
本記事ではこれまでご紹介してきた各部位を繋ぎ合わせ、本来のエンコード部分についてご紹介していきます。
下記の記事の知識が前提となるため、まだご覧になっていない方はこちらの記事からご覧ください。
【Transformer】AIで重要な深層学習モデルの基本まとめ1【MHA編】 - TomoGのごちゃまぜ倉庫
【Transformer】AIで重要な深層学習モデルの基本まとめ2【Add&Norm編】 - TomoGのごちゃまぜ倉庫
今回解説する部分
今回解説する部分は、上記の赤枠内です。
各レイヤーを個別に紹介するのではなく、全体的な流れについてまとめています。
また処理の流れをメインにするため、Multi-Head Attentionから始まりFFN、Add&Normをする一連の流れをN回繰り返す処理は敢えて行っていませんのでご注意ください。
ソースコード
gist63600812c27716cb537f6257c097eeee
本記事で使用するコードは上記です。
分かりやさを重視しているため論文とは異なっていたり、もっと効率のよいコードはありますが本記事では上記のコードを例としてご紹介していきます。
基礎部分
run_transformer関数:transformerの処理を順に行っていく関数。
ここでは各処理クラスのインスタンスを作成して各処理の実行関数forwardを実行するだけの処理をしています。
特に難しい処理を行っていないため、これ以上の説明は割愛させていただきます。
Embedding Layer
text_2_tokens関数:テキストのトークン情報を返す関数
forward関数:受け取ったテキストをトークン化して返す関数
positional_encoding関数:位置情報を出力する関数
embed関数:作成したトークンを出力する関数
まず本章では下記のように語彙を定義しています。
入力されたデータ:テキスト
事前に定義された単語群:ボキャブラリー
ベクトルで表現されたデータ:トークン
本来ならばテキストはボキャブラリーを参照して切り分けられ、トークン化の処理へと続きます。
ただ本記事ではボキャブラリーを使用しておらず、テキストをスペースごとに分割しただけです。
そして分割されたテキストごとにトークンを作っています。
※
テスト結果の値が大きいと感じる方は、create_positional_encoding関数の最後を【return 0】にしてみてください。
サンプルコードでは直感的に分かりやすいよう、1から順に番号を直接入れています。
Multi-Head Attention Layer
本部分についてはTransformerの核となる部分であり、詳細は下記の記事で既にご紹介しています。
【Transformer】AIで重要な深層学習モデルの基本まとめ1【MHA編】 - TomoGのごちゃまぜ倉庫
複雑だったは変数scoreとして、は変数weightsとして、最後には変数outputとして定義されています。
プログラム的には短いコードになりますが、実際はかなり複雑な処理を行っているため今一度何をやっているのか確認してみてください。
Add & Norm Layer
Add & Norm Layerの処理は特別難しいことをしていませんが、Numpyの各関数について意味を忘れないようにしましょう。
そして筆者的にこのレイヤーで注目すべきは、AddNormクラスのforward関数に渡されている変数の存在です。
この変数は基本部分でご紹介したrun_transformer関数の中を見てみると、1回目ではMulti-Head Attentionの出力結果である変数mha_outputと入力した変数xが同時に入っています。
これは以前の記事でもご紹介したように、Add(残差接続)は元データに寄り添いながらデータを正規化しているから。
2回目も同じように1つ前にあるレイヤーの入力と出力を同時に受け取っているので、その辺りを目で確認してみると面白いかもしれません。
FFN Layer
FFN Layerもかなりシンプルとなっており、変数x1で1回目の線形変換が、変数x2で非線形変換が、変数x3で2回目の線形変換を行っております。
そして本クラスにあるrelu関数が活性化関数となっており、本記事ではReLU関数を使用しています。
参考記事
本記事の内容は以上となります。
