はじめに
こんにちは! ドミノソフトのkimi_dominoです。
以前ニューラルネットワークとはなにか?という記事を書き、最も基本である順伝播型ニューラルネットワーク(多層パーセプトロン、MLPとも言う)について説明しました。
今回は近年のLLMの主流であるTransformerアーキテクチャについてざっくりと説明しようと思います。
Transformerアーキテクチャ
Transformerは近年のLLMで最も基本的なアーキテクチャで、2017年にGoogleが発表しました。 arxiv.org

大きく分けてエンコーダとデコーダから構成されていて、テキストをInputとしてエンコーダで解釈し、デコーダで新たなテキストを生成する、という役割を担っています。
近年では、エンコーダとデコーダをそれぞれ単体で使うことが多く、得意なタスクが異なります。
- エンコーダのみ(2018年:BERT):Inputをラベルに分類する
- 例:商品のカスタマレビューをポジティブ・ネガティブにラベリングする
- デコーダのみ(2018年:GPT):Inputに対して次の単語を予測する
- 例:「日本一高い山は何か?」という問いに対して「富士山」と回答する
分割する理由はエンコーダ・デコーダ両方を使うと計算量が多くなるため、訓練に要する時間、InputからOutputまでの時間が長くなるからです。 しかし、より近年ではLLMのパラメータ数自体が増えてきて、デコーダのみであらゆるタスクに対して高い性能が出せるようになってきています(例:ChatGPT、Gemini、Claude)。 以降ではアーキテクチャで重要なポイントの触りだけ押さえます。
注意機構
Transformerの理解で重要な部分はAttentionです。Attentionとは「注意」のことで、計算される値です。
Query、Keyを共に{I, Ate, Sushi}とすると、注意の計算は図のようになります。

注意の値は
であり、QueryとKeyの関係が強いほど1に近い値が得られ、対応するValueが出力に対して支配的になります。例えば、「I」という単語は「Sushi」よりも「Ate」と強い関係があるべきで、「I」は「Ate」により注意を払うことが自然と言えます。
トークナイズと入力の埋め込み
トークナイズ
入力「I Ate Sushi」をそのままエンコーダ・デコーダへ入力することは出来ません。通常、エンコーダ・デコーダへの入力する前に、トークナイザを通すことでコンテキストを適切な形へ分割する必要があります。その役割を担うのがトークナイザで、LLMのアーキテクチャの一部です。エンコーダモデルであるBERTでは、「I Ate Sushi」は{[CLS], I, Ate, Sushi}という形の配列にトークナイズし、[CLS]は入力の始まりを意味しています。モデルによっては誤字の修正や、全角を半角に変換するなどの前処理が行われます。
入力の埋め込み
入力の埋め込みとは、{I, Ate, Sushi}の各単語を、
、
のように、D次元ベクトル(例では3次元)で表します。

位置情報の埋め込み
入力{I, Ate, Sushi}に対して、単語の位置関係を記憶する方法が必要です。なぜなら、Transformerは配列を逐次処理するのではなく、並列に処理するため、位置情報を単語に埋め込む必要があります。
発表当初は正弦波関数を使った方法が紹介されていますが、ChatGPT4などのLLMではRoPE(Rotary Position Embedding)という方法が用いられています。これは、各入力ベクトルをの整数倍ずらした値を位置情報を埋め込んだ入力ベクトルとして再定義する方法です。注意機構に並列に入力しても、
の回転角から相対的な位置情報を反映することができます。
今回はここまで
今回はTransformerの触りとして、注意機構、トークナイズと入力の埋め込み、位置情報の埋め込みの説明でした。 まだまだ重要な部分があるのですが、長くなるので次回以降にまとめることにします!
ではまた~^-^
We're Hiring
ドミノソフトでは一緒に働く仲間を募集中です! HPのCONTACTからお気軽にご連絡ください! www.dominosoft.co.jp