Transformer详解
自注意力机制(Self-Attention)核心概念:对于每个 token,计算它和所有 token 的相关性,用相关性加权所有 token 的特征,得到当前 token 的新特征。
本质:将离散的token序列,映射为一个全连接的图结构,任意两个token之间都有一条边,边的权重就是注意力得分。
步骤 1:生成 Q/K/V![]()
三个线性层独立,把输入映射到三个不同的语义空间 - Q:当前token"我想找什么" - K:其他token"我有什么" - V:其他token"我是什么" 注意力得分 = Q和K的相似度,最终输出 = 相似度加权V
步骤 2:点积计算相关性
[n,d]×[d,n]=[n,n],Scores [i][j] 表示第 i 个 token 和第 j 个 token 的相关性
步骤 3:缩放(Scaling)
维度 d_k越大,点积算出来的数值就越 “爆炸”,导致 Softmax 输出非 0 即 1,梯度消失。除以根号 d_k,就是把点积的波动强行拉回 ±1,保证梯度能正常更新。
步骤 4:掩码(Mask)
两种掩码,最终会合并:
- Padding Mask:屏蔽输入中的 padding token(无意义的填充)
- 形状:[batch_size, 1, seq_len](广播后变成[batch_size, n_heads, seq_len, seq_len])
- Sequence Mask(Causal Mask因果掩码):解码器专用,屏蔽未来的 token
- 形状:[1, seq_len, seq_len](广播后变成[batch_size, n_heads, seq_len, seq_len])
掩码操作:scores = scores.masked_fill(mask==0, -1e9),这样 Softmax 后权重为 0 -∞在某些GPU上会导致数值不稳定,-1e9足够让Softmax后权重趋近于0步骤 5:Softmax 归一化
Attention Weights=Softmax(Scores)
效果:权重和为 1,每个 token 的注意力权重表示对其他 token 的关注程度
步骤 6:加权求和
Output=Attention Weights⋅V
维度变化:([n,n] × [n,d] = [n,d]),和输入维度完全一致
最终公式
多头注意力(Multi-Head Attention)核心思想:把 Q/K/V 拆成 h 个独立的头,每个头单独做自注意力,最后拼接结果,让模型同时捕捉不同类型的语义依赖。
数学公式:
前馈神经网络(FFN)结构:
两个线性层,中间加 ReLU 激活:FFN(x)=max(0,xW1+b1)W2+b2
残差连接 & 层归一化:
残差连接(Residual Connection):x=x+Sublayer(x)
层归一化(LayerNorm):
两种顺序:1.Post-LN(原始 Transformer):先做子层,再加残差,再做 LN
x=LayerNorm(x+Sublayer(x))
2.Pre-LN(现代大模型):先做 LN,再做子层,再加残差
x=x+Sublayer(LayerNorm(x))
位置编码(Positional Encoding)核心:自注意力是排列不变的,必须加位置信息告诉模型 token 的顺序
正弦余弦位置编码(原始 Transformer):
- pos:token 的位置(0,1,2...);i:特征维度的索引;直接加到 token 嵌入上:x = Embedding(x) + PE
完整 Transformer 架构
输入序列 → Embedding + PE → 编码器×6 → 编码器输出 ↓ 输出序列 → Embedding + PE → 解码器×6 → 线性层 → Softmax → 输出概率编码器层(Encoder Layer):
输入 ↓ 多头自注意力(Q/K/V都来自输入) ↓ 残差连接 + LayerNorm ↓ 前馈神经网络 ↓ 残差连接 + LayerNorm ↓ 输出解码器层(Decoder Layer):
输入 ↓ 掩码多头自注意力(只能看到当前和之前的token) ↓ 残差连接 + LayerNorm ↓ 交叉注意力(Q来自解码器,K/V来自编码器输出) ↓ 残差连接 + LayerNorm ↓ 前馈神经网络 ↓ 残差连接 + LayerNorm ↓ 输出