引言

在自然语言处理 (NLP) 领域,我们已经习惯了“越大越好”的范式。像 BERT 或 GPT 这样的大型模型,实际上是在整个互联网的数据上进行训练的,它们在接触具体任务之前就已经学习了语言的统计模式。但是,当我们从句子和段落的层面缩小到单个字符的层面时会发生什么?更重要的是,当我们没有针对某种特定语言的互联网级海量数据时,又该怎么办?

这就是低资源语言中形态变化推断 (Morphological inflection) 所面临的挑战。形态学研究的是单词的内部结构。正是这套系统告诉我们,“walk”的过去式是“walked”,但“run”的过去式却是“ran”。要想让机器掌握一门语言,它们必须理解这些规则。

在最近的一篇论文中,研究人员探讨了一个有趣的问题: 我们能否仅利用已有的数据,通过无监督任务来训练模型,从而提高其对单词进行词形变化的能力?

结果令人惊讶。研究表明,像“自编码” (预测输入单词本身) 这样简单的任务可以显著提升性能,有时甚至超过了驱动 BERT 等模型的复杂“去噪”策略。这篇博客文章将剖析他们的方法、架构,以及在数据稀缺时训练模型的启示。

问题: 字符级转导

在深入探讨解决方案之前,让我们先将问题形式化。字符级序列到序列任务 (或字符转导) 涉及将源字符串映射到目标字符串。与机器翻译 (我们将英语单词映射为法语单词) 不同,这里我们将“词元 (lemma) ” (单词的字典形式) 根据特定的语法特征映射到其“屈折形式 (inflected form) ”。

从数学上讲,如果我们有一组源字符串 \(S\) 和目标字符串 \(Y\),以及一组形态标签 \(\tau\),我们试图学习一个函数:

形态变化推断的函数定义。

在这里,\(f\) 通常是一个神经网络。这个函数在实际应用中的一个经典例子如下:

将 ‘cry’ 加上过去时标签映射为 ‘cried’ 的示例。

模型必须学会将标签 PST (过去时) 添加到 cry 上,即把 y 变成 i 并加上 ed。对于像英语这样拥有丰富示例的高资源语言来说,这微不足道。但对于低资源语言——这占了世界上语言的大多数——我们可能只有几百个训练对。

研究人员调查了 27 种类型各异的语言来验证他们的假设。如下表所示,这包括从阿姆哈拉语 (Amharic) 和白俄罗斯语 (Belarusian) 到纳瓦霍语 (Navajo) 和梵语 (Sanskrit) 的各种语言。

表 1 列出了研究中使用的 27 种语言。

方法: 无监督辅助任务

这篇论文的核心创新不在于一个新的庞大架构,而在于一种巧妙的训练策略。作者探索了利用无监督辅助任务进行迁移学习

迁移学习通常涉及先在辅助任务 (如语言建模) 上训练模型,然后在目标任务上对其进行微调。作者比较了两种具体的训练安排方式:

  1. 预训练 (PT) : 先在辅助任务上训练,然后在词形变化任务上微调。
  2. 多任务学习 (MTL) : 同时在辅助任务和词形变化任务上训练。

但这些“辅助任务”是什么呢?作者专门研究了不需要人工标注的任务。他们直接从现有的训练集中提取这些数据。

任务 1: 自编码 (AE)

自编码在概念上很简单。模型接收一个单词作为输入,并被要求预测完全相同的单词作为输出。

自编码示例: tried 映射为 tried。

在形态变化推断的背景下,这教会了模型该语言的有效字符序列。它迫使模型学习单词 tried 的表示,而无需担心语法转换。

任务 2: 去噪 (CMLM)

去噪是 BERT 和 RoBERTa 等著名模型背后的机制。作者使用了字符级掩码语言建模 (CMLM) 。 他们选取一个单词,通过掩盖或更改某些字符来破坏它,然后要求模型恢复原始单词。

去噪示例: tr@e@ 映射为 tried。

在这个例子中,@ 符号充当噪声标记。模型必须推断出 tr@e@ 实际上是 tried。这通常被认为比自编码更难,因为它要求模型理解周围字符的上下文来填补空白。

目标函数

对于多任务学习 (MTL) 设置,模型必须在学习词形变化任务 (将“cry”变为“cried”) 和无监督任务 (将“tr@e@”变为“tried”) 之间取得平衡。

用于训练模型的损失函数是两个任务损失的加权和:

多任务学习的损失函数公式。

在这个公式中:

  • \(\theta\) 代表模型参数。
  • \(l_1\) 是无监督任务 (AE 或 CMLM) 的损失。
  • \(l_2\) 是主要词形变化任务的损失。
  • \(\alpha\) 和 \(\beta\) 是权重 (在本文中设为 1) ,决定每个任务的重要性。

实验与结果

作者着手回答三个主要问题。让我们看看数据怎么说。

RQ1: 即使没有新数据,这也有帮助吗?

通常,无监督任务之所以有用,是因为它们允许我们使用海量的未标记外部数据。然而,在这个实验中,作者从现有的训练集中生成无监督数据。

结论: 是的。

观察下面的结果表,将“Baseline” (基线) 列与“PT-AE” (预训练自编码) 或“MTL-AE” (多任务自编码) 进行比较。

表 2 显示了 27 种语言中 5 种模型变体的开发集和测试集准确率。

几乎所有方法都优于基线。这是一个至关重要的发现: 在低资源环境下,只需让模型记忆或去噪训练数据,无需引入任何额外的外部单词,就能提高性能。

RQ2: 去噪 (CMLM) 比自编码 (AE) 更好吗?

鉴于 BERT 的成功,人们可能会认为去噪 (CMLM) 优于简单的自编码。

结论: 不,自编码获胜。

在上表中,MTL-AE (多任务自编码) 取得了最高的平均测试准确率 (73.66) ,显著击败了 MTL-CMLM (62.76) 。即使在预训练设置中 (PT-AE 对比 PT-CMLM) ,自编码也略占优势。

这表明对于数据集较小的字符级任务,简单地复制输入的简单目标可能比重建噪声输入的复杂任务提供更好的归纳偏置。

RQ3: 预训练 vs. 多任务学习?

结论: MTL 获胜,但有风险。

带有自编码的多任务学习 (MTL-AE) 是整体表现最好的。然而,带有去噪的多任务学习 (MTL-CMLM) 实际上比基线更差

这个结果令人费解。为什么在与主任务同时进行时,训练去噪任务反而会伤害模型呢?

深入剖析: 为什么去噪会损害 MTL?

作者假设,当在完全相同的少量词汇表上进行优化时,去噪任务 (tr@e@ -> tried) 可能与词形变化任务 (cry + PST -> cried) 差异太大。这两个目标可能在相互打架,将模型的参数拉向冲突的方向。

为了验证这一点,他们引入了外部数据

他们从通用依存树库 (Universal Dependencies, UD) ——一个大型树库集合——中获取数据。他们将这些外部文本用于辅助无监督任务。

假设是: 如果我们使用外部数据,无监督任务的分布将足够不同,从而不会与词形变化任务发生冲突,或者增加的多样性可能足以压倒冲突。

引入外部数据的结果

表 3 显示了添加外部 UD 数据后的结果。

如上表 3 所示,添加外部数据 (“-UD”列) 彻底改变了局面。

  • MTL-CMLM-UD (使用外部数据进行去噪) 跃升至 72.22 的准确率,相比没有外部数据时的 62.76 有了巨大的提升。
  • 现在它轻松击败了基线。

这证实了去噪是一个强大的目标,但在仅限于小数据集的多任务设置中,它需要更广泛的数据分布才能有效。

分析梯度

为了理解为什么在多任务设置中自编码 (AE) 稳定而去噪 (CMLM) 波动,研究人员分析了训练过程中的梯度

梯度告诉我们需要多少程度地更新模型权重以减少误差。理想情况下,在多任务设置中,我们希望辅助任务在主任务学习的同时提供稳定、有益的更新。

显示辅助任务梯度分布的小提琴图。

图 1 有助于可视化这一点。这些“小提琴图”显示了训练早期阶段辅助任务梯度的分布。

  • MTL-AE (左侧 蓝色/紫色) : 分布紧凑且集中在零附近。这意味着稳定性。自编码任务不需要对模型权重进行剧烈的更新。
  • MTL-CMLM (中间 橙色) : 分布较宽 (尾部较长) 。这表明方差很高。去噪任务的优化信号充满了“噪声”,这很可能干扰了主要词形变化任务的学习。

该分析表明,AE 之所以“出奇有效”,是因为它稳定了表示学习,而没有干扰学习形态规则的精细过程。

结论与启示

这篇研究论文为从事低资源语言或字符级任务的学生和从业者提供了一本实用的指南。

以下是主要收获:

  1. 不要浪费你的数据: 即使找不到更多数据,你也可以“重用”你的训练数据进行自编码等无监督任务,以提升性能。
  2. 保持简单: 像掩码语言建模 (去噪) 这样的复杂目标并不总是更好。对于字符级转导,简单的自编码通常能产生更好的结果。
  3. MTL 很强大但也很敏感: 多任务学习通常优于预训练,但必须谨慎选择辅助任务。如果任务发生冲突 (如在相同的小数据上进行去噪和词形变化) ,性能可能会下降。
  4. 外部数据解决冲突: 如果你想使用像去噪这样的复杂目标,你可能需要在 MTL 设置中引入外部数据 (如通用依存树库) 才能使其发挥作用。

通过理解训练目标与数据可用性之间的相互作用,我们可以构建更健壮的模型,逐个字符地保护世界多样化语言的丰富性。