Anthropic 工程博客 · 中文学习笔记Anthropic 工程笔记

    Bahdanau 注意力:翻译时边对齐边生成

    Neural Machine Translation by Jointly Learning to Align and Translate

    Day 15 · P2 原论文发布:2014-09-01 发表:ICLR 2015(oral) 阅读约 7 分钟 原论文链接 ↗ 30u30 单元 ↗
    作者
    Dzmitry Bahdanau, Kyunghyun Cho, Yoshua Bengio
    依据版本
    arXiv v7
    30u30 单元
    15_bahdanau_attention(讲解、实现与练习请到原仓库查看,本站不翻译、不改编,见导读)
    ⚠️ arXiv 首版 2014-09-01,现行为第 7 版;论文发表于 ICLR 2015(arXiv 页面注明为口头报告)。本笔记依据现行版本撰写。
    本页目录(14)
    1. 一句话总结
    2. 解决什么问题
    3. 核心思想
    4. 关键公式或机制
    5. 1. 三个式子
    6. 2. 实验设置(论文所写)
    7. 3. 结果(论文表 1,测试集 BLEU)
    8. 4. 对齐可视化
    9. 图解
    10. 关键原话
    11. 和 Anthropic 笔记的对应
    12. 读的时候要注意
    13. 30u30 对应单元
    14. 延伸阅读

    一句话总结#

    不要把整句源语言硬塞进一个向量;让解码器在生成每个目标词时,自己去源句里“软搜索”相关的位置,按相关程度加权取信息。

    解决什么问题#

    2014 年的神经机器翻译主要是编码器—解码器结构:一个 RNN 读完源句,把它压成一个固定长度向量;另一个 RNN 从这个向量生成译文。作者的判断是:固定长度向量是瓶颈。句子越长,越难把所有信息塞进去,翻译质量随句长明显下降。

    论文要做的是:在不改变“端到端训练一个神经网络”这个前提下,去掉这个瓶颈。

    核心思想#

    • 编码器保留每个位置的表示:用双向 RNN(BiRNN)读源句,把每个词位置的前向、后向隐藏状态拼起来,得到一串“注释向量”(annotation)h_j。每个 h_j 侧重它附近的词,同时带有整句的信息。
    • 解码器每一步都重新“看”源句:生成第 i 个目标词前,用上一步的解码器状态 s_{i-1} 去给每个 h_j 打分,分数经 softmax 变成权重 α_ij,再对所有 h_j 加权求和,得到这一步专属的上下文向量 c_i。
    • 对齐是软的、可微的:传统统计翻译把对齐当作隐变量;这里对齐模型就是网络的一部分,梯度能穿过它,和翻译模型一起训练。作者把 c_i 解释为“在所有可能对齐上取期望的注释”。
    • 论文把这个部件叫作对齐模型(alignment model)或“软搜索”,并说明它相当于在解码器里实现了一种注意力机制:解码器自己决定要关注源句的哪些部分,编码器也就不必把整句信息都压进一个向量。

    关键公式或机制#

    1. 三个式子#

    • 打分(对齐模型):e_ij = a(s_{i-1}, h_j),论文附录给出的具体形式是一个单隐层前馈网络:a(s_{i-1}, h_j) = v_aᵀ · tanh(W_a s_{i-1} + U_a h_j)
    • 归一化:α_ij = exp(e_ij) / Σ_k exp(e_ik)
    • 上下文向量:c_i = Σ_j α_ij · h_j

    解码器再用 s_{i-1}、上一个输出词和 c_i 计算新状态与下一个词的分布。论文附录提到,对齐模型对一对长度为 Tx、Ty 的句子要计算 Tx × Ty 次,所以特意选了单隐层这种便宜的形式,而且 U_a h_j 与 i 无关,可以预先算好。“每个输出位置都要和每个输入位置打一次分”这个成本结构,在 Transformer 里变成了上下文长度的平方。这种“前馈网络打分”的形式后来常被称为加性注意力,Transformer 论文正是拿它和点积注意力对比。

    2. 实验设置(论文所写)#

    • 任务:WMT ’14 英译法。每种语言只保留最常见的 30,000 个词,其余替换为 [UNK]。
    • 对比:RNNencdec(传统编码器—解码器)与 RNNsearch(本文模型),各自在最长 30 词和最长 50 词的句子上训练(后缀 -30、-50)。隐藏单元数为 1000。

    3. 结果(论文表 1,测试集 BLEU)#

    模型全部句子无未知词的句子
    RNNencdec-3013.9324.19
    RNNsearch-3021.5031.44
    RNNencdec-5017.8226.71
    RNNsearch-5026.7534.16
    RNNsearch-50(训练更久)28.4536.15
    Moses(短语统计翻译)33.3035.63
    • 在所有设置下 RNNsearch 都优于 RNNencdec,而且句子变长时下降得少。
    • 只看不含未知词的句子时,训练更久的 RNNsearch-50 与 Moses 相当(36.15 对 35.63);作者特别指出 Moses 还额外用了一个 4.18 亿词的单语语料。
    • 看全部句子时,本文模型仍低于 Moses(28.45 对 33.30),主要受未知词拖累。

    4. 对齐可视化#

    把 α_ij 画成矩阵(行是目标词、列是源词),大多数权重落在对角线附近,说明英法语序大体一致;在形容词与名词需要调换顺序的地方,权重能正确地“拐弯”。这让模型的行为第一次变得可以直观检查。

    图解#

    flowchart LR
        subgraph ENC["编码器:双向 RNN"]
            x1[源词 1] --> h1["注释 h₁"]
            x2[源词 2] --> h2["注释 h₂"]
            x3[源词 3] --> h3["注释 h₃"]
        end
        s["解码器状态 s(i-1)"] --> SC["对齐模型打分 e(i,j)"]
        h1 --> SC
        h2 --> SC
        h3 --> SC
        SC --> SM["softmax → 权重 α(i,j)"]
        SM --> C["上下文向量 c(i) = Σ α·h"]
        h1 --> C
        h2 --> C
        h3 --> C
        C --> D["生成第 i 个目标词"]
        s --> D

    图解:双向 RNN 编码器为每个源词位置保留一个注释向量;解码器每一步用当前状态给所有注释打分,softmax 得到权重,加权求和成这一步的上下文向量,再和解码器状态一起生成下一个目标词。

    关键原话#

    “we conjecture that the use of a fixed-length vector is a bottleneck in improving the performance of this basic encoder–decoder architecture”

    和 Anthropic 笔记的对应#

    Anthropic 笔记对得上的地方
    面向 AI 智能体的上下文工程本文的出发点是“把所有信息压进一个固定大小的东西会丢信息”,解法是让模型按需去看原始材料。上下文工程讲即时检索、只把需要的片段放进上下文,是在系统层面做同样的选择(类比)。
    上下文检索:给每个文本块补上“它来自哪里”注意力可以看成“对所有位置打分、取加权和”的软查找;RAG 是“对所有文本块打分、取前 k 个”的硬查找。两者都依赖一个好用的打分函数,只是一个可微、一个不可微。
    近期三个问题的事后复盘其中一个问题与上下文窗口路由有关。读完本文和 Transformer 后再看,会更清楚“上下文”对模型来说具体是什么。

    读的时候要注意#

    • 这里的注意力挂在 RNN 上:编码器、解码器都还是 RNN,注意力只是连接两者的部件。Day 13 Transformer 才把 RNN 整个拿掉。
    • 加性打分 vs 点积打分:本文用前馈网络打分;Transformer 用缩放点积。两者思想相同,计算方式不同,读 Day 13 时注意对比。
    • BLEU 数字要放在当时的设定里看:3 万词表、未知词替换、只用平行语料。和 Moses“打平”只在无未知词的子集上成立,不要笼统说“超过了统计翻译”。
    • 对齐图不等于解释:注意力权重直观好看,但“权重高 = 模型因此做出决定”并不是本文证明过的结论(笔者提醒)。
    • 名称问题:文中的“对齐模型”就是今天说的注意力打分函数;不同论文对 query/key/value 的叫法在 Day 13 才统一。

    30u30 对应单元#

    • 30u30 的 Day 15 单元↗(仓库采用 CC BY-NC-ND 4.0,本笔记没有使用其内容)。
    • 路线位置:30u30 导读 的原理支线 P2,建议顺序为 Day 15 → 13 → 14;从这里开始需要 PyTorch 基础才能跑仓库代码。

    延伸阅读#


    本笔记依据 2026-10-18 抓取的在线原文撰写,仅为导读与总结。原文:Dzmitry Bahdanau, Kyunghyun Cho, Yoshua Bengio,《Neural Machine Translation by Jointly Learning to Align and Translate》, ICLR 2015。

    本页目录