Large Concept ModelsのSONAR論文とコードを読む
Metaが公開した拡散モデルを使った言語生成モデルであるLarge Concept Models(LCM)では、
従来のトークン単位での予測ではなく、より大きなまとまりである「概念」を用います。
LCMでは概念として文章単位の埋め込み表現を用います。文章の埋め込み表現はSONARと呼ばれるネットワークで行います。
どのように文章の埋め込み表現を行っているか気になったので、SONARの論文とコードを読んでいきます。LCMに関しては触れません。
SONARとは
SONARとは、翻訳タスクをベースにTransformerのEncoder/Decoder構成でマルチリンガル/マルチモーダル対応の固定長の文章の埋め込み表現を行うネットワークとなります。
特に、TransformerのEncoder/Decoder構成、マルチモーダル、マルチリンガルで埋め込み表現を行うところが目新しいポイントとなっていそうです。
SONARの構成
参照: 論文中の図
図にもあるようにSONARは、SpeachEncoders、TextEncoder、TextDecoderを持ちます。SpeachEncodersとTextEncoderの出力が近づくように学習することでマルチモーダルに対応してます。
embeeding時にはTextEncoder(SpeachEncoder)を使い、学習時にはTextEncoderによるembeedingをTextDecoderで復元するようなイメージです。
TextEncoderとTextDecoderには、Metaの開発した翻訳モデルであるNNLB 1Bのweightを初期値として用います。
NLLB: https://ai.meta.com/blog/nllb-200-high-quality-machine-translation/ja/
この記事では主に、TextEncoder、TextDecoderについて見ていきます。(マルチモーダルに関してはあまり触れません)
TextEncoder
TextEncoderは、Encoder部分とPooler部分で構成されます。
Encoder部分
Encoder部分には、Transformer構造におけるEncoderが使われます。
Encoder Layerは以下のコードで作られ、attentionやffnを持つことがわかります。
例えば、Attentionについて見てみるとその実態はbuild_attentionにより作成されるStandardMultiheadAttentionを使っていることがわかります。
TextEncoderのEncoder部分の出力は、shape=(batch_size, seq_len, hidden_dim)です。
Pooler部分
Poolerとは、TextEncoderのEncoder部分の出力を固定長ベクトルとするため、Poolingを行う部分です。論文によると、Poolingにはいくつか比較の結果、Mean-Poolingを選択しています。
実装的には、LAST, MAX, MEAN, ATTENTIONの4種類が設定可能で、LAST, MAX, MEANは以下のように実装されています。
EOS pooling
PoolingにAttentionを使う場合です。
EOS Poolingの場合、TransformerにおけるDecoderを用います。つまり、self_attentionとcross_attentionを持ちます。
入力は
- seqとしてbos_token列(shape=(batch_size, 1))
- encoder_outputとしてencoder_outputを入力
出力はshape=(batch_size, 1, hidden_dim)となる。
bosのみembeddingする層を追加
self_attentionは、BOSトークン列のself_attentionなので実質機能しておらず、cross_attetionについてもBOSトークンに対して入力文章の埋込表現が割り当てられるイメージ? BOSに対してattentionを取っているので不安定にはなりそう。
TextDecoder
TextDecoderは、Transformer構造におけるDecoderが使われます。
入力はSequence列とTextEncoderの出力するsentence embeddingになります。
学習
マルチリンガルとマルチモーダルに対応するために2段階の学習を行います。今回は、第1段階のマルチリンガルに対応する学習のみ見ていきます。
学習は、翻訳タスクをベースとして、Auto-Encodeing的な学習も行います。
Translation Objective
入力文を多言語に翻訳することで、異なる言語の文が同じ意味を持つように埋め込み空間を調整
例: 「Hello, how are you?」と「Bonjour, comment ça va?」が近い埋め込みになるように学習
オートエンコーディング (Auto-Encoding)
文を一度埋め込み空間に変換し、再び元の言語にデコードすることで情報を保持する能力を向上
デノイジング・オートエンコーディング (Denoising Auto-Encoding)
ランダムなノイズ(単語の削除・順序の変更)を加えた文を元の文に復元するように学習
Lossについて
Lossは次のものを使います。
結果
興味のあった部分のみ
既存のモデルとの比較として、LASER3(LSTMベースの双方向エンコーダ)、LaBSE(BERTベース)、NLLB 1B(翻訳タスク向けTransformer)と比較しています。
- 翻訳タスク: NLLB 1Bに匹敵する翻訳精度
- 翻訳ペアが埋め込み空間で近くなるか(xsim-クロス言語類似度検索): LASER3やLaBSEよりも優れた結果となり、LASER3と比較してxsim++のエラー率を72%削減し
- オートエンコーディング: 固定サイズの文埋め込みを行いつつ、NLLB 1Bと同等の性能
所感
翻訳タスクベースでの埋め込み表現の獲得は面白いポイントでした。Auto-Encodingタスクも行なっていましたが、翻訳ペアが翻訳ペアが埋め込み空間で近くなるような学習で文章の埋め込み表現がうまく獲得できるのかは疑問。例えば、語順は異なるが同じ意味の文章などの評価はなかったので、どのような結果となるのか気になります。
Discussion