ブログ

LLM(大規模言語モデル)の内部で何が起きているのか:仕組みを丁寧に紐解く

今回は、How LLMs Actually Work という記事を読み、LLMのアーキテクチャがどのようにテキストを処理しているのか、その核心部分が気になったので自分なりに整理してみました。

これはめちゃくちゃ良い記事でした。是非とも参考に!!


ChatGPTなどのLLM(大規模言語モデル)は、一見すると魔法のように言葉を操っているように見えます。しかし、その中身を分解してみると、実際には「トランスフォーマー(Transformer)」と呼ばれるアーキテクチャをベースにした、非常に論理的な仕組みの積み重ねで構成されていることがわかります。

本稿では、数式を極力使わずに、最新のLLMがどのようなプロセスで入力を理解し、出力を生成しているのか、その道筋を辿ってみたいと思います。


全体像:テキストが処理されるまでの流れ

まずは、入力されたテキストがどのような工程を経て次の言葉として出力されるのか、大まかな流れを整理してみます。

flowchart TD
    A[入力テキスト] --> B[トークナイザー]
    B --> C[トークンIDの配列]
    C --> D[埋め込み行列 Embedding]
    D --> E[位置エンコーディング]
    E --> F[トランスフォーマー・ブロックの積み重ね]
    F --> G[次のトークンの予測]
    G --> H[出力テキスト]

現在のLLMの多くは、このパイプラインを共有しています。各モデルの個性の違いは、「どのようなデータを学習したか」「モデルの規模(パラメータ数)」「学習後の微調整(ポストトレーニング)」といった点から生まれます。


1. トークン化:言葉を数値の断片に分解する

LLMは、私たちが読み書きする「テキスト」をそのまま理解しているわけではありません。モデルが扱えるのはあくまで「数値」です。そのため、最初に行われるのがトークン化(Tokenization)という作業です。

テキストを「トークン」と呼ばれる断片に区切り、それぞれに固有の整数IDを割り当てます。

  • サブワードの活用: 単語をそのまま扱うのではなく、少し細かな単位(サブワード)で分割するのが一般的です。
  • 効率の良さ: 「running」を「run」と「ning」に分けることで、語彙(ボキャブラリー)のサイズを抑えつつ、未知の単語にも対応しやすくなります。
単語 トークン分割の例(イメージ) トークンID
tokenization [token, ization] [1204, 549]
strawberry [straw, berry] [8421, 3210]

ここで面白いのが、以前のLLMが「strawberryの中に 'r' はいくつあるか?」という質問に弱かった点です。これは、モデルが文字を直接見ているのではなく、「straw」と「berry」という、いわばレゴブロックのような塊として言葉を認識しているためです。


2. 埋め込み(Embeddings):数値に「意味」を与える

トークン化によって得られた「1024」や「549」といったIDは、単なる名簿の番号のようなものです。それ自体に「意味」は含まれていません。この番号を、意味を持ったベクトル(多次元空間上の座標)に変換するのが埋め込み(Embeddings)というステップです。

「埋め込み行列」と呼ばれる巨大なテーブルを参照することで、各トークンは数百から数千次元の数値のリストに変換されます。

  • 似た意味は近くに: 「犬」と「猫」は、ベクトル空間上で近い位置に配置されるようになります。
  • 関係性の表現: この多次元空間の中では、単語同士の複雑な関係性が数値として表現されています。

この時点では、各トークンは個別の意味を持ってはいますが、まだ「文の中での文脈」までは考慮されていません。


3. トランスフォーマーの核心部分(概要)

埋め込まれたデータは、ここからトランスフォーマー・ブロックと呼ばれる層を何度も通り抜けます。ここでは主に以下の処理が行われています。

  • アテンション(Attention): 文中のどのトークンが、どのトークンと関連が深いかを計算します。たとえば「彼は猫を飼っていて、それはとても可愛い」という文の「それ」が「猫」を指していることを紐解くプロセスです。
  • フィードフォワードネットワーク: モデルが学習を通じて蓄えてきた、世界に関する知識や構造的なパターンが適用される場所です。

これらの層を何十回、何百回と繰り返すことで、モデルは非常に高度な文脈理解を実現しているわけです。


まとめ:仕組みを知ることで見えてくるもの

最新のLLMが何をしているのかをざっくりまとめると、以下のようになります。

  1. テキストを数値の断片(トークン)に切り分ける。
  2. その数値を、意味を持ったベクトルに置き換える。
  3. トランスフォーマーの層を通じて、単語同士のつながり(文脈)を計算する。
  4. 次に続く確率が最も高いトークンを予測し、それを繰り返す。

「アーキテクチャ」という骨組みは多くのモデルで共通していますが、そこにどのような「重み(学習結果)」が載っているかが、モデルの賢さを決めることになります。

このように仕組みを紐解いてみると、LLMが単なる「すごいAI」ではなく、膨大な計算とデータの積み重ねによって構築された、精緻なソフトウェアであることが感じられるのではないでしょうか。

実際に、トークナイザーの挙動や埋め込みの仕組みを意識してみると、プロンプトの書き方やモデルの限界についても、少し解像度が上がるかもしれません。

参照記事