LLMはどのようにして動いているのか?

LLM101

Ryo Nakagami

2026年03月18日

LLMはプロンプトに対して順当な続きを出力している

  • LLMは入力テキスト(プロンプト)に対して, 次に来る可能性が高いトークンを確率的に予測し, 順番に出力している
  • 各ステップで語彙全体に対する確率分布を計算し, そこからトークンをサンプリングする

例: The best thing about AI is its ability to …

次のトークン候補 確率
learn 0.42
generate 0.25
process 0.15
understand 0.10
adapt 0.05
0.03
  • プロンプトに対して,上記のように次のトークンを1つずつサンプリングし続けることで文章を生成している
  • 常に「ランクの高い」トークンを選び続けると単調な文章が生成される傾向があるので,ランクの低い単語を選ぶ余地を残すことも重要

トークンとは?

  • テキストを分割した最小単位(単語・サブワード・文字など)
  • 例: "learning"["learn", "ing"]
  • LLMは文字ではなくトークン単位で処理を行う

温度パラメター(Temperature)

  • サンプリング時の確率分布の鋭さを制御するパラメター
  • Temperature = 0: 最も確率の高いトークンを常に選択(決定的)
  • Temperature → 高: 確率分布が平坦化し,低確率のトークンも選ばれやすくなる(多様性↑)
  • 創造的なタスクでは高め,正確性が求められるタスクでは低めに設定する
  • Claude Codeでは,明示パラメータではなく「プロンプト設計で制御するもの」という方針

数えられない確率を,モデルで近似する

Key Takeaways

  • 次のトークンを予測するには「あるトークン列の後に各トークンが出現する確率」が必要
  • しかし,語彙数が膨大なため全パターンの頻度をデータから直接数え上げることは不可能
  • 出現確率をニューラルネットワークでモデル化するアプローチが採用された

課題: 組合せ爆発

  • 語彙数 \(V = 40{,}000\) トークンの場合
  • 2-gramモデル(直前1トークンから予測)でも \(V^2 = 1.6 \times 10^{9}\)16億パターン
  • \(n\)-gramでは \(V^n\) で指数的に増加
  • 現実的なコーパスではほとんどのパターンが未出現となり,頻度ベースの確率推定は破綻する

解決策: 確率のモデル化

  • 全パターンを数え上げる代わりに,出現確率そのものをモデルで近似する
  • ニューラルネットワークにトークン列を入力し,次トークンの確率分布を出力させる
  • モデルのパラメータ1を大量のテキストデータで学習(=言語モデル
  • これにより未知のパターンに対しても汎化した予測が可能になった

LLMは「知っていること」を引き出せないことがある

  • LLMは膨大な学習データから知識を獲得しているが,プロンプトの書き方次第で正しい知識を引き出せないことがある
  • ユーザーが「LLMが本来知っていること」を適切に引き出せていないことに気づかない状態がUnknown Knowns問題

プロンプトから応答生成までの流れとUnknown Knowns

プロンプト → トークン予測 → 応答生成

  1. ユーザーがプロンプト(質問・指示)を入力
  2. LLMは入力トークン列に対して,次トークンの確率分布を計算
  3. 確率分布からトークンをサンプリングし応答を生成
  4. しかし,プロンプトが曖昧・不十分だと,モデルが持つ知識のうち最適な部分が活性化されない
  5. 結果として,本来正しく答えられるはずの問いに対して不完全・不正確な応答が返る

Unknown Knowns問題の具体例

モデルは知っているのに引き出せない

プロンプト設計の問題

  • 「要約して」→ どの粒度? 誰向け?
  • 文脈・制約が不足すると,モデルは汎用的な応答にフォールバックする

出力形式の暗黙の期待

  • ユーザーが期待する形式(表,箇条書き,コード等)を明示しないと,モデルは自由形式で応答する

LLMを使いこなすにあたって

Known-Unknownsフレームワークで整理するLLMとの付き合い方

Known Knowns(既知の既知)

LLMが知っていることを知っている状態

  • カスタマイズなしのLLMでも対応可能

Known Unknowns(既知の未知)

自分が知らないと自覚していること

  • 適切な情報が学習データに含まれていないため適切な推論ができない状態
  • RAG(検索拡張生成) で外部知識を動的参照

Unknown Knowns(未知の既知)

知っていることを知らない状態

  • 学習済みの知識を引き出せずに適切な推論が行えていない
  • プロンプト設計やClaude Codeのskillsで対応可能

Unknown Unknowns(未知の未知)

知らないことすら気づいていない領域

  • ハルシネーションが起きる前提で使用する
  • Fine-tuning でモデル自体の知識・推論能力を底上げ

Appendix

  • Appendix

単語をベクトルで表現する: Word Embedding

  • 単語の意味はその単語が使われる文脈(周囲の単語)によって決まる(分布仮説)1
  • この考えに基づき,単語を低次元の実数ベクトル(密ベクトル)で表現する手法がWord Embedding

課題: One-hot表現の限界

  • 従来のone-hot表現では,各単語は語彙数 \(V\) 次元のスパースベクトル
  • 例: \(\mathbf{w}_{\text{debt}} = [0, 0, 1, 0, \ldots, 0]\)
  • 任意の2単語間のコサイン類似度が常に0になり,単語間の意味的類似性を表現できない
  • 語彙数が大きいほどベクトルが高次元・スパースになり非効率

解決策: 密ベクトル表現

  • 単語を50〜300次元程度の密ベクトルで表現
  • 例: \(\mathbf{w}_{\text{debt}} = [0.73, 0.04, -0.18, 0.81, \ldots]\)
  • 意味の近い単語はベクトルも近い
    • \(\cos(\mathbf{w}_{\text{taxes}}, \mathbf{w}_{\text{tax}}) = 0.84\)
  • LLMでは入力トークンをまずこのEmbeddingに変換してからモデルに渡す

Word2Vec: 文脈から単語ベクトルを学習する

  • 大量のテキストデータ上で「ある単語の周囲にどの単語が出現しやすいか」を予測するタスクを解くことで,各単語のベクトル表現を獲得する(Mikolov et al., 2013)

Skip-gramモデルの学習手順

  1. 大規模コーパス(例: Wikipedia全文)を用意
  2. 各単語のベクトルをランダムに初期化
  3. テキスト中の各位置で,中心語 \(w_t\)文脈語 \(w_{t+j}\)(ウィンドウ幅 \(c\) 以内)のペアを作成
  4. 中心語ベクトル \(\mathbf{v}_{w_t}\) から文脈語の出現確率を計算:

\[p(w_{t+j} \mid w_t) = \frac{\exp(\mathbf{u}_{w_{t+j}}^\top \mathbf{v}_{w_t})}{\sum_{w=1}^{V} \exp(\mathbf{u}_w^\top \mathbf{v}_{w_t})}\]

  • \(\mathbf{v}_w\): 単語 \(w\)中心語ベクトル
  • \(\mathbf{u}_w\): 単語 \(w\)文脈語ベクトル
  1. 真の文脈語の確率が高くなるよう \(\mathbf{v}, \mathbf{u}\) を更新

学習されたベクトルの性質

  • 意味の近い単語はベクトルも近くなる
    • \(\cos(\mathbf{v}_{\text{taxes}}, \mathbf{v}_{\text{tax}}) = 0.84\)
  • ベクトル演算で類推が可能1
    • \(\mathbf{v}_{\text{king}} - \mathbf{v}_{\text{man}} + \mathbf{v}_{\text{woman}} \approx \mathbf{v}_{\text{queen}}\)

コンテキストウィンドウサイズの影響

  • 小さい\(\pm 1\)\(3\)): 構文的類似性を捉える
  • 中程度\(\pm 5\)\(10\)): 意味的類似性を捉える
  • 大きい\(\pm 10\)〜): トピック的類似性を捉える

GPTにおけるEmbeddingの役割

  • GPT(Generative Pre-trained Transformer)は,Word2Vecで確立されたEmbeddingの考え方を発展させ,文脈に応じて動的に変化するベクトル表現を実現した

Word2Vec → GPT: Embeddingの進化

Word2Vec GPT
ベクトル 単語ごとに固定 文脈に応じて動的
「bank」の表現 常に同じベクトル 「river bank」と「bank account」で異なる
学習タスク 周囲の単語を予測 次のトークンを予測
構造 浅いネットワーク Transformer(多層Self-Attention)
  • Word2Vecは「単語の意味をベクトルで表現できる」ことを示した
  • GPTはその着想をTransformerアーキテクチャで拡張した

GPTの処理フロー

  1. トークン化: テキストをトークン列に分割
  2. Token Embedding: 各トークンを密ベクトル \(\mathbf{e}_i\) に変換(学習済みEmbedding行列 \(E \in \mathbb{R}^{V \times d}\)
  3. Positional Encoding: 位置情報 \(\mathbf{p}_i\) を加算し,語順を表現

\[\mathbf{h}_i^{(0)} = \mathbf{e}_i + \mathbf{p}_i\]

  1. Transformer層\(\times N\)層): Self-Attentionにより文脈を反映した表現 \(\mathbf{h}_i^{(N)}\) を生成
  2. 出力層: \(\mathbf{h}_i^{(N)}\) から次トークンの確率分布を計算
  • Embedding行列 \(E\) のパラメータはTransformer全体と同時に学習される1