当前位置: 首页 > news >正文

Transformer 论文阅读笔记

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 层相同结构堆叠组成,每层包含两部分:

  1. Multi-Head Self-Attention
  2. Position-wise Feed Forward Network

每个子层外面都包了一层:

  • Residual Connection
  • LayerNorm

论文默认设置中,所有子层输出维度统一是d_model = 512

2.2 Decoder

解码器同样是6 层,但每层多了一个子层:

  1. Masked Multi-Head Self-Attention
  2. Encoder-Decoder Attention
  3. Feed 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_1+b_1)W_2+b_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),并把encodedecode入口都挂在这个类里。(GitHub)

我的理解是:
这个文件负责把“论文里的整体结构”组织起来,也就是:

  • 编码器怎么进
  • 解码器怎么走
  • 最终 body 怎么串起来

5.2tensor2tensor/layers/common_attention.py

这个文件更像 Transformer 的“零件库”。

里面能直接看到:

  • get_timing_signal_1d:负责生成 sinusoids timing signal
  • multihead_attention:多头注意力相关实现会在这里被注册和复用

尤其get_timing_signal_1d的注释写得很清楚:不同频率的 sinusoid 可以让 attention 学习绝对位置和相对位置。(GitHub)

所以如果是“论文 + 源码”一起读,我建议这样对应:

  • 论文的整体结构图
    对应models/transformer.py
  • 论文的attention / positional encoding 公式
    对应layers/common_attention.py

6. 最小复现思路:读源码时我会重点看什么

如果不纠结完整训练框架,只想自己复现一个最小版 Transformer,我觉得只要抓住下面 4 个模块:

  1. Embedding
  2. Positional Encoding
  3. Multi-Head Attention
  4. FFN + Residual + LayerNorm

一个极简的 Encoder Layer,逻辑上其实就是这样:

classEncoderLayer(nn.Module):def__init__(self,d_model=512,num_heads=8,d_ff=2048):super().__init__()self.attn=MultiHeadAttention(d_model,num_heads)self.ffn=FeedForward(d_model,d_ff)self.norm1=nn.LayerNorm(d_model)self.norm2=nn.LayerNorm(d_model)defforward(self,x,mask=None):x=self.norm1(x+self.attn(x,x,x,mask))x=self.norm2(x+self.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 梯度变小,训练不稳定。

2)Multi-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)
http://www.jsqmd.com/news/596435/

相关文章:

  • RPG Maker MV Decrypter:游戏资源提取与加密解析的创新方法与实战价值
  • 告别手写代码:ImStudio可视化GUI设计器如何让Dear ImGui开发效率提升300%
  • 实测通义千问2.5-7B-Instruct工具调用:轻松构建你的第一个AI Agent
  • ReactNative for OpenHarmony项目鸿蒙化三方库:react-native-flash-message — 闪现消息组件
  • 如何打造专属家庭电视直播系统:从技术实现到个性化体验
  • 3大突破!res-downloader突破限制高效获取音乐资源实战案例
  • 网站推广SEO的技巧有哪些_网站推广SEO需要哪些硬件和软件配置
  • Ostrakon-VL 扫描终端入门:Windows 系统下快速部署与测试指南
  • OFA-Image-Caption模型在VMware虚拟机中的开发测试环境搭建
  • LFM2.5-1.2B-Thinking-GGUF快速上手:用Postman保存/generate请求模板集
  • Pixel Script Temple部署教程:ARM服务器(如NVIDIA Grace)上Qwen2.5量化部署
  • 北京专业SEO优化公司如何进行内容营销
  • C#面试必问:垃圾回收(GC)的10个实战避坑指南
  • NomNom存档编辑器:突破《无人深空》游戏体验边界的核心功能与创新价值
  • OpenClaw低代码扩展:Qwen3-32B镜像与Node-RED可视化编排整合
  • Windows文件管理器视觉增强与个性化定制指南
  • 如何构建个人数字记忆库?WeChatMsg实现数据留存与记忆数字化的完整方案
  • chilloutmix_NiPrunedFp32Fix深度解析:从技术痛点到工业级部署的创新路径
  • OpenClaw节能模式:Qwen3-14B定时任务与资源释放配置
  • SQL代码质量守护:3步规避90%的SQL风险
  • 跨平台迁移指南:OpenClaw+千问3.5-9B从Mac到Windows
  • 避坑指南:Ansoft Maxwell永磁体仿真中,90%的人会忽略的这3个设置细节
  • 新手友好:用快马AI生成代码,零基础入门经典数据集分析实战
  • 深度解析notion-enhancer组件化架构:从UI扩展到底层实现的设计模式
  • MDX词典自动化构建:零基础高效制作专业词典的解决方案
  • 从零开始:用Meshroom将普通照片变身高精度3D模型
  • 免费企业建站对企业SEO有什么影响_免费企业建站如何获得专业域名
  • ai辅助设计轻量级cnn:快马平台智能建议网络优化与部署方案
  • 智能音箱‘耳背’怎么办?拆解AEC(回声消除)在语音唤醒和打断场景下的核心挑战
  • 5大维度解决Windows系统臃肿:Win11Debloat全方位优化指南