《Transformer通俗演绎:从“看不懂”到“原理如此”的逻辑通关指南》

259 阅读35分钟

作者是AI爱好者,在学习Transformer过程中发现绝大多数网上对Transformer的解读都会让我出现一种“只见树木,不见森林”的感觉。本文旨在帮助对 Transformer架构感兴趣的读者理解Transformer有什么作用以及为什么会有这种作用。本文只从理论和抽象逻辑上进行通俗化讲解,不涉及工程上的任何内容。

前言:必懂的数学概念(精简版)

Transformer中有几个高频的数学词汇,为降低读者阅读障碍,请先阅读前言中的数学概念。

1、向量

定义:向量是一组有序的数值,可理解为“带方向的数字列表”。例如:[0.8, -0.3, 1.2] 是一个3维向量,每个数字代表向量在对应维度上的“坐标”。

在Transformer中的作用:

每个Token(如“我”“吃”)会被转化为一个向量(如一个512维向量),称为“词嵌入向量”。向量的维度通过整体空间分布编码语义,而非单个维度对应特定属性,这些属性会通过训练编码到向量的各个维度中。 向量的核心特性是空间距离:语义相关的Token(如“猫”和“狗”)的向量在空间中距离更近,无关的Token(如“猫”与“白云”)距离更远。

  • 向量相加:将位置编码向量与词嵌入向量相加 (如)(如Embedding+Positional Encoding) ,本质是“将位置的顺序信息(第1个词、第2个词)融入语义表示”。

向量可通过加法、点积等操作捕捉语义关联(如“国王” - “男人” + “女人” ≈ “女王”)

  • 向量空间:文本中的每个词可以表示为高维向量(通过词嵌入)。这些向量共同构成了一个向量空间。在这个向量空间内可以用向量相似度计算两个词的距离,距离越近表示两个词越相关。

2、矩阵

定义:矩阵是一个二维的数值表格,由行和列组成,例如: 𝐴=[123456] , 𝐵=[123456] 。

其中每行可视为一个向量,如矩阵A的第一个向量(1 2 3),每列代表一个特征维度,如矩阵A的第一个特征(14) 。

基底:基底是表示矩阵的最小的单元,相当于初中的坐标系的X轴和Y轴。 ,𝑒1=[01],𝑒2=[10] 就是两个垂直方向的基底。多个互相垂直的基底叫做一组基底。

矩阵加法:

两个行数和列数分别相同的矩阵(即同型矩阵)可以相加,相加时只需将对应位置的元素分别相加,得到的结果仍是一个与原矩阵同型的矩阵。

如, 。

矩阵乘法:

若矩阵 有 个元素,矩阵 有 个元素,则 是 的矩阵,结果中的每个元素是 的行与 的列对应元素相乘后求和”。矩阵乘法的计算前提是第一个矩阵A的列数等于矩阵B的行数。

如, ,

如,设 , ,其中 与 为基底,

,则

上面公式代表着, 原本是一个以 为基底的矩阵,经过被A乘后,变成了以 与 为基底的矩阵了,而新的基底就是乘号前面的矩阵的列向量!这告诉我们矩阵的乘法的几何意义是右乘矩阵 (乘号右侧被乘的矩阵)变换了坐标系,而新的坐标系的基底就是左乘矩阵 (乘号左侧的矩阵) 的列向量。此时新基底与原基底的关系是 , ,意味着两个矩阵相乘的结果代表被乘的矩阵的基底变了,且这组新基底可以用原基底表示。如果原基底代表一定的物理意义或者隐性的特征的话,那么这组新基底就代表了每个坐标轴(每个坐标轴就是每个基底,这里指新基底)受多个物理意义共同影响的新坐标系。而在Transformer中,就是利用矩阵乘法这种“坐标系变换”的几何性质将上下文与当前字关联起来的。

其实为了举例方便,导致上面的例子对读者会产生一些误导,上面的CD是矩阵与向量的乘法,代表着对一个向量进行坐标系的转换。矩阵可以看做是一组向量,那么矩阵与矩阵的乘法就可以看做对一批向量进行坐标系转换,这批向量的新基底都相同,意味着这些向量被映射到了同一个坐标系下或者向量空间中。

3、损失函数与梯度:让模型学会语义的“纠错老师”

损失函数与梯度均是训练阶段使用的,所以需要先了解什么是训练。

什么是训练?

俗称喂数据。利用带有标签(可以理解成答案)的数据(可以理解成具有一问一答的问答的数据)对模型预先进行训练,让其通过训练中的数据学习到数据内部的相关规律,最终达到对未训练过的数据也可以生成答案的模型的方法。(就如同学生入学学习知识)

训练的本质目标是:让“上下文”与“目标词”的语义强关联,如果用向量去表示这种“语义强关联”的话意味上下文的向量与目标词的向量再逐轮的训练中是越来越相似,越来越靠近的。而训练完成之后模型不再更新参数,在接收数据生成答案的过程就是常说的部署后的推理阶段(就如同学生拿着校园知识毕业工作了)。

损失函数:

衡量模型的预测结果与真实答案之间的误差,误差越小代表模型在本数据集上的预测能力越好。(可能在未训练过的数据上存在过拟合问题,过拟合指的是只严格按照训练数据中学到的规则去预测未知领域的问题,如用小学的数学方法学习高等数学)

损失函数是多种多样的,Transformer论文中使用的是交叉熵损失函数。

,其中 是损失函数, 是真实结果, 是模型预测概率。

梯度:

梯度是损失函数对模型参数的导数(这个导数是有方向性的向量)。表示损失函数的值随参数变化的速率和方向。所以当模型因预测结果与真实结果不一致时,会给出损失函数的值与梯度的方向与模长后,更新权重矩阵中的参数用于缩小预测结果与真实结果之间的差距。

,其中W是权重矩阵,L是损失函数,得出的结果也是个矩阵,是损失函数对权重矩阵对应位置的偏导数。梯度矩阵中的每个参数就是梯度值,每个梯度一般都不相等。

新参数, ,其中 是学习率,是人工设置的超参数,通常为非常小的小数,如0.0001,学习率影响的是参数值更新的大小。

简单来说,梯度为正,参数减;梯度为负,参数加,加多少减多少就是参数更新的大小。这里面要注意一下,因为不同的参数矩阵中的参数的梯度是不同的,所以每个参数更新的大小也是不同的。

梯度用现实生活中理解就是我是从不觉得累的大力士想从山脚下上想以最快速度上山,而梯度就代表最快速度上山的那个山坡的坡度——最陡的。我只需要每走一段距离找到最陡的路我就能以最快的速度到达山顶。相反,沿着最缓的坡,也就是梯度相反的方向就是上山最慢的路线。在Transformer中,梯度的方向就是损失函数的增长方向,梯度的反方向就是损失函数下降最快的方向,所以大模型中我们要用梯度的反方向。

公式可以自行略过,只需要明白损失函数是衡量预测结果与真实结果误差的函数,像是一个裁判。而梯度是教练员,它根据裁判的结果去训练运动员(模型中的参数),以便运动员在下次比赛中得到一个好成绩。在模型里这个“好成绩”的理想期望就是预测的结果等于真实结果。这里的运动员比赛——结果——根据结果训练的过程就是模型在训练阶段每一次参数更新的全过程。

在训练后词的属性(例如人类在谈到沙发这个词时,背后代表着家具、价格、舒适、可以坐、可以躺的含义,这些含义叫做属性)与向量维度之间形成多对多映射关系,如:家具属性与舒适属性,这两个属性可能存在于向量的一个维度中,且家具属性也可能被编码到两个维度中,即和两个维度有关系。下面介绍一下这种多对多的关系是如何形成的。

训练的本质是通过数据驱动模型自动调整参数,使模型能够正确预测。训练的目的之一,让模型的词向量的维度与属性建立关联。

  1. 训练前的初始状态: 词向量的维度在初始时是随机初始化的,未预设任何语义关联(而非 “无任何意义”)。此时,维度只是独立的数值维度,与现实中的属性(如 “动物”“物体”)之间没有人为定义的映射关系。
  2. 训练如何建立维度与属性的关系: 以分类模型(判断输入是否为 “动物”)为例:
  • 当输入 “桌子”“椅子” 等非动物词汇时,若模型预测错误,反向传播会调整词向量参数(即维度的数值)和模型其他参数(如前馈神经网络的权重)调整。
  • 关键是词向量的维度通过训练学会 “协同编码属性”:
  • 假设 “动物” 属性需要 “有生命”“能运动”“有感官” 等特征,这些特征不会由单一维度独立表示,而是由多个维度的数值组合来编码(例如:维度 1 表示 “是否生物”,维度 5 表示 “是否能移动”,维度 10 表示 “是否有感官”)。
  • 训练中,模型通过调整这些维度的数值,使 “猫”“狗” 等动物词汇的对应维度组合趋近(形成 “动物簇”),而 “桌子”“椅子” 的维度组合在这些属性上呈现不同数值(形成 “物体簇”)。

模型在训练时,通过梯度下降让同类词(如动物)的词向量在多个维度上形成相似的数值模式(如维度A高、维度B低),形成‘向量簇’;当学习新类别(如桌椅)时,模型会让新类词的词向量在这些维度上形成相反或不同的模式,同时允许已学词向量轻微调整,以强化类别间的区分。最终,每个属性(如‘动物’‘家具’)由多个维度的模式组合表示,而每个维度的模式会被多个属性的组合共享(如维度A同时用于判断‘动物’和‘生物’),从而形成‘属性与维度多对多’的关系。”这种词向量属性与维度的多对多的关系是模型在推理阶段理解语义的基础。


以《Attention is all you need》论文中的经典transformer为例。

《Attention is all you need》中Transformer架构图

Transformer模型最初的用途主要作为机器翻译使用。主要是通过预先训练的方式解决的问题是不定长度的序列-序列(字数不固定的输入内容-字数不固定的输出内容)的问题与并行计算速度问题。(计算速度是工程化内容,本文不做详细解释)

Transformer主体由编码器和解码器组成。编码器的作用是让模型更好的理解输入内容。解码器的作用是基于理解输入的内容基础上让模型依据已经输出的内容继续输出符合语义关系的下一个字。

那问题来了,

1、编码器是如何理解输入内容的,它到底理解了什么?它内部是怎么构成的,每个部分(简称组件)各自起到了什么样的作用以至于形成了这种“语义理解”的效果?

2、解码器是怎么基于编码器理解的内容就能生成符合语义关系的下一个字?

我们接下来将围绕以上两个问题,从模型输入、编码器、解码器、模型输出四个环节学习Transformer的原理。

一、模型输入:从文字到向量的第一步

咱们先从模型的输入讲起。模型接收的是词嵌入向量Embedding vector(简称词向量,Embedding )。 Transformer的原理是通过向量相似性将输入映射(映射可以理解成对应)到向量空间中,通过计算向量空间中的向量相似性来提取特征,所以Transformer的第一步是将输入内容转化成向量。

1、什么是Token?

Token 是词汇表中的基本单元,可以是单个字、词或子词。拿中文为例,“我”是一个token,“我们”也是一个token,简单理解就是Token是单个的一个字或一个词。词表是所有字词形成的表格(每个字词在词表里用Token表示)。我们向模型输入的文字会转化为Token,Token可能是字词、也可能是数字。但不论是那种形式都与输入的文字一一对应。

2、词嵌入向量:文字的“数字化身”

用户输入文字时先进行分词,将分词后的每个词找到对应的Token,将Token转换成向量,这个向量就叫做词向量。例如,用户输入“我”,对应的词向量可能是(0 1 2 3 4 5 6 7 8 9 10),维度一般有很多,例如512个维度,简称512维。

技术小贴士:每个维度并不单独代表某个属性,而是通过整体向量的空间位置编码语义(如‘猫’和‘狗’的向量在高维空间中距离近)”

词嵌入向量的作用:

  • 把Token转换成向量;
  • 让向量具有语言意义(字本身的字面意义)

语言博大精深,每个字词都有其本身的含义,以“我草”为例,字面意义就是骂人。但当与具体语境结合时会产生其他含义,如当我看到一个美景时,我会喊:我草,太美了。此时“我草”代表的是感叹。而这种结合具体语境衍生出来的意义叫语境意义。如果说想让模型能理解语言,就首先要知道每个字的字面意义,然后再知道每个字的语境意义。而词嵌入向量的作用就是让向量具有字面意义,而后面讲到的编码器与其内部的注意力模块解决的就是让向量具有语境意义。

那么词嵌入向量是如何知道字面意义的呢?

答案就是通过训练。词嵌入向量的每个维度通过训练数据与梯度训练算法的作用下自动学习语义特征,也叫隐性特征,这种隐性特征指的是非人工指定具体特征,特征可以理解成属性,如身高、体重,是否是男性。不同的训练数据在训练时会对不同维度的梯度产生影响,受影响效果最大的维度自然就被动赋予了影响量的特征。这些特征以向量的形式组合在一起,代表的就是这个字的字面意义。这种字面意义本质上来说是在向量空间中与其他的字形成距离关系形成的。

模型在得到输入后是将所有内容一起并行给到模型,所以模型是不知道哪个字在前哪个字在后。所以需要模型还需要一个位置信息,否则无法区分“我吃饭”与“饭吃我”的区别。

3、位置编码:告诉模型“谁先谁后”

在 Transformer 模型中,自注意力机制(Self-Attention)本身不具有序列顺序感知能力,它平等地处理输入序列中的每个 Token(如单词),无法区分 “我吃饭” 和 “饭吃我” 这样的顺序差异。因此,需要将位置信息(Token 在序列中的顺序)编码到模型中,让模型能够捕捉 Token 之间的位置关系。

对于位置 和维度 (从 0 开始,维度总长度为 )

参数说明:

  • :位置(如句子中单词的位置,从 0 开始)。
  • :维度索引(偶数位置的数据用正弦计算位置编码,奇数位置的数据用余弦公式计算位置编码)。
  • :模型的隐藏层维度(如 512、1024 等)。
  • 10000:固定比例因子,控制频率的范围。

词向量与位置向量计算规则:两个向量维度相同,对应维度的值求和,形成一个维度不变的新向量。

小结:

词嵌入(把单词转换成数字向量的技术)就像给每个单词编了一个 “初始密码”,每个维度(密码中的一位数字)代表某种潜在含义,比如:

  • 有的维度可能代表 “是不是动物”,
  • 有的维度可能代表 “是褒义还是贬义”, 这些含义是模型提前学好的 “固定密码本”,但还没考虑单词在句子中的上下文(比如 “我草” 单独出现时,没有包含如我看到美景时的“我草”)。

“语义理解”说白了要做两个事儿,就是在指定的语境下结合文字字面含义去生成内容。理解的“语义”是什么?就是要让模型既能区分出每个汉字的字面意义,又能结合语境知道这个语境下这个字什么意思。刚才我们解决了模型区分出汉字字面含义的问题,下面看编码器是如何解决语境意义的。

二、编码器:从“看单个字”到“懂上下文”

上面的“词嵌入向量”解决的是模型“看懂单个字”的问题,而编码器解决的是模型“看懂上下文”的问题,以便让模型理解语义。

编码器是什么?编码器负责对输入序列进行编码,将输入的文本转换为一系列的向量表示。在编码过程中,模型会为每个输入位置生成多个向量表示,其中包括 Key 向量和 Value 向量。这些向量是通过线性变换得到的,具体来说,输入序列经过嵌入层转换为词嵌入向量后,会分别与三个不同的权重矩阵相乘,得到 Query、Key 和 Value 矩阵。

编码器有哪些部分构成?编码器由多层堆叠而成,每层主要由自注意力模块与前馈神经网络(FFN)组成。

编码器的作用:将输入序列(输入内容)的信息及其内部关系,转化为一组连续的、携带上下文关系的向量。

在《Attention Is All You Need》中Transformer中有6个编码器,每一个编码器有8个自注意力模块(多头自注意力),每个头独立计算注意力分数,然后拼接成一个向量输出给下一个编码器。前一个编码器的输出传到下一个编码器,即串行连接。每个编码器由多头注意力层与前馈神经网络层组成。

那编码器究竟怎么携带上下文关系的,上下文关系具体指的是什么?

1、自注意力机制(Self-Attention):聚焦“相关”字

自注意力机制是注意力机制的一种特殊形式,这里的“自”指的是输入的向量均来自同一个序列。作用是处理序列内部元素之间的依赖关系。这种依赖关系用向量相似性去表示,即向量相似度越高二者间的依赖关系越强,代表越关注。而Transformer中的注意力机制采用向量相似性中的一种计算方式——点积相似性。

注意力机制需要分三步计算:

第一步:生成Q、K、V矩阵

, 其中 (Query的权重矩阵), 查询(Query)矩阵,负责查询;

,其中 (Key的权重矩阵), 键(Key)矩阵,负责索引;

,其中 (Value的权重矩阵), 值(Value)矩阵,负责取值。

第二步:计算注意力分数并归一化

(Q是, 是K矩阵的转置,只是矩阵运算规则导致需要将其进行转置,不影响对注意力分数作用的理解),这就是点积相似度

输出概率: ,点积相似度。( 为 Key 向量维度)

第三步:求和,得到每个Token的输出。

Query 矩阵:在编码器的自注意力机制中,Query 矩阵的作用是为每个输入位置(输入的Token)生成一个查询向量,用于在同一输入序列(内容)中查找与之相关的信息。

Key 矩阵:为注意力机制提供用于匹配的特征信息。在解码器进行解码时,会根据当前生成的部分内容生成 Query 向量,然后通过计算 Query 向量与 Key 矩阵中每个向量的相似度,来确定输入序列中哪些位置与当前生成状态最相关。因此,Key 矩阵需要包含输入序列中每个位置的特征信息,以便进行有效的匹配。

Value 矩阵:Value 矩阵则是用来存储输入序列中每个位置的语义信息。当解码器确定了输入序列中与当前生成状态最相关的位置后,会根据这些位置对应的 Value 向量来生成下一个词。因此,Value 矩阵需要存储对应位置的语义信息,以便解码器能够准确地生成与输入语义一致的内容。

这三个矩阵为什么会有 这样的作用?注意力分数有什么用?和语境意义有什么关系?

训练阶段: 矩阵、 、 是模型参数,初始随机,训练时通过梯度下降算法模型自动修改参数。

前面在【矩阵乘法】章节中介绍过矩阵阵相乘的本质是变换了坐标系,变换后的坐标系可以被原坐标系表示,简单理解成在向量空间中旋转了矩阵坐标系。所以让其发生了维度的隐形特征转换。编码器的注意力机制的输出Z就存在于这个旋转后的坐标系中。这个坐标系本身是原坐标系的线性转换。例如新的X轴=0.8×原X轴+0.1×原Y轴。而模型通过之前的训练已经对现在的坐标系进行了隐形特征的学习(逻辑上是定义,实际上就是通过向量空间距离进行了分类),正是由于这种隐形特征的转换——让新坐标系=原坐标系的线性组合,即新的X轴=0.8×原X轴+0.1×原Y轴。这种矩阵乘法让编码器的自注意力模块的输出具备了上下文语义,也就是语境意义。

那么注意力模块是的理解“语境意义”的能力是如何获得的呢?

这种理解“语境意义”的能力是通过训练获得的。

训练具体的逻辑链条为:损失函数→参数更新→Q、K、V语义化。根据随机初始的权重矩阵 、 、 ,得到的Q、K、V也是随机初始化的向量,所以此时的 点积相似度无意义,不反映真实语义关系。如在输入内容“猫在沙发上跑”中初始的“猫”的Q向量可能和“上”的K向量相似度更高,尽管语义无关。此时模型输出预测答案,并与真实标签进行对比,发现预测错误。损失函数(如交叉熵)告诉模型“预测错了,调整 、 、 。调整的方式是按照损失函数的梯度的反方向(梯度下降)调整 权重矩阵 、 、 中的参数,使正确Token的点积更高,错误Token的点积更低,最终Q、K、V能捕捉真实语义关联,即训练后的注意力权重矩阵 、 、 使得 Q、K 向量能够编码语义相关的特征(如句法角色、上下文依赖),从而在点积运算中体现语义关联。

每个权重矩阵将输入向量的原始基底(如词嵌入维度)变换为新基底,使得新空间的每个维度包含了多个原始特征的混合信息。

  • 最终输出是值向量 V 的加权和,其中权重来自 Q 和 K 的相似度。
  • 关键:由于 (V = XW^V),而 (W^V) 同样是基底变换矩阵,因此聚合后的向量每个维度都包含了上下文相关的混合特征。

推理阶段:注意力权重矩阵的参数固定不变。

所以注意力机制中的权重矩阵会导致同一个词在不同语境下的(不同语境指的是不同的上下文)表示不同的含义(因为这个词的向量本身在融合了其所在的上下文信息),代表了模型提取了语义特征。这就是模型的“语义理解”能力。

技术小贴士:实际中属性与向量维度之间的多对多映射关系,如:性别属性与是否是人属性,这两个属性可能存在于向量的同一,且性别属性也可能被编码到两个维度中,即性别属性可能与两个维度有关系。

以“猫在沙发上跑”为例,注意力模块最后输出的“猫”的向量,不仅保留了“猫”这个物体的本身含义,还增强了其在特定上下文中的角色信息(如位置、动作等)。可以理解为:“猫”的语义是“本体”,注意力让它“看到”了周围的词(如“沙发”“跑”),从而形成“在沙发上跑的猫”的具体表示。这个就是前面所说的语境意义。

1.1 多头注意力(Multi-Head Attention):从多个视角看输入

设计:8个独立的“头”并行(同时)计算注意力,每个头学习不同的语义关系(如语法结构、实体关联)。

那为什么每个头会学习不同的语义关系呢或者说为什么每个头会关注输入内容的不同角度呢?为什么需要这么多“头”关注去学习语义关系,一个头学不过来吗?

• 流程:

  1. 每个头与不同的参数矩阵相乘生成独立的Q/K/V,计算注意力输出;

  2. 拼接所有头的输出,通过线性层映射回模型维度。

• 优势:类比“多人从不同角度观察同一美女,有的看腿有的看脸,有的看侧脸”,多头能捕捉更丰富的上下文(如某头关注“主谓宾”,另一头关注“时间-地点”)。

几何视角:多头注意力相当于同时在多个新坐标系下表示向量,然后融合这些表示,捕获更复杂的特征交互。

小贴士:为了把读者的重点放于对模型整体的理解上,本文将略过残差与归一化这两个工程属性更重的部分。

2、前馈神经网络(FFN):放大关键特征

前馈神经网络(FFN):数据流向由输入层到隐藏层到输出层的网络结构。在《Attention is all you need》论文中Transformer架构采用的是两层全连接神经网络,两层神经网络间夹了一个Relu函数(Relu只是一个函数而已,无可训练的参数),

  • FFN公式: 。
  • Relu函数公式: ,输出0与x中的较大者。即输入正数时直接输出该数,输入负数时输出0。

Relu函数的作用:神经网络的设计思想,通过模拟神经元的模式去创造一个超级复杂函数,这个复杂函数能模拟生活中的所有问题的函数从而模拟世界。而生活中的各种事物与事件都具有非线性的特点,所以需要在神经网络中加入非线性元素,而在 Transformer的设计思想中 Relu函数的存在意义就是增加模型的非线性的模拟能力。为什么加了Relu函数就可以增加模型非线性的捕捉能力,原因是Transformer本身就是多层的结构,每层与上一层的输出都构造了一个复合函数,越多层代表越复杂的复合函数。这样的复合函数就能模拟任意函数了。

而前馈神经网络(FFN)在其中起到的是放大特征的作用。通过FFN的第一层神经网络的高维矩阵把目标低维向量转化为高维向量,再通过RELU函数进行非线性转换,一是增强模型的非线性模拟能力,二是抑制FFN第一层输出的高维向量中的低相关维度,将其置0。然后把高相关传给FFN的第二层低维神经网络,通过高维度到低维度的向量转换,还原原向量维度(为了以后计算用),从而达到了非线性拟合能力与放大有效特征的目的。

前馈神经网络在此处相当于冶金中提纯的作用,将暗黄色的金矿石中的杂质去除,提炼成体积一样但内部蓬松的黄灿灿的金块,使特征更加明显。(内部蓬松是指无关特征清0了)

在经过以上一系列的语义特征提取,编码器输出含有语义特征的K、V向量,用于解码器调用。

3、小结

模型在训练过程中,通过计算多个向量之间的相似性(注意力分数),挖掘出组成向量的各个维度之间的关系。这些维度承载着语义、语法等信息。模型基于向量相似性发现维度间的关联,进而理解不同向量所代表元素之间的语义关系,实现对语言或数据的语义理解 。

编码器通过计算向量间的相似性(注意力分数),动态学习不同 Token(如字词)之间的语义依赖关系(例如 “猫” 与 “跑” 的动作关联)。向量的每个维度在训练中自动编码语义、语法等信息(如 “名词”“动词” 属性通过空间距离隐性表示),而注意力机制则通过调整 Q、K、V 矩阵的参数,让模型学会聚焦相关 Token(如 “跑” 的 Query 向量与 “猫” 的 Key 向量产生高相似度),最终构建能够捕捉上下文关联的语义空间。

三、解码器:基于已生成内容和问题理解,生成下一个字

解码器是什么?解码器的核心功能是根据编码器对输入序列的编码结果,以及已经生成的部分输出序列,逐词生成目标序列。例如在机器翻译任务中,编码器将源语言句子编码为向量表示,解码器则依据这些向量和已生成的译文片段,逐步生成完整的目标语言句子。

解码器由什么构成的?解码器由多层堆叠而成,每层包含掩码自注意力、交叉注意力、前馈神经网络FFN。

作用:解码器的主要作用是根据编码器对输入序列的编码信息和已经生成的部分目标序列,逐词生成完整的目标序列。在机器翻译任务中,解码器会根据编码器对源语言句子的编码,生成目标语言的翻译结果;在文本生成任务中,解码器会根据给定的上下文信息生成新的文本内容。

根据《《Attention is all you need》》论文中Transformer架构图来看,解码器也有个词向量的输入端。这里的输入在训练阶段与推理阶段不同。

  • 在训练阶段:在有监督学习中(SFT)中解码器输入端用于输入训练数据的真实标签。
  • 在推理阶段:解码器的输入端用于输入模型前面预测的内容,每次生成一个 Token 并作为下一次输入叫自回归。

1、掩码注意力(Masked Self-Attention):禁止“偷看未来”

解码器需要两种掩码确保生成逻辑正确:填充掩码(忽略无效填充)和未来掩码(禁止偷看未生成内容),二者共同控制注意力的可见范围。

• 为什么需要? 生成第t个字时,不能提前知道第t+1个字(如翻译时,不能提前知道后文)。

• 掩码矩阵:上三角矩阵,对角线以上置为 ,其余为0,确保第t步只能关注前t-1个字。注意力计算时加上掩码,使未来位置的注意力权重为0。

掩码类型:填充掩码与未来掩码

填充掩码:

为什么需要?

  • 场景:输入序列长度不一致(如句子有长有短),需用特殊符号(如)填充至固定长度。
  • 目的:告诉模型 “这些填充位置的 Token 没有实际语义,计算注意力时要忽略”。

对填充位置(如)生成值为-∞(或 0)的掩码,计算注意力分数时,将这些位置的分数置为无效。

未来掩码:

为什么需要?

  • 场景:解码器生成序列时(如翻译、文本生成),第t步只能看到前t-1步的输出(不能提前知道未来的 Token)。
  • 目的:确保生成过程是 “自回归” 的(每一步只依赖已生成的内容),符合人类语言生成逻辑(先说前半句,再说后半句)。

例如,3Token的掩码矩阵:

公式为:

2、交叉注意力(Cross-Attention):连接输入与输出

交叉注意力:解码器会“请教”编码器:“刚才输入的内容里,这个词对应的意思是什么?”比如生成中文“苹果”时,会参考编码器对英文“apple”的理解,确保生成的内容和输入语义一致。这里请教的意思是指用

• 输入:

◦ Query(Q)来自解码器当前层的输出。Query 矩阵的主要作用是代表解码器在生成当前Token时,所相关的上下文信息集合。在解码器的每运转一次,都会依据已经生成的部分内容生成一个 Query 向量。这个 Query 向量用于在编码器输出的 Key 矩阵里查找与之相关的信息。简单来说,Query 就像是一个 “查询请求”,它向编码器询问:“在输入序列中,哪些部分和我当前要生成的内容相关呢?

◦ Key(K)和Value(V)来自编码器的最终输出(即编码器对输入的整体理解)。

• 作用:解码器生成时,会用当前生成状态(Query)查询编码器对输入的整体编码(Key/Value),确保生成内容与输入语义一致(如英文‘run’对应中文‘跑’)”。

解码器会根据当下已经生成的部分内容算出 Query 向量,然后用这个 Query 向量去查询编码器输出的 Key 和 Value 矩阵。Key 矩阵包含了输入序列中每个位置的特征信息,Value 矩阵则存储了对应位置的语义信息。通过计算 Query 和 Key 之间的相似度,解码器能够明确输入序列里哪些部分和当前生成状态关联性最强,进而依据这些关联信息从 Value 矩阵中提取相关语义信息,最终生成和输入语义相符的词。

例如,解码“苹果”时,Q是解码器当前状态,K、V是编码器对英语“apple”的编码,使模型知道“这里该生成‘苹果’”。

3、解码器的前馈神经网络(FFN)

与编码器中的FFN作用相同。

四、模型输出:从向量到文字的“翻译”

1、线性层

Transformer解码器将输出传给线性层(全连接层)。 Transformer中的线性层的维度是词表维度,目的是为了计算词表中每个Token的相似度分数。

2、Softmax函数

将“相似度分数”转化为概率,计算出词表(Token表)中每一个Token的概率,选择概率最高的Token作为输出。

五、训练与推理:模型的“学习”与“工作”

1. 训练阶段:让参数“懂语义”

transformer通过损失函数中的梯度反向传播公式更新参数。

• 更新的参数:

所有可学习参数都会被更新,顺序由计算图依赖决定(非严格依次):

  1. 离输出最近的线性层、解码器FFN、注意力矩阵先接收梯度;

  2. 编码器的注意力矩阵、FFN、词嵌入矩阵后接收梯度(离输出最远)。

• 核心机制:

损失函数(如交叉熵)衡量预测与真实标签的差异,通过梯度下降反向传播,调整参数使正确Token的概率越来越高,最终Q、K、V矩阵能捕捉语义关联,词嵌入能编码有效语义。如前文中的例子:损失函数是衡量预测结果与真实结果误差的函数,像是一个裁判。而梯度是教练员,它根据裁判的结果去训练运动员(模型中的参数),以便运动员在下次比赛中得到一个好成绩。在模型里这个“好成绩”的理想期望就是预测的结果等于真实结果。这里的运动员比赛——结果——根据结果训练的过程就是模型在训练阶段每一次参数更新的全过程。

2. 推理阶段:用“懂语义的参数”生成内容

推理阶段:用户输入内容,将输入内容对应的Token向量化,加入位置信息后传给编码器,编码器按照训练阶段学习到的规律(各种语义关系)对新内容进行特征提取,解码器对内容进行预测。

• 参数固定,不再更新;

• 输入序列经编码器编码后,解码器逐Token生成:

  1. 先输入起始符号(代表开始),生成第一个字;

  2. 将已生成的字作为输入,递归生成下一个字,直到遇到结束符号(代表结束)。

线性层→解码器 FFN→解码器交叉注意力(仅 Q 矩阵)→解码器掩码自注意力→编码器 FFN→编码器自注意力→词向量。

总结:Transformer的核心魔法

  • 向量空间:将文字转化为高维向量,用空间距离表示语义关联;
  • 自注意力:动态计算“谁和谁相关”,捕捉上下文依赖;
  • 多头与FFN:多角度提取特征,增强非线性表达;
  • 训练驱动:通过梯度下降,让随机参数学会“理解”和“生成”。

声明:

1、本人只是AI原理爱好者不是从业者,难免在一些表述上存在不严谨的问题。如各位看官发现问题请明确指出来,咱是来者不拒,吸收并进。

2、为帮助读者聚焦各模块核心内容并形成模型整体认知,本文尽量不涉及数学公式的探究,以防干扰理解。例如,并没有探究“余弦位置编码采用对应维度数值相加后的结果为什么能被模型识别出位置信息”。

最后是写科普的一点心得,也同样分享给八方好汉。普通人学习任何事物首先要先知道这个东西是什么,有什么作用,为什么会有这种作用,然后把这种底层的东西抽象出更高维的逻辑表述,例如把登录验证码的接口逻辑抽象成“通过验证码防止账号盗用”的功能表述,这样才能让读者既见树木,又能理解森林。