Series · Transfer Learning · Chapter 11

迁移学习(十一):跨语言迁移

从双语词向量对齐讲到 mBERT/XLM-R 多语言预训练,系统拆解零样本迁移、translate-train、translate-test 的取舍,分析迁移差距的来源(语系、文字、资源量),并给出 pivot 策略与可落地的工程建议。

英语有数据,但世界上有 7000 多种语言。跨语言迁移做的事情,就是让一个只在英文 IMDB 上训练过的情感分类器去看西班牙语推特,让一个在 SQuAD 上微调过的问答模型回答印地语问题,让一个从未见过任何斯瓦希里语标注的模型也能在斯瓦希里语命名实体识别上拿到能用的分数。

这件事为什么可能?这一篇从最早期的双语词向量对齐讲起,推到让平行语料变成可选项的多语言预训练(mBERT、XLM-R),最后落到工程上最常见的三个问题:零样本、translate-train、translate-test 该怎么选?哪些语言对会出问题?低资源语言要怎么救?

你将学到什么

  • 共享语义空间假设的几何含义,以及把它落到代码里的 Procrustes 对齐
  • mBERT 在没有平行语料的情况下为什么也能跨语言,子词词表在这里到底贡献了什么
  • XLM-R 相比 mBERT 改了三件事(数据、采样、规模),每一件分别解决了什么
  • translate-train / translate-test / 零样本三种策略的取舍,什么时候用哪一种
  • 没有直接标注的小语种对该怎么做 pivot
  • 迁移差距来自哪里——文字系统、语系、语料规模——以及对应的缓解手段

前置知识

  • BERT 预训练(MLM、[CLS] 池化),见第 2 篇
  • 迁移学习基础,第 1-6 篇
  • 词向量:稠密向量、余弦相似度

问题定义

设 $\ell_s$ 是有大量标注数据的源语言,对应数据集 $\mathcal{D}_s = \{(x_i^{(s)}, y_i)\}$;$\ell_t$ 是没有任何标注的目标语言。经典的零样本跨语言目标是:

$$ \theta^* = \arg\min_\theta \mathbb{E}_{(x,y)\sim \mathcal{D}_s}\,\mathcal{L}\!\left(f_\theta(x), y\right), \qquad \text{然后在 } \mathcal{D}_t \text{ 上评估。} $$

报告时最关键的指标是迁移差距(transfer gap)

$$ \Delta(\ell_s \to \ell_t) = \operatorname{Acc}(\ell_s) - \operatorname{Acc}(\ell_t). $$

如果表示真的语言无关,$\Delta = 0$。现实里 $\Delta$ 从英语到德语的几个点,到英语到斯瓦希里语的二十几个点不等——这一篇剩下的内容基本都在解释这个差距来自哪里、以及怎么办。


共享语义空间

跨语言迁移的核心假设说起来简单,但当年并不容易证明:

不同语言只是表层符号不同,背后的概念是相通的;用一个合适的编码器 $f_\theta$,语义等价的输入会落在 $\mathbb{R}^d$ 中相近的位置。

形式化一点:对于语义等价的两句话 $s^{(\ell_1)}$ 和 $s^{(\ell_2)}$,

$$ \bigl\| f_\theta\!\left(s^{(\ell_1)}\right) - f_\theta\!\left(s^{(\ell_2)}\right) \bigr\| \approx 0. $$

多语言表示空间

上图就是这件事的卡通版:每一个圆代表一个概念,圆里的三个点是同一个意思在三种语言下的向量。如果你的编码器真能做到这样,那么用英文点训练出来的分类头,自然也会在中文点和法文点上激活——你压根没翻译过。

双语词向量对齐

在多语言 Transformer 出现之前,这个假设是在静态词向量上验证的。在英文上训一遍 word2vec,在法文上再训一遍,得到两个互不相干的嵌入矩阵 $\mathbf{X}_s, \mathbf{X}_t \in \mathbb{R}^{n \times d}$(行用一份小的双语词典对齐)。问题是:存不存在一个线性映射,把一边整个搬到另一边?

答案是存在,并且这个映射应该是正交的——旋转和反射保持内积,正好保留 word2vec 学到的几何关系。这就是 Orthogonal Procrustes

$$ \mathbf{W}^* = \arg\min_{\mathbf{W}} \bigl\|\mathbf{X}_s\mathbf{W} - \mathbf{X}_t\bigr\|_F^2 \quad\text{s.t.}\quad \mathbf{W}^\top \mathbf{W} = \mathbf{I}. $$

它有闭式解。对 $\mathbf{X}_t^\top \mathbf{X}_s$ 做 SVD 得到 $\mathbf{U}\boldsymbol{\Sigma}\mathbf{V}^\top$,则 $\mathbf{W}^* = \mathbf{V}\mathbf{U}^\top$。Conneau 等人(2018)后来证明这一步连双语词典都可以扔掉,用对抗训练就能恢复出 $\mathbf{W}$,这才有了完全无监督的双语词典抽取。

为什么先讲这个?因为多语言 Transformer 本质上是在更高维的空间里、端到端地、隐式地完成同样的对齐


多语言预训练

mBERT 与 XLM-R 对比

mBERT:先把它跑通的基线

Devlin 团队的原始配方很朴素:拿 BERT-base,把 104 种语言的维基百科拼起来,用一份共享的 110K WordPiece 词表,只跑 MLM 目标,没有平行语料,没有语言 ID

让人意外的是,这样竟然就 work 了。Pires 等(2019)和 Wu & Dredze(2020)把原因归结为三股力量:

  1. 锚点 token。 数字、标点、人名地名、英文借词(COVIDOKInternet)在多种语言里长得一模一样。同一个 token 出现在很多种语言的上下文里,它的嵌入会被推向一个语言无关的中心。
  2. 子词重叠。 WordPiece 会把同源词切成相同的片段。international(英)和 internationale(法)共享 inter + national。两种语言只要共享几千个子词,它们的嵌入就会被间接拉到同一个子空间里。
  3. 深层参数共享。 12 层 Transformer 在 104 种语言之间完全共享。从压缩的角度看,“在多种语言里复用同一套电路"是模型最省 bit 的策略,所以它就这么做了。

最反直觉的实验:把锚点 token 全部去掉,跨语言 NER 只掉了大约 5 个点。真正起决定作用的反而是子词重叠。

XLM-R:堆数据、改采样、加规模

Conneau 等(2020)问了一个直接的问题:那些精巧设计扔掉,纯粹堆规模会怎样?XLM-R 相对 mBERT 改了三件事:

维度mBERTXLM-R
语料Wikipedia(约 13 GB)CommonCrawl(2.5 TB,约 200 倍)
词表WordPiece,110KSentencePiece,250K
采样经验性指数采样$p_\ell \propto n_\ell^{0.7}$
参数量110M270M(base)/ 550M(large)

采样的改动比看起来重要得多。如果不加干预,模型看到英文的次数会比斯瓦希里语高几个数量级,斯瓦希里语的表示就会退化。用 $\alpha = 0.7$ 之后,高资源语言依然占大头,但长尾语言至少能看到足够多的子词共现,把基础统计学会。最终 XLM-R-large 在 XNLI 上比 mBERT 平均高约 10 个点——而这个差距主要来自长尾语言。

子词:被低估的真正主角

子词分词

看一眼"国际化"这个概念在四种语言里的分词结果。international 在英、法、德三种语言里都出现,共享的是同一行嵌入;只有中文因为字形完全不同,子词彼此独立。这解释了一个工程现象:共享文字与构词法的语言之间,跨语言迁移几乎是"免费"的;overlap 越少,迁移越难。 具体来说:

  • en -> de 简单:共享拉丁字母,维基百科子词重叠率约 30%。
  • en -> zh 难一些:模型只能从上下文里学对齐,差距明显。
  • en -> sw 的瓶颈不是对齐,是模型到底见过多少斯瓦希里语

迁移差距究竟从哪儿来

10 种语言的零样本 NER

上图是 WikiAnn 上的零样本 NER F1。三个规律每次都会出现:

  1. 同语系胜过跨语系。 德语、荷兰语、西班牙语、法语(印欧 + 拉丁字母)都在 80 F1 附近;阿拉伯语和中文比它们低十个点左右,尽管预训练语料其实比荷兰语还多。
  2. 资源量重要,但有上限。 把斯瓦希里语的预训练语料从 1 GB 加到 50 GB,提升明显;从 50 GB 加到 200 GB(德语量级),几乎听不到响。
  3. 与 in-language oracle 的差距是双峰的。 高资源印欧语种的 oracle 通常只比 XLM-R-large 零样本高 5-10 个点;低资源非拉丁文字的 oracle 可能高 15-25 个点。

把语料规模和零样本性能放在一起,资源效应就更直观了:

语料规模与零样本准确率

紫色虚线是 log-linear 拟合,能看出"高资源平台 + 低资源悬崖"的形状。绿色方块是开了 $\alpha=0.7$ 平衡采样后的结果:英语几乎没动,斯瓦希里语和约鲁巴语提升 5-7 个点


三种工程策略

工业上常用的就三套打法,挑一种之前最好都见过。

translate-train / translate-test / 零样本对齐

1. 零样本直接迁移

在英语标注上微调 XLM-R,部署的时候直接把目标语言喂进去。编码器本身已经是对齐的,分类头只看 [CLS],自然能泛化。

  • 优点:最便宜,一个模型支持所有目标语言,不依赖 MT。
  • 缺点:当目标语言离源语言很远时,准确率会留出空间。
  • 适用:要支持的目标语言很多,或者 MT 系统本身不可靠。

2. translate-train

把英文训练集机器翻译到目标语言,再在翻译数据上微调(通常和原始英文混合训练效果更好)。

  • 优点:相比零样本通常能再涨 2-5 个点,对低资源目标尤其明显。
  • 缺点:成本随目标语言数量线性增长;翻译质量差时反而掉点;除非联合训练,否则要给每个目标语言部署一个模型。
  • 适用:目标语言不多,且对应的 MT 还行。

3. translate-test

仍然只维护一个英文微调模型。推理时把目标语言输入翻译回英文,再过英文模型。

  • 优点:只维护一个模型,加新语言无需重训。
  • 缺点:每次推理多一次 MT 调用,延迟变高;翻译错误会和模型错误叠加。
  • 适用:临时加一种新语言,没有再训练预算。

图中下半部分的对比条总结了取舍。实践里大多数团队的做法是:先上一个零样本的 baseline 服务所有语言,再 translate-train 流量最大的几种语言,长尾留 translate-test 兜底。

没有直接标注的语言对:pivot 策略

pivot 策略

对于双向 MT 都不靠谱的小语种对(比如约鲁巴 -> 豪萨),通常通过一种高资源语言做中转。上图三种模式覆盖了工业里见到的绝大多数做法:

  • 源端 pivot(translate-test 走英文)。 约鲁巴输入 -> 英文 MT -> 英文模型。只要约鲁巴 -> 英文的 MT 勉强可用就行。
  • 目标端 pivot(translate-train 走英文)。 拿英文标注,MT 到豪萨,训练。前提是英文 -> 豪萨 MT 不要太差。
  • 多源集成。 训多个分类器(英、西、德各一个),在目标语言上把预测平均。当多个源语言的归纳偏置互补时,这种做法常常最强。

跨语言提示与代码转换

两个在现代系统里出现频次较高的小工具。

语言无关的连续 prompt。 不再每种语言写一份模板,而是在每条输入前面拼上 $m$ 个可学习的前缀向量 $\mathbf{P} = [\mathbf{p}_1, \dots, \mathbf{p}_m]$,并在多种语言上联合训练:

$$ \min_{\mathbf{P}} \; \sum_{\ell} \mathbb{E}_{(x,y)\sim \mathcal{D}_\ell}\,\mathcal{L}\!\left(f_\theta\!\left([\mathbf{P}; x^{(\ell)}]\right), y\right). $$

冻结的编码器保持跨语言;prompt 学到的是任务级别的锚点,不偏向任何一种语言。

代码转换数据增强。 训练时随机把源语言的部分词替换成目标语言的对应翻译,同时保留句法结构。这件事在教编码器:一个 token 的意思比它属于哪种语言更重要。在 GLUECoS、LinCE 这类代码混合基准上能稳定提升 5-10 个点。


实现示例

零样本跨语言分类器最小可用版本,建在 mBERT/XLM-R 上:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import torch
import torch.nn as nn
from transformers import AutoModel, AutoTokenizer


class CrossLingualClassifier(nn.Module):
    """基于多语言编码器 [CLS] 池化的分类器。"""

    def __init__(self, model_name: str = "xlm-roberta-base",
                 num_classes: int = 3, dropout: float = 0.1) -> None:
        super().__init__()
        self.encoder = AutoModel.from_pretrained(model_name)
        hidden = self.encoder.config.hidden_size
        self.head = nn.Sequential(
            nn.Dropout(dropout),
            nn.Linear(hidden, hidden),
            nn.Tanh(),
            nn.Dropout(dropout),
            nn.Linear(hidden, num_classes),
        )

    def forward(self, input_ids, attention_mask):
        out = self.encoder(input_ids=input_ids,
                           attention_mask=attention_mask)
        cls = out.last_hidden_state[:, 0]      # [CLS] 向量
        return self.head(cls)


# 训练:英文 (input_ids, labels) 反传,编码器 + 分类头一起更新。
# 评估:同一份模型、同一个 tokenizer,直接喂中文 / 法文输入。
# 编码器共享的子词空间和对齐过的 [CLS] 表示在背后做完了所有工作。

比代码本身更值得记住的几条经验:

  • 训练和推理用同一个 tokenizer。tokenizer 不一致是这个领域里最常见的"安静 bug”。
  • 零样本场景下不要冻结编码器——在源语言上做完整微调,比"冻结 + 线性探针"稳定高 3-5 个点。
  • translate-train 时把英文和翻译数据按 1:1 在同一个 batch 里混合;只用翻译数据训练,会在不补回目标语言增益的同时掉源语言性能。

常见问题

mBERT 没有平行语料,为什么能跨语言?

三股力量同时发力:跨语言共享的锚点 token(数字、标点、借词),把嵌入表"焊"到一起的子词重叠,以及强制语言无关特征成为最便宜表示的深层参数共享。去掉任何一项都会明显劣化迁移;三项全部去掉,跨语言能力就没了。

源语言怎么选?

默认选标注最多的那一个(基本上就是英语)。如果迁移差距特别难看,再考虑同语系的源:目标是西班牙语时,意大利语或葡萄牙语标注往往比英语标注效果更好。目标是斯瓦希里语时,英语依然是首选——因为别的语言根本就没有标注。

XLM-R 还是 mBERT?

默认 XLM-R,除非你被设备推理资源卡死。XLM-R-base(270M)相对 mBERT(110M)推理慢约 1.5 倍,但每一种长尾语言上都高 5-10 个点;XLM-R-large 慢 3 倍,再高 2-4 个点。

理论上限是什么?

跨语言迁移的上界由编码器表示空间里两种语言分布之间的互信息决定。经验观测:印欧语系内部的同族语言对,差距能压到 3-5 个点;跨语系(英 -> 中、英 -> 阿)通常稳定在 8-12 个点;极低资源目标(约鲁巴、斯瓦希里)瓶颈不在对齐而在"模型见过多少这种语言"。

translate-train 在准确率上几乎总是赢,为什么还要发布零样本?

成本。translate-train 需要每种目标语言都跑 MT(训练侧的延迟,再加上要维护 MT 系统本身),而且通常会落地成"每种语言一个模型"。零样本是一个模型服务全部 100 种语言。所以工业里常见的不是二选一,而是"先零样本兜底,再 translate-train 头部流量语种"。

目标是低资源语言,操作顺序是什么?

(a)先试 XLM-R-large 零样本。(b)如果还不够好,做适应性预训练:在目标语言的单语语料上继续跑几个 epoch 的 MLM,然后再微调。(c)能拿到对应语种的 MT 时,加一份 translate-train。(d)如果能收集到哪怕 100 条目标语言的标注,把它们混进去——少量目标语言数据在零样本之上的边际增益是非常高的。


参考文献

  • Conneau, A., Lample, G., Ranzato, M.A., et al. (2018). Word translation without parallel data. ICLR.
  • Devlin, J., Chang, M.W., Lee, K., Toutanova, K. (2019). BERT: Pre-training of deep bidirectional Transformers for language understanding. NAACL.
  • Pires, T., Schlinger, E., Garrette, D. (2019). How multilingual is multilingual BERT? ACL.
  • Wu, S., Dredze, M. (2020). Are all languages created equal in multilingual BERT? RepL4NLP.
  • Conneau, A., Khandelwal, K., Goyal, N., et al. (2020). Unsupervised cross-lingual representation learning at scale (XLM-R). ACL.
  • Hu, J., Ruder, S., Siddhant, A., et al. (2020). XTREME: A massively multilingual multi-task benchmark. ICML.
  • Lauscher, A., Ravishankar, V., Vulic, I., Glavas, G. (2020). From zero to hero: On the limitations of zero-shot language transfer. EMNLP.

系列导航

部分主题
1基础与核心概念
2预训练与微调
3域适应
4小样本学习
5知识蒸馏
6多任务学习
7零样本学习
8多模态迁移
9参数高效微调
10持续学习
11跨语言迁移(本文)
12工业应用与最佳实践

Liked this piece?

Follow on GitHub for the next one — usually one a week.

GitHub