作为一个初学者,我最近重新理解了"文字数字化"这件事
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
然后突然意识到,这里面其实是三件事:
- Q · Kᵀ —— 算匹配分数
- softmax —— 把分数变成权重分布
- 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 和其他网络结构动态组合信息
- 通过训练目标学习完成预测任务所需要的内部表示
但"这是否叫'理解',我已经不敢下结论了。
它是数学问题?是哲学问题?还是纯粹的定义问题?
我不知道。
我只知道,我以前太轻易地说"模型理解了语言"——现在我觉得,这话说出口之前,得先想清楚"理解"到底指什么。
而这个思考,可能比任何技术细节都难。
最后
学习时,"讲得太顺"往往是最危险的信号。
"文字数字化 = 变成向量 = 算距离 = 理解语言"——太顺了。顺得让人不假思索地接受,也顺得掩盖了很多细节。
真实的技术发展从来不是一条顺滑的直线。它是很多动机、很多妥协、很多工程考虑凑在一起的结果。
把这条线讲得太漂亮,反而失真。
作为一个初学者,我宁可理解得磕磕绊绊、不完整,也不想记住一个"看起来漂亮但经不起推敲"的版本。
这也是我写这篇文章的原因——把之前理解得"太满"的地方收回来一点。
不一定对,但至少是我真实想过的。
如果你也在学这些东西,欢迎一起讨论。有些问题,比答案更重要。
评论