
整体结构Transformer 整体架构可分为左右两块左边为编码器 Encoder右边为解码器 Decoder输入层词嵌入 Token Embedding构建词表vocab每个字符对应一个数字 id。初始化可训练词嵌入矩阵嵌入矩阵形状为 [词表大小 V, 嵌入维度 D]即字符共 V 个每个字符由长度为 D 512 的向量表示即模型隐藏层维度。查表映射输入句子按分词器拆分成最小单元 Token根据词表转换成 id 序列全句 Token 长为 L查找嵌入矩阵对应位置的向量作为该字符的特征向量形状为 [LD]。位置编码 Positional Encoding因为 Transformer 不采用 RNN 的结构而是使用全局信息无法感知时序顺序而这部分信息对于 NLP 来说非常重要。正/余弦位置编码$$ PE(pos, 2i) sin(pos/10000^{2i/d}) $$$$ PE(pos, 2i1) cos(pos/10000^{2i/d}) $$编码向量维度与词嵌入向量维度一致形状为 [LD]。如果我输入的句子转换成了 [20, 512] 大小的向量嵌入那么对于第3个字符矩阵中第3行其正余弦编码矩阵的第3行第1个元素为 PE(2, 0) sin(2/10000^(20/512)) sin(2)第3行第2个元素为PE(2, 1) cos(2/10000^(20/512)) cos(2) … …以此类推填满这一行共512个元素再类推填满这个矩阵共20行。将词嵌入矩阵和编码矩阵按位相加就得到了有序的输入嵌入矩阵。旋转位置编码 RoPERoPERotary Position Embedding其核心思想是通过向量旋转的方式将绝对位置信息编码到 Query 和 Key 向量中从而使得模型在计算注意力分数时能够自然地利用相对位置信息。RoPE 不再像传统位置编码那样直接将位置向量加到词嵌入上。它的操作发生在生成Q和K向量之后、计算注意力分数之前维度分组对 Q 和 K 矩阵每一行向量的 D 维特征两两一组视为 D/2 个二维向量。即 $[Q_{00}, Q_{01}]$$[Q_{02}, Q_{03}]$… …$[Q_{0,D-2}, Q_{0,D-1}]$。下标可视为列表索引计算旋转角第 i 对的角度 $θ_i pos/(10000^{2i/d})$。pos 从1开始代表 token 的位置逐对旋转 Q 和 K$$ Q_{00}^{}Q_{00}cos(θ_0)-Q_{01}sin(θ_0) $$$$ Q_{01}^{}Q_{00}sin(θ_0)Q_{01}cos(θ_0) $$对所有元素做同样的操作。旋转后的 $Q_{rope}$ 维度保持 [LD] 不变。计算自注意力输出$$ Attention(Q_{rope}, K_{rope}, V)Softmax(Q_{rope}K_{rope}^T/\sqrt{d_k})V $$关键洞察假设词A在位置 pos_A词B在位置 pos_B。经过RoPE旋转后A 的 Q 向量和 B 的 K 向量的内积可以用旋转变换的性质推导出来$$ ⟨Q(A), K(B)⟩ Σ |q_i| · |k_i| · cos( Δpos · w_i ) $$其中 $w_i$ 是 $θ_i$ 的分母部分。其中Δpos pos_A - pos_B就是它们的相对位置。这说明两个词的内积只和它们的相对距离 Δpos 有关和绝对位置 pos_A、pos_B 无关。这正是旋转操作的神奇之处把绝对位置编码转化成了相对位置感知使得注意力得分自然地依赖于词与词之间的相对位置。缩放点积注意力 Scaled Dot-Product AttentionQKV 投影变换QKV 是原始输入 X 的线性变换它们被映射到了不同的功能空间中。Query (Q)代表当前 token 为了更好地理解自己需要去“查询”序列中其他词元的信息。Key (K)代表序列中每个 token 所“携带”的可以被查询的信息标签。Value (V)代表序列中每个 token 实际包含的深层含义。实现方式输入 X 形状为 [L512]。初始化三个可学习权重矩阵 WqWkWv形状为 [512512]。投影变换Q XWqK XWkV XWv形状保持不变 [L512]。缩放点积公式Self-Attention 输出$$ Attention(QKV) softmax(QK^T/\sqrt{d_k})V $$$d_k$ 是矩阵 Q 和 K 的列数拆分多头后的维度除以 $\sqrt{d_k}$ 叫做缩放方差避免 Q 和 K 的内积过大。$QK^T$ 相当于 Q 的第一行去乘以 K 的每一列即 Q 的第一个 token 表示我想查询什么信息类似输入的查询去匹配 K 的每一个 token 表示我携带什么信息类似书籍名称内积结果即每个 token 相对于这句话其他 token 的相似度得分这也就是自注意力的来源。$QK^T$ 形状为 [LL]取决于整句话的 token 长度。Softmax 归一化可以把得分转化为概率值也称注意力系数。再与 V 相乘得到自注意力输出即按照注意力系数将每一个新的 token 用所有 token 线性表示注意力系数中第一个 token 对自己的相似度分数归一化概率 1。多头注意力 Multi-Head Attention多头注意力模块包含 h 个自注意力层需要在 QKV 线性投影后就将它们拆分成 Q_iK_iV_i。$$ d_k d / h 512/8 64 $$它们的形状都是 [L64]。每个 Q_iK_iV_i 都要独立进行自注意力输出结果 Concat 到一起后再做一次线性变换恢复维度。Tranformer EncoderAdd Norm 残差连接和层归一化作用Add减缓反向传播时导致的梯度消失以及深层网络的退化现象 Norm让训练更稳定。每个 Encoder 进行了两次 Add Norm。第一次$LayerNorm(X MultiHeadAttention(X))$第一次 X 表示位置编码后的输入嵌入矩阵。第二次$LayerNorm(X FeedForward(X))$第二次 X 表示上层 Add Norm 的输出。Feed Forward 前馈网络作用特征加工实现方式输入向量 — 全连接层1 — RELU 激活函数 — 全连接层2$$ max(0, XW_1 b1)W2 b2 $$经过 Encoder 后输入和输出的维度一致。Transformer Decoder解码器结构与编码器稍有不同解码器中包含两个 Multi-Head Attention 层且第一个 MHA 层采用了 Masked 操作。注意到右边部分有一个 outputs(shifted right)这表明输入的 token 序列需要整体右移一位并在开头加上起始符 Start。Masked Multi-Head Attention实现方式输入为经词嵌入和位置编码后的 token 序列 X形状为 [L, 512]。和编码器一样对 X 乘以 WqWkWv 做投影变换得到 QKV形状为 [L, 512]。构造 Mask 矩阵该矩阵是一个下三角矩阵对角线右上角元素都为0对角线上和右下角元素都为1。计算 $QK^T$ 得到句内 token 间的相似度得分。将 $QK^T$ 和 Mask 矩阵按位相乘做掩码。对 $Mask QK^T$ 做 Softmax 计算概率每一行行和为1。以第一行只有一个元素可用说明第一个 token 只能根据自身信息推断下一个 token 是什么而第二个 token 可以利用自身和前一个 token 的信息做推断避免了解码器“偷看”标准答案来生成。掩码矩阵再与 V 相乘得到输出矩阵 Zi通过多头拼接后 Z 形状为 [L, 512]。第二个 Multi-Head Attention实现方式输入的 KV 矩阵来自编码器和 Q 矩阵来自解码器分别用输出乘以独立权重矩阵$$ K_{enc}MW_k, V_{enc}MW_vQ_{dec}ZW_q $$这里的 M 为前馈网络的输出Z 为掩码多头注意力层的输出。同编码器中的自注意力层一样做内积、缩放、softmax … … 。有一些意义需要弄明白Decoder 第一层掩码注意力的作用顾及自己的上下文保证语句通顺。投影输出 Q 矩阵代表当前生成端的查询意图。Decoder 第二层自注意力的作用以编码器输出构建 KV 矩阵K 矩阵代表源端可被匹配的语义键V 矩阵代表源端可提取的内容值这都包含了原文的语义保证在翻译任务中不脱离原文意思。Linear Softmax最后通过 Linear 层将输出映射成词表的维度[1, V]。Softmax 将向量归一化得到词表里每一个单词的预测概率取概率最大的词作为生成结果。最后提一句Transformer 这种 Encoder-Decoder 结构适合对齐类的任务即需要对源端进行理解比如说翻译任务和改写任务需要理解原文内容。而 Decoder-only 的模型只需要理解自身输入的上下文依赖上下文进行生成。参考Transformer模型详解图解最完整版Transformer模型详解图解最完整版 - 知乎