作为一个初学者,我最近重新理解了"文字数字化"这件事

2026-10-06 · AI · 阅读 21 · 访客 21

写这篇文章,纯粹是因为我最近被一个问题卡住了。

不是什么宏大的问题。就是:

把文字变成向量,再用距离算相似度,这就算数字化了吗?

我一开始觉得这问题简单,随口就能答。但仔细想了两天,发现我之前的理解一直糊在一起——知道大概方向,但从没认真拆开过。

这篇文章不是教程,就是我把思考过程摊开。肯定有不严谨的地方,欢迎批评。


从身份证号说起

刚学 Embedding 的时候,我和大多数人一样,从这样一个例子开始:

"我" → 102
"爱" → 235
"吃" → 567
"苹果" → 890

当时我觉得"数字化"就是这个意思——文字变成数字了嘛。

后来某个晚上,我盯着这张表看,突然觉得不对劲:102 和 235 之间差 133,这个 133 是什么意思?

没有任何意思。

我把这张表完全打乱,"我"变成 87,"爱"变成 3,重新训练一遍——模型跑出来的结果会完全一样。

编号只是"身份证号"。它告诉你这是谁,但不告诉你他和别人什么关系。

这是我理解这条链的第一层:区分 ≠ 理解。


Attention 不只是"算距离"

我之后的很长一段时间里,脑子里的模型是这样一条线:

文字 → 向量 → 距离近 = 相似 → 模型就懂语言了

这条线讲起来特别顺。我给朋友讲过好几次,自我感觉良好。

直到有一次,我把 Attention 的公式重新拆开来看:

softmax(Q · Kᵀ / √d_k) · V

然后突然意识到,这里面其实是三件事:

  1. Q · Kᵀ —— 算匹配分数
  2. softmax —— 把分数变成权重分布
  3. A · V —— 按权重把信息取出来

我之前只讲了第一步。

就算你算出"苹果"和"吃"最相关,你也还没拿到"吃"能提供的信息——你还要用权重把 V 加权读出来。

算分只是开始。读出信息才是结果。

所以我现在的说法是:Attention 是"打分 + 归一化 + 聚合",而不是"算距离"。


点积是相似度,不是距离

有一次给同事讲分享,我说"Attention 用距离算相似度",当场被问了一句:

点积是距离吗?

我愣了一下。

点积真的不是距离。

距离有严格定义,得满足三条:

  • 非负性:d(a,b) ≥ 0
  • 对称性:d(a,b) = d(b,a)
  • 三角不等式:d(a,c) ≤ d(a,b) + d(b,c)

点积满足哪条?只满足对称性。

  • 点积可以是负数,不满足非负性
  • 三角不等式更不用谈

点积是相似度,不是距离。

不过这里还得再精确一点。点积本身是对称的:

a · b = b · a

但 Attention 里的匹配关系却不怎么对称。因为 Q 和 K 来自不同的投影:

Q = X · W_Q
K = X · W_K

所以从原始 token 的角度看:

q_i · k_j      ← 第 i 个词去问第 j 个词
q_j · k_i      ← 第 j 个词去问第 i 个词

这两个一般不相等。

不是"点积变得非对称了",而是 Q-K 匹配关系本身就不是对称的。

那次之后我改口:Attention 算的是相似度 / 匹配度,不是距离。


W_Q、W_K 到底在做什么

这件事我卡了很久。

我曾经以为,训练之后的 W_Q、W_K 差不多就是"做归一化"的——把向量调整到差不多长度的空间里,方便比较。听起来挺合理的。

但这是错的。

W_Q、W_K 是可学习的线性投影。它们真正做的事是:

学习什么样的特征应该用于 Query,什么样的特征应该用于 Key。

它们不是归一化。归一化是 LayerNorm、RMSNorm、L2 normalization 那一类操作。W_Q、W_K 是"选择特征"的投影矩阵。

我为什么一直搞混?因为脑子里总有个模糊的感觉:"反正训练之后 W 学好了,差不多能起到归一化的效果吧。"

这种"差不多",是我学习时最大的敌人。

现在的说法:

W_Q、W_K 把原始表示投影到两个专门用于计算匹配关系的表示空间。

真正控制数值尺度的是 √d_k 那个缩放因子。

(我一开始写的是"子空间",但"子空间"这个词在数学上有严格定义,用在这里不太准确。还是说"表示空间"稳一点。)

各司其职,不要混着说。


表示是动态的,这可能是最容易被忽略的一点

这是我最近才真正意识到的。

我以前讲 Embedding 的时候,脑子里浮现的画面是:

"苹果" → 一个向量 "猫" → 一个向量 一个词一个向量,就这样

但这是 Word2Vec 时代的世界观。

现代 Transformer 里,同一个"苹果":

  • 在"我吃了一个苹果"里 → 表示偏向水果
  • 在"苹果发布新产品"里 → 表示偏向科技公司

同一个 token 的最终表示,取决于整个上下文。

这是现代语言模型和经典词向量最本质的区别。

我现在把两件事分开看:

静态 Embedding(查表得到的):

E["苹果"]   ← 一个固定向量

上下文表示(Transformer 每一层的输出):

h_i = f(x_1, ..., x_n)_i   ← 依赖整个上下文

静态 Embedding 提供起点表示,而 Attention、MLP 以及多层 Transformer 共同根据上下文不断重构它。

注意我这次说的是"Attention、MLP 以及多层 Transformer 共同",而不是只说 Attention——因为:

X → Attention → 残差/归一化 → MLP → 残差/归一化 → 下一层...

整个 block 都在参与"重构表示",不能把功劳只归给 Attention。

以前我没讲清楚,因为我自己也没想清楚。


"国王 - 男人 + 女人 ≈ 女王"这个例子

这个例子太有名了。我以前也特别喜欢用它。

但它被用滥了。

它是经典静态词向量模型里的经验观察——在 Word2Vec、GloVe 这类模型上,人们发现某些语义属性确实表现为向量空间中的方向关系。

(顺便说一句,Word2Vec 和 GloVe 其实是两种不同的方法——前者是神经词向量的训练方法,后者是基于词-上下文共现统计的方法。把它们完全并列也不太准确。)

它说明了一件事:语义关系可以在向量空间中呈现为几何关系。

但它不是:

  • 现代语言模型的核心机制
  • 严格成立的数学定理
  • 语义理解的完整解释

现在的 LLM,语义计算要复杂得多。这类线性关系更像是一个历史现象。

我现在把它当"引子"用,不当"核心论证"。


位置编码的作用

以前我写"位置编码让距离能区分位置"。

这个说法不准确。

位置编码的真正作用是:

把顺序和位置信息注入到表示里,让模型能利用 token 的排列关系。

举个最简单的例子:

  • "狗咬人"
  • "人咬狗"

词完全一样,顺序不同。没有位置编码,模型没法知道谁咬谁。

它不是"让距离有什么性质",是"注入顺序信息"。

而且现在的 LLM 也不用传统的绝对位置编码了。许多现代 LLM 采用 RoPE 等相对位置关系友好的位置机制,思路和传统绝对位置编码完全不一样。

(我一开始想直接点名"LLaMA、Qwen 用的是 RoPE",但想想还是别写这种具体的品牌列表——模型架构一直在更新,写死了容易过时。)


我现在的理解,分三层

把这条链拆开,我现在的理解是:

第一层:编码

"苹果" → 890

只是发身份证号。不涉及语义。

第二层:表示

890 → [0.62, 0.55, -0.31, ...]

把符号放进连续的、可训练的向量空间。

这里我要修正一下之前的说法。我以前会写"有了'相似词靠近'的性质",但这句话有点太绝对——不同的训练目标会塑造出不同的表示空间结构。有些嵌入空间确实会体现"相似词靠近",有些则不一定这么简单。

更稳的说法是:

训练目标会使表示空间形成某些有用的几何结构,例如部分语义关系可以通过相似度或方向关系体现出来。

第三层:计算

X → Q, K, V → Attention → H

根据上下文动态重构表示。 这一步才让"苹果"在两种句子里有不同含义。

三层叠起来,才是现代语言模型。

把它们都叫"数字化",或者都叫"距离测量",我现在觉得都不准确。


关于"Embedding",我还想再补一句

我以前有个隐含的假设:

Embedding = 语义表示

这个想法也不够准。

实际上,一个隐藏状态里可能同时编码着:

  • 词汇信息
  • 句法信息
  • 位置
  • 指代关系
  • 主题
  • 实体关系
  • 任务相关信息
  • 中间计算结果

而且不同层可能承担不同功能。

所以更准确的说法是:

Embedding 给离散 token 一个可训练的连续起点表示;真正丰富的语义、句法和上下文信息,是在后续网络层中逐步计算出来的。

这个说法比"Embedding 就是语义"要好。


从"距离"到"关系"

如果让我说最近最大的一个认识转变,就是这个词的替换。

从"距离"到"关系"。

"距离"这个词讲起来很顺,但它太窄了。它能概括相似度,但概括不了投影、加权、聚合、非线性变换、多层堆叠、位置关系。

"关系"这个词更宽。

计算机不是因为文字变成数字才开始理解语言,而是因为文字被放进了一个可以计算关系的空间。

这个空间里能做的不只是算距离:

  • 可以做投影
  • 可以做加权聚合
  • 可以做非线性变换
  • 可以多层叠加
  • 可以编码位置关系

这些都不是"距离"两个字能概括的。


但是"理解"到底是什么?

写到这里,我本来想写一个总结性的结尾。

但我写不出来。

因为我发现,我真正搞清楚的只是"计算机做了什么":

  • 它把离散符号编码成可学习的表示
  • 在表示空间中形成可计算的关系
  • 用 Attention 和其他网络结构动态组合信息
  • 通过训练目标学习完成预测任务所需要的内部表示

但"这是否叫'理解',我已经不敢下结论了。

它是数学问题?是哲学问题?还是纯粹的定义问题?

我不知道。

我只知道,我以前太轻易地说"模型理解了语言"——现在我觉得,这话说出口之前,得先想清楚"理解"到底指什么。

而这个思考,可能比任何技术细节都难。


最后

学习时,"讲得太顺"往往是最危险的信号。

"文字数字化 = 变成向量 = 算距离 = 理解语言"——太顺了。顺得让人不假思索地接受,也顺得掩盖了很多细节。

真实的技术发展从来不是一条顺滑的直线。它是很多动机、很多妥协、很多工程考虑凑在一起的结果。

把这条线讲得太漂亮,反而失真。

作为一个初学者,我宁可理解得磕磕绊绊、不完整,也不想记住一个"看起来漂亮但经不起推敲"的版本。

这也是我写这篇文章的原因——把之前理解得"太满"的地方收回来一点。

不一定对,但至少是我真实想过的。


如果你也在学这些东西,欢迎一起讨论。有些问题,比答案更重要。

评论

回复
还没有评论,来说两句吧。