大家的AI
机器学习AI论文
加载中…

学习

🏅我的成就

Ch.02

Transformer:位置编码与前馈

自注意力擅长捕捉词与词之间的关系,但对词在句中的位置未必充分显式。因此 Transformer 在词嵌入上加上位置编码(PE),让模型知道第几个词。在块内混合关系之后,前馈(FFN)层再对每个词的表示做深层变换。本章用易懂的方式说明正弦–余弦 PE、与可学习位置嵌入的差异,以及 FFN 作为逐词 MLP的作用。

公式怎么读

在 ht(0)=xt+PE(t)h_t^{(0)} = x_t + PE(t)ht(0)​=xt​+PE(t) 中,xtx_txt​ 是词嵌入,PE(t)PE(t)PE(t) 是位置 ttt 的向量。内容与顺序(第几个编成数的信息)相加形成输入。正弦–余弦 PE 用 PE(t,2i)=sin⁡(t/100002i/d)PE(t,2i)=\sin(t/10000^{2i/d})PE(t,2i)=sin(t/100002i/d) 与 PE(t,2i+1)=cos⁡(t/100002i/d)PE(t,2i+1)=\cos(t/10000^{2i/d})PE(t,2i+1)=cos(t/100002i/d),用多个频率 iii 编码位置。ddd 即 dmodeld_{model}dmodel​,ttt 为词元下标。FFN(h)=W2 σ(W1h+b1)+b2\mathrm{FFN}(h)=W_2\,\sigma(W_1 h+b_1)+b_2FFN(h)=W2​σ(W1​h+b1​)+b2​ 中,σ\sigmaσ 为非线性,W1W_1W1​ 为 dmodel→dffd_{model}\to d_{ff}dmodel​→dff​,W2W_2W2​ 为 dff→dmodeld_{ff}\to d_{model}dff​→dmodel​。权重共享(各位置用同一套 FFN)有助于泛化并简化实现。
上
从左往右读,每格把意思和第几个编成数的信息(PE)加在一起。
下
路之间不混合,四路各走同一个计算块(同一套权重、同一套运算)一次。
论文里把这种计算块称为 FFN。

① 做输入 →(中间省略)→ ② 每路同一 FFN

同一块里先
① 再
②,按顺序进行。
同一块内的顺序
①→②
① 先把 意思 + 顺序(PE) 加成 输入。(中间的注意力等本图省略)
② 再用 同一 FFN 每路各走一次。路之间不混合。
① 把意思和顺序数(PE)合在一起
类似把句子里第几个词用数字记下来。
A→B→C→D0号意思+顺序值A 合并值意思+顺序值1号意思+顺序值B 合并值意思+顺序值2号意思+顺序值C 合并值意思+顺序值3号意思+顺序值D 合并值意思+顺序值
↓② 同一计算块、每路打磨一遍(FFN)三路不互通,各走同一个计算块路 1输入变宽层非线性输出路 2输入变宽层非线性输出路 3输入变宽层非线性输出路 4输入变宽层非线性输出
四路都是 同一计算块(W₁、W₂ 共享)
① 把意思和顺序数(PE)合在一起
类似把句子里第几个词用数字记下来。
A→B0号意思+顺序值A 合并值意思+顺序值1号意思+顺序值B 合并值意思+顺序值C→D2号意思+顺序值C 合并值意思+顺序值3号意思+顺序值D 合并值意思+顺序值
↓② 同一计算块、每路打磨一遍(FFN)三路不互通,各走同一个计算块路 1输入变宽层非线性输出路 2输入变宽层非线性输出路 3输入变宽层非线性输出路 4输入变宽层非线性输出
四路都是 同一计算块(W₁、W₂ 共享)
号意思顺序值计算块(FFN)

Transformer:位置编码与前馈层

1. 概念:为何需要位置编码
自注意力会看全句,但若只有词嵌入的排列,首尾等顺序信息可能不足。位置编码为每个位置 ppp 构造长度 dmodeld_{model}dmodel​ 的向量 PE(p)PE(p)PE(p),通过相加告诉模型顺序。
直觉: 像影院座位需要行列号;PE 给每个词元贴上位置标签。
数学: 常写 ht(0)=xt+PE(t)h_t^{(0)} = x_t + PE(t)ht(0)​=xt​+PE(t)。
应用: 翻译、摘要、问答中语序改变意义,BERT/GPT 类模型都会加入位置信息。
2. 概念:正弦–余弦位置编码(用钟表来想)
先建立直觉: 想象一块指针表。秒针转得快,分针中等,时针很慢。三根针指向的组合能告诉你「现在几点几分」——就像给第几个词贴上可区分的信号。每根针转速不同,两个时刻离得近还是远(相对距离)也更好分辨。正弦–余弦 PE 类似:把几种慢波、快波叠在一起,让每个位置有一组不同的数字模式。
再多一句: 经典 Transformer 在向量不同维度上放 sin⁡\sinsin 与成对的 cos⁡\coscos 这种周期性重复的值,并用多组频率,让模型更容易区分相邻位置与相隔较远的位置。
公式(不必背,供查阅): PE(t,2i)=sin⁡(t/100002i/dmodel)PE(t,2i)=\sin(t/10000^{2i/d_{model}})PE(t,2i)=sin(t/100002i/dmodel​),PE(t,2i+1)=cos⁡(t/100002i/dmodel)PE(t,2i+1)=\cos(t/10000^{2i/d_{model}})PE(t,2i+1)=cos(t/100002i/dmodel​)。ttt 是第几个词元,iii 是维度下标,dmodeld_{model}dmodel​ 是向量长度。
白话拆解: 可以把整个式子理解成:给每个位置 ttt造一串数字,当作位置指纹。向量有 dmodeld_{model}dmodel​ 个分量,两两一对就像转速不同的波叠在一起。ttt表示句子中第几个词;iii更像在选哪一档频率(慢波到快波)。dmodeld_{model}dmodel​是向量总长,出现在指数里是为了别把频率调得太极端。相邻位置数值变化小,相距更远更容易差别大,有助于模型感知相对远近。sin⁡\sinsin 配 cos⁡\coscos类似用两个坐标描述指针角度,比单靠一种波更稳(细节不必死记)。
应用: 长上下文编码器等,后续有 RoPE 等发展。
3. 概念:前馈层(FFN)——逐词“深度面谈”
一句话: 注意力让词与词互相混合;FFN则在下一步保持每一路分开,对每一路用同一套小网络各算一次(接近上图绿色计算块)。
比喻: 开完集体会(注意力)后,每个人单独进小隔间再聊一轮(FFN)。向量宽度 dmodeld_{model}dmodel​ 常先扩宽中间再压回,像沙漏。
为什么需要? 注意力多是线性变换与混合;FFN 里加 ReLU(max⁡(0,⋅)\max(0,\cdot)max(0,⋅))等非线性,才能学到弯弯曲曲的规则,而不只是直线关系。
公式(查阅即可): FFN(x)=max⁡(0,xW1+b1)W2+b2\mathrm{FFN}(x)=\max(0,xW_1+b_1)W_2+b_2FFN(x)=max(0,xW1​+b1​)W2​+b2​。W1,W2W_1,W_2W1​,W2​ 通常各位置共享。
应用: 情感、NER 等——注意力收上下文,FFN 精修每个词。
4. 概念:块内流程——传送带的一站
一句话: 编码器一个块像流水线一站,步骤顺序固定不变。
好记顺序:
1. 准备: 在嵌入上加 PE,让词元带上“第几个”的信息。
2. 混合: 注意力交换词间上下文。
3. 稳住: Add & Norm — 残差相加防信号消失,再层归一化把尺度拉齐。
4. 分路加工: FFN对每一路做非线性更新。
5. 再来一次 Add & Norm 收尾。
公式(查阅即可): 先 h′=LayerNorm(h+Attn(h))h'=\mathrm{LayerNorm}(h+\mathrm{Attn}(h))h′=LayerNorm(h+Attn(h)),再 h′′=LayerNorm(h′+FFN(h′))h''=\mathrm{LayerNorm}(h'+\mathrm{FFN}(h'))h′′=LayerNorm(h′+FFN(h′))。把这一整块叠很多层。
应用: 搜索、聊天、代码生成等。

为何重要

顺序改变语义
“我吃了饭”与词序打乱后语法语义不同。没有 PE,模型更难稳定保持这种差别。金融日志里时间顺序也至关重要。
FFN 负责强非线性
注意力多是线性映射加 softmax 混合;FFN 通过升维与非线性学习复杂规则。
算力权衡
增大 dffd_{ff}dff​ 与层数会提升表达力,也会增加 GPU 开销与延迟。
通向新模型的台阶
绝对位置嵌入、正弦 PE、RoPE、ALiBi 等不断演进,但“把顺序写进张量”的思想一致。

如何使用

工程流程:分词 → 嵌入 → +PE
分词后乘嵌入矩阵,再加位置向量。可学习 PE 表用 max_position_embeddings 等限定长度。长文档问答需同时设计上下文长度。
FFN 超参数
intermediate_size(dffd_{ff}dff​)、激活(GELU)、Dropout 等。例如 dmodel=768d_{model}=768dmodel​=768 时常取 dff=3072d_{ff}=3072dff​=3072。
解码器注意
掩码注意力遮住未来词元,但 PE 仍传递从左到右的顺序。
调试提示
若顺序敏感,检查 PE/RoPE/上下文长度;若表示单调,检查 FFN 宽度、深度与激活。

小结

自注意力再强,也需要把每个词在序列中的位置可靠地告诉模型。正弦–余弦位置编码用多种频率叠加,在嵌入上形成可区分的位置模式;随后注意力调节词间关系,FFN 则在每个位置上重复同一非线性变换以细化表示。先扩后缩的 FFN 结构,是翻译、摘要、分类与生成等任务里在质量与算力之间的常用旋钮。

解题说明

小结 — 位置编码为嵌入补充顺序;正弦 PE 用多频率编码位置;FFN 在各位置用共享 MLP 堆叠非线性。dffd_{ff}dff​、层数与上下文长度与成本联动。
  • 类型PE 目的
  • 提示(关键词 → 思路)注入顺序/绝对与相对线索 → 找「嵌入+PE」
  • 类型正弦 PE
  • 提示(关键词 → 思路)典型为偶维 sin⁡\sinsin、奇维 cos⁡\coscos
  • 类型加性 PE
  • 提示(关键词 → 思路)h=x+PE(pos)h = x + PE(pos)h=x+PE(pos)
  • 类型FFN
  • 提示(关键词 → 思路)逐词 MLP,常 dff>dmodeld_{ff} > d_{model}dff​>dmodel​
  • 类型共享
  • 提示(关键词 → 思路)多数情况下各位置共用同一套权重
  • 类型权衡
  • 提示(关键词 → 思路)更宽/更深 ↔ 更高算力与延迟
类型提示(关键词 → 思路)
PE 目的注入顺序/绝对与相对线索 → 找「嵌入+PE」
正弦 PE典型为偶维 sin⁡\sinsin、奇维 cos⁡\coscos
加性 PEh=x+PE(pos)h = x + PE(pos)h=x+PE(pos)
FFN逐词 MLP,常 dff>dmodeld_{ff} > d_{model}dff​>dmodel​
共享多数情况下各位置共用同一套权重
权衡更宽/更深 ↔ 更高算力与延迟
示例(概念理解题)
「仅靠自注意力就能完全暴露顺序。」
① 对
② 只是部分
③ 顺序不重要
并不完全,需要 PE 等补顺序。→ 2

「典型的正弦·余弦 PE 中,偶数维 2i2i2i 上常用哪个函数?」
① 仅 cos
② sin
③ 恒等
常见形式为 PE(t,2i)=sin⁡(⋯ )PE(t,2i)=\sin(\cdots)PE(t,2i)=sin(⋯)。→ 2

「把词嵌入 xxx 与位置向量 PEPEPE 合在一起,最常见的方式是?」
① 相加 x+PE(pos)x+PE(pos)x+PE(pos)
② 只拼接
③ 只逐元素相乘
加性(相加)PE 最常见。→ 1

「FFN(前馈)块的作用最接近?」
① 做注意力那种词间关系
② 对每个词元做非线性变换(扩宽再压回)
③ 只做 dropout
更接近逐词 MLP。→ 2

「同一层里各位置使用 FFN 的常见方式是?」
① 每个位置一套不同的 W1,W2W_1,W_2W1​,W2​
② 所有位置共享同一套 FFN 权重
③ 只共享 PE 矩阵
参数共享更常见。→ 2

「增大中间维 dffd_{ff}dff​ 或层数时,通常要一起考虑的代价是?」
① 速度一定变快
② 算力·内存·延迟
③ 标签数量
表达能力与成本的权衡。→ 2

示例(判断题)
「FFN 必须在每个词元上用不同权重。」对=1,错=0。
通常共享权重。→ 0

示例(情景题)
「病历里用药前后顺序很重要,优先要补强的输入是?」
① 嵌入+PE
② 只要像素
③ 只要文件名
需要顺序信息。→ 1

示例(投票计数)
「指示向量 [1,1,0,1,0] 中 1 的个数?」
1+1+0+1+0=31+1+0+1+0=31+1+0+1+0=3。→ 3

示例(模型预测聚合)
「三个块的分数 [2,1,2] 之和?」
2+1+2=52+1+2=52+1+2=5。→ 5

示例(结构/计算题)
「10 个词元时,自注意力分数矩阵有多少个元素?」
10×10=10010\times10=10010×10=100。→ 100

示例(堆叠层/集成原理)
「堆很多层的目的最接近?」
① 逐步抽象
② 删除数据
③ 禁止输入
逐层加深表示。→ 1