NLLB-200をLoRAで日英翻訳に特化させた話
はじめに
言語処理100本ノック 2025 (Rev 1)は、東北大学の乾・鈴木研究室が公開している自然言語処理(NLP)の演習問題集である。UNIXコマンドによるテキスト処理、正規表現、形態素解析、単語ベクトル、ニューラル機械翻訳など、全100問を通じてNLPの基礎から応用までを体系的に学ぶことができる。

本記事では、第10章の課題であるニューラル機械翻訳モデルの構築について、実装の詳細と得られた知見を記録する。
課題「自分だけの翻訳エンジンを作る」
KFTTデータセット
手元にあるのは、京都フリー翻訳タスク(KFTT)のデータセットだけである。KFTTはGraham Neubig氏が整備した日英機械翻訳の評価用データセットで、NICTが制作した「Wikipedia日英京都関連文書対訳コーパス」をベースとしており、CC BY-SA 3.0ライセンスで公開されている。京都関連のWikipedia記事を対象とした日本語と英語の対訳がセットになっている。
データの規模は以下のとおりである。
- 学習データ 約44万文(日本語12.0M単語、英語11.5M単語)
- 開発データ 1,166文
- テストデータ 1,160文
このデータセットを用いて翻訳モデルを構築するのが本課題の目的である。対象が京都関連の百科事典テキストであるため、歴史・文化に関する専門用語、固有名詞の翻字、日本語特有の概念の意訳など、一般的な翻訳タスクと比較して難易度が高い。
制約と目標
- 実行環境 Google Colab(NVIDIA A100-SXM4-40GB)
- 学習時間 3〜4時間以内
- 目標 BLEUスコア15以上
NLLB-200の選択
翻訳タスクには翻訳に特化したモデルを
ベースモデルとして、Meta社の NLLB-200(No Language Left Behind)を選択した。NLLBは200以上の言語に対応した多言語翻訳モデルであり、Fairseqフレームワーク上で構築されている。
モデル選択の動機はシンプルで、翻訳タスクであれば翻訳に特化したモデルを使うべきだという判断である。汎用的な大規模言語モデル(LLM)をファインチューニングするアプローチもあり得るが、NLLBは最初から翻訳のために設計・訓練されているため、少ないデータと短い学習時間でドメイン適応が可能になる。なお、NLLBは2022年公開のモデルであり、変化の激しいこの分野においては最新とは言えない。ファインチューニング前提であれば、より新しい汎用モデルを選ぶアプローチも有効である。
Dense, MoE, Distilled
NLLB-200にはいくつかのバリエーションが公開されている。
- MoE(Mixture of Experts) は、複数の専門家ネットワーク(サブネットワーク)を持ち、入力に応じて一部だけを選択的に使用するアーキテクチャ。精度は高いが、モデルサイズが大きい
- Dense(密結合モデル) は、通常のTransformerで、全パラメータが毎回の計算に参加する。シンプルで安定しているが、MoEと比較するとメモリ効率は相対的に劣る
- Distilled(蒸留モデル) は、大規模モデルの知識をコンパクトなモデルに転写したもの
今回選択したのは NLLB-200-distilled-600M、すなわちDense構造の蒸留版(約6億パラメータ)である。6億パラメータの全てが毎トークンの処理に使われる。Colab環境で学習可能なサイズでありながら、蒸留により大規模モデルの翻訳知識を引き継いでいる。
NLLBはエンコーダ・デコーダ構造(Seq2Seq)を採用しており、入出力の言語は言語コードトークン(日本語 jpn_Jpan、英語 eng_Latn)で明示的に指定する。
日本語テキスト
↓
SentencePiece トークナイザー
↓
NLLB-200 エンコーダ
↓
NLLB-200 デコーダ (+LoRA)
↓
ビーム探索
↓
英語テキスト
GPUメモリとの戦い
A100のメモリアーキテクチャ
今回使用したNVIDIA A100は、プロセッサ(GPU)の隣にHBM2eメモリを80GB搭載している。モデルの学習では、このメモリにモデル本体だけでなく、オプティマイザの状態や勾配も保持する必要がある。限られたメモリに「できるだけコンパクトに、でも精度は落とさずに」モデルを収めることが課題になる。

混合精度訓練(FP16)
計算精度を保ちつつ高速に処理するために、混合精度訓練(FP16)を使用した。通常のFP32(32ビット浮動小数点)の代わりにFP16(16ビット)で計算することで、メモリ使用量を半減させ、A100のTensor Coreによる高速演算を活用できる。精度を維持しつつ低いビット数で計算する手法は広く確立されており、現在のディープラーニング訓練では標準的な設定である。
LoRA(パラメータの効率的な更新)
6億パラメータの全てをFP16で格納しても約1.2GBだが、学習時にはオプティマイザの状態(Adamの場合、各パラメータにつき2つの追加変数)や勾配の保持が必要になり、メモリ消費は数倍に膨れ上がる。ここで導入するのがLoRA(Low-Rank Adaptation)である。
LoRAはMicrosoft Researchが論文で提案した手法で、元の重み行列 \(W_0\) を固定し、低ランクの更新行列 \(\Delta W = BA\) のみを学習するというアイデアである。 \(B\) と \(A\) はランク \(r\) の行列であり、 \(r\) を元の次元より十分に小さく設定することで、更新パラメータ数を劇的に削減できる。推論時は \(W_0 + BA\) を事前に統合しておけば、追加の計算コストは発生しない。

今回の設定は以下のとおりである。
- ランク(r) 32
- スケーリング係数(alpha) 64
- 適用対象 Attention層のQuery, Key, Value, Output射影行列
- ドロップアウト率 0.05
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=32,
lora_alpha=64,
target_modules=["q_proj", "v_proj", "k_proj", "out_proj"],
lora_dropout=0.05,
bias="none",
task_type="SEQ_2_SEQ_LM"
)
model = get_peft_model(model, lora_config)
残りの98.5%のパラメータは固定されるため、事前学習で獲得した汎用的な翻訳知識が保持される。
コサイン減衰スケジューラーによる学習戦略
学習率の制御
学習率のスケジューリングにはコサイン減衰(Cosine Annealing)を採用した。調整可能なハイパーパラメータは主に3つである。
- \(\eta_{max}\)(最大学習率)はコサインカーブのピークとなる学習率で、今回は \(3 \times 10^{-4}\)
- \(\eta_{min}\)(最小学習率)はコサインカーブの底の学習率で、デフォルトは0
- \(T_{max}\)(周期の長さ)は、何ステップでコサインカーブを1周するかを指定する

ウォームアップ
学習の最初から学習率を全開にすると、重みが大きく壊れてしまうことが知られている。そこで、全ステップの5%(約1,700ステップ)をウォームアップ期間とし、学習率を0から \(\eta_{max}\) まで線形に増加させた。ウォームアップの後は、コサイン関数に従って学習率を \(\eta_{min}\) に向けて滑らかに減衰させる。
学習が進むにつれてモデルが覚えるべきことは減っていき、微細な調整のフェーズに移行する。コサイン減衰はこの過程を自然に表現しており、後半では小さな学習率で精密な最適化が行われる。
その他の設定
- バッチサイズ 64
- エポック数 5(データセット全体を5周)
- 重み減衰 0.01(L2正則化として機能し、過学習を抑制する)
- 総ステップ数 約34,400
訓練には約3.5時間を要した。
実験結果
翻訳品質
BLEUスコア(ビーム幅5で評価)は以下のとおりである。
- 開発データ BLEU 21.01
- テストデータ BLEU 22.09
以下に翻訳例を示す。
正解:Dogen was a Zen monk in the early Kamakura period.
出力:Dogen was a Zen priest in the early Kamakura period.
「僧」を "monk" ではなく "priest" と訳している差異はあるが、文構造は正確であり自然な英語が生成されている。"monk" と "priest" はいずれも禅僧の英訳として用いられることがあり、文脈依存の翻訳揺れである。
正解:The founder of Soto Zen
出力:He was the founder of the Soto sect.
前文の文脈を引き継いで主語 "He" を補い、完全な文として出力している。正解が名詞句であるのに対し、モデルは主語付きの文を生成しており、翻訳としてはより自然ともいえる。
ビーム探索の最適化
デコード時のビーム幅を変化させ、翻訳品質への影響を調べた。計算コストを抑えるため、二段階方式を採用した。
- 第一段階 200文のサンプルで6パターン(ビーム幅1, 2, 3, 5, 7, 10)を評価し、候補を絞り込む
- 第二段階 上位3つ(ビーム幅10, 7, 2)を全開発データ(1,166文)で検証
全開発データでの結果は以下のとおりである。
- ビーム幅2 BLEU 21.05
- ビーム幅7 BLEU 21.15
- ビーム幅10 BLEU 21.31(最良)
ビーム探索は、各タイムステップで上位 \(k\) 個(ビーム幅)の候補を保持しながらデコードを行う手法である。ビーム幅1の場合は各ステップで最も確率の高いトークンだけを選ぶ貪欲探索(Greedy Search)になる。ビーム幅を大きくすると、より多くの候補を並行に探索するため翻訳品質が向上する傾向がある一方、計算時間もビーム幅に比例して増加する。
今回の実験では、ビーム幅を2から10に増やしても改善幅は0.26ポイントにとどまっており、このモデルとデータにおいてはビーム探索による追加の改善余地が限定的であることを示している。
学習曲線の分析
Training LossとValidation Lossはいずれも学習を通じて安定的に減少し、5エポック終了時点でValidation Lossは約1.51に収束した。後半のエポックにおけるValidation Lossの減少が緩やかであることから、5エポックはこのモデルとデータ規模において十分な学習量であったと判断できる。Training LossとValidation Lossの乖離は限定的であり、重大な過学習は観察されなかった。
実際の学習データから得られた学習率のグラフも、ウォームアップからコサイン減衰への滑らかな遷移を確認でき、設計どおりの学習が行われていた。
サブワード分割について
NLLBのトークナイザーはSentencePieceベースのBPE(Byte Pair Encoding)によるサブワード分割を採用している。形態素解析器(MeCabなど)に依存せずに日本語テキストを分割できるため、言語固有の前処理が不要になる。
「京都御所は日本の歴史的建造物です。」(17文字)を分割すると、以下の10トークンが得られる。
▁ / 京都 / 御 / 所は / 日本の / 歴史的 / 建造 / 物 / です / 。
「京都」や「歴史的」のように意味的にまとまった単位で分割される場合もあれば、「所は」のように助詞が先行する名詞と結合される場合もある。形態素解析とは異なる分割基準だが、翻訳タスクにおいてはデータ駆動で最適化された分割が有効に機能する。
サブワード分割の利点として、未知語を既存のサブワードの組み合わせで表現できる点がある。辞書にない固有名詞であっても文字単位まで分解すれば表現可能であり、語彙外(OOV)問題を回避できる。また、複数言語間で共通のサブワードを共有できるため、多言語モデルとの親和性が高い。
今後の改善の方向性
- モデルスケール NLLB-1.3Bなど大規模モデルの使用による品質向上。ただしColab環境ではメモリ制約があるため、量子化(4bit/8bit)との併用が必要になる
- 汎用LLMの活用 NLLBのような翻訳特化モデルではなく、最新の汎用LLMをファインチューニングするアプローチも検討に値する。事前学習で獲得した広範な言語理解能力が、翻訳品質の向上に寄与する可能性がある
- データ拡張 バックトランスレーション(英日の逆翻訳で擬似的な学習データを生成する手法)によるデータ増強
- 評価指標の多様化 BLEUは表層的なn-gram一致を測定するため、意味的な翻訳品質を十分に捉えられない場合がある。COMETなどのニューラル評価指標を併用することで、より信頼性の高い品質評価が可能になる
- Detokenization 本実験ではトークン化済みデータをそのまま評価に使用したが、適切なdetokenization処理を追加することで、BLEUスコアの正確性を改善できる
実行環境
- ハードウェア Google Colab(NVIDIA A100-SXM4-40GB, HBM2e 80GB)
- Python 3.12
- 主要ライブラリ PyTorch 2.8.0, Transformers 4.57.0, PEFT, Datasets 4.0.0, sacrebleu
- ベースモデル facebook/nllb-200-distilled-600M
- データセット KFTT v1.0
- 参考教材 言語処理100本ノック 2025 (Rev 1)
