【Transformer】AIで重要な深層学習モデルの基本まとめ5【デコーダー編】

本ページには、プロモーションが含まれています。

本記事ではTransfomerのデコーダー部分について筆者が学んだことを纏めていきます。

そして今回はいきなりデコーダー内部の説明をするのではなく、一旦デコーダーをブラックボックスとし、何を入力として何を出力しているのかをご紹介していきます。

これまでのエンコーダー部分の解説はありませんが、本記事を理解する上では重要になるため、先に下記の記事をご覧になることをお勧めします。

今回解説する部分

引用:Attention Is All You Needを改変

今回解説する部分は、上記の赤枠内です。

各レイヤーを個別に紹介するのではなく、全体的な流れについてまとめています。

必要な前提知識

本記事では解説に特殊なトークン(<BOS>や<EOS>など)を使うため、何か分からない方は下記の記事をご覧ください。

zenn.dev

また意味を理解していなくても、本記事では<BOS>のシークエンス開始地点を示す特殊トークンしか使ってないため、それだけ理解しておけば問題ありません。

そもそもエンコーダーとデコーダーとは

まず初めに、本記事では何回も出てくるエンコーダーとデコーダーと言う言葉の意味について解説していきます。

本来の意味

そもそもエンコーダーとデコーダーの本来の意味を知っていますか?

多くの場面で出てくるので何気なく使いやすいですが、本来の意味を知っておくとより理解が早いので先にご紹介します。

エンコーダーについては下記の記事を。

it-notes.stylemap.co.jp

デコーダーについては下記の記事をご覧ください。

it-notes.stylemap.co.jp

ザックリまとめると、とあるデータを扱いやすいように変換することをエンコーダー、変換されたデータを元に戻すのをデコーダーと言います。

イメージ的には英文を和訳するのがエンコーダー、和訳した文章を元に英文を作るのがデコーダーといったイメージです。

Transfomerのエンコーダー・デコーダー

Transfomerのエンコーダーについてですが、こちらは基本的な意味は変わっていません。

文章を入力とし、それをトークン化してMulti Head Attention(以下MHA)やFFNで解釈しており、文章からベクトルに高次元ベクトルに変換されていると言えるからです。

ただし、Transfomerのデコーダーは少しだけ意味合いが変わります。

デコーダーの入力部分

ここからは本題であるデコーダーの入力部分についてご紹介していきます。

分かりやすく概略化すると

ここから具体的な話になりますが、それよりも先に概念的に分かりやすくしていた方が理解は早いです。

まずデコーダー部分でしたいことを大雑把に示したら、上図のようになります。

知らない人が「初めまして。私の名前は」で会話が途切れたとしましょう。

この時、次にくるであろう言葉は何を思い浮かべますか?

山田や佐藤といった人の名前を思い浮かべるのが正しく、テニスやサッカーといったスポーツの名前を思い浮かべるのは間違っていると誰もが分かると思います。

そしてなぜ人名を思い浮かべるのかと言えば、それまで話されていた内容から推論したからです。

要はこの推論を、プログラムにもできるようにと決められたのが、次から解説するOutput(shifted right)です。

Output (shifted right)の意味

多くの方がここで何を入力しているのか疑問に思うでしょう。

まず結論を言うと、Outputとshifted rightは別であること。

筆者はどうしてもOutputを入力する、日本語にすれば「出力を入力する」とかいう摩訶不思議な言葉に納得できず、ChatGPTに質問しました。

すると、このような結論が得られました。

推論時(実際にユーザーが使うとき):Output

学習時(重みや線形変換させる値を定める時):shifted right

上記の定義が正しいのか、論文にも参考記事にもなかったため判別付きませんが、これからの理解を円滑にするため一旦これが真として理解してください。

そして理解を進めていくうちに、恐らくこれが正しく参考記事の言っている意味も理解できてきます。

Output (shifted right)を使ってやりたいこと

ここからは実際にOutput (shifted right)を使ってやりたいことを解説していきますが、混乱を避けるために今後はshifted rightと統一して解説していきます。

説明を簡単にするため、Transfomerを上図まで簡略化して解説していきます。

本記事ではInputされたテキストが、エンコーダーによって滞りなく処理されたと仮定し

た上で、使用する例文は下記の文章とします。

入力(Input):私はトムです。

欲しい答え:I am Tom.

 

この時の処理の流れとして、下記のようになります。

第1回)

shifted right:<BOS>

Output:I

 

第2回)

shifted right:<BOS> I

Output:am

 

第3回)

shifted right:<BOS> I am

Output:Tom

 

上記のように処理が進んでいきます。

分かりにくいですが、デコーダーがOutputしたものをもう一度入力させて、再び次に出力する単語を推測している状態となります。

これだけでは全く意味が分からないため、図示すると下図のようになります。

上図は先に示した概念図と同じ形態とあわせたもので、推測するのに必要な要素はInput(エンコーダーからの情報)とshifted rightとなります。

これを更に分かりやすくすると下図のようになります。

上図からも分かる通り、推測は2つのデータを元にして行われています。

それは先に言った通り、エンコーダーからの情報と自らが出力したデータです。

これがデコーダーで行われていることであり、どんどん新しい単語が出力されていくカラクリとなります。

結局何をしているのか

ここまで何とか学んだことを綺麗に纏めようとしましたが、今までの解説で理解した方は少ないでしょう。

そこで筆者がザックバランと理解しやすいよう、自分なりの理解で解説していきます。

学習時

まず学習時は、デコーダーの入力にshifted rightを使い、プログラムに正解を教えていきます。

この時、プログラムはどのような文章が入力されたら、どのような単語を推測すればいいのかを学んでいくでしょう。

そしてここで重要なのが、学んだ内容は【Output(shifted right)】に入るのではなく、これまでエンコーダーで使ってきた重み行列やFNNの重みなどに影響していきます。

ここでshifted rightに入っているわけではありません!

推測時

次に推測時、つまりユーザーが実際に何かを入力した時です。

これは学習時に学んだ重み行列やFNNの重み、そして自身が出力した結果を元に次に出力すべき単語を推測していきます。

勘違いしやすい注意点

最も勘違いしやすいと思われるのが、shifted rightという単語。

私もshifted rightのことを正解を少しだけ動かしたデータを入力させると勘違いし、それだったらエンコーダーなど通さずに、そのままshifted rightを出力すればいいと考えていました。

ただこれまでの説明からも分かる通り、それは学習時の話であって実際に使うときとは別です。

参考記事

qiita.com

zenn.dev

qiita.com


本記事の内容は以上となります。

本記事では具体的なソースコードなどは一切ありませんが、それでも概念的に捉えるのも難しい場所だと思われます。

分かりやすいよう図を多くしましたが、それでも納得できない場合はそれこそAIなどに聞いてみて問題を解決してもいいでしょう。

本記事は以上です。お疲れさまでした。