📖

Hugging FaceのNLLB

2022/10/16に公開

200以上の言語の任意の翻訳ができるFacebookのNo Language Left Behindを試してみます。
HuggingFaceのtransformersで動かしました。
本当は、facebookresearchのgithubのインストールを試みていましたが、Google ColabでApexのインストールでエラーになり、断念しました。

RuntimeError: Cuda extensions are being compiled with a version of Cuda that does not match the version used to compile Pytorch binaries.  Pytorch binaries were compiled with Cuda 11.3.
    In some cases, a minor-version mismatch will not cause later errors:

は、setup.pyのminor-versionチェックを変更しましたが、さらにエラー

ERROR: No .egg-info directory found

もう無理。。。
なので、HuggingFaceでお手軽に動かしてみます。
なお、NLLBのモデルファイルは、CC-BY-NC 4.0ライセンスなので、商用利用はできません。


NLLB

DISCLAIMER: If you see something strange, file a Github Issue and assign @LysandreJik

Overview of NLLB

The NLLB model was presented in No Language Left Behind: Scaling Human-Centered Machine Translation by Marta R. Costa-jussà, James Cross, Onur Çelebi, Maha Elbayad, Kenneth Heafield, Kevin Heffernan, Elahe Kalbassi, Janice Lam, Daniel Licht, Jean Maillard, Anna Sun, Skyler Wang, Guillaume Wenzek, Al Youngblood, Bapi Akula, Loic Barrault, Gabriel Mejia Gonzalez, Prangthip Hansanti, John Hoffman, Semarley Jarrett, Kaushik Ram Sadagopan, Dirk Rowe, Shannon Spruit, Chau Tran, Pierre Andrews, Necip Fazil Ayan, Shruti Bhosale, Sergey Edunov, Angela Fan, Cynthia Gao, Vedanuj Goswami, Francisco Guzmán, Philipp Koehn, Alexandre Mourachko, Christophe Ropers, Safiyyah Saleem, Holger Schwenk, and Jeff Wang.
論文の要旨は以下の通りです。
地球規模で言語の壁をなくすという目標のもと、機械翻訳は今日の人工知能研究の主要な焦点として確固たる地位を築いています。しかし、こうした取り組みはメジャー言語に集中しており、大半を占めるマイナー言語が置き去りにされているのが現状です。200言語の壁を突破し、高品質かつ倫理的な配慮も怠らないためには、何が必要なのでしょうか。
No Language Left Behindでは、まず、ネイティブスピーカーへのインタビューを通じて、マイナー言語の翻訳サポートの必要性を文脈化することで、この課題に挑みました。そして、マイナー言語とメジャー言語の間のパフォーマンスギャップを縮小することを目的としたデータセットとモデルを作成しました。具体的には、Sparsely Gated Mixture of Expertsに基づく条件付き計算モデルを開発し、マイナー言語に合わせた新規かつ効果的なデータマイニング技術で得られたデータで学習させることで、マイナー言語とメジャー言語の性能差を縮めました。
また、数千のタスクに対して学習を行う際に、オーバーフィッティングに対抗するために、複数のアーキテクチャと学習の改良を提案します。重要なのは、人間が翻訳したベンチマークであるFlores-200を用いて4万以上の異なる翻訳方向の性能を評価し、人間の評価とFlores-200の全言語をカバーする新しい毒性ベンチマークを組み合わせて、翻訳の安全性を評価することである。
本モデルは、従来の最先端技術に対して44%のBLEU向上を達成し、世界共通翻訳システムの実現に向けた重要な基礎を築きました。

Generating with NLLB

ターゲットテキストを生成する際に、forced_bos_token_idをターゲット言語のidに設定します。以下の例は、facebook/nllb-200-distilled-600Mのモデルを用いて、英語からフランス語に翻訳する方法です。
なお、フランスのfra_LatnにはBCP-47のコードを使用しています。Flores 200データセットに含まれる全BCP-47の一覧はこちらをご覧ください。

from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-200-distilled-600M")
model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M")

article = "UN Chief says there is no military solution in Syria"
inputs = tokenizer(article, return_tensors="pt")

translated_tokens = model.generate(
    **inputs, forced_bos_token_id=tokenizer.lang_code_to_id["fra_Latn"], max_length=30
)
tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0]

Generating from any other language than English

翻訳元のデフォルト言語として英語(eng_Latn)が設定されています。別の言語から翻訳することを指定するには、tokenizerのsrc_lang キーワード引数でBCP-47コードを指定する必要があります。
ルーマニア語からドイツ語への翻訳例は、以下をご覧ください。

from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(
    "facebook/nllb-200-distilled-600M", use_auth_token=True, src_lang="ron_Latn"
)
model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M", use_auth_token=True)

article = "Şeful ONU spune că nu există o soluţie militară în Siria"
inputs = tokenizer(article, return_tensors="pt")

translated_tokens = model.generate(
    **inputs, forced_bos_token_id=tokenizer.lang_code_to_id["deu_Latn"], max_length=30
)
tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0]

NllbTokenizer

これ以降はよく分からないのでいつの日か。。。


ということで、英語→日本語を試してみます。
以下、Google Colabで動かしました。

!pip install transformers
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(
    "facebook/nllb-200-distilled-600M", use_auth_token=False, src_lang="eng_Latn"
)
model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M", use_auth_token=False)

article = "Driven by the goal of eradicating language barriers on a global scale, machine translation has solidified itself as a key focus of artificial intelligence research today. "
inputs = tokenizer(article, return_tensors="pt")

translated_tokens = model.generate(
    **inputs, forced_bos_token_id=tokenizer.lang_code_to_id["jpn_Jpan"], max_length=200
)
tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0]
  • 原文
    Driven by the goal of eradicating language barriers on a global scale, machine translation has solidified itself as a key focus of artificial intelligence research today.
  • NLLBによる翻訳
    機械翻訳は,世界規模で言語障壁を根絶する目標に支えられ,今日人工知能研究の中心となるものとして固まりました.
  • DeepLによる翻訳
    地球規模で言葉の壁をなくすことを目標に、機械翻訳は今日の人工知能研究の重要な焦点として確固たる地位を築いています。
  • Googleによる翻訳
    言語の壁を世界規模で根絶するという目標に突き動かされて、機械翻訳は今日の人工知能研究の重要な焦点としての地位を確立しています。

NLLBは、すごいとまでは言えませんが、まあ理解できるぐらいの翻訳はできています。

Discussion