目录标题
- 一、词转词向量
- 第一步:分词、清洗和标准化(把句子切碎)
- 第二步:构建词表 (Vocabulary)(发“身份证号”)
- 第三步:使用词嵌入矩阵(查表变向量)(注入灵魂)
- 二、嵌入表行数等于词表行数可以理解,但是列数怎么定
- 一、列数(维度)是怎么定的?依据是啥?
- 二、机器怎么知道在这些列上填啥数字?(重点!就是深度学习训练)
- 三、那这些学出来的列,人类能看懂吗?
- 三、每一列可以看作深度学习的权重吗?(又解释一遍词转词向量)那输入tensor是啥,就是训练数据是啥,是[我是人物的档案,你的任务档案在哪]这里一句句话转成词向量吗?
- 一、完全可以这么理解,而且在底层代码里,它确确实实就是权重(Weight)。
- 二、那输入 Tensor 是啥?训练数据长啥样?
- 三、训练数据到底是什么?(以 GPT 这种大模型为例)
- 四、那每个模型都是有词表,词表有10000行,都有对应的词嵌套矩阵就是10000行,维度认为预定300列,那世界上这么多词,就代表有很多行,那对应的词嵌套矩阵岂不是很大。难道现在的大模型都是这样搞得?
- 1. 现在的矩阵到底有多大?(算笔账)
- 2. 世界上词这么多(代码、火星文、拼写错误),怎么塞进词表?
- 3. 大模型除了这个矩阵,还有别的参数吗?
- 五、如果想修改 人物档案 在词嵌入矩阵里每一列权重,是不是就给就喂包含人物档案的句子训练
- 一、纠正误区:输入多次特定句子,这个词的权重就能“完美”吗?
- 二、词嵌入表 (Embedding) 的真相:大模型时代,它是“死”的
- 总结你的想法:
- 六、transformer网络和深度学习训练调整每个词的列权重有啥区别
- 七、transformer怎么拿到Embedding表里向量变成几乎准确的词向量处理的(必须搞定原来自注意力机制原理,这里粗略介绍一下)
- 八、查Embedding表,这里每列是不是通过深度学习训练出来的。后面tranformer就用不到深度学习了,调Embedding表这里已经几乎固定列的权重了
- 一、查嵌入(Embedding)表,每列确实是深度学习训练出来的吗?
- 二、后面 Transformer 就用不到、也不调这里的权重了吗?
- 三、那在 Transformer 阶段,是怎么“用”这个固定向量的?
- 总结:
一、词转词向量
将词转换为词向量时:
首先需要对文本进行分词,再根据需要进行清洗和标准化。
构建词表(Vocabulary),每个词对应一个索引。
使用词嵌入矩阵将词索引转换为词向量。
自然语言处理(NLP)最神奇的地方,就是要把人类看得懂的文字,变成机器看得懂的数字(向量)。
结合这三个步骤,我们用一句最简单的话来举例:
“我爱吃苹果。”
我们一步步看,这句话是怎么变成一串串数字(词向量)的。
第一步:分词、清洗和标准化(把句子切碎)
机器不认识一整句话,它必须先把它切成词(Token)。
- 分词:把“我爱吃苹果”切成
["我", "爱", "吃", "苹果", "。"]。 - 清洗和标准化:去掉没用的标点符号(比如句号),英文字母通常还会转成小写。
结果:我们得到了一个干净**的词列表:["我", "爱", "吃", "苹果"]。
第二步:构建词表 (Vocabulary)(发“身份证号”)
机器不仅不认识字,更不认识词。所以我们要建一个大字典(词表),给每个词发一个唯一的数字 ID(索引)。
假设我们手里有一个包含几万个词的字典:
| 词 (Word) | 索引 (Index) |
|---|---|
| 你 | 0 |
| 我 | 1 |
| 爱 | 2 |
| 吃 | 3 |
| 香蕉 | 4 |
| 苹果 | 5 |
| … | … |
根据这个字典,我们把刚才切好的词,替换成数字 ID。
结果:["我", "爱", "吃", "苹果"]变成了[1, 2, 3, 5]。
注意:这时候,机器虽然拿到了数字,但它觉得1和2只是编号,并不代表“我”和“爱”有任何语义上的关系(不能因为 2 比 1 大,就说“爱”比“我”大)。
第三步:使用词嵌入矩阵(查表变向量)(注入灵魂)
这一步就是图里的核心:词嵌入(Word Embedding)。
我们要准备一个大表格(词嵌入矩阵)。这个表格的行数等于词表大小,列数是我们自己定的(比如定个 4 维,意思是每个词用 4 个数字来描述)。
假设我们训练好(或者下载好)的矩阵长这样:
| 索引 | 向量 (Vector) | 隐含的意义(机器自己学出来的) |
|---|---|---|
| 0 (你) | [0.1, 0.2, 0.1, 0.9] | 代词,人 |
| 1 (我) | [0.1, 0.1, 0.1, 0.8] | 代词,人 |
| 2 (爱) | [0.9, 0.1, 0.2, 0.1] | 动词,情感 |
| 3 (吃) | [0.8, 0.5, 0.1, 0.1] | 动词,动作 |
| 4 (香蕉) | [0.1, 0.9, 0.8, 0.1] | 名词,食物,黄色 |
| 5 (苹果) | [0.1, 0.9, 0.8, 0.2] | 名词,食物,圆形 |
怎么查表?
还记得第二步我们得出的数字 ID 吗?[1, 2, 3, 5]。
- 遇到
1,我们就去矩阵的第 1 行,把[0.1, 0.1, 0.1, 0.8]抽出来。 - 遇到
2,去第 2 行抽[0.9, 0.1, 0.2, 0.1]。 - 遇到
3,去第 3 行抽[0.8, 0.5, 0.1, 0.1]。 - 遇到
5,去第 5 行抽[0.1, 0.9, 0.8, 0.2]。
最终结果:
“我爱吃苹果”这句话,最终变成了一个4×4 的矩阵(4个词,每个词4个维度):
[ 0.1 0.1 0.1 0.8 0.9 0.1 0.2 0.1 0.8 0.5 0.1 0.1 0.1 0.9 0.8 0.2 ] \begin{bmatrix} 0.1 & 0.1 & 0.1 & 0.8 \\ 0.9 & 0.1 & 0.2 & 0.1 \\ 0.8 & 0.5 & 0.1 & 0.1 \\ 0.1 & 0.9 & 0.8 & 0.2 \end{bmatrix}0.10.90.80.10.10.10.50.90.10.20.10.80.80.10.10.2
这就是机器眼中的“我爱吃苹果”。它变成了一个4 维 Tensor。
💡为什么非要变成这么复杂的向量?直接给数字 1、2、3、5 不行吗?
这就是词嵌入(Word Embedding)的魔法所在。变成向量后,数字之间有了数学关系。
你看表里:
- “我”是
[0.1, 0.1, 0.1, 0.8] - “你”是
[0.1, 0.2, 0.1, 0.9]
它俩的数值非常接近,说明机器知道它们词性相似(都是代词)。
再看:
- “苹果”是
[0.1, 0.9, 0.8, 0.2] - “香蕉”是
[0.1, 0.9, 0.8, 0.1]
它们的向量也极度相似,机器就知道它们都是能吃的水果。
更神奇的是,向量还能做数学运算(比如著名的例子):
“国王”的向量 - “男人”的向量 + “女人”的向量 ≈ “女王”的向量
二、嵌入表行数等于词表行数可以理解,但是列数怎么定
我们分两步来扒开这个“黑盒”:
- 列数(维度)是怎么定的? (人为设定的超参数)
- 机器怎么知道每一列填啥数字? (算法自己学出来的,这是核心! )
一、列数(维度)是怎么定的?依据是啥?
词向量的列数,在专业术语里叫“Embedding Dimension(嵌入维度)”。
- 列数不是固定的,是人(工程师)拍脑袋设定的“超参数”。
- 依据是什么?主要是“你要捕捉多少语义细节”和“你的算力/内存有多大”。
举个通俗的例子:如何给一个人写“人物档案”(词向量)?
- 如果只给 2 列(2 维):你只能记录他的两个特征,比如
[身高, 体重]。这就叫 2 维词向量。两个词如果身高体重差不多,机器就认为它们相似。 - 如果给 10 列(10 维):你可以记录
[身高, 体重, 年龄, 智商, 情商, 颜值, 财富, 幽默感, 运动能力, 饭量]。这就能区分得更细致了。 - 如果给 300 列(300 维):早期的自然语言处理(比如 Word2Vec 算法),最常用的就是 300 维。这 300 列可能包含了 300 种人类难以直接命名的隐藏特征(比如:是否是有生命的、是否是动作、情感是正向还是负向等)。
- 现在的超大模型(如 GPT-4、豆包):维度动辄4096 维、8192 维甚至上万维!因为大模型需要理解极其复杂的语法、逻辑、代码、多语言知识。
列数定太小:词与词之间容易“撞车”,分不清细微差别(比如分不清“喜欢”和“爱”)。
列数定太大:浪费算力,矩阵极度庞大,模型训练慢且容易“过拟合”。
所以,列数就是一个“筐”,你想装多细的信息,就定多大的筐。
二、机器怎么知道在这些列上填啥数字?(重点!就是深度学习训练)
这绝对不是人类工程师手动填进去的。你不可能去规定“第 1 列代表是否吃素,第 2 列代表颜色”。
这些数字是机器自己**“学”出来的,依靠的是一种叫做“反向传播(Backpropagation)”和“梯度下降”**的数学魔法。
通俗解释“机器怎么学”:
- 初始状态(瞎蒙):
刚开始,词嵌入矩阵里的数字全是随机乱填的(比如标准正态分布)。
此时,机器眼里的“苹果”可能就是[0.88, -0.12, 0.45, ...],毫无逻辑。 - 做填空题(训练任务):
我们给机器几千万篇文章,让它玩一个游戏,比如**“预测下一个词”**(大模型就是这么练的)。
输入:“我每天早上都要吃一个……”
机器根据它乱填的矩阵,算了一下,预测下一个词是“轮胎”(错得离谱)。 - 老师打手板(计算误差):
真实的答案是“苹果”。机器发现自己错了,产生了一个巨大的“误差(Loss)”。 - 调整数字(反向传播):
这是最关键的一步。机器会回过头去,稍微修改(微调)矩阵里的数字。
它发现,为了让预测变成“苹果”,可能需要把“苹果”这个向量里的某几个数字调大一点,把“吃”这个词的向量也调整一下,让它们俩在空间上的**“距离”更近**。 - 千锤百炼(迭代):
把这个过程重复几十亿次!经过海量的数据“毒打”,矩阵里的数字越来越合理。- 原本随机乱填的数字,慢慢变成了能表达语义的向量。
- “苹果”和“香蕉”的向量越来越像(因为它们经常出现在相似的上下文里,比如“吃___”)。
- “苹果”和“手机”也会有一定相似性(因为都有苹果公司)。
三、那这些学出来的列,人类能看懂吗?
绝大多数情况下,人类看不懂。
大模型学出来的 4096 维,并不是我们想象中的:
- 第 1 列 = 甜度
- 第 2 列 = 圆润度
机器在 4096 维空间里,自己构建了一套极其复杂的“特征坐标系”。这些特征可能是人类语言根本无法描述的抽象概念组合。
但是!机器不需要人类看懂,它自己懂就行了。只要在这个高维数学空间里,“国王” - “男人” + “女人” 算出来的结果,最接近的那个词是“女王”,这就说明它学到了真理。
三、每一列可以看作深度学习的权重吗?(又解释一遍词转词向量)那输入tensor是啥,就是训练数据是啥,是[我是人物的档案,你的任务档案在哪]这里一句句话转成词向量吗?
一、完全可以这么理解,而且在底层代码里,它确确实实就是权重(Weight)。
- 词嵌入矩阵本身就是一个巨大的“权重矩阵”。
在 PyTorch 里,定义一个词嵌入层其实就是在定义一个全连接层(或查表层)。
# 假设词表有 10000 个词,每个词用 300 维向量表示embedding_layer=torch.nn.Embedding(num_embeddings=10000,embedding_dim=300)这里的10000 x 300矩阵里的每一个数字,都是可学习的参数(权重)。
一开始随机写:对,初始化时,机器就是在这个矩阵里随机生成一堆小数。
训练时调整:当你输入一句话,模型算出了误差(比如预测错了下一个词),反向传播(Backpropagation)的算法就会去计算这个巨大的矩阵里,哪些数字导致了错误,然后把它们微调一点。经过几亿次调整,这些权重就变得“有语义”了。
二、那输入 Tensor 是啥?训练数据长啥样?
你举的例子「我是人物的档案,你的任务档案在哪」非常生动,但要纠正一点:输入给模型的,绝对不是这句话本身,也不是直接的索引,而是“切词后的索引序列”经过“查表”后得到的“三维 Tensor”。
我们把这个流水线彻底打通,看看“训练数据”到底长什么样:
1. 原始文本(人类语言)
假设我们有一条训练数据(一句话):
“我喜欢吃苹果”
2. 转成索引(Token IDs)
机器先查词表(Vocabulary),把这句话变成一排数字。假设词表里:我=1,喜欢=2,吃=3,苹果=4,句号=5。
那么输入变成了一维 Tensor:[1, 2, 3, 4, 5]
3. 变成词向量(Embedding 查表)
这就是你问的“输入 Tensor 是啥”。机器拿着这排数字[1, 2, 3, 4, 5],去刚才那个10000 x 300的权重矩阵里“查表”。
- 拿出第 1 行的 300 个数字(“我”的向量)。
- 拿出第 2 行的 300 个数字(“喜欢”的向量)。
- …
查完之后,原本一维的[1, 2, 3, 4, 5]就变成了一个二维的大矩阵(Tensor):
形状是[5, 300]。也就是 5 个词,每个词 300 个维度。
注意!如果一次喂给模型多句话(比如 32 句话作为一批,即 Batch Size = 32),这个 Tensor 就会变成三维的:[32, 5, 300]。(这就是你之前问的三维/四维 Tensor 的来源!)
这个[32, 5, 300]的 Tensor,才真正进入神经网络(比如 Transformer)去进行计算。
三、训练数据到底是什么?(以 GPT 这种大模型为例)
你理解的“训练数据是一句话”大体是对的,但大模型训练时,其实是在玩一个“完形填空”或“接龙”的游戏。
以刚才的[1, 2, 3, 4, 5](我喜欢 吃 苹果 。)为例:
训练数据通常被切成两部分:
- 输入(Input):
[1, 2, 3, 4](我喜欢 吃 苹果) - 目标标签(Target):
[2, 3, 4, 5](喜欢 吃 苹果 。)
训练过程是这样的:
- 机器看着
[1, 2, 3, 4](我喜欢 吃 苹果),去查表变成向量,送进网络。 - 网络经过一顿复杂的数学运算(矩阵乘法、注意力机制等),开始预测下一个词。
- 机器预测的答案是:第 1 个位置它猜下一个词是“喜欢”;第 2 个位置猜下一个词是“吃”;第 3 个位置猜下一个词是“苹果”;第 4 个位置猜下一个词是“。”。
- 对比误差:机器把自己猜的,跟真实的目标标签(Target)对比。如果它把“苹果”后面猜成了“香蕉”,误差就很大。
- 反向传播:误差传回去,调整那个
10000 x 300的Embedding 权重矩阵。让“苹果”的向量稍微向“吃”的向量靠近一点。 - 重复几万亿次。
四、那每个模型都是有词表,词表有10000行,都有对应的词嵌套矩阵就是10000行,维度认为预定300列,那世界上这么多词,就代表有很多行,那对应的词嵌套矩阵岂不是很大。难道现在的大模型都是这样搞得?
现在的大模型用的就是这套逻辑,而且它们对应的词嵌入矩阵极其巨大,甚至大得吓人!
我们可以算一笔账,看看现在的顶级大模型(比如 GPT-4、豆包等)在这个“查表矩阵”上到底有多疯狂,以及它们是怎么解决“代码/生僻词太多”的问题的。
1. 现在的矩阵到底有多大?(算笔账)
你说的 10000 个词、300 列,那是早期小模型的规模(比如 2013 年的 Word2Vec)。
现在的大模型呢?
- 词表大小(行数):通常是 10万 到 25万 左右。
- 维度大小(列数):通常是 4096 到 12288 左右。
我们拿一个中等偏上的大模型(比如 Llama 3 或早期版本的 GPT-3)来算算:
假设词表有 128,000 行(包含各种语言、代码、符号),维度是 8192 列。
这个矩阵包含的数字个数是:128 , 000 × 8 , 192 ≈ 10.48 128,000 \times 8,192 \approx 10.48128,000×8,192≈10.48亿。
10亿个参数!
仅仅是为了“把词变成向量”这一个步骤,这个矩阵里就装了 10 亿个需要训练的数字。如果每个数字用 16 位浮点数(FP16)存储,光是这一个查表矩阵,就要占用约 2 GB的显存。这也就是为什么大模型动不动就几十上百 GB,因为底层全是这种巨大的矩阵堆出来的。
2. 世界上词这么多(代码、火星文、拼写错误),怎么塞进词表?
你提到“代码有很多行”,这是个极其核心的问题。人类语言是无止境的,每天都在造新词(比如“绝绝子”、“栓Q”),代码变量名更是千奇百怪(比如getUserInfoById)。如果要把世界上所有的词和代码都塞进词表,那行数得几千万,矩阵会大到根本算不动。
怎么解决?秘诀就是:不再以“词”为单位,而是以“子词(Subword)”为单位。
现在的大模型(包括 GPT 系列、豆包等)普遍使用一种叫BPE(Byte-Pair Encoding,字节对编码)的算法来构建词表。
通俗解释 BPE 怎么干活的:
- 化整为零:它不认完整的词,它认“词根”或“片段”。
- 比如
unbelievable(难以置信),它不会给这一个词一行,它会拆成un+believ+able三行。 - 比如代码
getUserName,它会被拆成get+User+Name。
- 比如
- 合并高频组合:如果在海量数据里,
get和User经常连在一起出现,它就会把这两合并成一个新行叫getUser。 - 终极兜底(字节级):如果遇到一个极其罕见的字、生僻字、甚至乱码,词表里实在没有办法怎么办?模型会退化成“字节(Byte)”级别。英语里的字母、汉字的一个偏旁部首、甚至一个表情包的编码,都可以被拆成一个个单字节。总共就 256 个基础字节,任何火星文都能被拆开。
好处是什么?
- 词表大小可以死死控制在 10万~15万 行左右,矩阵不会无限膨胀。
- 模型变得极其强大:即便遇到从来没见过的代码变量名(比如
var_abc_123),模型也能通过认识var、abc、123这些碎片,拼凑出它的意思。
3. 大模型除了这个矩阵,还有别的参数吗?
有,而且词嵌入矩阵只是冰山一角。
用个比喻,大模型就像一座工厂:
- 词嵌入矩阵(Embedding Matrix):就是工厂大门口的“收货单翻译机”。它负责把人类输入的词(查表变成向量),翻译成内部工人听得懂的“数学语言”。
- Transformer 网络(核心大脑):词向量进入工厂后,会经过几十层甚至上百层的复杂加工流水线。这流水线里的每一个螺丝钉、齿轮(权重),都是参数。这部分叫“注意力机制(Attention)”和“前馈网络(FFN)”。
- 输出层(LM Head):干完活了,最后要把数学向量再变回人类词汇。这个输出层通常和词嵌入矩阵一样大(或者直接共用同一个矩阵)。
在一个 100 亿参数的大模型里,词嵌入矩阵可能只占了几亿参数,绝大多数的参数都集中在中间那几十层的大脑网络里。
五、如果想修改 人物档案 在词嵌入矩阵里每一列权重,是不是就给就喂包含人物档案的句子训练
一、纠正误区:输入多次特定句子,这个词的权重就能“完美”吗?
答案是:不能,而且千万不能这么干。
为什么?
过拟合(Overfitting)的灾难:
如果你只给模型喂[我是人物的档案]这一句话,模型会变成一个“复读机”。它确实会把这个词的向量调到跟你这句话严丝合缝,但代价是:它把之前学的所有常识全忘了。这叫“灾难性遗忘”。就像你为了考好一门课,死记硬背背了一道题,换个参数就不会了。词向量表示的是“相对关系”,而不是“独立含义”:
还记得我们说的“苹果”和“香蕉”吗?向量里的数字,必须放在整个数学空间里看。如果你强行去修改“人物”这个词的某几列数字,它跟“任务”、“档案”在其他维度的距离就会乱了。权重是“被迫”改变的,不是“主动”改变的:
大模型在训练时,并不是针对某一个词去调它。它是根据一整句话预测下一个词。算出来的误差,会通过数学公式(反向传播)同时微调成千上万个词的权重。你输入的句子,只是推动庞大矩阵改变的一粒沙子。
二、词嵌入表 (Embedding) 的真相:大模型时代,它是“死”的
在早期的小模型(比如 Word2Vec)里,确实是“喂这个词的句子,这个词的列就变”。但现在的百亿、千亿参数大模型,几乎冻结了词嵌入表。
- 为什么?因为词嵌入表是通用底座。大模型在预训练时,已经读过几万亿个词了。它不需要你在微调的时候去教它“苹果”是什么意思。
- 真正在变的是什么?是后面那几十层极其复杂的 Transformer 网络(那些巨大的矩阵乘法和注意力机制)。
- 打个比方:词嵌入表是字典,后面的大脑是阅读理解能力。
你想让模型学会“做任务”,不是去修改字典里“任务”这两个字的定义,而是去训练它的大脑,让它知道当“任务”和“档案”连在一起时,该怎么推理、怎么输出。
总结你的想法:
- 你想要的:想要哪个词好,就去喂哪个词的句子,改那个词在表里的数字。
- 现实是:
- 词嵌入表通常不动(是死字典)。
- 真正改变的是“大脑(Transformer层)的思考方式”。
训练不是针对单个词,而是针对上下文逻辑。你喂 100 遍“人物档案”,不如喂 100 种“人物档案”在不同场景下的对话,让大脑学会举一反三。
如果你想真的去“调”某个特定词的权重,或者让它记住特定的知识(比如公司内部的专有名词),现在业界有更高级的办法:
- 继续预训练(Continue Pre-training):往那个巨大的 10 亿参数的 Embedding 表里,硬塞进去一批你们公司的专属词汇。
- 微调(SFT):不动词表,只疯狂训练后面的网络大脑,让它学会“看到这批词,应该输出什么样的特定格式”。
- RAG(检索增强生成):这是现在最火的。根本不改模型权重,而是建一个外部资料库。当你问“人物档案”时,模型先去资料库里把相关的文档搜出来,然后连同你的问题一起塞给大脑去读。相当于不背字典了,直接开卷考试。
现在的重点是:大模型是通过海量的“上下文”,在调整大脑的脑回路,而不是在死磕字典里的单字。
六、transformer网络和深度学习训练调整每个词的列权重有啥区别
深度学习调整“词的列”(Embedding 表):
就像是我们之前说的,那个10万行 × 4096列的矩阵。在预训练阶段,它是通过预测下一个词慢慢“学”出来的。学完之后,它基本就固定了。
在这个表里,“苹果”这个词对应的向量是唯一的、静态的。不管你说“我吃了一个苹果”还是“我买了个苹果手机”,查出来的“苹果”向量一模一样。Transformer 网络调整权重(注意力机制):
Transformer 根本不关心字典里“苹果”的初始向量是什么样,它关心的是**“苹果”跟周围词的关系**。
Transformer 里面的“权重(Weight)”是几万个矩阵乘法里的数字。它通过学习语法规律、逻辑关系、上下文搭配,来调整词与词之间的融合方式。
通俗比喻:
- Embedding 表:是《新华字典》。你查“苹果”,字典告诉你它长什么样,无论在哪句话里,定义不变。
- Transformer 网络:是《阅读理解大师》。它拿到字典里的解释后,结合上下文告诉你:“在这个句子里,‘苹果’指的是一部手机,不是水果。”
七、transformer怎么拿到Embedding表里向量变成几乎准确的词向量处理的(必须搞定原来自注意力机制原理,这里粗略介绍一下)
这就涉及到大模型中最伟大的发明:自注意力机制(Self-Attention)。
我们拿一句话举例:“苹果真好吃,我买了两斤。”和“苹果发布会开了,我买了两台。”
这两句话里都有“苹果”,但意思完全不同。Transformer 是怎么处理的?
第一步:查表得到“初始向量”(粗糙版)
通过 Embedding 查表,“苹果”在第一句话和第二句话里,拿到的初始向量是完全一样的。此时它是“瞎”的,不知道自己 是水果还是手机。
第二步:Transformer 的魔法——“左顾右盼”(自注意力机制)
Transformer 会让句子里的每一个词,都去“看”句子里的其他词。
- 在“苹果真好吃”里:Transformer 算出来,“苹果”跟“好吃”、“吃”的关联度极高。
- 在“苹果发布会”里:Transformer 算出来,“苹果”跟“发布会”、“买”的关联度极高。
第三步:融合与更新(产生“上下文向量”)
这就是最核心的一步!Transformer 会根据刚才算出来的关联度,把周围词的信息“揉”进“苹果”的向量里。
- 第一句话里的“苹果”向量,混合了大量“好吃、甜、水果”的特征。
- 第二句话里的“苹果”向量,混合了大量“科技、手机、贵”的特征。
此时,“苹果”不再是字典里那个固定的初始向量了,它变成了一个**“根据上下文动态生成的、极度精准的高级向量”**。
这个带有上下文的新向量,再被送进更深层的网络(比如几十层 Transformer),不断重复“左顾右盼”和“融合”的过程。越往后,词向量的含义就越精准、越抽象。
第四步:输出预测(变成人类语言)
当这个极其精准的向量被计算到最后,模型会通过最后一层(通常和 Embedding 矩阵共享权重),去计算词表里 10 万个词的概率。
比如算出来:下一个词是“手机”的概率是 90%,是“香蕉”的概率是 0.01%。
机器选概率最大的那个输出。
八、查Embedding表,这里每列是不是通过深度学习训练出来的。后面tranformer就用不到深度学习了,调Embedding表这里已经几乎固定列的权重了
一、查嵌入(Embedding)表,每列确实是深度学习训练出来的吗?
是的,百分之百是训练出来的。
- 怎么训练的?在最开始(预训练之前),这个
10万行 × 4096列的矩阵里的数字,全是随机生成的乱码。 - 随着模型阅读海量的文本(比如几万亿个词),它不断做“预测下一个词”的练习。每次预测错了,反向传播算法(Backpropagation)就会顺着网线爬回来,微调这个矩阵里的数字。
- 比如,为了让“吃”和“苹果”在预测任务中配合得更好,算法会把“苹果”向量里的某几个数字调大,把另外几个数字调小。经过千锤百炼,这些列上的数字才变得有意义(比如呈现出水果、科技等语义)。这就是标准的深度学习过程。
二、后面 Transformer 就用不到、也不调这里的权重了吗?
完全正确!在业界,这叫“冻结(Freeze)词嵌入层”。
在大模型的训练和微调(Fine-tuning)过程中,工程师通常会设定两个不同的“学习率(Learning Rate)”:
- Transformer 内部(大脑):学习率很高,每天都在疯狂调整。
- Embedding 层(查表层):学习率极低,甚至直接设为 0(完全冻结)。
为什么要这么做?
- 为了省钱省算力:那个嵌入矩阵动辄十亿参数,如果每算一句话都要去微调它,GPU 会直接冒烟。既然它已经把“词”翻译得很好了,就让它固定当个“字典”用。
- 为了防止遗忘:如果你频繁去改字典,模型很容易把以前学过的常识忘掉。维持字典稳定,模型的大脑(Transformer)才能专心学习复杂的逻辑和语法。
三、那在 Transformer 阶段,是怎么“用”这个固定向量的?
虽然 Transformer 不去改这些列的数字了,但它拿到这个固定的初始向量后,要做一件极其夸张的事情——“洗稿”。
你可以这样理解:
- Embedding 给你的是一堆“原材料”(比如:苹果 =
[0.1, 0.8, 0.2...],吃 =[0.9, 0.1, 0.5...])。这些原材料被固定死了。 - Transformer 是一个拥有几十层流水线的“超级加工厂”。它拿到原材料后,不需要改变原材料本身,而是通过几十层的矩阵乘法(Attention),把这些原材料混合、重组、投影到新的数学空间里。
- 在 Transformer 看来,“苹果”那个固定的 4096 维向量,只是它的“出生证明”。经过第一层 Transformer 后,它吸取了“吃”的信息;经过第五层后,它吸取了整句话的语气;经过最后一层后,它变成了一个全新的、带有整个句子语境的“超级向量”。
举个极其通俗的例子:
- Embedding(冻结的列):就像是给你发了一张身份证,上面写着你的身高、体重、性别。这个信息是你刚出生时就固定好的,不随环境改变。
- Transformer(动态处理):就是把你放进社会里。你今天去了医院(上下文是治病),你的状态向量就变成了“病人”;你明天去了酒吧(上下文是娱乐),你的状态向量就变成了“顾客”。你的身份证(Embedding)没变,但你在 Transformer 里的表现(向量表示)一直在变。
总结:
- Embedding 层:是用深度学习训练出来的“静态字典”。一旦训练好,在后续微调中基本就被“冻结”了(权重固定)。
- Transformer 层:是“动态加工厂”。它拿着固定的字典,根据句子的上下文,把这些词揉捏成极其精准的高级向量,然后去输出结果。