引言
语法纠错 (Grammatical Error Correction, GEC) 是自然语言处理中最实用的应用之一。无论是学生润色论文,还是专业人士起草邮件,我们都依赖这些系统来修正语法、拼写和流畅度错误。
多年来,该领域主要由两种方法主导。第一种是 序列到编辑 (Sequence-to-Edit, seq2edit) 模型,它将问题视为标记任务——标记哪些单词需要被删除、保留或插入。第二种是 序列到序列 (Sequence-to-Sequence, seq2seq) 模型,它将纠错视为翻译任务: 将“糟糕的语法”翻译成“好的语法”。
由 BART 和 T5 等 Transformer 驱动的 seq2seq 模型已经变得非常强大。然而,它们通常以“单遍” (single-pass) 方式运行。模型读取句子一次并生成修正结果。但想想人类是如何修改文本的。我们很少一次就能改得很完美。我们写完,读一遍,优化,然后再读一遍。
这篇博文将深入探讨一篇引人入胜的研究论文 “Multi-pass Decoding for Grammatical Error Correction” (用于语法纠错的多遍解码) , 该论文将这种类似人类的迭代优化引入了 seq2seq 模型。研究人员提出了一种方法,让模型可以进行多次解码 (即多遍解码) ,同时既不会变得效率低下,也不会“遗忘”原始上下文。
我们将探讨他们如何解决迭代解码的两大障碍:
- 效率: 如何防止模型无休止地进行优化?
- 信息丢失: 如何确保模型在进行修改后还能记住原始句子?
让我们深入探讨。
背景: Seq2Seq GEC 框架
要理解这项创新,我们需要先看看标准方法。在典型的序列到序列 GEC 框架中,我们有一个编码器 (Encoder) 和一个解码器 (Decoder) 。
编码器 接收不符合语法的源句子 (我们称之为 \(x\)) ,并将其转换为隐藏状态向量。

解码器 随后获取这些隐藏状态 (\(h_e\)) 以及它已经生成的历史内容 (\(\hat{x}\)),以计算下一个隐藏状态。

最后,一个 分类器 (通常是一个带有 softmax 的全连接层) 预测下一个单词的概率。

在标准设置中,这只发生一次。模型生成一个句子,任务就结束了。
多遍解码 (MPD) 的潜力
多遍解码 (MPD) 提出了一个简单的问题: 为什么要止步于一遍?
如果我们将 修正后的 句子作为新的输入反馈给模型,模型可能会捕捉到第一次错过的错误。这形成了一个循环:
- 输入: “He go to school.” \(\rightarrow\) 输出 1: “He goes to school.”
- 输入: “He goes to school.” \(\rightarrow\) 输出 2: “He goes to the school.” (进一步优化)
然而,这引入了两个主要问题。
- 计算成本: 对每个句子运行多次大型 Transformer 模型是很慢的。如果我们不知道何时停止,推理成本将会飙升。
- 源信息丢失: 这是一个微妙但关键的问题。如果模型在第 1 轮删除了一个词,那么这个词就会从第 2 轮的输入中消失。但如果那个被删除的词包含了第 2 轮修正所需的线索怎么办?
研究人员提出了一种新颖的架构来同时解决这两个问题。
核心方法: 让 MPD 更高效、更智能
论文介绍了两种机制: 用于处理效率问题的 早停机制 (Early-Stop Mechanism) , 以及用于处理记忆丢失问题的 源信息融合 (Source Information Fusion) 。
1. 早停机制
在朴素的 MPD 设置中,你可能会设置一个硬性限制——比如,“总是解码 3 次”。但如果句子在第一次之后就已经完美了呢?那你就在浪费计算资源。
作者提出在模型内部直接训练一个轻量级的逻辑回归分类器 (\(C_e\))。这个分类器观察解码过程结束时 <eos> (句尾) token 的隐藏表示,并预测概率 \(p_e\): “我们现在应该停止吗?”

这里,\(w_e\) 和 \(b_e\) 是可学习的权重和偏置。函数 \(\sigma\) 是一个 sigmoid 函数,输出 0 到 1 之间的值。
训练早停机制
模型如何知道 应该 何时停止?在训练期间,如果满足以下条件,研究人员将解码步骤标记为“停止”(True):
- 输出与上一轮相比没有变化 (收敛) 。
- 输出虽然变了,但与标准答案 (gold reference) 的 编辑距离 增加了 (意味着模型把句子改得更糟了) 。
他们使用二元交叉熵 (BCE) 损失来训练这个特定组件:

该损失被添加到标准的 seq2seq 生成损失中,由超参数 \(\lambda\) 控制:

这个简单的机制允许模型逐句动态地决定——是需要更仔细地思考,还是工作已经完成了。
2. 源信息融合
这是论文在技术上最具创新性的部分。
迭代修正的问题在于“传声筒游戏”效应。随着你修改句子,你离原始输入越来越远。
考虑论文中的这个例子:
- 源句子: “We go to the orchard and brought apples, but forget pears.”
- 第 1 轮修正: 模型修正了 “brought” 的时态为 “bring” (以匹配 “go”) 。
- *结果: * “We go to the orchard and bring apples…”
- 第 2 轮修正: 现在模型想修正语义。它意识到 “bring” 虽然语法没错,但在果园的语境下,“buy” (买) 或 “pick” (摘) 可能是更好的动词。
如果模型只看到第 1 轮的输出 (“bring”),它必须在 “buy” 或 “pick” 之间进行猜测。然而,原始 源词是 “brought"。“Buy” 的过去式是 “bought”,这在发音上与 “brought” 非常相似。这表明用户可能想表达的是 “buy”,但犯了拼写/语音错误。
如果模型忘记了原始源词 “brought”,它就丢失了这个线索。
合并策略
为了解决这个问题,研究人员建议将原始源句子 (\(x\)) 和上一轮的输出 (\(\hat{x}_{t-1}\)) 融合 成一个单一序列。
由于像 BART 这样的预训练模型只有一个编码器,它们不能轻易地输入两个分开的句子。相反,他们使用一种比较算法将它们合并。

如上方的 图 1 所示,合并过程如下:
- 比较 源句子和解码句子。
- 识别 相同 (保留) 的片段和不同 (删除或插入) 的片段。
- 构建 一个保留两者顺序的单一序列。
在图中,“brought” (来自源) 和 “bring” (来自解码) 都保留在合并序列中。这使得编码器可以访问该词的 两个 版本。
编码合并序列
简单地将单词拼凑在一起是不够的;模型需要知道哪个词来自哪里。作者使用了两种嵌入策略:
- 编辑标签 (Edit Tags): 他们为合并序列中的每个 token 分配标签:
- e (equal): 该 token 同时存在于源句子和当前解码中。
- d (delete): 该 token 在源句子中,但在解码中被删除了。
- i (insert): 该 token 是解码中新增的。
- 位置编码 (Position Encodings): 标准 Transformer 使用一个位置 ID (0, 1, 2…)。在这里,token 拥有 两个 位置:
- 源位置: 在原始句子中的索引 (如果它不在那里,则为 0) 。
- 解码位置: 在当前修正句子中的索引 (如果它被删除了,则为 0) 。
通过将这些嵌入相加,模型获得了关于当前修正状态 以及 原始错误历史的丰富表示。
实验与结果
研究人员在两个标准基准上评估了他们的方法: CoNLL-14 和 BEA-19 。 他们将多遍解码 (MPD) 技术应用于强大的基线模型: BART (Base 和 Large) 以及 T5 (Large)。
主要性能
结果非常积极。如 表 1 所示,添加 MPD 后,所有模型都取得了一致的改进。

看看 BART (12-2) 在 BEA-19 测试集上的结果。基线分数是 68.32 。 使用 MPD 后,分数跃升至 71.31 。 在 GEC 领域,近 3 分的提升是巨大的。
值得注意的是与 LLaMa 2 (7B) 的比较。即使在微调之后,这个巨大的大语言模型 (F0.5 为 61.96) 的表现也明显不如专门的 BART + MPD 方法。这凸显了模型并不总是越大越好;专门的架构很重要。
消融实验: 融合重要吗?
研究人员测试了处理源信息的不同方法。
- None: 仅输入上一轮的输出 (标准 MPD) 。
- Concat: 直接将源句子和输出拼接在一起 (长度效率低) 。
- Pos+Edit: 提出的带有位置和编辑标签的合并方法。

表 4 证实,虽然标准 MPD (“None”) 比基线有所改进,但添加源融合 (“Pos+Edit”) 产生了最高的分数。这证实了“记住”源句子可以防止模型偏离用户的原始意图。
效率分析
对多遍解码最大的批评是速度。 早停 机制起作用了吗?

表 3 揭示了这种权衡。
- \(n=3\) (固定 3 轮): 得分为 65.98,但运行速度仅为 0.38x (非常慢) 。
- With \(C_e\) (早停): 得分更高,为 66.44 (可能是因为它在“过度修正”之前停止了) ,运行速度为 0.83x 。
虽然它仍比单遍 (1.00x) 稍慢,但它的速度几乎是固定多遍方法的两倍,并且提供了更好的质量。
语言无关性
为了证明这不仅仅是针对英语的技巧,他们在中文 GEC 数据集上运行了相同的设置。

表 5 中的结果与英语结果相互印证。BART + MPD 方法的表现优于标准 BART 基线超过 2 分,证明了该方法的通用性。
结论
论文 “Multi-pass Decoding for Grammatical Error Correction” 为 GEC 领域超越单遍生成提供了令人信服的论据。通过将错误纠正视为一个迭代过程,我们可以获得显著更高的质量。
对于学生和从业者来说,关键要点是:
- 迭代优化行之有效: 就像人类一样,模型也能从对自己工作的“二次检查”中受益。
- 上下文为王: 在优化过程中不能忽略源输入。将原始错误与当前草稿合并,使模型能够根据原始文本中的语音或语义线索做出明智的决定。
- 效率是可解决的: 我们不需要复杂的强化学习策略来管理解码步骤。训练一个简单的分类器来预测“停止”既有效又高效。
这种方法为我们在精度至关重要的任务中构建 Seq2Seq 模型设立了新标准,这表明文本生成的未来可能是循环的,而非线性的。
](https://deep-paper.org/en/paper/file-3413/images/cover.png)