作者:来自 vivo 互联网算法团队- Huang Minghui

本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略。首先介绍了 NLLB-200 的背景、数据、分词器和模型,以及其与 LLM(Large Language Model)的异同和协同关系。接着列举了实战与应用的案例,包括使用 ChatGPT 生成的样本微调 NLLB-200 和使用 NLLB-200 的翻译结果作为 LLM 的 prompt 等。通过本文的研究和实践,可以为小语种翻译模型和语言模型的融合提供一定的参考和借鉴。

一、NLLB 背景介绍

NLLB(No Language Left Behind) \[1\]  是Meta发起的一个项目,目标是打破语言障碍。不论每个人说的是什么语言,都能使他们平等地获取信息和交流。官方对外宣称,这是全球第一个以单一模型对应多数语言翻译的设计,希望借此能够帮助更多人在社群平台上进行跨语言互动。

NLLB 计划的核心是开发一个既准确又能适应大量语言的翻译模型。这不仅包括像英语、中文和西班牙语这样的广泛使用的语言,还扩展到那些使用人数较少的语言,比如土著和地区性语言,它们通常缺乏用于高质量机器翻译的数据资源。NLLB 计划的更广泛愿景是促进不同语言障碍背后的沟通与知识获取,进而支持全球社区的教育、经济机会和社会包容性。随着这些语言的AI模型和数据集的改进,它们可以被集成到各种工具和平台中,以提供实时翻译服务、内容理解和其他与语言相关的功能,为全球用户带来好处。

NLLB 项目包含多种语言的翻译数据集,也包含基于机器学习技术的翻译模型,这些技术和模型能够更有效地从有限的数据中学习,使得那些可能几乎没有翻译数据的语言也能被翻译成其他语言。为了实现这些目标,NLLB 聚集了研究人员、语言学家和工程师,共同致力于先进的机器学习模型、数据收集和增强策略,以及改进的评估方法,以确保翻译不仅仅是字面上的,而且在文化和语境上也是准确的。

在本文中,我们主要要介绍的是 NLLB 项目中的主角,也就是 NLLB-200 这个预训练模型。这是 Meta AI 开源的一个机器翻译的大模型,支持200+语言之前的互相翻译。

1.1 NLLB-200 数据

目前,谷歌翻译能够覆盖大约130种语言的翻译,而微软则大约能够翻译110种语言。Meta AI 的目标是通过 NLLB 计划实现覆盖200多种语言的翻译。因此,除了考虑模型本身,Meta AI 还需要关注翻译模型层面之外的方面,包括数据标注与数据清洗等。

NLLB-200 项目使用的数据集名为 Flores-200,它是 Flores-101 数据集的扩展,其中包含来自世界各地的101种语言。而 Flores-200 数据集不仅覆盖了之前的语言集合,还增加了更多语言,使总数扩大到了200种。

除了收集公开可用数据和使用网络爬虫爬取的数据外,研究团队还采用回译策略来进一步扩充训练数据集。回译是一种独特的数据增强技术,涉及使用已有的机器翻译模型将目标语言的文本翻译回源语言,以创造新的、丰富的训练样本,有助于提高模型在各种语言上的表现和准确性。

由于这些数据用于机器翻译任务,因此其格式都是句子对格式,即包含第一种语言及其相应的表达,同时包含对应翻译的第二种语言的表达。数据示例如下:

{
  "translation": 
  {
     "ace_Latn": "Gobnyan hana geupeukeucewa gata atawa geutinggai meunan mantong gata.",
     "ban_Latn": "Ida nenten jaga manggayang wiadin ngutang semeton."
  },
     "laser_score": 1.2499876022338867,
     "source_sentence_lid": 1.0000100135803223,
     "target_sentence_lid": 0.9991400241851807,
     "source_sentence_source": "paracrawl9_hieu",
     "source_sentence_url": "_",
     "target_sentence_source": "crawl-data/CC-MAIN-2020-10/segments/1581875144165.4/wet/CC-MAIN-20200219153707-20200219183707-00232.warc.wet.gz",
     "target_sentence_url": "https://alkitab.mobi/tb/Ula/31/6/\n"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

1.2 NLLB-200 分词器

在收集并清理了大量数据之后,NLLB-200 模型使用了 一些方法来促进模型学习到语言不可知(language-agnostic)的表示,从而能够用于多种语言之间的转换,而不仅仅是针对特定的单一语言。其中,最关键的要素之一是设计了一个能够处理所有语言的分词器。在这个分词器中,使用了一个共享的词汇表,采用共享的 SentencePiece 词汇表来编码所有涉及的语言的输入和输出序列。

这意味着相同的子词单元可以在不同的语言之间共用,有助于模型学习到跨语言共通的词汇表示。该 SentencePiece 模型是在采样的1亿个句子上进行训练的。为了确保低资源语言能够得到充分的表示,NLLB 团队对高资源语言进行了下采样,同时对低资源语言进行了上采样,最终训练出一个词表大小高达256206的模型(相比之下,Llama/Llama2/Llama3的词表大小为32000)。

要使用 NLLB 的分词器,我们可以直接调用 Transformers,里面有一个 NllbTokenizer,接收的参数为:

- vocab_file (str)
  - bos_token (str, optional, defaults to "<s>")
  - eos_token (str, optional, defaults to "</s>")
  - sep_token (str, optional, defaults to "</s>")
  - unk_token (str, optional, defaults to "<unk>")
  - pad_token (str, optional, defaults to "<pad>")
  - mask_token (str, optional, defaults to "<mask>")
  - tokenizer_file (str, optional)
  - src_lang (str, optional)
  - tgt_lang (str, optional)
  - sp_model_kwargs (Dict[str, str])
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
from transformers import NllbTokenizer

tokenizer = NllbTokenizer.from_pretrained(
  "nllb/nllb-200-distilled-1.3B", src_lang="eng_Latn", tgt_lang="fra_Latn"
)
example_english_phrase = " UN Chief Says There Is No Military Solution in Syria"
expected_translation_french = (
  "Le chef de l'ONU affirme qu'il n'y a pas de solution militaire en Syrie."
)
inputs = tokenizer(
  example_english_phrase, text_target=expected_translation_french, return_tensors="pt")
  • 1.
  • 2.