HelloAI
📄 论文精读 🏆 必读经典 · 2017 · NeurIPS 2017

Attention Is All You Need

Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin
TL;DR
提出 Transformer 架构——完全抛弃 RNN,只用注意力机制。这篇 8 页的论文催生了今天所有大模型。被引 12 万+。
#Transformer#Attention#NLP#必读

为什么这篇论文重要

如果 AI 史只能列 10 篇关键论文,这是其中之一。它定义了 2018 年至今所有 LLM 的架构基础

GPT、BERT、Claude、Gemini、Llama……全部基于 Transformer

“Attention is all you need.” 标题的张狂程度在 2017 年是少见的。事实证明他们说的是对的。

论文的核心贡献

1. 完全抛弃了 RNN

2017 年之前,序列建模(翻译、语言模型)几乎全用 RNN/LSTM。问题:

  • 训练慢(必须串行)
  • 长依赖难学(梯度消失)

本文提出:只用 Attention 也行

2. 提出了 Scaled Dot-Product Attention

公式:

Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V

\sqrt{d_k} 这个缩放——是工程小心思但极其重要(详见 L3-05)。

3. 多头注意力(Multi-Head Attention)

不只用一个 attention,并行用 8 个或更多,让模型学到不同的”注意模式”。

4. 位置编码(Positional Encoding)

Attention 本身不知道顺序——他们用正弦/余弦给每个位置编码:

PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos, 2i) = \sin(pos / 10000^{2i/d_{model}})

后来 RoPE、ALiBi 等改进的是这一部分。

5. 完整 Encoder-Decoder 架构

原文是机器翻译用的:

  • Encoder 看完源句子
  • Decoder 用 cross-attention 一边生成一边参考 encoder

2018 年后主流改成 Decoder-only(GPT 风格)或 Encoder-only(BERT 风格)—— 原始 Encoder-Decoder 反而少见了。

论文的实验

在 WMT 英德、英法翻译上:

  • BLEU 分数超过之前所有方法
  • 训练时间是基于 RNN 模型的 1/4

训练快效果好——这两点一起达成,让所有人立刻转 Transformer

一些有趣的细节

为什么叫 “Attention is all you need”

致敬 1964 年披头士的歌《All You Need Is Love》。

8 个作者写的,其中 5 个后来都创办了 AI 公司

  • Ashish Vaswani → Adept AI
  • Noam Shazeer → Character.AI, Google
  • Llion Jones → Sakana AI
  • Aidan N. Gomez → Cohere
  • Łukasz Kaiser → OpenAI

这是 AI 史上”最赚钱的论文”之一——8 个作者的初创公司加起来值 100+ 亿美元。

Google 没用好这篇论文

讽刺的是 —— Google 是发明者,但没有第一个做出 ChatGPT。 OpenAI 在 2018 年从这篇论文起跑,2022 年做出了 ChatGPT。

“Google 写论文,OpenAI 改变世界” —— 一个被反复讲的故事。

这篇论文今天还重要吗

仍然重要。但学习时不必逐字读这篇—— 2017 年的原文写法和现代实现已经有差距。

建议路径:

  1. 先看 L3-05 注意力机制详解 建立直觉
  2. 再看 L3-08 完整 Transformer 架构 整合
  3. 再回头读原文(如果你想做研究)

Andrej Karpathy 的视频《Let’s build GPT》比读原文学得快 10 倍——直接代码实现。

复现

最简实现:

import torch
import torch.nn as nn
import torch.nn.functional as F

class MultiHeadAttention(nn.Module):
    def __init__(self, d_model=512, n_heads=8):
        super().__init__()
        self.d_k = d_model // n_heads
        self.n_heads = n_heads
        self.W_q = nn.Linear(d_model, d_model)
        self.W_k = nn.Linear(d_model, d_model)
        self.W_v = nn.Linear(d_model, d_model)
        self.W_o = nn.Linear(d_model, d_model)

    def forward(self, q, k, v, mask=None):
        batch = q.size(0)
        Q = self.W_q(q).view(batch, -1, self.n_heads, self.d_k).transpose(1, 2)
        K = self.W_k(k).view(batch, -1, self.n_heads, self.d_k).transpose(1, 2)
        V = self.W_v(v).view(batch, -1, self.n_heads, self.d_k).transpose(1, 2)

        scores = (Q @ K.transpose(-2, -1)) / (self.d_k ** 0.5)
        if mask is not None:
            scores = scores.masked_fill(mask == 0, -1e9)
        attn = F.softmax(scores, dim=-1)
        out = (attn @ V).transpose(1, 2).contiguous().view(batch, -1, self.n_heads * self.d_k)
        return self.W_o(out)

不到 30 行,就是 Transformer 的灵魂

推荐配套阅读

  • Karpathy: nanoGPT —— 从零代码实现,约 300 行
  • The Illustrated Transformer(Jay Alammar) —— 图解
  • The Annotated Transformer —— 论文逐行注释
  • HelloAI: L3-05 Attention + L3-08 Transformer 完整架构
💡 一句话总结

这篇论文写的不只是一个模型——是 AI 后续十年的语法。 现在所有大模型都是它的”方言”。

📬

想要更多论文精读

订阅每周精选 —— 下一篇论文笔记直接送邮箱。

💬

讨论区

· 用 GitHub 账号登录评论
⚠️ Giscus 评论未配置 —— 在 src/components/Comments.astro 顶部填入 仓库 ID 和分类 ID(见组件注释里的配置步骤)。