2026/4/6 10:34:38
网站建设
项目流程
Transformer 论文阅读笔记从《Attention Is All You Need》到 Tensor2Tensor 源码摘要最近重新读了一遍经典论文《Attention Is All You Need》。这篇论文最重要的地方不只是提出了 Transformer而是把序列建模从“按时间步递推”改成了“直接建模全局依赖关系”。论文里的模型完全抛弃了 RNN 和 CNN只保留 Attention 作为核心计算模块并在机器翻译任务上拿到了当时非常强的结果。论文也明确说明训练与评估代码开源在 Tensor2Tensor 中。1. 这篇论文到底解决了什么问题在 Transformer 之前NLP 里的主流方案还是 RNN/LSTM/GRU。它们的共同问题很明显计算依赖前一个时间步难并行长距离依赖路径长训练不够高效训练速度和硬件利用率都受限这篇论文的核心想法非常直接既然 Attention 已经能建模依赖关系那能不能彻底不要 RNN只用 Attention答案就是 Transformer。论文提出的模型完全依赖 attention mechanism 来建立输入和输出之间的全局依赖并且带来了更好的并行性。2. Transformer 的核心结构Transformer 仍然沿用了Encoder-Decoder大框架但内部模块彻底换了。2.1 Encoder编码器由6 层相同结构堆叠组成每层包含两部分Multi-Head Self-AttentionPosition-wise Feed Forward Network每个子层外面都包了一层Residual ConnectionLayerNorm论文默认设置中所有子层输出维度统一是d_model 512。2.2 Decoder解码器同样是6 层但每层多了一个子层Masked Multi-Head Self-AttentionEncoder-Decoder AttentionFeed Forward Network这里最关键的是masked self-attention当前位置不能看未来 token否则生成时就“作弊”了。3. 论文里最关键的 4 个点3.1 Scaled Dot-Product Attention论文里的核心公式[Attention(Q,K,V)softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V]我自己的理解很简单QK^T算“该关注谁”除以sqrt(d_k)防止数值太大softmax 梯度过小再乘V得到加权后的输出表示这一步其实就是 Transformer 的心脏。3.2 Multi-Head Attention如果只有一个 attention head模型只能从一个角度理解句子多头注意力相当于把表示空间切成多个子空间同时建模不同类型的关系。论文默认用了8 个 heads每个 head 的 key/value 维度是 64。3.3 Feed Forward Network每层 attention 后面都会接一个前馈网络[FFN(x)max(0,xW_1b_1)W_2b_2]本质上就是两层线性层加一个 ReLU。它的作用更像是“特征变换”而 attention 负责“信息交互”。3.4 Positional Encoding因为 Transformer 没有 RNN也没有卷积所以模型本身不知道 token 的顺序。论文用的是sin/cos 位置编码把位置信息直接加到 embedding 上。作者也试过 learned positional embedding但效果接近最后选了正弦余弦形式。4. 我读完后的几个核心理解4.1 Transformer 真正厉害的不只是“效果更好”它更大的意义在于把序列建模问题改写成了更适合 GPU 的矩阵计算问题。RNN 更像“按顺序处理”Transformer 更像“全局关系建模”。这不是一个小优化而是范式变化。4.2 Attention 从“辅助模块”变成了“主角”在更早的 seq2seq 模型里attention 往往只是外挂而这篇论文直接让 attention 成为核心计算单元。这一步非常关键因为后面的 BERT、GPT、本质上都是沿着这条路往前走的。4.3 位置编码不是配角很多初学者会低估位置编码但如果没有它Transformer 其实分不清词序。没有顺序信息模型只能看到“一堆 token 的集合”而不是序列。4.4 Self-Attention 的优势和代价都很明显优势并行能力强长距离依赖路径短更适合 GPU 计算代价标准 self-attention 的复杂度是 (O(n^2 \cdot d))序列一长显存和计算压力会很大这也是后来各种稀疏注意力、线性注意力、FlashAttention 不断出现的原因。5. 结合 Tensor2Tensor 源码看这篇论文论文最后提到训练和评估代码开源在Tensor2Tensor。GitHub 页面显示这个仓库后来被归档为只读README 也写明它已经 deprecated并建议使用后续库 Trax。 (GitHub)如果只是想对照论文读代码我觉得抓住下面两个文件就够了。5.1tensor2tensor/models/transformer.py这个文件可以看成 Transformer 的主入口。源码开头直接写明这是论文“Attention Is All You Need”对应的 Transformer model下面还定义了class Transformer(t2t_model.T2TModel)并把encode和decode入口都挂在这个类里。(GitHub)我的理解是这个文件负责把“论文里的整体结构”组织起来也就是编码器怎么进解码器怎么走最终 body 怎么串起来5.2tensor2tensor/layers/common_attention.py这个文件更像 Transformer 的“零件库”。里面能直接看到get_timing_signal_1d负责生成 sinusoids timing signalmultihead_attention多头注意力相关实现会在这里被注册和复用尤其get_timing_signal_1d的注释写得很清楚不同频率的 sinusoid 可以让 attention 学习绝对位置和相对位置。(GitHub)所以如果是“论文 源码”一起读我建议这样对应论文的整体结构图对应models/transformer.py论文的attention / positional encoding 公式对应layers/common_attention.py6. 最小复现思路读源码时我会重点看什么如果不纠结完整训练框架只想自己复现一个最小版 Transformer我觉得只要抓住下面 4 个模块EmbeddingPositional EncodingMulti-Head AttentionFFN Residual LayerNorm一个极简的 Encoder Layer逻辑上其实就是这样classEncoderLayer(nn.Module):def__init__(self,d_model512,num_heads8,d_ff2048):super().__init__()self.attnMultiHeadAttention(d_model,num_heads)self.ffnFeedForward(d_model,d_ff)self.norm1nn.LayerNorm(d_model)self.norm2nn.LayerNorm(d_model)defforward(self,x,maskNone):xself.norm1(xself.attn(x,x,x,mask))xself.norm2(xself.ffn(x))returnx这段代码虽然很短但已经把论文里最核心的层结构表达出来了Self-Attention - Residual Norm - FFN - Residual Norm。这一点和论文描述是一致的。7. 论文结果为什么这么重要论文实验部分最亮眼的结论是在 WMT 2014 English-to-German 上Transformer(big) 达到28.4 BLEU在 WMT 2014 English-to-French 上Transformer(big) 达到41.8 BLEU更重要的是它不只是效果好训练成本也更低并行效率更高。这个结果直接证明了只靠 attention也能把 seq2seq 做到当时的 SOTA。这也是 Transformer 后来成为 NLP 主干架构的根本原因。8. 面试/复习速记1为什么要除以 (\sqrt{d_k})因为点积值会随着维度变大导致 softmax 梯度变小训练不稳定。2Multi-Head Attention 的作用是什么让模型从多个子空间同时学习不同类型的依赖关系。3为什么 Transformer 不需要 RNN因为 self-attention 可以直接建模任意两个位置之间的关系不再需要时间步递推。4为什么必须加位置编码因为 Transformer 本身不具备顺序感知能力。5看 Tensor2Tensor 源码先看哪先看models/transformer.py再看layers/common_attention.py。前者看整体后者看细节。(GitHub)9. 总结如果只用一句话总结这篇论文我会写成Transformer 的本质是用全局注意力替代时序递归把序列建模从“逐步处理”变成了“关系建模”。而从源码角度看Tensor2Tensor 做的事情其实也很清楚transformer.py负责整体框架common_attention.py负责 attention 和位置编码这些关键组件所以这篇论文最值得学的不只是公式而是它背后的建模思想把复杂的序列依赖变成统一的注意力计算。参考资料Vaswani et al.,Attention Is All You Need。Tensor2Tensor GitHub 仓库与源码文件。(GitHub)