大模型训练原理(八)|为什么把一个 Token 变成几千个数字,它反而开始有“意义”了?——Embedding 真正讲透
上一课最后我们已经把文字送到了神经网络的大门口。整条链路是Text↓Tokenizer↓Token↓Token ID比如一句话人工智能正在改变软件开发。经过某个 Tokenizer 以后会被拆成若干 Token再进一步变成一串 Token ID。具体怎样切、具体 ID 是多少取决于具体 Tokenizer。没有指定模型时Information Not Available但上一课有一个结论与具体 Tokenizer 完全无关Token ID 只是编号。或者说得更准确一点Token ID 是地址不是意义。假设猫 → 4217 狗 → 9821 数据库 → 3154217 和 9821 本身没有任何地方写着“猫”和“狗”都是动物。315 也没有告诉模型“数据库”属于软件和计算机领域。甚至cat → 100 quantum → 101两个 ID 只差 1也完全不代表它们语义接近。于是第七课走到最后留下了一个非常关键的断点Text↓Token↓Token ID↓?↓Transformer这个问号是什么答案就是今天这一课Embedding但这一课真正要回答的不只是Embedding 是什么而是一个更根本的问题为什么一串毫无意义的 Token ID经过 Embedding 以后竟然能够逐渐变成模型可以使用的 Representation这件事一旦想通后面的 Attention、Hidden State、Transformer才真正有了入口。一、第七课解决的是“你是谁”第八课开始解决“你是什么样的”先把两件事彻底分开。Tokenizer 做完以后“猫” → Token ID 4217这个 4217 很重要。因为模型必须能够唯一确定现在输入的是 Vocabulary 里的哪一个 Token所以 Token ID 的任务是Identity也就是身份识别。但语言模型只知道身份远远不够。因为它还要逐渐学习“猫”经常出现在哪些 Context“猫”和“狗”有什么共同使用模式“猫”和“微积分”为什么通常不属于同一类语言环境“bank”在不同句子里为什么可能承担不同含义这些已经不是Identity的问题。而是Representation也就是表示。所以从今天开始我们第一次需要严格区分Token ID 负责告诉模型“这是谁”。Representation 负责让模型形成“这个东西应该怎样被计算”。Embedding就是从 Identity 走向 Representation 的第一步。二、为什么不能把 Token ID 直接当成普通数字假设我们的 Vocabulary 极小只有五个 TokenTokenToken ID猫0狗1苹果2银行3跑步4如果直接把0 1 2 3 4当成普通数值交给神经网络会发生一个很奇怪的问题。普通数字天然带着数学关系4 3 2 1 0还有4 - 3 1 1 - 0 1甚至4 2 × 2但这些数学关系和 Token 之间的语言关系毫无关系。“跑步”并不比“银行”大 1。“苹果”也不是“狗”的两倍。所以Token ID 虽然是数字但不能把它当成具有普通数值意义的 Feature。它更像数据库里的 Primary Key。例如Employee ID 17352不意味着编号 17353 的员工就和他性格特别接近。编号只是找到这个对象的地址。于是问题继续向前。既然普通数字会制造不存在的大小和距离关系我们能不能换一种表示方式三、第一种自然答案One-hot还是刚才五个 Token。我们不要再把“猫”表示成0而是表示成[1, 0, 0, 0, 0]“狗”[0, 1, 0, 0, 0]“苹果”[0, 0, 1, 0, 0]“银行”[0, 0, 0, 1, 0]“跑步”[0, 0, 0, 0, 1]这就是One-hot EncodingOne-hot 有一个非常漂亮的性质。每一个 Token 都只是在属于自己的那个位置上放一个 1。其他位置全部是 0。于是“狗”不是数字 1它只是第二个位置被激活这样一来“狗比猫大 1”这种虚假的数学关系就消失了。从 Identity 的角度看One-hot 非常干净。但它很快就出现了第二个问题。四、One-hot 解决了假关系却没有创造真正的关系假设真实 Vocabulary 有V 100000也就是十万个 Token。那么每一个 Token 的 One-hot Vector 都需要100000 维例如[0,0,0,0,...,1,...,0,0]十万个位置里99999 个是 0 1 个是 1非常稀疏。这当然很浪费。但更严重的问题其实还不是存储。真正的问题是One-hot 仍然只知道“它是谁”。它没有表达“它和其他 Token 有什么关系。”例如“猫”和“狗”在人类语言里显然存在大量相似使用环境。它们都可能和宠物 主人 喂养 毛 动物这些概念共同出现。而“猫”和“微积分”的语言使用模式通常完全不同。可是在 One-hot 空间里猫 [1,0,0,0,...] 狗 [0,1,0,0,...]它们和猫 [1,0,0,0,...] 微积分 [0,0,1,0,...]从这种表示本身看没有天然的“第一组更相似”。所有不同 Token 都被完全分开。所以 One-hot 做到的是Identity without Relationship有身份没有关系。而语言模型真正需要的是一种不仅能够区分 Token还能够被训练成有用内部结构的表示方式。这就把我们逼到了 Embedding。五、如果 One-hot 太稀疏那就把它投影到一个更小的空间假设 Vocabulary Size 是V我们给模型准备一张矩阵E∈ ℝV×d这里V是Vocabulary Size而d是Embedding Dimension假设V 100000 d 4096那么这张矩阵就是100000 × 4096它有十万行。每一行都有 4096 个数字。可以把它画成Token IDEmbedding0一条 d 维向量1一条 d 维向量2一条 d 维向量......99999一条 d 维向量这张表就是Embedding Matrix现在假设“猫”的 Token ID 4217模型不再把4217这个数字直接交给 Transformer。而是做一件非常简单的事去 Embedding Matrix 找第 4217 行假设这一行是[0.21, -0.73, 1.18, 0.44, ...]那么真正进入后续神经网络的就是这一整条向量。数学上e4217 E[4217]突然之间第七课那句话就完整了。Token ID 是地址。因为它真正做的事情就是告诉模型去 Embedding Matrix 的哪一行取数据。而Embedding Vector 才是后续网络真正计算的对象。六、这时候你会发现第七课里那个 V × d 终于不是一个伏笔了上一课我们讨论 Vocabulary Size 时已经提前看到过V×d当时我们只是说如果 Vocabulary 变大Embedding Matrix 相关参数规模也会随之变化。现在终于可以真正理解为什么。因为 Vocabulary 每新增一个 TokenEmbedding Matrix 原则上就需要多出一行对应它的向量。所以Vocabulary Size↓Embedding Matrix 行数↓Embedding Parameters它们根本不是三个彼此独立的概念。Tokenizer 负责定义有哪些 Token。Vocabulary 负责定义每个 Token 的 ID 是什么。Embedding Matrix 接着定义每个 Token ID 初始对应哪一条连续向量。所以现在完整的数据入口已经变成Raw Text↓Tokenizer↓Token↓Token ID↓Embedding Lookup↓Vector第七课解决Symbol → ID第八课开始解决ID → Vector七、One-hot 为什么还值得讲因为它能让你真正看懂 Embedding Lookup这里有一个非常漂亮的线性代数关系。假设 Vocabulary 只有 5 个 Token。“狗”的 Token ID 是 1。那么它的 One-hot 是x [0, 1, 0, 0, 0]再假设 Embedding Matrix 是Ee0e1e2e3e4现在做xE由于x [0, 1, 0, 0, 0]只有第二个位置是 1所以矩阵乘法最后留下的就是xEe1也就是“狗”的 Embedding。这件事很重要。因为它告诉我们Embedding Lookup 从数学上可以看成 One-hot Vector 与 Embedding Matrix 相乘。但工程实现中根本没必要真的创建一个十万维甚至更大的 One-hot Vector。因为 Token ID 已经告诉我们应该取哪一行了。所以实际操作更接近Embedding(ID) E[ID]直接查表。于是One-hot × Embedding Matrix和Embedding Lookup在结果上可以对应起来。这也是为什么 Embedding Layer 看起来像“查表”背后却仍然可以放在线性代数框架里理解。八、但如果 Embedding 只是查表那“意义”到底从哪里来现在真正的大问题出现了。假设猫 → [0.21, -0.73, 1.18, ...] 狗 → [0.25, -0.69, 1.09, ...]谁写的这些数字工程师提前规定的吗是不是有人在训练前告诉模型第 1 维 是否是动物 第 2 维 是否可爱 第 3 维 是否是宠物 ...都不是。真正关键的一句话是Embedding Matrix 本身就是模型参数。也就是说E⊂ θ它属于我们前面几课一直在讲的θ训练刚开始时这些数字并没有今天想象中的丰富语言结构。接下来发生的事情就是第一课到第六课已经讲过的整套 Training LoopData↓Model↓Prediction↓Loss↓Gradient↓Optimizer↓Parameter Update只不过现在我们终于发现Embedding Matrix 也是 Parameter。所以 Gradient 不只更新 Attention、MLP 等后续网络参数。它也可以一路影响到 Embedding 相关参数。整条链现在变成Text↓Tokenizer↓Token ID↓Embedding↓Neural Network↓Prediction↓Loss↓Backpropagation↓Gradient↓Embedding Update到这里第八课第一次真正重新接回了第一课。九、模型从来没有被要求“学习语义”这一点特别值得停下来想一会。训练语料里没有一张表猫 动物 狗 动物 巴黎 城市 法国 国家也没有一个监督标签告诉模型猫和狗的向量距离应该是 0.18 猫和数据库的距离应该是 0.91模型真正被要求做的事情从第二课开始就只有一个把下一个 Token 预测得更准。例如训练数据不断出现我养了一只猫 这只猫很可爱 给猫喂食 狗也是常见宠物 我带狗出去散步如果模型想在这些 Context 中降低 Loss它的内部参数就必须逐渐形成一些对预测有帮助的结构。“猫”和“狗”会出现在大量相似或相关的语言环境里。如果某种 Representation 能够让后续网络更容易利用这些统计规律那么Loss↓Gradient↓Parameter Update就可能不断强化这种 Representation。注意这里最重要的措辞。不是“模型被告诉猫和狗应该靠近。”而是某些内部表示方式如果更有利于完成预测任务就更可能在训练过程中被保留下来。这就是Representation Learning表示学习。十、所以 Embedding 真正神奇的地方不是“数字很多”很多人第一次听 Embedding会产生一个错觉Token ID 是一个数字没有意义。Embedding 有 4096 个数字所以终于有意义了。这个因果关系是不对的。并不是数字越多 → 越有意义真正关键的是这些数字是可学习参数组成的 Representation而且会因为训练目标不断被调整。如果随机生成 4096 个数字然后永远不训练它并不会自动获得语言意义。Embedding 真正重要的三个条件是连续向量可学习参数训练目标驱动它们结合起来以后模型才拥有了一个可以逐渐组织语言规律的连续空间。十一、为什么是高维向量而不是一个数字假设我们强行规定每一个 Token 只能用一个数字表示。例如猫 0.31 狗 0.34 银行 0.82 跑步 0.57问题很快就会出现。一个 Token 的语言使用模式可能同时涉及语法角色、主题、搭配关系、实体属性、语言类别、上下文习惯、代码结构、语义关系以及大量我们甚至很难直接命名的统计特征。一个坐标根本没有足够的自由度去形成这么复杂的结构。于是模型使用e [e1,e2,e3, …,ed]这样的高维向量。例如d 4096那么一个 Token 的初始 Representation 就处在一个 4096 维空间中。我们通常把这种空间叫Vector Space或者更广义地说Representation Space但这里马上要防止一个非常常见的误区。十二、4096 维不代表 4096 个可以被人类命名的属性千万不要把 Embedding 想象成第 1 维 是否是动物 第 2 维 是否是名词 第 3 维 是否与金融有关 第 4 维 是否褒义 第 5 维 是否属于科技领域 ...真实神经网络通常远没有这么整齐。更常见的情况是某种信息分布在许多维度、许多参数以及它们的组合关系中。一个概念不一定属于某一个单独维度。同一个维度也不一定只承担一种人类可以直接命名的含义。这就是Distributed Representation分布式表示。所以面对[0.21, -0.73, 1.18, 0.44, ...]不要执着地问“0.21 到底是什么意思”有时候更合理的问题应该是这一整组数字形成的模式在后续计算中发挥了什么作用这才更接近现代神经网络内部 Representation 的真实样子。十三、那“知识存在高维向量里”这句话到底对不对这是一个很容易说过头的问题。如果说“大模型所有知识都存在 Embedding Matrix 里。”这是不准确的。Embedding 的确非常重要但模型的知识和能力会分布在大量地方Embedding Parameters Attention Parameters MLP Parameters 其他网络权重 运行时 Hidden States 以及它们之间的复杂交互所以更准确的说法应该是模型能够把对任务有用的信息结构编码进高维 Representation而知识以分布式形式存在于整个网络之中。Embedding 是Representation 的入口不是整个知识仓库这两个概念一定不要混在一起。十四、Latent 到底是什么意思从这一课开始你会越来越频繁地在论文里看到一个词Latent例如Latent RepresentationLatent SpaceLatent State很多人第一次看到会觉得它特别玄学。其实最核心的意思没有那么神秘。Token ID 是4217这是我们人为定义的显式编号。但经过模型以后4217↓[0.21, -0.73, 1.18, ...]这些内部坐标到底应该怎样组织并不是人类逐维规定好的。它们是在训练过程中形成的。所以可以把 Latent 理解成模型内部形成、但没有被人类预先规定成人类可读字段的内部表示。换句话说我们规定任务。模型通过 Optimization 自己寻找什么样的内部坐标系统最有利于完成任务。这就是 Latent Representation 最值得理解的地方。十五、有了向量我们终于可以第一次谈“相似”Token ID 本身不能谈距离。因为4217 和 4218数值接近不代表 Token 语义接近。但变成 Vector 以后情况不同了。我们终于可以使用线性代数的方法分析两个 Representation。例如ecat和edog之间是否呈现某种相似结构。一个很常见的分析工具叫Cosine Similarity公式是cos(a,b) a·b|a| |b|直觉上它主要比较两个向量的方向有多相似。通常接近 1意味着方向较相似。接近 0意味着方向关系较弱。接近 -1意味着方向相反。但这里必须特别谨慎。不能把它简单理解成Cosine Similarity 就是完整的“语义相似度”。尤其在现代 LLM 中语言结构远不只存在于最初的 Token Embedding 里。所以更严谨的说法是Cosine Similarity 是研究 Vector Representation 几何关系的一种工具。而不是“模型的全部语义已经被压缩成一个距离。”十六、Embedding 最大的限制终于出现了它还不知道当前 Context现在来看一句苹果发布了新的设备。再看另一句我吃了一个苹果。为了教学方便假设某个 Tokenizer 中的“苹果”在这里最终对应同一个 Token ID。那么它刚刚进入 Embedding Layer 时Token ID 相同↓查同一行 Embedding Matrix↓得到同一个初始 Token Embedding问题来了。第一句话里的“苹果”可能更偏向某个实体或品牌语境。第二句话里的“苹果”显然处于食物语境。可是最开始 Lookup 出来的 Token Embedding 可以是相同的。这意味着Input Embedding 并不等于 Token 在当前句子里的最终含义。Embedding 解决的是这个 Token 以什么向量作为进入网络的起点但它还没有完整解决这个 Token 在当前 Context 中到底是什么意思这一区分极其重要。十七、于是我们第一次需要区分 Embedding 和 Hidden State以后看 Transformer 论文或代码时你会不停遇到EmbeddingHidden StateRepresentation这几个词。先建立一个最基本的框架。Token ID身份编号4217它只是 Index。Token Embedding通过 Embedding Matrix 查出来的初始向量e4217它是 Token 进入模型时的Initial RepresentationHidden StateToken 经过 Transformer Layer 一层又一层处理以后形成hi(l)其中i代表 Token Positionl代表 Layer。这时候的向量已经不只是最初的 Token Embedding。它开始受到Context、Attention、MLP、Residual、以及前面多层网络变换的影响。所以以后看到一个 Vector一定要先问这是刚进入模型的 Token Embedding还是已经经过网络处理的 Hidden Representation两者不能混为一谈。十八、真正的“上下文意义”要等 Token 之间开始交流Embedding 到这里解决了一个非常重要的问题Discrete Token↓Continuous Vector但语言真正麻烦的地方从来不只是理解孤立的 Token。例如小明告诉小李他明天不会来了。“他”到底更可能指谁又比如代码user_count 10几百个 Token 以后再次出现user_count模型需要把现在这个位置和前面出现过的信息关联起来。只靠最初的 Token Embedding显然还做不到。因为Embedding 让每个 Token 拥有了可以计算的 Representation。但这些 Representation 还需要根据 Context 互相影响。只有经过后续网络一个 Token 的 Hidden State 才可能逐渐从“我是谁”走向“我在当前上下文里是什么。”而这正是 Transformer 接下来真正要解决的问题。十九、为什么 Embedding 是整个 LLM 非常关键的一次“世界转换”回顾一下。Embedding 之前模型面对的是猫 银行 Python return 人工智能这些离散符号。而 Embedding 之后一句长度为T的 Token Sequence可以变成x1,x2,x3, …,xT其中每一个xi ∈ ℝd于是从这一刻开始模型终于能够对语言做矩阵乘法、点积、线性投影、加法、归一化、Attention、MLP、Residual。也就是说Transformer 从来不是直接对“文字”做矩阵乘法。Transformer 真正处理的是Vector所以这一课最重要的一次转换就是Symbol → Vector人类世界里的离散语言第一次真正进入了神经网络擅长的连续数学世界。二十、现在把前八课第一次完整串起来到这里我们终于可以把前八课拼成一台完整机器。第一课模型为什么会学习核心Loss↓Gradient↓Parameter Update第二课LLM 到底在学什么核心Context↓Next Token Prediction第三课模型输出的到底是什么核心Logits↓Softmax↓Probability Distribution接下来我们一路理解Cross Entropy、Backpropagation、Optimizer。第七课终于转到输入端Text↓Tokenizer↓Token↓Token ID而今天这一课把最后一个入口补上Token ID↓Embedding↓Vector于是整个 LLM 的基本数据流第一次可以写成Raw Text↓Tokenizer↓Tokens↓Token IDs↓Embedding↓Vectors↓Transformer↓Hidden States↓LM Head↓Logits↓Softmax↓Next Token Probability这时候再看“大模型读文字”这句话你应该已经有完全不同的画面了。模型并没有一个叫理解文字()的神秘函数。真正发生的是离散语言被编码成离散 Token。Token 被映射成连续 Vector。神经网络对 Vector 进行大量数学变换。最后再把内部状态映射回 Vocabulary 上的概率分布。这才是 LLM 真正的数据世界。二十一、现在终于可以回答标题里的问题为什么把一个 Token 变成几千个数字以后它反而开始有“意义”了严格来说并不是因为它变成了几千个数字所以产生了意义。而是因为第一这些数字构成了一个Continuous Representation。它们能够真正参与神经网络计算。第二这些数字不是固定的人为编码而属于Learnable Parameters。第三这些参数持续受到Prediction↓Loss↓Gradient↓Optimization的训练压力。第四为了降低预测误差模型会逐渐形成对完成任务有用的内部结构。所以更准确的一句话应该是Embedding 不是把人类定义好的“意义”塞进 Vector。而是为模型提供一个可以通过训练逐渐形成有用 Representation 的连续空间。这才是 Embedding 真正值得学懂的地方。二十二、学完这一课最容易犯的五个错误误区一Token ID 本身包含语义不包含。Token ID 首先只是 Vocabulary Index。ID 相近不代表语义相近。误区二Embedding 是工程师提前设计好的语义表通常不是。Embedding Matrix 是模型参数的一部分会参与 Training。误区三Embedding 每一维都有明确的人类含义通常不能这样理解。现代神经网络大量使用Distributed Representation。误区四一个 Token 的 Embedding 就是这个词在所有语境中的完整意义不是。Token Embedding 只是进入模型时的初始 Representation。Contextual Meaning 需要后续网络进一步形成。误区五大模型的知识全部存在 Embedding Matrix不对。模型的能力和知识分布在整个网络参数与运行时 Representation 中。Embedding 只是入口之一。二十三、如果你真的理解这一课应该能够回答这几个问题现在不要背定义。尝试自己回答为什么 Token ID 不能直接被当成普通数值 Feature为什么 One-hot 消除了虚假的大小关系却仍然不是理想 Representation为什么OneHot × EmbeddingMatrix可以对应一次 Embedding Lookup为什么 Embedding Matrix 属于θ也就是模型参数如果训练数据从来没有显式告诉模型“猫和狗比较相似。”为什么训练仍然可能形成对语言任务有帮助的内部结构为什么 Embedding Dimension 很高却不能简单解释成“每一维对应一个语义属性”为什么同一个 Token 的初始 Embedding 可以相同经过 Transformer 后的 Hidden State 却可能完全不同如果这些问题你都能顺着Token ID↓Embedding Matrix↓Vector↓Loss↓Gradient↓Representation Learning解释出来那 Embedding 就真的学懂了。二十四、但现在又出现了一个更基础的问题只有 Vector模型怎么知道顺序这一课结束以后一句话已经从Token₁ Token₂ Token₃ ... Tokenₜ变成x1,x2,x3, …,xT很好。每一个 Token 都已经拥有一个 Vector。Transformer 终于有东西可以算了。但现在出现一个看似不起眼、实际上非常致命的问题。假设有两句话狗咬人和人咬狗Token 都差不多。Embedding 也都有。可两句话的意思显然完全不同。区别在哪里顺序。问题是如果 Transformer 看到的只是Vector Vector Vector Vector这些向量本身哪里写着谁是第一个谁是第二个谁在谁前面Embedding 告诉模型我是谁。可是它并没有自动告诉模型我在哪里。于是第八课结束以后我们自然遇到了 Transformer 的下一个问题Token↓Embedding↓Vector↓???如果所有 Token 最终都只是 Vector模型到底从哪里知道它们的顺序这就是下一课要解决的问题Position下一课我们会正式进入Position Encoding、Position Embedding以及 RoPE。然后再继续向前来到整个 Transformer 最核心的问题这些已经拥有身份、拥有位置的 Vector究竟怎样彼此寻找和交换信息那个答案就是Attention下一课大模型训练原理09如果 Transformer 看到的只是一堆 Vector它到底怎么知道谁在前、谁在后——Position 与 RoPE第七课解决的是文字怎么变成模型可以索引的编号。第八课解决的是编号怎么变成模型真正能够计算的 Representation。第九课则要继续追问有了 Representation 以后模型到底怎么知道这些 Token 的顺序到这里我们已经真正从人类看到的Language一步一步走进模型看到的Vector Space而 Transformer 的世界现在才刚刚开始。