深度学习36:RNN前置知识:nlp名词看不懂

发布时间:2026/11/4 7:05:00
深度学习36:RNN前置知识:nlp名词看不懂

目录标题

      • 一、词转词向量
        • 第一步:分词、清洗和标准化(把句子切碎)
        • 第二步:构建词表 (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.1​0.10.10.50.9​0.10.20.10.8​0.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]
    它们的向量也极度相似,机器就知道它们都是能吃的水果。

更神奇的是,向量还能做数学运算(比如著名的例子):
“国王”的向量 - “男人”的向量 + “女人”的向量 ≈ “女王”的向量

二、嵌入表行数等于词表行数可以理解,但是列数怎么定

我们分两步来扒开这个“黑盒”:

  1. 列数(维度)是怎么定的? (人为设定的超参数)
  2. 机器怎么知道每一列填啥数字? (算法自己学出来的,这是核心! )
一、列数(维度)是怎么定的?依据是啥?

词向量的列数,在专业术语里叫“Embedding Dimension(嵌入维度)”。

  • 列数不是固定的,是人(工程师)拍脑袋设定的“超参数”。
  • 依据是什么?主要是“你要捕捉多少语义细节”和“你的算力/内存有多大”。

举个通俗的例子:如何给一个人写“人物档案”(词向量)?

  • 如果只给 2 列(2 维):你只能记录他的两个特征,比如[身高, 体重]。这就叫 2 维词向量。两个词如果身高体重差不多,机器就认为它们相似。
  • 如果给 10 列(10 维):你可以记录[身高, 体重, 年龄, 智商, 情商, 颜值, 财富, 幽默感, 运动能力, 饭量]。这就能区分得更细致了。
  • 如果给 300 列(300 维):早期的自然语言处理(比如 Word2Vec 算法),最常用的就是 300 维。这 300 列可能包含了 300 种人类难以直接命名的隐藏特征(比如:是否是有生命的、是否是动作、情感是正向还是负向等)。
  • 现在的超大模型(如 GPT-4、豆包):维度动辄4096 维、8192 维甚至上万维!因为大模型需要理解极其复杂的语法、逻辑、代码、多语言知识。

列数定太小:词与词之间容易“撞车”,分不清细微差别(比如分不清“喜欢”和“爱”)。
列数定太大:浪费算力,矩阵极度庞大,模型训练慢且容易“过拟合”。

所以,列数就是一个“筐”,你想装多细的信息,就定多大的筐。


二、机器怎么知道在这些列上填啥数字?(重点!就是深度学习训练)

这绝对不是人类工程师手动填进去的。你不可能去规定“第 1 列代表是否吃素,第 2 列代表颜色”。

这些数字是机器自己**“学”出来的,依靠的是一种叫做“反向传播(Backpropagation)”和“梯度下降”**的数学魔法。

通俗解释“机器怎么学”:

  1. 初始状态(瞎蒙):
    刚开始,词嵌入矩阵里的数字全是随机乱填的(比如标准正态分布)。
    此时,机器眼里的“苹果”可能就是[0.88, -0.12, 0.45, ...],毫无逻辑。
  2. 做填空题(训练任务):
    我们给机器几千万篇文章,让它玩一个游戏,比如**“预测下一个词”**(大模型就是这么练的)。
    输入:“我每天早上都要吃一个……”
    机器根据它乱填的矩阵,算了一下,预测下一个词是“轮胎”(错得离谱)。
  3. 老师打手板(计算误差):
    真实的答案是“苹果”。机器发现自己错了,产生了一个巨大的“误差(Loss)”。
  4. 调整数字(反向传播):
    这是最关键的一步。机器会回过头去,稍微修改(微调)矩阵里的数字。
    它发现,为了让预测变成“苹果”,可能需要把“苹果”这个向量里的某几个数字调大一点,把“吃”这个词的向量也调整一下,让它们俩在空间上的**“距离”更近**。
  5. 千锤百炼(迭代):
    把这个过程重复几十亿次!经过海量的数据“毒打”,矩阵里的数字越来越合理。
    • 原本随机乱填的数字,慢慢变成了能表达语义的向量。
    • “苹果”和“香蕉”的向量越来越像(因为它们经常出现在相似的上下文里,比如“吃___”)。
    • “苹果”和“手机”也会有一定相似性(因为都有苹果公司)。
三、那这些学出来的列,人类能看懂吗?

绝大多数情况下,人类看不懂。

大模型学出来的 4096 维,并不是我们想象中的:

  • 第 1 列 = 甜度
  • 第 2 列 = 圆润度

机器在 4096 维空间里,自己构建了一套极其复杂的“特征坐标系”。这些特征可能是人类语言根本无法描述的抽象概念组合。

但是!机器不需要人类看懂,它自己懂就行了。只要在这个高维数学空间里,“国王” - “男人” + “女人” 算出来的结果,最接近的那个词是“女王”,这就说明它学到了真理。

三、每一列可以看作深度学习的权重吗?(又解释一遍词转词向量)那输入tensor是啥,就是训练数据是啥,是[我是人物的档案,你的任务档案在哪]这里一句句话转成词向量吗?

一、完全可以这么理解,而且在底层代码里,它确确实实就是权重(Weight)。
  1. 词嵌入矩阵本身就是一个巨大的“权重矩阵”。
    在 PyTorch 里,定义一个词嵌入层其实就是在定义一个全连接层(或查表层)。
# 假设词表有 10000 个词,每个词用 300 维向量表示embedding_layer=torch.nn.Embedding(num_embeddings=10000,embedding_dim=300)

这里的10000 x 300矩阵里的每一个数字,都是可学习的参数(权重)。

  1. 一开始随机写:对,初始化时,机器就是在这个矩阵里随机生成一堆小数。

  2. 训练时调整:当你输入一句话,模型算出了误差(比如预测错了下一个词),反向传播(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. 机器看着[1, 2, 3, 4](我喜欢 吃 苹果),去查表变成向量,送进网络。
  2. 网络经过一顿复杂的数学运算(矩阵乘法、注意力机制等),开始预测下一个词。
  3. 机器预测的答案是:第 1 个位置它猜下一个词是“喜欢”;第 2 个位置猜下一个词是“吃”;第 3 个位置猜下一个词是“苹果”;第 4 个位置猜下一个词是“。”。
  4. 对比误差:机器把自己猜的,跟真实的目标标签(Target)对比。如果它把“苹果”后面猜成了“香蕉”,误差就很大。
  5. 反向传播:误差传回去,调整那个10000 x 300的Embedding 权重矩阵。让“苹果”的向量稍微向“吃”的向量靠近一点。
  6. 重复几万亿次。

四、那每个模型都是有词表,词表有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 怎么干活的:

  1. 化整为零:它不认完整的词,它认“词根”或“片段”。
    • 比如unbelievable(难以置信),它不会给这一个词一行,它会拆成un+believ+able三行。
    • 比如代码getUserName,它会被拆成get+User+Name。
  2. 合并高频组合:如果在海量数据里,get和User经常连在一起出现,它就会把这两合并成一个新行叫getUser。
  3. 终极兜底(字节级):如果遇到一个极其罕见的字、生僻字、甚至乱码,词表里实在没有办法怎么办?模型会退化成“字节(Byte)”级别。英语里的字母、汉字的一个偏旁部首、甚至一个表情包的编码,都可以被拆成一个个单字节。总共就 256 个基础字节,任何火星文都能被拆开。

好处是什么?

  • 词表大小可以死死控制在 10万~15万 行左右,矩阵不会无限膨胀。
  • 模型变得极其强大:即便遇到从来没见过的代码变量名(比如var_abc_123),模型也能通过认识var、abc、123这些碎片,拼凑出它的意思。

3. 大模型除了这个矩阵,还有别的参数吗?

有,而且词嵌入矩阵只是冰山一角。

用个比喻,大模型就像一座工厂:

  • 词嵌入矩阵(Embedding Matrix):就是工厂大门口的“收货单翻译机”。它负责把人类输入的词(查表变成向量),翻译成内部工人听得懂的“数学语言”。
  • Transformer 网络(核心大脑):词向量进入工厂后,会经过几十层甚至上百层的复杂加工流水线。这流水线里的每一个螺丝钉、齿轮(权重),都是参数。这部分叫“注意力机制(Attention)”和“前馈网络(FFN)”。
  • 输出层(LM Head):干完活了,最后要把数学向量再变回人类词汇。这个输出层通常和词嵌入矩阵一样大(或者直接共用同一个矩阵)。

在一个 100 亿参数的大模型里,词嵌入矩阵可能只占了几亿参数,绝大多数的参数都集中在中间那几十层的大脑网络里。

五、如果想修改 人物档案 在词嵌入矩阵里每一列权重,是不是就给就喂包含人物档案的句子训练

一、纠正误区:输入多次特定句子,这个词的权重就能“完美”吗?

答案是:不能,而且千万不能这么干。

为什么?

  1. 过拟合(Overfitting)的灾难:
    如果你只给模型喂[我是人物的档案]这一句话,模型会变成一个“复读机”。它确实会把这个词的向量调到跟你这句话严丝合缝,但代价是:它把之前学的所有常识全忘了。这叫“灾难性遗忘”。就像你为了考好一门课,死记硬背背了一道题,换个参数就不会了。

  2. 词向量表示的是“相对关系”,而不是“独立含义”:
    还记得我们说的“苹果”和“香蕉”吗?向量里的数字,必须放在整个数学空间里看。如果你强行去修改“人物”这个词的某几列数字,它跟“任务”、“档案”在其他维度的距离就会乱了。

  3. 权重是“被迫”改变的,不是“主动”改变的:
    大模型在训练时,并不是针对某一个词去调它。它是根据一整句话预测下一个词。算出来的误差,会通过数学公式(反向传播)同时微调成千上万个词的权重。你输入的句子,只是推动庞大矩阵改变的一粒沙子。


二、词嵌入表 (Embedding) 的真相:大模型时代,它是“死”的

在早期的小模型(比如 Word2Vec)里,确实是“喂这个词的句子,这个词的列就变”。但现在的百亿、千亿参数大模型,几乎冻结了词嵌入表。

  • 为什么?因为词嵌入表是通用底座。大模型在预训练时,已经读过几万亿个词了。它不需要你在微调的时候去教它“苹果”是什么意思。
  • 真正在变的是什么?是后面那几十层极其复杂的 Transformer 网络(那些巨大的矩阵乘法和注意力机制)。
  • 打个比方:词嵌入表是字典,后面的大脑是阅读理解能力。
    你想让模型学会“做任务”,不是去修改字典里“任务”这两个字的定义,而是去训练它的大脑,让它知道当“任务”和“档案”连在一起时,该怎么推理、怎么输出。

总结你的想法:
  • 你想要的:想要哪个词好,就去喂哪个词的句子,改那个词在表里的数字。
  • 现实是:
    1. 词嵌入表通常不动(是死字典)。
    2. 真正改变的是“大脑(Transformer层)的思考方式”。
    3. 训练不是针对单个词,而是针对上下文逻辑。你喂 100 遍“人物档案”,不如喂 100 种“人物档案”在不同场景下的对话,让大脑学会举一反三。

如果你想真的去“调”某个特定词的权重,或者让它记住特定的知识(比如公司内部的专有名词),现在业界有更高级的办法:

  1. 继续预训练(Continue Pre-training):往那个巨大的 10 亿参数的 Embedding 表里,硬塞进去一批你们公司的专属词汇。
  2. 微调(SFT):不动词表,只疯狂训练后面的网络大脑,让它学会“看到这批词,应该输出什么样的特定格式”。
  3. RAG(检索增强生成):这是现在最火的。根本不改模型权重,而是建一个外部资料库。当你问“人物档案”时,模型先去资料库里把相关的文档搜出来,然后连同你的问题一起塞给大脑去读。相当于不背字典了,直接开卷考试。

现在的重点是:大模型是通过海量的“上下文”,在调整大脑的脑回路,而不是在死磕字典里的单字。

六、transformer网络和深度学习训练调整每个词的列权重有啥区别

  1. 深度学习调整“词的列”(Embedding 表):
    就像是我们之前说的,那个10万行 × 4096列的矩阵。在预训练阶段,它是通过预测下一个词慢慢“学”出来的。学完之后,它基本就固定了。
    在这个表里,“苹果”这个词对应的向量是唯一的、静态的。不管你说“我吃了一个苹果”还是“我买了个苹果手机”,查出来的“苹果”向量一模一样。

  2. 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(完全冻结)。

为什么要这么做?

  1. 为了省钱省算力:那个嵌入矩阵动辄十亿参数,如果每算一句话都要去微调它,GPU 会直接冒烟。既然它已经把“词”翻译得很好了,就让它固定当个“字典”用。
  2. 为了防止遗忘:如果你频繁去改字典,模型很容易把以前学过的常识忘掉。维持字典稳定,模型的大脑(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 里的表现(向量表示)一直在变。

总结:
  1. Embedding 层:是用深度学习训练出来的“静态字典”。一旦训练好,在后续微调中基本就被“冻结”了(权重固定)。
  2. Transformer 层:是“动态加工厂”。它拿着固定的字典,根据句子的上下文,把这些词揉捏成极其精准的高级向量,然后去输出结果。