
本記事ではAIなどのプログラムでよく使用されるTransfomerの基本的な仕組みを筆者が学び、解釈したことをまとめていきます。
今回は第3回で、2回その処理を行う【Feed Forward】について解説していきます。
仕組みや概略を理解するのを最優先としているので、間違っている箇所があるかもしれないことにご注意ください。
今回解説する部分
今回解説する部分は、上記の赤枠内です。
上記の赤枠外にもう1つ同じ【Feed Forward】が存在ますが、本記事では上記の赤枠部分に絞って解説していきます。
Feed Forward
元の論文では、Position-wise Feed-Forward Networkと記載されており、ネット上ではFFNと記載される部分です。
多くの記事で軽く流されている部分ですが、本記事ではじっくりと深堀していきます。
FFNの仕組み
まずFFNは下記の式で表されます。
これだけ見てもあまりよく分からないため、各記号の意味を含めて解説していきます。
1回目の線形変換
FFNで行われる処理が線形変換で、下記が実行されます。
上記のは学習済みの重み行列で、は学習済みのバイアスです。
そしては入力値で、本記事では前回までの記事で出力されたベクトルが入ります。
非線形変換
1度目の線形変換が行われた後、FFNでは非線形変換が行われます。
それが下記となります。
このは活性化関数と呼ばれており、ReLUやGELU、SwishGLUなどが使われています。
活性化関数の解説は別でするとして、今はとにかく何かしらのルールを持って非線形変換を行っていると理解しておいてください。
※よくFFNを解説する記事では下記のように紹介されています。
上記の式は活性化関数としてReLUを使った場合であり、その記事または私の記事が誤表記しているわけではありません。
2回目の線形変換
非線形変換が行われた後、2回目の線形変換を行います。
上記の式は第1回目の線形変換とほぼ変わらないため、説明は割愛させていただきます。
そしてこの2回目の線形変換をもってFFNの動作が終了します。
これまでの処理のように数十回と処理を繰り返す処理ではないため、ご注意ください。
実行する意味
まず大切な確認として、「どうしてFFNを実行するのか」ですが、最も大きな理由は非線形変換を使って各トークンの表現力を増やすためです。
ただ筆者もどうしてFNNを使えば、さらに言えば非線形変換を用いれば各トークンの表現力が増すのか正直にいってよく分かっていない状況です。
下記の時にご紹介したMulit-Head Attentionが各トークン毎に横の繋がりを深めるのに対し、このFNNは各トークン毎自身の表現を縦に増やす処理だと言われています。
【Transformer】AIで重要な深層学習モデルの基本まとめ1【MHA編】 - TomoGのごちゃまぜ倉庫
しかしこの説明は直感的に理解しがたく納得できないため、FNNをどうして使うのか、この位置にある理由を含め、今度より深く理解を深めてからにした方がいいと思われます。
活性化関数の種類
最後に説明を後に回していた活性化関数についてご紹介していきますが、どの活性化関数を使うかによって処理やメリット・デメリットが大きく変わってきます。
そのため現在代表的な活性化関数と、その参考になる記事をまとめましたのでそちらをご覧ください。
ReLU(Rectified Linear Unit)
初期で使われていたため、この活性化関数がベースとなっています。
詳細は下記の記事を参照ください。
GELU(Gaussian Error Linear Unit)
ReLUの次ほどに有名な活性化関数としてGELUが挙げられます。
詳細は下記の記事を参照ください。
その他
実は活性化関数は様々な種類が他にもあるため、以下に名前と参考記事を掲載していきます。
・Swish / SiLU(Sigmoid-weighted Linear Unit)
・Leaky ReLU
・ELU(Exponential Linear Unit)
・SELU(Scaled Exponential Linear Units)
・ReGLU / GeGLU
・SwiGLU
参考記事
FFNを使う理由については上記を参考。
本記事の内容は以上となります。
FNNは仕組みは簡単ですが、直感的に何をしているのかが分かりにくく非常に説明の難しい処理となっています。
しかし様々なところで使われている技術でもあるため、仕組みだけでも理解しておくのがいいでしょう。
本記事は以上です。お疲れさまでした。
