多语言 NLP 本节摘要:一个模型、一百多种语言、其中多数零训练数据——跨语言迁移是 2020 年代实用的奇迹。英语有数十亿标注样本,乌尔都语只有几千,米提利语几乎没有。任何服务全球受众的实用 NLP 系统都必须在「没有任务特定训练数据」的长尾语言上工作。多语言模型通过同时在许多语言上训一个模型来解决:共享表示让模型把高资源语种学到的技能迁移到低资源语种。在英语情感分析上微调一下,它对乌尔都语的情感预测开箱就出奇地好——这就是零样本跨语言迁移,重塑了 NLP 走向世界的方式。本节点明取舍、列经典模型(mBERT、XLM-R、XLM-V、mT5、NLLB-200、BLOOM、Aya-23),并讲透那个让新团队栽跟头的决定:如何为迁移选源语言——以及为何默认选英语常常是错的。
本节摘要:一个模型、一百多种语言、其中多数零训练数据——跨语言迁移是 2020 年代实用的奇迹。英语有数十亿标注样本,乌尔都语只有几千,米提利语几乎没有。任何服务全球受众的实用 NLP 系统都必须在「没有任务特定训练数据」的长尾语言上工作。多语言模型通过同时在许多语言上训一个模型来解决:共享表示让模型把高资源语种学到的技能迁移到低资源语种。在英语情感分析上微调一下,它对乌尔都语的情感预测开箱就出奇地好——这就是零样本跨语言迁移,重塑了 NLP 走向世界的方式。本节点明取舍、列经典模型(mBERT、XLM-R、XLM-V、mT5、NLLB-200、BLOOM、Aya-23),并讲透那个让新团队栽跟头的决定:如何为迁移选源语言——以及为何默认选英语常常是错的。最后揭示低资源语言上「分词税」(生育税、变体恢复税、容量外溢税)如何让模型静悄悄变差,以及为何你无法靠堆数据走出一个坏分词器。
对应原课程:Phase 5 · Lesson 18 ·
multilingual-nlp(原英文phases/05-nlp-foundations-to-advanced/18-multilingual-nlp/docs/en.md)。前置依赖:第 04 节(GloVe、FastText、子词)、第 11 节(机器翻译)。
阅读完本节,你应当能够:
英语有数十亿标注样本。乌尔都语有几千。米提利语几乎没有。任何服务全球受众的实用 NLP 系统,都必须在任务特定训练数据不存在的语言长尾上工作。
多语言模型通过同时在许多语言上训一个模型来解决。共享表示让模型把高资源语种学到的技能迁移到低资源语种。在英语情感分析上微调一下,它对乌尔都语的情感预测开箱就出奇地好。这就是零样本跨语言迁移,它重塑了 NLP 走向世界的方式。
三大支柱:
anti- 拿到同一个 token。from transformers import AutoTokenizer, AutoModelForSequenceClassification import torch tok = AutoTokenizer.from_pretrained("joeddav/xlm-roberta-large-xnli") model = AutoModelForSequenceClassification.from_pretrained("joeddav/xlm-roberta-large-xnli") def classify(text, candidate_labels, hypothesis_template="This text is about {}."): scores = {} for label in candidate_labels: hypothesis = hypothesis_template.format(label) inputs = tok(text, hypothesis, return_tensors="pt", truncation=True) with torch.no_grad(): logits = model(**inputs).logits[0] entail_score = torch.softmax(logits, dim=-1)[2].item() scores[label] = entail_score return dict(sorted(scores.items(), key=lambda x: -x[1])) print(classify("I love this product!", ["positive", "negative", "neutral"])) print(classify("मुझे यह उत्पाद पसंद है!", ["positive", "negative", "neutral"])) print(classify("J'adore ce produit !", ["positive", "negative", "neutral"]))
一个模型、三种语言、同一个 API。XLM-R 在 NLI 数据上训过,通过蕴含把戏迁移到分类。
from sentence_transformers import SentenceTransformer import numpy as np model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2") pairs = [ ("The cat is sleeping.", "Le chat dort."), ("The cat is sleeping.", "El gato está durmiendo."), ("The cat is sleeping.", "Die Katze schläft."), ("The cat is sleeping.", "The dog is barking."), ] for eng, other in pairs: emb_eng = model.encode([eng], normalize_embeddings=True)[0] emb_other = model.encode([other], normalize_embeddings=True)[0] sim = float(np.dot(emb_eng, emb_other)) print(f" {eng!r} <-> {other!r}: cos={sim:.3f}")
互译句在嵌入空间里落得近,不同的英语句子落得远。这就是跨语言检索、聚类、相似性能工作的原因。
from transformers import TrainingArguments, Trainer from datasets import Dataset def few_shot_finetune(base_model, base_tokenizer, examples): ds = Dataset.from_list(examples) def tokenize_fn(ex): out = base_tokenizer(ex["text"], truncation=True, max_length=128) out["labels"] = ex["label"] return out ds = ds.map(tokenize_fn) args = TrainingArguments( output_dir="out", per_device_train_batch_size=8, num_train_epochs=5, learning_rate=2e-5, save_strategy="no", ) trainer = Trainer(model=base_model, args=args, train_dataset=ds) trainer.train() return base_model
对 100~500 条目标语种样本,num_train_epochs=5、learning_rate=2e-5 是安全默认。学习率过高会让多语言对齐坍缩,你最终得到一个「英语专用」模型。
| 模型 | 年份 | 覆盖 | 备注 |
|---|---|---|---|
| mBERT | 2018 | 104 语言 | 在维基百科上训。第一个实用多语言 LM,低资源上弱。 |
| XLM-R | 2019 | 100 语言 | 在 CommonCrawl 上训(比维基大得多)。跨语言基线。Base 270M、Large 550M。 |
| XLM-V | 2023 | 100 语言 | XLM-R 配 100 万 token 词表(原 25 万)。低资源更好。 |
| mT5 | 2020 | 101 语言 | 多语言生成的 T5 架构。 |
| NLLB-200 | 2022 | 200 语言 | Meta 翻译模型,含 55 种低资源。 |
| BLOOM | 2022 | 46 语言 + 13 编程 | 开源 176B 多语言 LLM。 |
| Aya-23 | 2024 | 23 语言 | Cohere 多语言 LLM,阿拉伯、印地、斯瓦希里上强。 |
按用例选。分类用 XLM-R-base 是稳妥默认;生成任务按「翻译还是开放生成」选 mT5 或 NLLB;LLM 风格的工作配 Aya-23 或用显式多语言提示的 Claude。
多数团队默认用英语做微调源。2026 研究常常证明这是错的。
语言相似性比原始语料规模更能预测迁移质量。对斯拉夫语目标,德语或俄语常常胜过英语;对印度语目标,印地语常常胜过英语。qWALS 相似度度量(2026,基于世界语言结构图谱特征)量化了这一点。LANGRANK(Lin 等,ACL 2019)是另一个更早的方法,从语言相似性、语料规模、谱系关联的组合里给候选源语种排名。
💡 实用规则:如果你的目标语种有一个类型学相近的高资源亲戚,先试在它上面微调,再和英语微调对比。
保存为 outputs/skill-multilingual-picker.md:
--- name: multilingual-picker description: Pick source language, target model, and evaluation plan for a multilingual NLP task. version: 1.0.0 phase: 5 lesson: 18 tags: [nlp, multilingual, cross-lingual] --- Given requirements (target languages, task type, available labeled data per language), output: 1. Source language for fine-tuning. Default English; check LANGRANK or qWALS if target language has a typologically close high-resource language. 2. Base model. XLM-R (classification), mT5 (generation), NLLB (translation), Aya-23 (generative LLM). 3. Few-shot budget. Start with 100-500 target-language examples if available. Zero-shot only if labeling is infeasible. 4. Evaluation plan. Per-language accuracy (not aggregate), cross-lingual consistency, entity-level F1 on non-Latin scripts. Refuse to ship a multilingual model without per-language evaluation — aggregate metrics hide long-tail failures. Flag scripts with low tokenization coverage (Amharic, Tigrinya, many African languages) as needing a model with byte-fallback (SentencePiece with byte_fallback=True, or byte-level tokenizer like GPT-2).
paraphrase-multilingual-MiniLM-L12-v2 在一个混合语种小语料上搭跨语言检索器。用英语查询,检索任意语种文档,测 recall@5。learning_rate=2e-5 是安全默认:过高会让多语言对齐坍缩,得到英语专用模型。byte_fallback=True/byte-level BPE),训前先验目标文上的生育。下一节,我们钻进「分词税」的根——进入「子词分词」,看 BPE、WordPiece、Unigram、SentencePiece 如何决定一个 token 边界,以及生育与覆盖率为何决定一切。