# 03 · 公式推导 > 学习笔记 03/05 · by 小小叶 🍃 > 把第 02 篇的直觉,用数学严格写出来。 --- ## 一、输入表示 Transformer 的输入 `x` = **单词 Embedding + 位置 Embedding**: ``` x = Embedding(word) + PositionalEncoding(pos) ``` - **单词 Embedding**:可用 Word2Vec/Glove 预训练,或随模型一起训练 - **位置 Embedding(PE)**:补上顺序信息(见第五节) 整个句子的输入是矩阵 **X**,shape = `[n, d]`: - n = 句子单词数 - d = 表示向量维度(论文中 d = 512) --- ## 二、Q, K, V 的计算 对输入矩阵 X,用三个**可训练**的线性变换矩阵 Wq、Wk、Wv 得到: ``` Q = X · Wq K = X · Wk V = X · Wv ``` 每一行对应一个单词。Q/K/V 的 shape 通常是 `[n, d_k]`。 --- ## 三、Self-Attention 输出公式 ⭐ ``` ┌ ┐ │ Q · Kᵀ │ Attention = softmax │ ───────── │ · V │ √d_k │ └ ┘ ``` ### 逐步拆解 **第 1 步:Q·Kᵀ —— 算相关性** - 结果是 `n×n` 矩阵 - 第 i 行第 j 列 = 单词 i 对单词 j 的相关性分数(点积越大越相关) **第 2 步:除以 √d_k —— 缩放** - 为什么除?防止点积过大,导致 softmax 进入梯度极小的饱和区 - d_k 越大,点积数值越容易爆 → 用 √d_k 拉回正常范围 **第 3 步:softmax —— 归一化成权重** - 对矩阵的**每一行**做 softmax - 每行加起来 = 1 → 变成"注意力系数/分配比例" **第 4 步:· V —— 加权平均** - softmax 矩阵 × V → 输出 Z - Z 的第 i 行 = 所有单词 V 按第 i 行权重的加权和: ``` Zᵢ = Σⱼ softmax(...)ᵢⱼ · Vⱼ ``` > 💡 这一步就是第 02 篇讲的"加权平均"的数学形式。 --- ## 四、Multi-Head Attention(多头注意力) ### 核心思想 不止做一组 Q/K/V,而是并行做 **h 组**(论文 h=8),每组叫一个"头"。 ``` headᵢ = Attention(Q·Wqᵢ, K·Wkᵢ, V·Wvᵢ) i = 1..h MultiHead = Concat(head₁, ..., headₕ) · Wo ``` ### ⚠️ 关键避坑点(很多文章讲错) **不是每个头都用完整的 d_model=512 维!** 而是把 512 **拆成 h 份**: ``` 每个头的维度 = d_model / h = 512 / 8 = 64 ``` - 每个头在 64 维子空间里做注意力 - 8 个头的 64 维输出拼接(Concat) → 回到 512 维 - 再过一个线性层 Wo 调整 > 这样总计算量和单头 512 维相当,但能从**多个子空间/视角**捕捉不同的相关性(有的头关注语法、有的关注语义)。 ### 维度一致性 Multi-Head 输出矩阵 Z 与输入 X **维度相同**,方便堆叠多层。 --- ## 五、位置编码(Positional Encoding) ### 为什么需要? Transformer 不像 RNN 顺序处理,**自注意力本身无序**(打乱输入,输出只是跟着换位置,关系不变)。但顺序对 NLP/时序极重要。**不加位置编码,Transformer 就退化成词袋模型。** ### 公式(sin/cos 编码) ``` PE(pos, 2i) = sin( pos / 10000^(2i/d) ) PE(pos, 2i+1) = cos( pos / 10000^(2i/d) ) ``` - pos = 单词在句子中的位置 - 2i / 2i+1 = 维度的偶数/奇数位 - d = 编码维度(与词 Embedding 一致,便于相加) ### 为什么用 sin/cos?两大好处 1. **能外推到更长序列**:训练时最长 20,来了长度 21 也能算出第 21 位的编码 2. **能表示相对位置**:因为 ``` sin(A+B) = sinA·cosB + cosA·sinB cos(A+B) = cosA·cosB - sinA·sinB ``` 所以 PE(pos+k) 可由 PE(pos) 线性表示 → 模型容易学到"相对距离 k" --- ## 六、Mask(掩码) ### Padding Mask 把补齐用的 `` 位置在 softmax 前设为 -∞ → 权重变 0,不参与注意力。 ### 因果 Mask / Sequence Mask(Decoder 用) - 自回归生成时,预测第 i 个词**不能看到 i 之后的词** - 做法:在 softmax **之前**,把上三角(未来位置)设为 -∞ - softmax 后这些位置权重 = 0 → 单词 i 只能"加权平均"它之前的信息 > 这点在**时间序列预测**里至关重要(防止偷看未来 = 防数据穿越),详见第 04 篇。 --- ## 七、本节小结(公式速查) ``` 输入: X = Embedding + PE Q/K/V: Q=XWq, K=XWk, V=XWv 注意力: softmax(Q·Kᵀ/√d_k)·V 多头: Concat(head₁..headₕ)·Wo,每头维度 d/h 位置编码: PE(pos,2i)=sin(pos/10000^(2i/d)), 奇数位用 cos Mask: softmax 前把不该看的位置设 -∞ ``` > 📌 下一篇 `04_时间序列预测应用.md`:把这套机制接到时序预测上。