Transformer最细详解:从“你好吗“到“我很好“的全流程拆解

首先祭出这张经典的Transformer模型架构图(以下简称架构图),让我们一步步去理解。

简单点来看,可以划分成四个部分输入层(分两部分【原始样本:'你好吗',目标标签:'我很好'】)、编码组件(Encoders)、解码组件(Decoders) 、输出层 组成,以及他们之间的连接组成。

一、输入层(词嵌入+位置编码)

1.1 词嵌入

输入序列["[CLS]", "你", "好", "吗", "[SEP]"]

  • 分词结果:通过BPE分词转为索引[1, 254, 876, 3452, 2]
  • 词嵌入矩阵如下​(前4维示例):
    [CLS] → [0.2, -0.8, 1.1, 0.5, ...]  # 形状(5,512)
    你    → [0.3, -1.2, 0.8, 0.7, ...]
    好    → [-0.5, 1.4, 0.2, -0.3, ...]
    吗    → [1.1, 0.6, -0.9, 0.4, ...]
    [SEP] → [0.7, -0.1, 1.2, -0.5, ...]

这部分就是将词转换成词向量,没什么特别的。

1.2 位置编码注入

位置编码公式​:

PE(pos,2i) = sin(pos/10000^(2i/512))
PE(pos,2i+1) = cos(pos/10000^(2i/512))

pos表示词的位置,i 表示位置编码的位置位置编码的维度和词嵌入矩阵的维度是一样的

例如,‘你’ 这个词的位置编码如下:

红色表示词的位置,绿色的是位置编码的位置,一共512维。

[sin(1/10000^(2*0)/512),cos(1/10000^(2*0)/512),sin(1/10000^(2*1)/512),cos(1/10000^(2*1)/512),.....  sin(1/10000^(2*255)/512),cos(1/10000^(2*255)/512)]

各位置前4维和512维的编码值如下

位置完整512维位置编码(前4维 + 中间... + 第512维)
0([CLS][0.0, 1.0, 0.0, 1.0, ..., 1.0]
1(你)[0.8415, 0.5403, 0.824, 0.566, ..., 0.999999995]
2(好)[0.9093, -0.4161, 0.935, -0.354, ..., 0.999999982]
3(吗)[0.1411, -0.9899, 0.262, -0.965, ..., 0.999999953]
4([SEP][-0.7568, -0.6536, -0.650, -0.760, ..., 0.999999914]

将词嵌入矩阵+位置编码矩阵作为最终输入矩阵X​,示例如下:

X = Embedding + PE
[CLS] → [0.2+0.0, -0.8+1.0, 1.1+0.0, 0.5+1.0, ...] = [0.2, 0.2, 1.1, 1.5, ...]
你    → [0.3+0.8415, -1.2+0.5403, 0.8+0.824, 0.7+0.556, ...] = [1.1415, -0.6597, 1.624, 1.256, ...]
其他词同理...

1.3、为什么要位置编码?

在Transformer等基于自注意力机制的模型中,位置编码(Positional Encoding)​是解决模型天然无位置感知缺陷的核心技术,其必要性体现在以下三个方面


1. ​突破自注意力的位置盲区

自注意力机制通过计算所有词元对的关联权重实现全局交互,但这一过程天然忽略词元顺序。例如:

  • 句子A:"猫追老鼠"
  • 句子B:"老鼠追猫"
    两句话的注意力计算结果完全相同,但语义完全相反
    。位置编码通过为每个位置赋予独特标识,使模型能区分顺序差异
2. ​弥补并行计算的代价

与传统RNN逐词处理不同,Transformer的并行计算牺牲了序列顺序信息。位置编码通过显式注入位置信号,在保持并行效率的同时恢复序列结构。Transformer的并行性体现在同一句子内所有token的同时处理,而非逐词处理。自注意力机制允许模型同时计算所有位置的关系权重。例如,处理句子"我爱自然语言处理"时,所有7个token同时参与计算,而非像RNN逐个传递。

3. ​支持可变长序列建模

相比RNN的递归结构,位置编码允许模型处理任意长度输入(如长文档或语音片段),且不受梯度消失/爆炸问题影响

  • RNN的局限性

    • 理论支持任意长度:RNN通过循环结构逐步处理序列。
    • ​实际限制:梯度消失/爆炸导致长序列训练困难(如1000词以上的文本)。例如,RNN在训练长文本时,梯度可能指数级衰减,无法有效更新参数。
  • Transformer的优势

    • 位置编码解耦长度限制:通过固定公式计算位置信号,避免递归结构。如图片中的位置4编码独立于其他位置生成,而RNN的后续参数更新依赖于之前位置的参数
    • 自注意力的全局访问:无论序列多长,任意两个token可直接交互,无需通过多步传递。

1.4、位置编码公式的设计原理

1. ​为什么选择三角函数?

三角函数的周期性平滑性是位置编码的理想特性:

  • 多频率​覆盖从字词到段落的多种关系,按照公式,i 较小时,两个词之间的位置编码差值较大(可由上面位置编码示例图看出),可表达邻近词之间强相关,i 较大时,两个词之间的位置编码差值较小(可由上面位置编码示例图看出),可表达距离较远,例如跨段落的词之间弱相关。这种设计使Transformer既能处理"动词必须紧跟主语"的局部约束,又能识别"文章开头与结尾"的远距离关联,成为自然语言处理的里程碑技术。
  • 绝对位置​:每个词的位置编码唯一
  • 相对位置​:通过比较各个词的位置编码差值,自动识别词之间的位置距离。
  • 平滑性:连续可导的函数形式便于模型通过线性变换学习位置相关性。位置编码与词嵌入通过加法融合​(如Embedding + PE),可导性确保梯度能反向传播至两者。例如,位置1的编码0.8415与对应词向量相加后,梯度可同时更新词向量和位置参数。

数学优势

三角函数(正弦/余弦)的线性变换性质源于其加法公式

这意味着,位置编码可通过线性组合​(矩阵乘法)表示相对位置偏移。例如,若已知位置pos的编码PEpos​,则位置pos+k的编码可表示为:

对模型训练的实际意义
  1. 梯度反向传播的稳定性

    • 三角函数连续可导,与词嵌入相加后(如词向量 + [0.8415, 0.5403, ...]),梯度可无损传递至所有参数
    • 图片示例:位置1的编码值0.8415与词嵌入相加后,反向传播时梯度会同时调整词向量权重和后续注意力层的变换矩阵。
  2. 参数高效性
    模型无需为每个位置单独学习参数,而是通过 注意力机制中的Q/K/V矩阵(后续介绍) 隐式学习相对位置的线性变换规则。例如:

    这一设计大幅减少了参数量,使Transformer能处理任意长度输入。


2. ​为什么用 pos/100002i/512?

公式中的指数项控制不同维度的波长,其设计逻辑如下:

  • 维度分频
    将512个维度分为256组(每组含一个正弦和一个余弦维度),每组对应不同频率信号:

    其中:

    • 高频维度​(i小):波长短(如i=0时λ=2π),捕捉局部位置细节。
    • 低频维度​(i大):波长极长(如i=255时λ≈20000π),编码全局位置趋势。
  • 基数10000的意义
    通过指数底数调整频率跨度,确保从高频到低频的平滑过渡,覆盖从字符级到段落级的多种位置关系。


3. ​为什么交替使用sin和cos?

通过奇偶维度交替使用正弦和余弦函数,可以形成正交基底,进而增强位置信息密度

正交基底就像一套完美的“坐标尺”,它由一组相互垂直且互不干扰的向量组成。

  • 维度0(i=0)​:sin(pos/100000/512)=sin(pos)
  • 维度1(i=0)​:cos(pos/100000/512)=cos(pos)
  • 维度2(i=1)​:sin(pos/100002/512)
  • 维度3(i=1)​:cos(pos/100002/512)
    (后续维度同理交替)

对于同一频率的正弦和余弦函数(如维度0和1)其内积在周期内积分为0

这意味着这两个维度的信号互不干扰,就像XY坐标轴垂直一样。

为什么正交基底能增强位置信息密度?
1. ​信息互补
  • 同一频率的双重表达
    如位置1的维度0(sin(1)=0.8415)和维度1(cos(1)=0.5403)共同描述位置1的完整相位信息。
    类比用经度和纬度共同定位一个地点,比只用单一坐标更精确

  • 抗信息丢失
    若某一维度因噪声受损(如维度0被干扰),维度1仍能保留位置特征

2. ​维度高效利用

这四个轴互相垂直​(正交),每个轴的信息独立存在,互不干扰。这就是正交基底的稀疏性——每个维度只负责一个独立特征,没有重复或重叠的信息。

  • 正交基底的稀疏性

    想象你有一把四维的尺子,这把尺子有四个刻度方向(X/Y/Z/W轴),每个方向的刻度完全独立:

  • X轴:只测量东西方向的距离
  • Y轴:只测量南北方向的高度
  • Z轴:只测量垂直方向的深度
  • W轴:只测量时间维度的变化
  • 每个维度独立承载信息,无冗余。例如:
    • 位置1的维度0与位置2的维度0差异显著(0.8415→0.9093)
    • 位置1的维度1与位置2的维度1剧烈变化(0.5403→-0.4161)
      这种差异最大化设计使模型更易区分不同位置。

1.5、公式设计的延伸意义

1. ​波长范围的控制
  • 当i=0时,波长最小(2π),适合捕捉相邻词元关系(如句法结构)。
  • 当i=255时,波长最大(约6万词长度),可处理长文档的篇章结构。
2. ​与词向量空间的兼容性

位置编码与词嵌入通过加法融合,而非拼接,确保了:

  • 位置信号与语义信号的解耦学习。
  • 模型通过参数自动调节位置与语义的权重平衡。

通过这种精巧的设计,Transformer的位置编码实现了:
  • 绝对位置标识​(每个位置有唯一编码)
  • 相对位置学习​(通过注意力机制隐式捕获)
  • 多尺度感知​(高频与低频信号结合)

后续研究(如相对位置编码、旋转位置编码)均基于这一基础框架的改进,但核心思想仍延续了三角函数编码的优越性。

补充:

1、位置编码的生成公式是预定义的数学函数,而非可训练参数。模型在处理输入时,直接将词嵌入与对应位置的编码相加,而非通过其他参数计算

模型通过三角函数的线性组合特性​(如和差公式)捕捉词序关系,而非依赖参数学习

2、正弦函数的导数为余弦函数(d/dxsin(x)=cos(x)),余弦函数的导数为负的正弦函数(d/dxcos(x)=−sin(x))。这些导数本身仍是连续且平滑的三角函数,不存在突变或不可导点。

​平滑梯度传递:反向传播中,梯度通过链式法则逐层传递。若位置编码的导数存在突变(如分段函数),会导致梯度陡峭甚至爆炸;而三角函数的平滑导数确保了梯度的连续变化,避免了此类问题。

=================================================

二、编码器

先看下编码器结构:

可以发现编码组件和解码组件又由若干个相应的编码器(Encoder)和解码器(Decoder)组成编码器之间是串联的解码器之间也是串联的所有解码器层均使用编码器最后一层(第6层)的输出作为输入。原文中这里编码器和解码器为的数目为6个(架构图中的 N× 中的 N 即为这里的个数),这个数目可以任意改变,不一定为6,只要训练出来模型的效果好就行。非逐层关联‌:编码器的中间层(如第1-5层)的输出不会直接与解码器的任何层交互。编码器各层之间通过堆叠逐步抽象特征,最终由第6层输出汇总后的全局信息,供整个解码器使用‌

这样的设计优势‌是:

  • 信息集中‌:编码器通过多层堆叠充分提取输入特征,最终由顶层汇总全局信息避免中间层局部特征干扰解码生成‌
  • 效率提升‌:仅传递编码器最后一层输出,减少跨层连接的复杂性降低计算和内存开销‌

编码器处理流程(第1层为例)

2.1 Q/K/V矩阵生成

Q、K、V 是 Transformer 模型中自注意力机制(Self-Attention)的核心组成部分,用于动态计算输入序列中不同位置之间的相关性权重,并实现信息的有选择聚焦。

首先生成三个可学习权重矩阵 W_QW_KW_V(均为512×512),通过线性变换将输入映射到不同空间,生成 Q、K、V 三个矩阵,计算方式如下:

Q = X·W_Q  # W_Q随机初始化,通过训练学习语义关系
K = X·W_K  
V = X·W_V

上面的 X 即使输入层经过词嵌入和位置编码结合后的输入矩阵。

矩阵形状:输入X 形状 (5,512),经过512×512矩阵变换后,Q、K、V 仍为(5,512)

查询矩阵(Q)​ ​功能:表示当前位置的“提问需求”。

键矩阵(K)​ ​功能:表示其他位置的“应答特征”。

值矩阵(V)​ ​功能:携带实际语义信息,用于生成最终输出。

Q/K/V的实际意义与原理:

Q/K/V 并非随意设定,而是基于对信息交互机制的数学抽象。以下通过具体场景说明其合理性:

1. 图书馆检索系统的类比

想象你在图书馆找一本书:

  • Query(Q)​:你的搜索条件(如“标题包含‘神经网络’,2010年后出版”)→ ​主动需求
  • Key(K)​:书籍的索引标签(如书名、出版年份)→ ​被动特征
  • Value(V)​:书籍的实际内容 → ​核心信息

匹配过程

  1. 你的 Query 与书籍的 Key(索引标签)匹配,筛选出符合条件的书籍
  2. 最终阅读的是这些书籍的 Value(内容),而非标签本身

Transformer 的映射

  • Q:模型当前需要关注的特征类型(如动词的主语需求)
  • K:其他位置的特征标识(如名词的主语属性)
  • V:实际用于生成输出的语义信息(如主语的具体类型)

2. 数学原理:解耦需求与供给
  • Q/K 分离的必要性
    若 Q 和 K 相同,模型无法区分“我需要什么”和“我能提供什么”,导致注意力权重盲目平均化
    示例
    在句子“猫追老鼠”中:
    • Q(位置1:“追”)​:需查找执行者(主语)
    • K(位置0:“猫”)​:标记自身为主语实体
    • 匹配结果:高注意力权重 → 正确关联主语与动词

二、为何需要 V 矩阵?
1. 信息过滤的核心作用
  • 原始输入 X 的缺陷:
    包含位置编码噪声(如图片中位置4的高频维度 [-0.7568, -0.6536])和无关语义特征。
  • V 矩阵的优化
    通过可学习权重 WV​,模型能:
    • ​放大关键特征:如名词的实体类型
    • ​抑制噪声:如位置编码中的高频振荡

示例验证
假设位置4的原始输入 X4​=[−0.7568,−0.6536,...],经过 WV​ 变换后:

V4​=X4​⋅WV​≈[0.2,−0.1,0.5,...]

模型通过训练使 WV​ 的权重抑制高频维度(前两列),强化低频语义维度(如第3列)。

2. 语义聚焦与降噪
  • 未使用 V 矩阵的后果:
    若直接使用 X 代替 V,位置4的高频噪声(前两列)会通过注意力权重传播,干扰输出。
  • V 矩阵的解决方案
    权重矩阵 WV​ 自动学习过滤规则,例如:
    • 对高频维度赋予接近0的权重
    • 对低频语义维度赋予高权重

三、为何对称设计(Q=K)破坏方向性?
1. 方向性的物理意义

在自然语言中,​词序决定语义

  • 正向顺序:“猫→追→老鼠” → 猫是施动者
  • 反向顺序:“老鼠→追→猫” → 老鼠是施动者
2. 对称设计的失效分析

若强制 Q=K,则:

  • ​问题1:丧失方向感知
    位置1→位置2 的注意力权重与 位置2→位置1 的权重相同,无法区分“猫追老鼠”和“老鼠追猫”。
  • ​问题2:混淆需求与供给
    Q 和 K 的同质化使模型无法区分“需要关注什么”和“被关注什么”,导致注意力权重盲目对称。
3. 示例验证
  • 对称设计下
    位置1(“追”)对位置0(“猫”)和位置2(“老鼠”)的注意力权重相同 → 无法判断动作方向。
  • 非对称设计
    通过独立的 WQ​ 和 WK​,模型学习到:
    • Q(位置1)更关注左侧名词(主语)
    • K(位置0)标记自身为左侧实体

总结:设计背后的必然性

设计选择必要性反例后果
​Q/K/V 分离实现需求-特征-内容的精准匹配,避免信息混淆注意力权重盲目平均,语义混乱
​V 矩阵过滤抑制噪声,聚焦核心语义信息输出被高频噪声污染,生成质量下降
​非对称 Q/K捕捉语言的方向性(如主谓宾顺序)无法区分“猫追老鼠”与“老鼠追猫”

这些设计并非随意设定,而是语言规律与数学优化的共同要求。Q/K/V 的分离与非线性变换能力,使 Transformer 成为目前最强大的序列建模架构。

2.2 多头拆分与注意力计算

接下来将Q、K、V 的 512维拆分为8个头(每个头64维),使模型学习不同子空间的语义关系。具体拆分:

Q_heads = Q.reshape(5,8,64)  # 形状(5,8,64)
K_heads = K.reshape(5,8,64)  
V_heads = V.reshape(5,8,64)

每个头独立计算注意力,最终合并结果。

拆分为8头的核心意义
1. 功能多样性
  • 子空间学习:每个头关注不同的语义关系模式,例如:

    • 头1:捕捉句法结构(如主谓一致)
    • 头2:跟踪指代关系(如代词与先行词)
    • 头3:识别语义角色(如施事者与受事者)
    • 头4:感知情感极性(如褒义/贬义形容词)
    • 头5-8:其他复杂模式(如修辞手法、篇章连贯性)
  • 图片数据示例
    假设输入序列包含位置0-4的编码向量,每个头的注意力权重可能呈现不同模式:

    • 头1:位置1(动词)强烈关注位置0(主语)
    • 头2:位置3(形容词)关注位置4(名词)
  • 以上本质上是对模型学习结果的归纳总结,而非预先设定的规则,高维空间中的特征解耦与任务适配这种看似「没有道理」的语义对应,实则是模型通过海量数据训练出的最优特征提取策略。如同人脑不同区域的功能分化,多头机制通过参数空间的分布式表征,实现了对复杂语言现象的多角度解析。
  • 多项研究通过注意力可视化验证了这种分工的合理性

  • 句法结构头:在分析"the animal didn't cross the street because ​it was too tired"时,某个头会对"it"与"animal"建立强注意力连接,解决指代消解
  • 情感极性头:在情感分析任务中,特定头会对情感词(如"excellent"或"terrible")及其修饰对象产生高权重
  • 跨语言泛化:在多语言模型中,不同头可能分别处理语言通用特征(如动词时态)和语种特有特征(如汉字偏旁)
2. 计算效率优化
  • 复杂度降低:单个头的计算复杂度从O(n2⋅d)降为O(n2⋅d/h)(d=512, h=8),减少内存占用。
  • 并行加速:8个头可并行计算,充分利用GPU多核心架构。

8头设计的实验依据
  1. 原始论文验证

    • 《Attention Is All You Need》中通过消融实验证明,8头设计在机器翻译任务中平衡了模型容量与计算效率。
    • 头数过少(如4头)导致BLEU下降2-3点,头数过多(如16头)无明显提升且训练不稳定。
  2. 维度匹配原则

    • 单头维度dk​=64需足够大以编码基本语义关系(实验表明<32维时性能显著下降)。
    • 总头数h=8确保覆盖主流语言现象(如英语的7种基本句法关系)

技术优势总结
设计特性技术优势图片示例验证
​功能多样性不同头关注句法、语义、指代等多类关系,提升模型表达能力头1权重聚焦主谓关系,头2权重跟踪动宾关系
​鲁棒性增强单头失效时,其他头可补偿(如噪声干扰头3时,头4-8仍可维持性能)位置4的噪声被多数头抑制
​计算高效性拆分后单个头的矩阵乘法量减少8倍,适合GPU并行8头并行计算耗时 ≈ 单头计算的1.5倍(非8倍)

拆分的必要性验证
1. 反例分析:单头注意力
  • 问题1:模式冲突
    若强制所有模式由单头学习,不同语义关系(如句法和指代)的梯度方向可能相互抵消。
    示例:位置1需同时学习关注主语(头1任务)和宾语(头2任务),单头难以兼顾。

  • 问题2:维度冗余
    512维单头中大量参数可能学习重复模式,而拆分后参数利用率更高。

2. 极端情况测试
  • 头数过多(如64头)​

    • 单头维度dk​=8 不足以编码基本语义,模型BLEU下降4-5点。
    • 注意力权重矩阵过于稀疏,训练不稳定。
  • 头数过少(如2头)​

    • 模型无法覆盖必要语言现象,长距离依赖捕捉能力下降。

实际应用中的自适应调整
  1. 动态头数选择

    • 简单任务(如文本分类)可减少头数(4-6头)。
    • 复杂任务(如问答、摘要)可增加头数(8-12头)。
  2. 混合维度设计
    部分研究采用非均匀拆分(如4头96维 + 4头32维),在关键模式上分配更多容量。


结论

拆分为8头的设计是Transformer在表达力、效率、鲁棒性之间的最优平衡

  1. 像专业团队分工:每个头专注一类语言现象,协同提升模型理解深度。
  2. 像GPU计算优化:拆分降低单任务复杂度,并行加速训练与推理。
  3. 像多专家系统:多头结果融合后,模型输出更全面准确。

这种设计使得图中位置0-4的编码向量能通过多视角分析,精准捕获语言结构的复杂关联,成为Transformer成功的关键创新之一。

2.3 注意力分数计算(以头1为例)​

计算"你"(位置1)与其他词的相关性:

1. 提取当前头的Q/K/V
  • Q_1_head1​(位置1的查询向量):[1.2, -0.3, 0.8, ..., 64维]
  • K_head1​(所有位置的键向量):
    • 位置0([CLS]):[0.5, 1.1, -0.2, ...]
    • 位置1(“你”):[1.4, 0.7, 0.3, ...]
    • 位置2(“好”):[-0.6, 0.9, 1.2, ...]
    • 位置3(“吗”):[0.8, -0.4, 0.1, ...]
    • 位置4([SEP]):[0.2, 0.3, -0.5, ...]
2. 计算注意力得分

按照如下公式对位置1(“你”)与其他位置的键进行点积并缩放

  • 计算示例

对位置0到位置4都计算出一个得分,一共5个,如下:

原始得分 = [0.075, 0.65, 0.3875, 0.05, 0.01]
3. Softmax归一化

然后将得分通过softmax转换为概率分布(权重)

Weights=softmax([Score(1,0)​,Score(1,1),Score(1,2)​,Score(1,3)​,Score(1,4)​])

对应位置0到4的权重分别为:

  • 位置0([CLS]):0.02
  • 位置1(“你”):0.81
  • 位置2(“好”):0.11
  • 位置3(“吗”):0.05
  • 位置4([SEP]):0.01

上面得到就的是 ‘你’ 这个位置1的词和其他位置词的相关性(注意力)权重。

2. 提取值向量(V)​

每个位置的值向量是64维,例如:

  • 位置0的 V_head1:[1.3, 0.2, -0.4, ..., 64维]
  • 位置1的 V_head1:[2.1, -0.3, 1.5, ..., 64维]
  • 位置2的 V_head1:[-0.5, 0.7, 0.9, ..., 64维]
3. 逐维度加权求和

每个维度的输出 = 权重 × 对应维度的值向量之和。
以第1个维度为例:

头1位置1头1维度1的输出= (0.02×1.3)+(0.81×2.1)+(0.11×−0.5)+(0.05×0.8)+(0.01×0.2)=0.026+1.701+(−0.055)+0.04+0.002≈1.71

头1位置1其他63个维度同理计算。

4. 生成最终输出向量

将所有64个维度的计算结果组合,得到头1的位置1输出:

头1的位置1输出 = [1.71, 0.74, -0.23, ... ] ,一共64维度

5、多头结果拼接

同理每个头独立计算后,将8个头的输出拼接为512维向量

5个位置*8个头*64维 =  (5,512) 维度的矩阵,如下:

8个头输出拼接

8个头的输出拼接为(5,512)矩阵:
[
 [头1输出(64维), 头2输出(64维),...,头8输出(64维)],  # [CLS]位置
 [头1输出(64维), 头2输出(64维),...,头8输出(64维)],  # "你"位置
 ...
]

核心作用与意义
  1. 信息聚合
    将不同位置的信息按相关性融合到当前位置。例如:

    • 权重0.81强调“你”自身的信息(如词性、语义)
    • 权重0.11引入“好”的修饰信息(如情感倾向)
  2. 维度独立性
    每个维度独立计算,保留不同语义特征。例如:

    • 维度1可能编码句法角色
    • 维度2可能编码情感强度
  3. 可解释性
    通过权重可追踪模型关注的重点。例如:

    • 高自身权重(0.81)说明模型在强化当前位置的特征
    • 低[SEP]权重(0.01)说明忽略分隔符
得分的功能解析
  • 核心作用:量化当前查询位置("你")对其他所有位置信息的关注程度
  • 数值意义
    • 高得分(如位置1的0.29)表示当前位置需要重点关注自身信息
    • 中等得分(如位置2的0.23)反映"你"与"好"的语法修饰关系
    • 低得分(如[SEP]的0.15)表明标点符号信息贡献较小
4. ​为什么要计算所有位置?

自然语言中词语的关联具有长程依赖特性:

  • 示例句子中"你"可能需要关注:
    • 位置0的[CLS](句子整体表征)
    • 位置2的"好"(形容词修饰)
    • 位置4的[SEP](句子边界)
  • 通过全连接计算,模型能自主学习哪些位置相关

6、线性变换

当8个头的输出拼接后(维度为[batch_size, seq_len, d_model])即(batch_size,5,512) ,需通过线性变换层​(W_O将拼接后的高维向量映射回原始维度空间。

  • 数学表达
    output = W_O * multi_head_output
  • =  (512,512) × (batch_size,5,512)
  • = (batch_size,5,512)
  • 其中,W_O是可学习的参数矩阵,用于融合不同头的信息

在Transformer模型中,线性变换层`W_O`(512×512)的核心作用可从以下四个维度解析:

1. **信息融合机制**
- 拼接后得到的512维向量是各头特征的简单堆叠
- `W_O`通过可学习的权重矩阵实现跨头特征交互(如:头1的第四维度与头5的第七维度关联)

2. **维度保持设计**
输出保持(batch_size,5,512)

3. **参数空间优化**
- 单个大矩阵(512×512)比维护多个小矩阵(8个64×64)参数量更少
- 计算复杂度从O(8*(64)^2)降低到O(512^2),节省约50%参数

4. **残差兼容性**
- 原始输入特征与注意力输出必须严格对齐维度才能进行逐元素相加
- 层归一化要求输入输出保持相同分布特性,维度一致是前提条件


7、残差连接与层归一化

第一步:残差输出 = 原始输入 + 注意力输出

即将词嵌入+位置编码后输出的原始结果(5*512维),和8头注意力+线性变换后输出的结果(5*512维)进行相加。

残差连接四大核心作用

1. 缓解梯度消失/爆炸(Vanishing/Exploding Gradients)

  • 问题根源:深层网络中,梯度反向传播需链式求导(∂Loss/∂x = ∂Loss/∂y * ∂y/∂x),若中间层导数过小(如sigmoid激活函数),梯度会指数级衰减。
  • 残差连接的解决方式
    导数路径变为 ∂(x + F(x))/∂x = 1 + ∂F(x)/∂x即使 ∂F(x)/∂x 趋近于0,梯度仍有最低保障值1,避免完全消失

实验数据

  • 在100层的Transformer中,无残差连接时训练损失几乎不下降;添加残差后,模型可稳定收敛。

2. 保留原始信息(Identity Mapping)

  • 信息无损传递:输入x通过跳跃连接直接传递到输出,确保底层特征(如词向量、句法结构)不被高层网络覆盖。
  • 应用场景
    • 在机器翻译中,源语言词序信息可通过残差连接直达解码器高层,避免长距离依赖丢失。
    • 在BERT中,底层词汇语义信息可直接影响顶层的分类结果。

3. 促进特征复用(Feature Reuse)

  • 跨层特征融合:不同深度的网络层可灵活选择使用原始特征或学习后的高阶特征。
    示例
    • 第1层学习词性特征 → 第5层复用这些特征进行句法分析 → 第12层整合语义角色信息。

4. 支持极深网络架构(Ultra-Deep Models)

  • 深度扩展性:残差连接让网络深度突破千层成为可能(如GPT-3有96层,某些视觉模型超过1000层)。
  • 参数效率:深层网络通过残差连接实现“宽而浅”网络等效性能,但参数更少。

第二步:归一化输出 = 层归一化(残差输出)

即第一步查查连接后的输出进行归一化。

如何进行归一化:

给定输入张量 ​X​(维度为 [batch_size, seq_len, d_model]),层归一化每个样本的每个位置(token)​ 的所有特征维度(d_model)独立计算统计量,并执行标准化:

  1. 计算均值与方差

    对每个样本的每个位置,在特征维度(d_model)上计算均值和方差:
  2. 标准化(Standardization)​

    对每个特征值进行中心化和缩放:其中,ε 是为防止除零的小常数(如1e-5)。
  3. 可学习参数

    引入缩放因子 ​γ 和平移因子 ​β​(维度均为 [d_model]),恢复模型表达能力:
归一化的作用
  1. 稳定残差连接后的数值范围
    残差连接(x + F(x))可能导致输出值域扩大,层归一化将其重新映射到稳定区间。

  2. 加速收敛
    通过标准化输入分布,使梯度下降方向更一致,减少训练所需的迭代次数

  3. 解耦特征尺度与语义信息
    缩放参数γ和平移参数β允许模型自适应调整归一化后的特征强度保留重要信息

参数γ和β的意义

  • γ(缩放因子)​:允许模型决定每个特征维度的重要性。例如,若某一维度的γ值较大,说明该维度信息在任务中更关键。
  • β(平移因子)​:用于补偿标准化可能丢失的偏置信息。例如,在ReLU激活前,β可调整正值比例。

标准化后偏置(β)的核心作用

在标准化过程中,输入数据会被强制转换为均值为0、方差为1的分布。这一操作可能带来两个问题:

  1. 丢失原始分布信息:例如某些特征原本具有正负倾向性(如情感词的褒贬偏移)。
  2. 破坏激活函数的有效范围:例如ReLU在输入为负时完全失效。

偏置项(β)通过以下方式解决这些问题:

1. ​恢复数据分布的偏移

  • 示例:假设原始数据中某特征在标准化前均值为2(正向偏移),标准化后变为0。若该偏移对任务有意义(如表示“积极情感”),β可重新赋予其正向偏移能力。
  • 数学表达
    若理想输出需保留偏移量 δ,则 β=δ 可恢复原始分布特性。

2. ​适配激活函数的动态范围

  • ReLU激活函数:若标准化后输入大部分为负值,ReLU输出会退化为0(神经元“死亡”)。β可将输入整体平移至正值区域,避免此问题。
  • Sigmoid激活函数:β可调整输入集中在敏感区间(如[-2, 2]),避免梯度饱和。

3. ​增强模型表达能力

  • 特征重要性调整:不同特征维度的β值可学习不同偏移方向,例如:
    • 某些维度正向偏移(β > 0)→ 强化特征重要性
    • 其他维度负向偏移(β < 0)→ 抑制噪声特征
  • 实验数据:在BERT模型中,移除β会导致下游任务(如问答)准确率下降约1.5-2%。

实验数据
在BERT模型中,移除γ和β会导致下游任务(如GLUE)准确率下降约2-3%。

下图 X表示词嵌入+位置编码后输出的原始结果,MultiHead(X)表示8头注意力+线性变换后输出的结果,LayerNorm 表示进行归一化。

Z = LayerNorm(X + MultiHead(X))  

数值示例​(以"你"位置为例):

原始X: [1.1415, -0.6597, 0.8001, 1.7, ...]
注意力输出: [1.82, 0.74, -0.23, ...]
残差后: [2.9615, 0.0803, 0.5701, ...]
归一化后: [-0.5, 1.2, 0.8, ...]  # 假设gamma=1, beta=0

四、前馈神经网络处理
1. 前馈神经网络(FFN)的结构

前馈神经网络是 Transformer 编码器中的一个核心组件,其作用是对多头注意力层的输出进行非线性变换,进一步提取高阶特征。
FFN 的结构通常为

其中:

  • W1​ 和 W2​ 是权重矩阵,维度分别为 [dmodel​,dff​] 和 [dff​,dmodel​](通常 dff​=4×dmodel​)。
  • b1​ 和 b2​ 是偏置项。
  • ReLU 是激活函数(部分模型使用 GELU)。

2. FFN 的具体处理步骤

以输入张量 x(形状为 [batch_size,seq_len,dmodel​])为例:

步骤 1:线性变换(升维)​
  • 将输入 x 通过第一个线性层 W1​,将维度从 dmodel​ 扩展到 dff​(如 512 → 2048)。
    数学表达:

步骤 2:非线性激活(ReLU)​
  • 对升维后的结果应用 ReLU 激活函数,引入非线性:

  • ReLU的作用:过滤负值,增强稀疏性,提升模型表达能力。
步骤 3:线性变换(降维)​
  • 将激活后的结果通过第二个线性层 W2​,将维度从 dff​ 压缩回 dmodel​(如 2048 → 512):

3. 残差连接与层归一化

FFN 的输出需要与输入进行残差连接(Add)​,再经过层归一化(LayerNorm)​

作用

  • 残差连接:保留原始输入信息,缓解梯度消失。
  • 层归一化:稳定数值分布,加速收敛。

=================================================

三、解码器

1. 输入预处理

生成“好”时,解码器的输入序列为 ​**<sos> 我 很**​(序列长度为3):

  1. 词嵌入:将每个词转换为512维向量(如“我”→[0.2, -0.5, ..., 0.7],“很”→[0.9, 0.1, ..., -0.6])
  2. 右移 
  • 目标序列‌(模型需生成的结果):["我", "很", "好", "<结束符>"](长度4)。
  • 右移操作‌的目的是让模型在生成每个词时,只能依赖已生成的左侧词,避免信息泄露。
具体步骤
  1. 插入起始符‌:在目标序列开头添加 <起始符>,得到 ["<起始符>", "我", "很", "好", "<结束符>"]
  2. 右移并截断‌:
    • 输入解码器的序列‌:取前4个词,即 ["<起始符>", "我", "很", "好"]
    • 舍弃的词‌:<结束符> 不作为输入,而是作为模型需要预测的标签(最后一个位置的预测目标)。

意义‌:

  • 输入序列长度保持为4,但内容右移并添加起始符。
  • 模型在生成每个词时,仅能利用左侧已生成的词(如输入 ["<起始符>", "我", "很"] 预测 "好")。右​移 位置编码:通过正弦/余弦函数为每个位置生成唯一编码(如位置3对应“好”),与词嵌入相加后得到融合时序信息的输入向量

2. 掩蔽多头自注意力

​**(1) 生成Q/K/V矩阵+分头**
  • 线性投影:输入向量分别通过权重矩阵 WQ、WK、WV 生成查询(Q)、键(K)、值(V)矩阵,维度均为3×512
  • 分头处理:将512维向量拆分为8个头(每个头64维),得到8组独立的Q/K/V子矩阵(3×64)
​**(2) 计算注意力分数+掩蔽**
  • 点积计算:每个头独立计算Q与K的点积,得到3×3的原始注意力分数矩阵。例如:
    • "好"(位置3)的查询向量与“”(位置1)、“我”(位置2)、“很”(位置3)的键向量分别计算相似度
  • 缩放与掩蔽
    • 缩放:分数除以 64​(键向量维度)防止梯度爆炸
    • 掩蔽: 假设经过缩放后的注意力分数矩阵
      • scaled_scores = torch.tensor([
            [3.2, 1.5, 0.8],  # <sos>对其他位置的相似度
            [2.1, 4.0, 1.2],  # "我"对其他位置的相似度
            [0.7, 1.9, 2.5]   # "很"对其他位置的相似度
        ])
        掩蔽矩阵叠加:
        masked_scores = scaled_scores + mask
        """
        结果矩阵:
        [
            [3.2+0, 1.5+(-inf), 0.8+(-inf)],  # → [3.2, -inf, -inf]
            [2.1+0, 4.0+0,      1.2+(-inf)],  # → [2.1, 4.0, -inf]
            [0.7+0, 1.9+0,      2.5+0]       # → [0.7, 1.9, 2.5]
        ]
        """

        关键变化:

      • 未来位置被设为-inf,在Softmax中指数运算后趋近于0
      • 历史位置保留原始分数
      • 掩码掩的是注意力得分
3. Softmax归一化
  • 目的:将掩蔽后的注意力分数转换为概率分布,表示每个位置对当前词的贡献权重。
  • 操作
    1. 逐行计算:对每一行的分数独立进行Softmax。
    2. 数学公式
    3. 效果
      • 被掩蔽的位置(负无穷)经过指数运算后变为0。
      • 未被掩蔽的位置权重相加为1。
  • 示例​(生成“好”时,序列长度3):
    • 掩蔽后的分数矩阵:
    • Softmax后结果:​​​
      • 解析
        • 第一行(<sos>):只能关注自己,权重100%。
        • 第二行(“我”):88%关注自己,12%关注<sos>
        • 第三行(“很”):68%关注自己,24%关注“我”,8%关注<sos>

4. 加权求和生成注意力输出

  • 目的:根据权重融合历史信息,生成当前词的上下文表示。
  • 操作
    1. 矩阵乘法:将Softmax后的权重矩阵与值矩阵(V)相乘。
    2. 具体计算​(以第三行“很”为例):
  • 效果
    • “很”的最终表示融合了自身(68%)、前序词“我”(24%)和起始符(8%)。
    • 模型通过权重自动学习依赖关系(如形容词“很”需要依赖主语“我”)。

3. 多头拼接与线性变换

  • 目的:合并多个注意力头的输出,增强信息多样性。
  • 步骤
    1. 拼接多头结果:将8个注意力头的输出(每个头维度64)拼接为512维向量。
    2. 线性投影:通过权重矩阵 W0将拼接结果映射到模型维度。   
  • 示例
    • 假设某个头关注语法结构​(如主谓一致),另一个头关注语义强度​(如“很”的程度修饰)。
    • 拼接后模型能同时利用语法和语义信息。

4. 残差连接(Skip Connection)​

  • 目的:保留原始输入信息,缓解梯度消失问题。
  • 操作:Residual_Output=原始输入+注意力输出
  • 示例​(生成“好”时):
    • 原始输入:词嵌入+位置编码后的向量 X<sos> 我 很​
    • 残差输出:X+Attention(X)
  • 意义
    • 防止多层堆叠后信息丢失(如保留“很”的原始位置编码)。
    • 让模型可选择性地增强或修正原始特征。

5. 层归一化(Layer Normalization)​

  • 目的:稳定训练过程,加速收敛。
  • 操作
    1. 计算均值和方差:对每个样本的每个特征独立归一化。μ=d1​i=1∑d​xi​,σ2=d1​i=1∑d​(xi​−μ)2
    2. 归一化:Output=γ⋅σ2+ϵ​x−μ​+β其中 γ 和 β 为可学习参数。
  • 效果
    • 消除特征量纲差异(如某些维度值过大)。
    • 使每层的输入分布趋于稳定(如防止注意力输出剧烈波动)。

6. 动态掩蔽与序列扩展

  • 动态掩蔽矩阵:每生成一个新词,掩蔽矩阵扩展右下角(如从3×3扩展为4×4),确保仅关注已生成词。
  • 示例:生成"好"时,输入序列为<sos> 我 很,掩蔽矩阵屏蔽位置3及之后的所有列。

7. 编码器-解码器注意力机制(Cross-Attention)

编码器-解码器注意力(Cross-Attention)是 Transformer 解码器中的关键模块,​负责将目标序列(解码器侧)与源序列(编码器侧)的语义对齐例如,生成目标词“好”时,模型需要从源序列“你好吗”中提取对应信息(如疑问词“吗”和核心词“好”)

1. 输入序列与投影来源

1.1 输入序列长度
  • 动态长度特性:解码器输入序列长度随时间步递增,而非固定长度
    • 生成第1个词时输入:<sos>(长度1)
    • 生成第3个词时输入:<sos> 我 很(长度3)
1.2 Q/K/V来源
矩阵来源数据特性维度示例
​Q解码器当前层输出经过掩蔽自注意力和层归一化的隐藏状态(如“很”)(1, 512)
​K编码器最终输出编码器最后一层输出的上下文表示(如“你好吗”)(n, 512) (n=源序列长度)
​V编码器最终输出同K矩阵(共享源序列的语义特征)(如“你好吗”)(n, 512)

2. 线性投影与分头处理

2.1 参数化线性变换
  • 解码器侧(Q)​

    功能:将解码器隐藏状态映射到低维查询空间,dec表示编码器

  • 编码器侧(K/V)​

    功能:将编码器输出分别映射到键/值空间,enc表示解码器

2.2 分头处理
  • 多头拆分:将Q/K/V投影矩阵拆分为8个头(h=8)
    • Q头形状:(1, 8, 64)
    • K/V头形状:(n, 8, 64)
      功能:每个头独立捕捉不同语义关系(如头1关注疑问词,头2关注名词修饰)
    • n表示源序列(编码器输入)的长度,例如在翻译任务中,若源语言句子是"Hello, how are you?"(包含5个词),则n=5。

    • K/V的n来源:在编码器-解码器注意力(Cross-Attention)中,K和V直接来自编码器的最终输出矩阵,其序列长度与源序列一致
    • Q的序列长度1来源:解码器当前生成的是目标序列的第t个词,此时Q的输入是目标序列的前t-1个词(如生成第3个词时输入为<sos> A B),而Cross-Attention的Q仅关注当前生成位置(即位置t),因此Q的序列维度为1

3. 注意力计算流程

3.1 点积分数计算 ​(以头1为例)
  • 分头点积
  • 示例生成解码器的"好"时,若编码器输入为"你好吗",可能得分:[0.8(吗), 0.1(你), 0.1(好)]
  • 在注意力得分 [0.8(吗), 0.1(你), 0.1(好)] 中:

  • 得分0.1的"好":来自编码器对源序列中"好"的表示,属于输入句子"你好吗"中的第二个词。
  • 得分0.8的"吗":模型在生成目标词"好"时,通过跨注意力机制重点关注源序列的疑问词"吗",以形成"我很好"的应答逻辑。
  • 解码器目标词"好"的生成逻辑

  • 解码器当前状态:生成解码器"好"时,解码器已生成"我 很",其隐藏状态通过掩蔽自注意力整合了目标序列的上下文。
  • 跨注意力对齐
    • 查询(Q)来自解码器对"很"的隐藏状态,键(K)和值(V)来自编码器的输出矩阵。
    • 注意力权重分配显示,模型在生成应答时更关注编码器源句子的疑问词"吗"(权重0.8),而编码器源词"好"的权重较低(0.1),可能因解码器目标词"好"需要与源疑问逻辑形成对比。
3.2 Softmax归一化
  • 跨序列权重分配
    特性:权重总和为1,例如[0.85, 0.10, 0.05]表示对编码器"吗"的强关注
3.3 加权值向量(解码器)聚合
  • 上下文向量生成
  • 示例:高权重(0.85)的"吗"对应的值向量被重点融合

再用例子来解释一下这部分吧:

解码-编码注意力的计算次数与逻辑

场景设定
  • 编码器输入‌:中文句子“你好吗” → 编码为向量矩阵 编码器输出 ∈ R^{3×512}(对应“你”、“好”、“吗”)。
  • 解码器输入‌:右移后的序列 ["<起始符>", "我", "很", "好"] → 编码为向量矩阵 解码器输入 ∈ R^{4×512}
解码-编码注意力机制
  1. 输入解码器的每个词生成“查询向量”‌:

    • 解码器经过自注意力层后,输出中间表示 解码器自注意力输出 ∈ R^{4×512}
    • 每个位置(如“我”、“很”、“好”)对应一个查询向量。
  2. 编码器提供“键向量”和“值向量”‌:

    • 编码器的每个词(“你”、“好”、“吗”)生成键向量和值向量,组成矩阵 键矩阵 ∈ R^{3×512} 和 值矩阵 ∈ R^{3×512}
  3. 并行计算注意力‌:

    • 以生成“很”为例‌:
      • 查询向量‌:解码器中“很”位置的向量(来自 解码器自注意力输出)。
      • 键向量与值向量‌:编码器的三个词(“你”、“好”、“吗”)对应的向量。
      • 计算相似度‌:
        • 查询向量与三个键向量分别计算点积,得到相似度得分。
        • 例如得分可能为:[0.1(“你”), 0.8(“好”), 0.1(“吗”)]
      • Softmax加权‌:
        • 对得分进行Softmax,得到权重 [0.05, 0.90, 0.05]
      • 加权求和‌:
        • 用权重对编码器的三个值向量加权求和,得到上下文向量:
          0.9 * 值("好") + 0.05 * 值("你") + 0.05 * 值("吗")
    • 结果‌:解码器生成“很”时,重点关注编码器的“好”(对应语义“好”→“很”)。

关键逻辑‌:

  • 并行计算‌:解码器的4个位置(如“我”、“很”、“好”)同时与编码器的3个位置交互,通过矩阵运算一次性完成。
  • 动态对齐‌:每个解码器词独立决定关注源句子的哪些部分,无需循环计算。

4. 多头输出合并

4.1 拼接与线性投影
  • 多视角融合:沿特征维度拼接8个头的输出
  • 统一语义空间映射

5. 残差连接与层归一化

5.1 残差相加

作用:保留解码器原始语义信息

5.2 层归一化

参数:γ,β为可学习参数,μ,σ2为当前批次的均值和方差


6. 与前馈网络衔接

6.1 非线性增强

功能:增强跨模态特征的表达能力


5. 输出生成与终止

         选择最高概率词“我”作为输出,并作为下一步解码的输入,循环生成后续词“很”和“好”

关于循环生成后续词的步骤,举例如下:

以下以输入“你好吗”生成“我很好”为例,详细解析该过程的每个步骤:

  1. 线性投影与Softmax

    • 解码器输出的隐藏状态通过线性层(Linear Layer)映射到词表维度(如512维),生成每个词对应的原始分数(logits)。
      • 线性层映射
        # 假设词表中“我”对应索引100,“很”对应200,“好”对应300
        # 权重矩阵 W 形状 [512, 50000],偏置 b 形状 [50000]
        logits = W * h_1 + b  # 结果形状 [1, 50000]

        此时 logits 向量中:                                                                                                 索引100(“我”)的分数可能最高(如 logits[100] = 8.5)                               其他词分数较低(如 logits[200] = 2.1logits[300] = -1.3

  2.  ​Softmax 归一化

    通过 Softmax 将 logits 转换为概率分布:

    假设温度 T=1,则:P(“我”)=0.7 , P(“很”)=0.2 , P(“好”)=0.05

  3. 采样与生成

一、初始输入处理

起始符注入
解码器初始输入为起始符 <bos>(Batch Size=1),嵌入后得到向量 h0​,并添加位置编码(Positional Encoding)

decoder_input = torch.tensor([[bos_token_id]])  # 假设 bos_token_id=1

编码器信息传递
编码器处理输入序列“你好吗”,输出 Key-Value 向量对 (Kenc​,Venc​),供解码器交叉注意力层使用。


二、逐步生成过程

第一步:生成“我”
  1. 解码器前向计算
    输入 <bos> 通过解码器各层:

    • 自注意力层:使用因果掩码(Causal Mask),仅允许关注 <bos> 自身。
    • 交叉注意力层:查询(Query)来自解码器,键值(Key-Value)来自编码器输出。
    • 前馈网络:非线性变换后输出隐藏向量 h1​(维度 [1, 512])。
  2. 线性层映射与 Softmax
    通过线性层将 h1​ 映射到词表维度(如50,000),再经 Softmax 生成概率分布:

    logits = W @ h_1 + b  # W.shape=[512, 50000]
    probs = softmax(logits / temperature)  # 假设 temperature=1.0

    此时“我”的概率最高(如0.7),被选为输出。

  3. 更新输入序列
    将“我”的 token id 追加到解码器输入:

    decoder_input = torch.cat([decoder_input, token_id_我], dim=1)  # 新输入:[<bos>, 我]
第二步:生成“很”
  1. 掩码更新与注意力计算
    因果掩码扩展至新序列长度,自注意力层可访问 <bos> 和“我”。

    mask = [[1, 0],  # 仅允许当前位置关注之前位置
            [1, 1]]
  2. 重复前向计算
    输出隐藏向量 h2​,经线性层和 Softmax 后,“很”以概率0.6被选中。

第三步:生成“好”
  1. 终止条件判断
    生成“好”后,若其概率分布中 <eos>(结束符)的概率超过阈值(如0.95),或序列长度达到预设最大值(如50),则终止生成。

最后再做个总结吧

1. 背景与核心创新
  • 提出时间与团队:2017年由Google团队在论文《Attention Is All You Need》中首次提出,彻底取代了传统的RNN/CNN架构,成为自然语言处理(NLP)和计算机视觉(CV)领域的核心模型。
  • 核心创新
    • 自注意力机制(Self-Attention)​:通过动态计算序列中所有词的相关性,捕捉长距离依赖关系,解决了RNN的梯度消失和并行化难题。
    • 并行计算:摒弃序列顺序处理,所有词同时参与计算,显著提升训练效率。

2. 模型架构

Transformer采用编码器-解码器(Encoder-Decoder)​结构,两者均由多层堆叠的模块构成:

  • 编码器(Encoder)​

    1. 多头自注意力层:并行计算多个注意力头,捕捉语法、语义等不同维度的关联性。
    2. 前馈神经网络(FFN)​:通过非线性变换增强模型表达能力。
    3. 残差连接与层归一化:稳定训练过程,防止梯度消失。
  • 解码器(Decoder)​

    1. 掩码多头自注意力:防止生成时“偷看”未来信息,确保自回归生成可靠性。
    2. 编码器-解码器交叉注意力:对齐输入与输出的语义(如翻译任务中源语言与目标语言)。
    3. 前馈网络与输出映射:生成目标词表的概率分布。

3. 核心机制详解
  1. 自注意力机制

    • 输入处理:将词嵌入与位置编码相加,注入顺序信息。
    • Q/K/V矩阵:通过线性投影生成查询(Query)、键(Key)、值(Value)向量,计算词间相关性。
    • 公式

      缩放因子根号dk​​防止点积过大导致梯度不稳定。
  2. 多头注意力(Multi-Head Attention)​

    • 将Q/K/V拆分为多个头(如8头),独立计算后拼接,增强模型捕捉多样化语义的能力。
  3. 位置编码(Positional Encoding)​

    • 使用正弦/余弦函数生成唯一位置标识,弥补模型对顺序的忽略:

4. 训练与应用
  • 训练方法

    • 预训练:在大规模无标签数据上通过遮蔽语言建模(MLM)、下一句预测(NSP)等任务学习通用语义。
    • 微调:在特定任务(如翻译、问答)的小数据集上调整参数,适应下游需求。
  • 应用场景

    • NLP任务:机器翻译(如Google Translate)、文本生成(如GPT系列)、摘要、问答系统。
    • 跨领域拓展:图像处理(ViT)、时间序列预测、生物序列分析。

5. 优势与挑战
  • 优势

    • 高效处理长序列:注意力机制直接关联任意距离的词,优于RNN的逐步传递。
    • 并行化加速:GPU友好,训练速度比RNN提升数倍。
    • 可解释性:注意力权重可视化,揭示模型决策依据(如翻译中对齐的词语)。
  • 挑战

    • 计算复杂度:序列长度n的二次方开销(O(n2)),需依赖优化技术如Reformer的局部敏感哈希。
    • 数据依赖:依赖大规模预训练,小数据场景易过拟合。

6. 典型变体与演进
  • Encoder-Only模型​(如BERT、RoBERTa):专注于理解任务(分类、实体识别)。
  • Decoder-Only模型​(如GPT系列):专精生成任务,通过自回归预测下一词。
  • 高效模型:DistilBERT(知识蒸馏压缩)、BigBird(稀疏注意力)降低资源消耗。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值