Sequence-to-Sequence Models
系列変換(seq2seq)モデルは、翻訳、要約、音声処理のように、入力シーケンスを長さの異なる出力シーケンスに変換します。
シーケンス間(seq2seq)モデルは、長さが異なることもあるシーケンス同士を変換します。たとえば、英語の文をフランス語に翻訳する、長い記事を要約する、音声クリップを文字起こしする、といった処理です。多くのモデルはエンコーダー・デコーダー構造を採用します。エンコーダーが入力全体を内部表現に変換し、デコーダーはその表現と、すでに生成したトークンを条件として、1つずつ出力を生成します。このとき、トークンを順番に生成します。この手法が現代的な形になったのは2014年です。GoogleのSutskever、Vinyals、LeがSequence to Sequence Learning with Neural Networksを発表し、Choらは機械翻訳向けのRNNエンコーダー・デコーダーを説明しました。2017年以降、ほとんどのseq2seqモデルはTransformerを基盤に構築されています。
Seq2Seqモデルの仕組み#
2014年のモデルでは、エンコーダーの長短期記憶(LSTM)ネットワークが原文を単語ごとに読み取り、固定長の1つのベクトルに圧縮します。デコーダーのLSTMは、そのベクトルを翻訳へと展開します。Sutskeverらは4層のLSTMを使い、原文の単語順を逆にすると学習が容易になることを発見し、WMT'14英仏翻訳テストセットでBLEUスコア34.8を達成しました。各文を1つのベクトルに圧縮すると長い入力の処理が難しくなるため、Bahdanau、Cho、BengioはNeural Machine Translation by Jointly Learning to Align and Translateでアテンション機構を導入し、デコーダーが各ステップでエンコーダーのすべての状態を参照できるようにしました。Transformerはこのエンコーダー・デコーダー構造を維持しながら、再帰処理を自己注意機構に置き換え、クロスアテンションで2つの部分を接続しました。推論時には、デコーダーをループで実行します。
デコーダーが終了トークンを出力するとループが止まるため、出力長は例ごとに学習されます。デコーディングでは通常、ビームサーチで複数の候補出力を保持します。これは翻訳と音声認識で標準的な選択肢です。
Teacher Forcingを使った訓練#
訓練時には、デコーダーをループさせる必要はありません。Teacher Forcingでは、正解のターゲットシーケンスを1つ右にずらして入力し、因果マスクによって各位置がそれ以前のターゲットだけを見るようにして、次のトークンをすべて1回の並列処理で予測します。損失は、予測と正解の次のトークンとのクロスエントロピーです。PyTorchのnn.Transformerは、元のエンコーダー・デコーダー構造を実装しています。
import torch
from torch import nn
torch.manual_seed(0)
src_vocab, tgt_vocab, d_model = 1000, 800, 64
embed_src, embed_tgt = nn.Embedding(src_vocab, d_model), nn.Embedding(tgt_vocab, d_model)
model = nn.Transformer(d_model, nhead=4, num_encoder_layers=2, num_decoder_layers=2, batch_first=True)
to_logits = nn.Linear(d_model, tgt_vocab)
source = torch.randint(0, src_vocab, (1, 9)) # a 9-token source sentence
target = torch.randint(0, tgt_vocab, (1, 7)) # start token + a 6-token translation
# Teacher forcing: the decoder reads the correct previous tokens and predicts every next token in parallel
decoder_input, labels = target[:, :-1], target[:, 1:]
causal_mask = nn.Transformer.generate_square_subsequent_mask(decoder_input.size(1))
logits = to_logits(model(embed_src(source), embed_tgt(decoder_input), tgt_mask=causal_mask))
loss = nn.functional.cross_entropy(logits.flatten(0, 1), labels.flatten())
print(f"Source tokens: {source.shape[1]} -> decoder logits: {tuple(logits.shape)}")
print(f"Training loss: {loss.item():.2f}")Source tokens: 9 -> decoder logits: (1, 6, 800)を出力します。これは、9トークンのソースを1回の処理で使って計算した、6つのターゲット位置それぞれに対する800トークンのターゲット語彙上の予測です。未訓練モデルの損失6.73は、一様な予測の損失ln(800) ≈ 6.68に近い値です。訓練時には常に正しい前のトークンを入力する一方、推論時にはモデル自身の予測を入力するため、推論時に誤りが連鎖することがあります。この現象は露出バイアスと呼ばれます。
Seq2Seqと関連アーキテクチャの比較#
- BERTなどのエンコーダーのみのモデル: 入力を双方向から読み取り、トークンごとに1つの表現を出力するため、分類やタグ付けに適しています。
- デコーダーのみの大規模言語モデル(LLM): GPTなどのモデルは、入力と出力を1つのシーケンスに配置し、プロンプトを続けることでseq2seqタスクを処理します。現在のテキスト生成の多くはこの方法で実行されます。
- リカレントニューラルネットワーク(RNN)とGRU: 2014年の初期エンコーダーとデコーダー内部で使われていた再帰層です。Choらは、エンコーダー・デコーダーを発表した同じ論文でゲート付き回帰ユニットを提案しました。
用途#
Googleは2016年にGoogle翻訳をGNMTシステムへ移行しました。これはアテンション機構を備えた8層のLSTMエンコーダー・デコーダーであり、翻訳は今もseq2seqの代表的なタスクです。GoogleのT5は、自然言語処理(NLP)のすべてのタスクをテキストからテキストへの変換として扱い、テキスト要約や質問応答も含めました。OpenAIのWhisperは、68万時間の音声でトレーニングされた、音声認識用のエンコーダー・デコーダー型Transformerです。ビジョンモデルも同じパターンを画像キャプション生成や光学文字認識(OCR)に使います。MicrosoftのFlorence-2は、1つのseq2seqモデルでキャプション生成、グラウンディング、検出をテキスト出力として処理し、Large版は自動アノテーション用にUltralytics Platformで実行できます。GoogleのPix2Seqは、各物体を4つの量子化座標とクラスからなる5つの離散トークンで表し、物体検出をseq2seqとして扱います。Ultralyticsパッケージで実行できるBaiduのリアルタイム検出器RT-DETRは、エンコーダーとクロスアテンション型デコーダーを維持しつつ、デコーダーで300個の物体クエリを並列に改良するため、すべてのボックスを1回の処理で出力します。










