Transformerを理解するまでに私が陥った、3つの勘違い
自然言語処理でお馴染み、他の分野も席巻しつつあるTransformerについて、 やっと自分の理解が追いついてきた。
Transformerとは何か、については、良い記事がたくさんあるのでそちらを参照されたい。
念のため、最小限の説明をすると、次のような感じ。
- 入力列から、辞書的に情報を拾い上げて出力列に伝える仕組み、もしくは、それを使ったモデル構造のこと。
- Attentionと呼ばれる機構が、「辞書的に情報を拾い上げ」る役割を実現。
以前に調べたときは、上辺だけをさらっと知ることを優先していたために、 結構勘違いが多かったことに気づかされた。そのことについて、ここにメモしておく。
(#上辺じゃなくて最初からちゃんと理解せえ、という自分への戒めも込めて。)
(2021.7.16 5月頃にメモとして書いていたものを、タイトル含め書き直して再投稿)
Transformerモデルについて
1. 「Transformer」という語が指す範囲は、文脈による
特に、TransformerとBERTをいっぺんに理解しようとしてはまった点。
私の理解の上では、(Original)Transformerの1層とBERTの1層が、 図のように対応する。
Attention Is All You Needの論文の解説記事だと、そもそも左の図全体を (Originalの) Transformerと呼ぶことが多い。一方で、その応用技術では、図の1層分をTransformerと捉えている印象がある。
なお、上の左右の図は、そもそも見比べるべきではないことに注意が必要である。
右図は、先行研究のELMo等の概念と比べるために書かれた図であって、 BERTの図が間違っている、とか、そういう批判をしたい訳ではないことを補足しておく。
2. 「BERT」は「(単なる)双方向Transformer」ではない
特に双方向RNN等を知っている上で、"Bidirectional Transformer"と言われると、 何か計算上の改良が加わっているのではないか、と勘違いが働きやすい(私だけ?)がそうではない。
では、BERTの何が双方向性を持つのか、というと、「学習対象のタスクが」である。
- 従来よく行われていた、「文章の n-1 語めまでを入力して、n 語めを推測する」タスクでは、前向き方向にしか推定が行えない (*1)。
- 対して、BERTで設定されたタスク(2つのうち)の1つは、「文章の n 語めを隠して入力し、隠された n 語めを推測する」というタスクである。これなら、前向きにも後ろ向きにも単語情報を活用する、という恩恵が得られる。
つまり、双方向の予測が働くように設定したタスクによって、Transformerが双方向性の予測にも強くなった、ということである。
(*1) 補足:
- 文をひっくり返して、後ろ向きも予測すればいいという考え方であれば、双方向RNNで導入されており、これは前身のELMoで採用されていた方法である。
3. Decoderは、再帰せずに文書生成を行える訳ではない
「TransformerはRNNでないから、並列処理できる」的な説明だけを見て これも誤認してしまった。これは「学習時」にのみ、当てはまる。
例として、原文「彼/は/あの/通り/沿い/に/住んでいる」とその訳文「He/lives/along/that/street」を考える。 この場合、Transformer翻訳モデルの入力と出力の関係は、次のようになる。
(Encoderへの入力/Decoderへの入力 → /Decoderに期待される出力)
- [彼][は][あの][通り][沿い][に][住んでいる][<終>] / [<空>] → [He]
- [彼][は][あの][通り][沿い][に][住んでいる][<終>] / [<空>][He] → [He][lives]
- [彼][は][あの][通り][沿い][に][住んでいる][<終>] / [<空>][He][lives] → [He][lives][along]
- [彼][は][あの][通り][沿い][に][住んでいる][<終>] / [<空>][He][lives][along] → [He][lives][along][that]
- [彼][は][あの][通り][沿い][に][住んでいる][<終>] / [<空>][He][lives][along][that] → [He][lives][along][that][street]
- [彼][は][あの][通り][沿い][に][住んでいる][<終>] / [<空>][He][lives][along][that][street] → [He][lives][along][that][street][<終>]
学習時は、途中までの予測が完璧だと仮定して、次の1単語の予測を行う。 RNNみたいに内部状態が要るわけではないので、6つ分をいっぺんに並列計算できる。
一方、テスト時は、当然「途中までの予測」なんてものは手元にないので、 6つ分をいっぺんに、ではなく、RNNのDecoderと同じようなイメージで、 1つずつ単語を増やして予測していく。
参考文献
- [1] Vaswani A, Shazeer N et al. Attention is all you need. NIPS, 2017.
- [2] Devlin J, Chang MW et al. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. 2018.
- [3] 作って理解する Transformer / Attention - Qiita
- [4] 深層学習界の大前提Transformerの論文解説! - Qiita
- [5] 【世界一分かりやすい解説】イラストでみるTransformer|Beginaid