kntty.hateblo.jp

ここに何か書く。

Transformerを理解するまでに私が陥った、3つの勘違い

自然言語処理でお馴染み、他の分野も席巻しつつあるTransformerについて、 やっと自分の理解が追いついてきた。

Transformerとは何か、については、良い記事がたくさんあるのでそちらを参照されたい。

念のため、最小限の説明をすると、次のような感じ。

  • 入力列から、辞書的に情報を拾い上げて出力列に伝える仕組み、もしくは、それを使ったモデル構造のこと。
  • Attentionと呼ばれる機構が、「辞書的に情報を拾い上げ」る役割を実現。

以前に調べたときは、上辺だけをさらっと知ることを優先していたために、 結構勘違いが多かったことに気づかされた。そのことについて、ここにメモしておく。

(#上辺じゃなくて最初からちゃんと理解せえ、という自分への戒めも込めて。)

(2021.7.16 5月頃にメモとして書いていたものを、タイトル含め書き直して再投稿)

Transformerモデルについて

1. 「Transformer」という語が指す範囲は、文脈による

特に、TransformerとBERTをいっぺんに理解しようとしてはまった点。

私の理解の上では、(Original)Transformerの1層とBERTの1層が、 図のように対応する。

f:id:kntty:20210713092013p:plain
Transformer[1]とBERT[2]の図の関係

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つずつ単語を増やして予測していく。

参考文献