←記事一覧

大規模言語モデルの系譜と仕組み — Transformer から ChatGPT まで、LLM の全体像を図解で理解する

Word2Vec から GPT-4 までの言語モデルの系譜と、トークナイゼーション、Transformer、自己注意機構、テキスト生成、RLHF の仕組みをインタラクティブな図で解説する。

LLMTransformer自然言語処理深層学習Interactive

はじめに

ChatGPT の登場以来、大規模言語モデル(LLM: Large Language Model)は広く使われるようになった。LLM はコードを書き、論文を要約し、複雑な質問に答える。こうした振る舞いはすべて、「次のトークンを予測する」という単純な処理の繰り返しから生まれている。

この記事では、Word2Vec から GPT-4 までの系譜をたどった後、テキストをトークンに分割する仕組み、次のトークンの確率分布を計算する Transformer とその中心にある自己注意機構、分布からトークンを選ぶ方法、事前学習から RLHF までの学習の流れを順に説明する。

動画で読む4:36合成音声ナレーション・字幕付き
文字起こしを表示

ChatGPTの流暢な応答は、どんな仕組みから生まれるのでしょうか。Word2VecからTransformer、RLHFまで、LLMの全体像を一気にたどります。

出発点の1つは2013年のWord2Vec。単語をベクトルにしましたが、文脈が変わっても同じベクトルのままでした。2017年の論文Attention Is All You Needが、RNNの逐次処理を自己注意で置き換えました。

2018年以降、Transformerから3つの系統が伸びました。BERTはマスクされたトークンを予測し、理解タスクに強みを持ちます。T5は全タスクをテキストからテキストへ統一し、デコーダ型のGPT系は左から右へ1トークンずつ生成します。GPT-3は1750億パラメータでfew-shot学習を示しました。今の対話AIも同じデコーダ型です。

2020年のスケーリング則は、損失がパラメータ、データ、計算量のべき乗則に従うと示しました。2022年のChinchilla論文は、計算最適なdenseモデルには従来よりはるかに多くのトークンが要ると示しました。同論文の設定では、目安は1パラメータあたり約20トークン。700億パラメータなら約1.4兆トークンです。

LLMは文字列を直接読むのではなく、まずトークンIDの列へ変換します。BPEは文字やバイトから始めて、最も頻繁に隣り合うペアを新しいトークンへ繰り返しマージします。GPT-4の語彙は約10万トークン。日本語では、1文字が1トークン以上になることも多いです。

次に、トークンIDは高次元の埋め込み、たとえば4096次元のベクトルに変換されます。Transformerは並列に処理するため、順序を位置エンコーディングで注入する必要があります。現代のLLaMA、Gemma、Mistralなどでは、次元のペアを位置に応じた角度で回転させるRoPEが主流です。RoPEでは、クエリとキーの内積に効く位置情報が、2つのトークンの相対位置だけになります。

自己注意では各トークンから、何を探すかのQuery、何を持つかのKey、渡す情報のValueを作ります。QueryとすべてのKeyの内積を、Keyの次元数の平方根で割り、softmaxで重みにします。その重みでValueを混ぜ合わせると、文脈に応じた新しい表現ができます。

マルチヘッド注意では、ヘッドごとに主語と動詞の一致や修飾語と名詞の関係などを並列に学べます。デコーダ型の因果マスクは、スコア行列の対角より上をマイナス無限大にし、softmaxで未来の重みをゼロにします。

1つのTransformerブロックは自己注意とFFNの2つのサブ層からなり、それぞれを正規化と残差接続が包みます。残差接続は入力を足し戻すことで、深い層へ勾配が届くショートカットを作ります。現代のPre-LNはサブ層の前で正規化し、大規模でも安定しやすくします。FFNは各トークンを独立に変換し、Transformer全体の約3分の2のパラメータを占めます。

最後の層の出力は語彙サイズへ射影され、softmaxで次トークンの確率分布になります。推論では、分布から1つのトークンを選び、文脈に追加し、同じ処理を繰り返します。greedyは常に最大確率を選びます。温度を下げると決定的に、上げると多様になります。top-kは上位k個だけを残し、top-pは累積確率がpを超えるまで候補を残します。

学習はまず事前学習から始まります。Web、書籍、コードなど数兆トークンで、次トークン予測を反復します。この段階のモデルは続きを書けても質問には答えられないため、SFTで約10万件の高品質な指示と応答のペアを学ばせます。RLHFでは、人間が複数回答をランキングし、そのランキングから報酬モデルが学習されます。そしてPPOで報酬を最大化しつつ、KLペナルティで元のモデルから離れすぎないようにします。

その流暢さは、次のトークンを予測するという単純な原理を、大規模にスケールさせることから生まれます。記事では、自己注意、テキスト生成、Transformerブロックのインタラクティブデモで、さらに深く確認できます。

LLM の系譜 — 10 年の進化

2013Word2Vec単語埋め込み2017TransformerAttention Is All You Need2018BERT / GPT-1事前学習時代の幕開け2020GPT-31750 億パラメーター2022ChatGPTSFT + RLHF2024–GPT-4o / Gemini / Claudeマルチモーダル・推論

Word2Vec 時代(2013)

Mikolov et al. (2013) が提案した Word2Vec は、単語を固定次元のベクトル(埋め込み)に変換する手法だ。有名な例が king - man + woman ≈ queen で、単語の意味の関係がベクトルの足し引きに現れる。ただし、1 つの単語には文脈によらず同じベクトルが割り当てられる(静的な埋め込み)。

Transformer の登場(2017)

Vaswani et al. (2017) の論文 "Attention Is All You Need" が提案した Transformer は、RNN の逐次処理を自己注意機構(Self-Attention)で置き換え、系列内の全位置を並列に計算できるようにした。このアーキテクチャが現在の LLM の基盤になっている。

事前学習時代(2018–)

Transformer をベースに 3 つのアーキテクチャファミリーが発展した。

Transformer2017 — Vaswani et al.エンコーダー系BERT (2018)マスク言語モデルRoBERTa (2019)学習方法を改良した BERTDeBERTa (2020)内容と位置を分けた注意機構エンコーダー・デコーダー系T5 (2019)テキスト→テキストBART (2019)ノイズ除去オートエンコーダーFlan-T5 (2022)指示チューニングデコーダー系GPT-2/3 (2019–20)自己回帰型言語モデルLLaMA (2023)オープンウェイトGPT-4 / Claude (2023–)最先端モデル分類・固有表現抽出・埋め込み翻訳・要約対話・コード生成・推論

エンコーダー系(BERT 系)

BERT(2018)は、マスクされたトークンを予測するマスク言語モデル(MLM)というタスクで事前学習される。双方向の文脈を捉えるため、分類・固有表現抽出・類似度計算などの理解タスクに強い。

エンコーダー・デコーダー系(T5 系)

T5(2019)は、翻訳・要約・質問応答などすべてのタスクを、テキストを入力してテキストを出力する同じ形式(text-to-text)で扱う。

デコーダー系(GPT 系)

GPT シリーズは自己回帰型の言語モデルで、左から右へ 1 トークンずつ生成する。パラメーター数を増やすにつれて性能が大きく向上し、GPT-3(1750 億パラメーター)では、プロンプトに数例を示すだけで新しいタスクをこなす few-shot 学習が実証された。現在の ChatGPT、Claude、Gemini はいずれもデコーダー型・自己回帰型のファミリーに属するが、それぞれ別の製品・モデルの系譜である。

スケーリング則

log x(x は N、D、C のいずれか)log L(損失)L(x) ∝ x^(−α)パラメーター数 (N)データ量 (D)計算量 (C)Kaplan et al. 2020, Hoffmann et al. 2022

Kaplan et al. (2020) は、言語モデルの損失がパラメーター数 NN、データ量 DD、計算量 CC のべき乗則に従うことを発見した。

L(x)∝x−αL(x) \propto x^{-\alpha}

xx は NN、DD、CC のいずれかで、ほかの 2 つが制約にならない範囲で成り立つ。指数 α\alpha は量ごとに異なる。

Hoffmann et al. (2022) の Chinchilla 論文は、計算量に対して最適な dense 言語モデル(トークンごとに全パラメーターを使うモデル)には、それ以前の多くの大規模モデルが使っていたよりはるかに多い学習トークンが必要であることを示した。同論文の設定では、おおむね 1 パラメーターあたり 20 トークンになる。例えば 700 億パラメーターのモデルなら約 1.4 兆トークンだ。

トークナイゼーション — テキストを数値に

LLM は、テキストをトークンと呼ばれる単位に分割し、各トークンを整数の ID に置き換えた数値の列として処理する。

入力テキスト"The cat sat on the mat"↓ GPT-2 の BPE トークナイザー(Ġ = 単語の前の空白)トークン(サブワード)TheID: 464ĠcatID: 3797ĠsatID: 3332ĠonID: 319ĠtheID: 262ĠmatID: 2603

BPE(Byte Pair Encoding)

GPT シリーズや LLaMA など多くの LLM が使うトークナイゼーション手法が BPE(Sennrich et al., 2016)だ。BPE は次の手順で語彙を作る。

  1. テキストを文字(またはバイト)単位に分割する
  2. コーパス全体で、隣り合って出現する回数が最も多いペアを見つける
  3. そのペアを 1 つの新しいトークンとしてマージする
  4. 語彙サイズが目標に達するまで 2〜3 を繰り返す
# BPE の簡略化された疑似コード
vocab = set(all_characters)
for i in range(num_merges):
    # 最頻ペアを見つける
    pair = most_frequent_pair(corpus)
    # マージして新トークンに
    new_token = pair[0] + pair[1]
    vocab.add(new_token)
    corpus = merge_in_corpus(corpus, pair, new_token)

GPT-4 の語彙は約 10 万トークンだ(tiktoken の cl100k_base)。バイト単位の BPE では、日本語のように文字の種類が多い言語で、出現頻度の低い文字が 1 文字で複数のトークンに分かれることも多い。

なぜサブワードか?

単語単位の語彙では、学習時に見なかった単語(未知語)を表現できず、語彙も大きくなる。文字単位なら語彙は小さく未知語も生じないが、系列が長くなる。サブワードはその中間で、語彙サイズを目標値に抑えながら、見たことのない単語もサブワードの組み合わせで表せる。同じ BPE トークナイザーで多言語のテキストも処理できる。

Transformer アーキテクチャ

LLM の多くは、トークン ID の列をデコーダー型の Transformer で処理する。

× N入力埋め込み + 位置エンコーディングマルチヘッド自己注意機構残差接続 & 層正規化フィードフォワードネットワーク残差接続 & 層正規化線形層 + Softmax → 確率分布トークン ID 列次トークン予測

デコーダー型 Transformer は、入力の埋め込み、N 層積み重ねた Transformer ブロック(自己注意・残差接続と正規化・FFN)、出力層からなる。

1. 入力埋め込み + 位置エンコーディング

埋め込み層は、トークン ID を高次元ベクトル(例: 4096 次元)に変換する。RNN は入力を 1 つずつ順に読むので順序が処理に反映されるが、自己注意は全トークンを並列に扱い、それ自体ではトークンの順序を区別しない。そのため、順序の情報を位置エンコーディングで明示的に加える必要がある。

正弦波位置エンコーディング(オリジナル)

Vaswani et al. (2017) の Transformer は正弦波ベースの位置エンコーディングを使用した。pospos は位置、ii は次元のインデックス、dd は埋め込みの次元数だ。

PE(pos,2i)=sin⁡ ⁣(pos100002i/d),PE(pos,2i+1)=cos⁡ ⁣(pos100002i/d)\text{PE}(pos, 2i) = \sin\!\left(\frac{pos}{10000^{2i/d}}\right), \quad \text{PE}(pos, 2i+1) = \cos\!\left(\frac{pos}{10000^{2i/d}}\right)

次のヒートマップでは、低い次元(左側)ほど位置に対して速く振動し(高周波)、高い次元(右側)ほどゆっくり変化する(低周波)。

正弦波位置エンコーディングPE(pos, 2i) = sin(pos / 10000^(2i/d)), PE(pos, 2i+1) = cos(pos / 10000^(2i/d))位置次元012345670123456789101112131415青 = 正 赤 = 負 (偶数次元: sin、奇数次元: cos)高周波低周波

正弦波を使うと、任意の固定オフセット kk に対して、PE(pos+k)\text{PE}(pos + k) を PE(pos)\text{PE}(pos) の線形関数で表せる。原論文は、この性質によってモデルが相対位置を学習しやすくなると考えた。

RoPE(回転位置埋め込み)

LLaMA、Gemma、Mistral など現在の多くの LLM は RoPE(Rotary Position Embedding)を使う。RoPE は、クエリーとキーのベクトルの次元を 2 つずつ組にし、各組を位置に応じた角度だけ 2 次元平面上で回転させる。

RoPE (回転位置埋め込み)次元の組を、位置に応じた角度だけ回転させるpos = 0θ·pos = 0°d₀d₁pos = 1θ·pos = 30°d₀d₁pos = 2θ·pos = 60°d₀d₁q_m · k_n は、位置については相対位置 (m − n) だけに依存する→ 回転角は絶対位置で決まるが、スコアには位置の差だけが残る

RoPE の重要な性質は、回転後のクエリー qmq_m とキー knk_n の内積が、位置については相対位置 (m−n)(m - n) だけに依存することだ。各トークンには絶対位置に応じた回転をかけるが、注意スコアには 2 つのトークンの距離だけが反映される。

RoPE(x,pos)=(x0cos⁡(θ⋅pos)−x1sin⁡(θ⋅pos)x0sin⁡(θ⋅pos)+x1cos⁡(θ⋅pos)⋮)\text{RoPE}(x, pos) = \begin{pmatrix} x_0 \cos(\theta \cdot pos) - x_1 \sin(\theta \cdot pos) \\ x_0 \sin(\theta \cdot pos) + x_1 \cos(\theta \cdot pos) \\ \vdots \end{pmatrix}

式の θ\theta は回転の周波数で、次元の組ごとに異なる値を使う。RoPE をそのまま学習時より長い系列に使うと性能が落ちやすいが、この周波数を調整すると長い系列にも対応させられる。NTK-aware スケーリングや YaRN といったコンテキスト長の拡張手法は、この調整に基づいている。

2. マルチヘッド自己注意機構

注意の計算そのものは、後の「自己注意機構」の節で説明する。

1 つの注意ヘッドは、各トークンについて 1 組の注意重みしか計算できない。ヘッドを複数にすると、異なるヘッドが異なる関係(主語と動詞の一致、形容詞による名詞の修飾、共参照など)を並列に学習できる。

入力 X (d_model = 512)ヘッド 1d_k = 128Q·Kᵀ/√d_k → V主語-動詞ヘッド 2d_k = 128Q·Kᵀ/√d_k → V形容詞-名詞ヘッド 3d_k = 128Q·Kᵀ/√d_k → V共参照ヘッド 4d_k = 128Q·Kᵀ/√d_k → V構文連結 (d_k × h = 512)線形変換 W_O → 出力マルチヘッド出力 (d_model = 512)MultiHead(Q,K,V) = Concat(head₁, …, headₕ) · W_O
MultiHead(Q,K,V)=Concat(head1,…,headh)⋅WO\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h) \cdot W_O

ここで headi=Attention(QWQ(i),KWK(i),VWV(i))\text{head}_i = \text{Attention}(Q W_Q^{(i)}, K W_K^{(i)}, V W_V^{(i)}) だ。GPT-3 は 96 ヘッド、LLaMA 2 70B は 64 ヘッドを使う。

MQA / GQA — KV キャッシュの削減

標準のマルチヘッド注意(MHA)では、ヘッドごとに独立した K, V の射影を持つ。そのため、推論時に保存する KV キャッシュ(後述)がヘッド数に比例して大きくなる。MQA(Multi-Query Attention)は、全 Q ヘッドで 1 組の K, V を共有してこのキャッシュを小さくする。GQA(Grouped-Query Attention)は Q ヘッドを gg 個ずつのグループに分け、グループごとに K, V を共有する。Ainslie et al. (2023) によると、MQA は推論を大きく速くするが品質が下がることがあり、GQA は MHA に近い品質を MQA に近い速度で実現する。

方式K, V ヘッド数モデル例特徴
MHA= Q ヘッド数GPT-3品質が最も高いが、KV キャッシュも最大
MQA1PaLM、StarCoder全ヘッドで K, V を共有し、推論が最も速い
GQAQ ヘッド数の 1/gLLaMA 2 70B、MistralMHA と MQA の中間

LLaMA 2 は 34B と 70B のモデルで GQA を採用した。同論文の 30B モデルでの比較では、GQA は多くの評価タスクで MHA と同程度の性能を示し、より大きなバッチで推論できたためスループットも高かった。

3. 残差接続 & 層正規化

各サブ層(自己注意と FFN)では、出力に入力を加算し(残差接続)、正規化を組み合わせる。正規化を置く位置は、後述の Post-LN と Pre-LN で異なる。

なぜ残差接続が不可欠か

残差接続がないと、逆伝播の勾配は NN 個の層を通過する間に指数的に減衰(または爆発)しやすい。残差接続では入力をそのまま次の層へ足す経路があるので、出力側の勾配がこの経路を通って入力に近い層まで直接届く。

xl+1=xl+F(xl)x_{l+1} = x_l + F(x_l)

これにより、GPT-3(96 層)や LLaMA 2 70B(80 層)のような 100 層近い深いネットワークを学習できる。

Post-LN vs Pre-LN

Post-LN (オリジナル)x自己注意加算 (残差)LayerNormFFN加算 (残差)LayerNormPre-LN (現代)xRMSNorm自己注意加算 (残差)RMSNormFFN加算 (残差)
Post-LN(オリジナル)Pre-LN(現代)
正規化の位置サブ層の後サブ層の前
正規化手法LayerNormLayerNorm(GPT-3)→ RMSNorm(LLaMA 以降)
学習安定性学習率のウォームアップが必須安定。大規模モデルでも収束しやすい
採用モデル元の Transformer、BERTGPT-3、LLaMA、Mistral

RMSNorm(Root Mean Square Layer Normalization)は LayerNorm の簡略版で、平均を引く操作を省略する。

RMSNorm(x)=xRMS(x)⋅γ,RMS(x)=1d∑i=1dxi2\text{RMSNorm}(x) = \frac{x}{\text{RMS}(x)} \cdot \gamma, \quad \text{RMS}(x) = \sqrt{\frac{1}{d}\sum_{i=1}^{d} x_i^2}

平均の計算を省く分だけ計算量が少なく、提案論文の実験で LayerNorm と同等の性能を示したことから、LLaMA 以降のモデルで標準的に使われている。

4. フィードフォワードネットワーク(FFN)

FFN は、各トークンのベクトルに独立に適用される全結合ネットワークだ。注意機構がトークン間の関係を捉えるのに対し、FFN は各トークンの特徴を変換する。中間層の次元を入力の 4 倍にする標準的な構成で数えると、FFN の重みは自己注意の 4 つの射影行列の合計の 2 倍になり、Transformer 全体(埋め込みを除く)のパラメーターの約 2/3 を占める。FFN は、学習した知識の多くを蓄えていると考えられている。

標準 FFN

オリジナルの Transformer(Vaswani et al., 2017)は ReLU を使用し、GPT や BERT では GELU に置き換えられた。

FFN(x)=GELU(xW1+b1)W2+b2\text{FFN}(x) = \text{GELU}(x W_1 + b_1) W_2 + b_2

中間層の次元 dffd_{\text{ff}} は通常 4×dmodel4 \times d_{\text{model}} だ(例: dmodel=4096d_{\text{model}} = 4096 なら dff=16384d_{\text{ff}} = 16384)。

SwiGLU — 現代の標準

Shazeer (2020) が提案した SwiGLU は Gated Linear Unit に Swish 活性化を組み合わせた手法で、LLaMA や PaLM などで採用されている。

SwiGLU フィードフォワードネットワークx (d_model)x · W₁ (d_ff)Swish(x) = x · σ(x)x · W₃ (d_ff)(ゲート)⊙要素積· W₂ → 出力 (d_model)SwiGLU(x) = (Swish(x · W₁) ⊙ (x · W₃)) · W₂
SwiGLU(x)=(Swish(xW1)⊙(xW3))W2\text{SwiGLU}(x) = \bigl(\text{Swish}(x W_1) \odot (x W_3)\bigr) W_2

Shazeer の実験では、FFN を SwiGLU に置き換えたモデルの品質が標準 FFN のモデルより高かった。その理由として、次の 2 点が考えられる。まず、xW3x W_3 はゲートとして働き、Swish(xW1)\text{Swish}(x W_1) の各成分をどれだけ通すかを入力に応じて制御する。次に、Swish(x)=x⋅σ(x)\text{Swish}(x) = x \cdot \sigma(x) は ReLU と違って滑らかで、負の入力に対しても小さな値を返すため、勾配が途切れにくい。

SwiGLU は 3 つの行列(W1,W2,W3W_1, W_2, W_3)を使うので、パラメーター数を標準 FFN と揃えるために中間層の次元を dff=83dmodeld_{\text{ff}} = \frac{8}{3} d_{\text{model}} とする(標準 FFN は 4×dmodel4 \times d_{\text{model}})。

5. 最終出力層

最後の Transformer ブロックの出力を正規化し(LLaMA 系では RMSNorm)、線形変換(Unembedding)で語彙サイズ ∣V∣|V| 次元に射影する。これを softmax で確率分布に変換し、次のトークンを予測する。

GPT-2 や Gemma などのモデルは、埋め込み行列 WEW_E と出力層の重み WUW_U を重み共有(weight tying)する。WU=WETW_U = W_E^T とすると、パラメーターが ∣V∣×d|V| \times d 個減り、入力と出力で同じ意味空間を使うことになる。

デコーダーの因果マスク

GPT のようなデコーダー型モデルでは、因果マスク(causal mask)を使って未来のトークンへの注意を遮断する。位置 ii のトークンは位置 1,2,…,i1, 2, \ldots, i のトークンにのみ注意できる。

因果マスク (注意行列)緑 = 注意可能、赤 = マスク (−∞)Key →ThecatsatontheQuery →Thecatsatonthe✓−∞−∞−∞−∞✓✓−∞−∞−∞✓✓✓−∞−∞✓✓✓✓−∞✓✓✓✓✓"sat" (3 行目) は "The"、"cat"、"sat" に注意でき、"on"、"the" には注意できない

実装では、スコア行列の対角より上の部分を −∞-\infty に設定する。softmax を通すと、その位置の重みは 0 になる。学習時にも各位置がその位置までのトークンだけを参照するので、左から右へ 1 トークンずつ生成する自己回帰生成と条件が揃う。

Transformer ブロック全体の流れ

次のデモでは、1 つの Transformer ブロックを通るデータの流れを、ここまで説明した要素ごとに 1 ステップずつ追える。

Transformer ブロックの順伝播

"I love cats" の 3 トークンが 1 つの Transformer ブロックを通る過程を、1 ステップずつ示す(d_model = 4、値は説明用)。

📥埋め込み+PE
→
📏RMSNorm
→
🔀Q,K,V
→
🎯注意重み
→
✨注意出力
→
➕残差
→
📏RMSNorm
→
⚡FFN
→
➕残差
→
📤出力
ステップ 0: 入力埋め込み + 位置エンコーディング
トークン:Ilovecats
X = Embed + PE
I0.82−0.150.440.91
love0.330.78−0.220.56
cats0.610.420.73−0.08

トークン ID をまず埋め込み行列でベクトルに変換し、位置エンコーディングを加算する。各トークンが d_model = 4 のベクトルになる(実際の LLM では例えば 4096 次元)。

1 / 10

自己注意機構 — Transformer の核心

自己注意機構(Self-Attention)は、各トークンと他の全トークンとの関連度を入力に応じて計算し、文脈を反映した表現を作る仕組みだ。

数式

Attention(Q,K,V)=softmax ⁣(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^T}{\sqrt{d_k}}\right) V
  • QQ(Query): 各トークンが「何を探しているか」を表すベクトル
  • KK(Key): 各トークンが「何を持っているか(どんな情報で自分を検索してほしいか)」を表すベクトル
  • VV(Value): 各トークンが「実際に渡す情報」を表すベクトル
  • dk\sqrt{d_k}: スケーリング因子(dkd_k はキーベクトルの次元数)。内積が大きくなりすぎて softmax が飽和するのを防ぐ

インタラクティブデモ

自己注意機構(Self-Attention)

"The cat sat" の 3 トークンで自己注意を計算する過程を、1 ステップずつ示す(d_k = 2、因果マスクなし、値は説明用)。

トークン:Thecatsat
X(入力)
The1.00.20.50.8
cat0.30.90.10.6
sat0.70.40.80.2

入力は "The cat sat" の 3 トークンの埋め込み X だ。各行が 1 トークンの 4 次元ベクトルで、ここから Q, K, V の 3 つの行列を計算する。

1 / 8

RNN と比べた自己注意の利点

  1. 長距離依存: RNN では遠いトークンの情報が減衰するが、自己注意は全トークンに直接アクセスできる
  2. 並列計算: RNN は逐次処理だが、自己注意は行列演算なので GPU で並列に計算できる
  3. 解釈可能性: 注意重みを可視化すると、各トークンがどのトークンに大きな重みを置いたかが分かる

計算量の課題

自己注意は全トークンの組についてスコアを計算するので、計算量は系列長 nn に対して O(n2)O(n^2) になり、文脈が長いと負担が大きい。次の手法は、この計算を高速化したり、メモリー使用量を減らしたり、複数のデバイスに分担させたりする。

手法計算量概要
通常の注意O(n2)O(n^2)全トークン対を計算
Flash AttentionO(n2)O(n^2)(メモリー O(n)O(n))GPU のメモリー(HBM)への読み書きを減らす
Multi-Query AttentionO(n2)O(n^2)K, V のヘッドを共有し推論を高速化
Grouped-Query AttentionO(n2)O(n^2)MQA と MHA の中間。LLaMA 2 70B などで採用
Ring AttentionO(n2/p)O(n^2 / p)(デバイスあたり)系列を pp 台のデバイスに分割して並列に計算

テキスト生成 — 次トークン予測の仕組み

LLM は、コンテキスト(入力トークン列)を受け取ると、次に来るトークンの確率分布を出力する。この分布からトークンを 1 つ選んでコンテキストの末尾に加え、同じ処理を繰り返してテキストを生成する(自己回帰生成)。

生成戦略

Greedy decoding: 常に最高確率のトークンを選ぶ。出力は決定的になるが、単調になりやすい。

温度スケーリング: ロジット ziz_i(softmax が確率に変換する前の各トークンのスコア)を温度 TT で割ってから softmax を適用する。

pi=exp⁡(zi/T)∑jexp⁡(zj/T)p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}
  • T<1T < 1: 分布が鋭くなる → より決定的(事実を述べるタスク向き)
  • T>1T > 1: 分布がなだらかになる → より多様・創造的(創作向き)
  • T→0T \to 0: greedy decoding に収束

Top-k サンプリング: 確率上位 kk 個のトークンだけを残し、残りをゼロにして再正規化する。

Top-p(Nucleus)サンプリング: 確率の高い順に、累積確率が pp(例: 0.95)を超えるまでのトークンだけを残す。分布が鋭いときは候補が少なく、なだらかなときは多くなるため、候補数が固定の top-k より柔軟だ。

インタラクティブデモ

テキスト生成デモ

温度と top-k サンプリングで、LLM が 1 トークンずつテキストを生成する過程を示す(表示は上位 5 候補、値は説明用)。

コンテキスト:Thecat▌
sat
logit: 3.20%
is
logit: 2.80%
ran
logit: 1.50%
the
logit: 0.90%
very
logit: 0.40%

コンテキスト "The cat" を入力すると、モデルの最終層が次のトークンの候補ごとにロジット(softmax 前のスコア)を出力する。

1 / 8

学習パイプライン — 生のモデルから対話 AI へ

事前学習大規模コーパスで次トークン予測数兆トークンSFT指示データで教師あり微調整約 1.3 万件(InstructGPT)RLHF / DPOモデルを人間の選好に合わせる報酬モデル + PPO、または DPOデプロイAPI / チャットインターフェース量子化・推論最適化

ステージ 1: 事前学習(Pre-training)

事前学習では、言語の一般的な知識を獲得するために、Web テキスト、書籍、コードなど数兆トークン規模のコーパスで次のトークンを予測するタスクを学習する。損失は、各位置で正解の次トークン xtx_t に与えた確率の負の対数を足し合わせたものだ。

Lpretrain=−∑t=1Tlog⁡P(xt∣x<t;θ)\mathcal{L}_{\text{pretrain}} = -\sum_{t=1}^{T} \log P(x_t | x_{<t}; \theta)

この段階のモデルは文の続きを生成できるが、質問に答えたり指示に従ったりするようには学習されていない。

ステージ 2: 教師あり微調整(SFT)

SFT では、モデルが指示に従うように、高品質な(指示, 応答)ペアのデータセットで微調整する(InstructGPT では約 1.3 万件)。これにより、モデルはユーザーの質問に回答するという形式を学習する。

[指示] 日本の首都はどこですか?
[応答] 日本の首都は東京です。

ステージ 3: 人間のフィードバックによる強化学習(RLHF)

SFT 後のモデルも、事実に基づかない回答や有害な出力を生成することがある。RLHF は、どちらの回答が良いかという人間の判断を使ってモデルを人間の選好に合わせ、こうした出力を減らす。

  1. 報酬モデルの学習: 人間のアノテーターが同じプロンプトへの複数の回答を順位付けし、そのデータで回答の良さをスコアにする報酬モデルを学習する
  2. PPO(近接方策最適化): 報酬モデルのスコアを最大化するようにポリシー(LLM)を更新する。ただし、元のモデルから離れすぎないよう KL ペナルティーを加える
JRLHF=E[R(x,y)−β KL(πθ∥πref)]\mathcal{J}_{\text{RLHF}} = \mathbb{E}\bigl[R(x, y) - \beta \, \text{KL}\bigl(\pi_\theta \| \pi_{\text{ref}}\bigr)\bigr]

R(x,y)R(x, y) はプロンプト xx への回答 yy に報酬モデルが付けるスコア、πθ\pi_\theta は更新するポリシー、πref\pi_{\text{ref}} は元の(SFT 後の)モデル、β\beta は KL ペナルティーの強さを決める係数だ。

DPO(Direct Preference Optimization)は RLHF を簡素化した手法で、報酬モデルを明示的に学習せず、選好データから直接ポリシーを最適化する。LLaMA 2 は PPO ベースの RLHF を使用したが、その後 Zephyr、LLaMA 3 などのオープンモデルで DPO が広く採用されている。

現代 LLM の主要テクニック

KV キャッシュ

自己回帰生成では、過去のトークンの K と V はステップが進んでも変わらない。そこで、一度計算した K, V を KV キャッシュとして保存し、以降のステップで再利用する。各ステップでは新しいトークンの分だけを計算すればよいので推論が大幅に速くなるが、キャッシュのメモリー消費は系列長に比例して増える。

量子化

LLM のパラメーターを 32/16 ビット浮動小数点から 4/8 ビット整数に変換し、メモリーと計算コストを削減する。GPTQ や AWQ などの手法を使うと、多くのワークロードで精度の低下を小さく抑えられる。その結果、70B モデルも 4 ビットなら重みが約 35 GB になり、大容量メモリーの GPU 1 枚で動かすことも現実的になる。実際に動かせるかは、コンテキスト長に応じた KV キャッシュの量やレイテンシーの要件による。

MoE(Mixture of Experts)

MoE は、FFN 層を複数の「エキスパート」に分け、トークンごとにルーターが少数のエキスパート(Mixtral では 8 個中 2 個)を選んで計算する手法だ。全パラメーター数は大きいが、推論時に各トークンで使われるパラメーターは一部なので、計算量を抑えたままモデルを大きくできる。

コンテキスト長の拡張

初期の Transformer 系モデル(BERT など)のコンテキスト長は 512 トークン程度だったが、現在は Gemini 1.5 のように 100 万トークン以上を処理できるモデルもある。コンテキスト長の拡張には、前述の RoPE の周波数調整(NTK-aware スケーリングや YaRN)や Ring Attention などの手法が使われている。

まとめ

各節の要点は次のとおりだ。

  1. 歴史: Word2Vec → Transformer → BERT/GPT → スケーリング則による大規模化
  2. トークナイゼーション: BPE によるサブワード分割で任意のテキストを数値系列に
  3. Transformer: 自己注意 + FFN + 残差接続を N 層積み重ねたアーキテクチャ
  4. 自己注意: softmax(QKT/dk)V\text{softmax}(QK^T/\sqrt{d_k})V で全トークン間の関連度を入力に応じて計算
  5. テキスト生成: 温度・top-k・top-p サンプリングによる確率的な自己回帰生成
  6. 学習パイプライン: 事前学習 → SFT → RLHF/DPO で「次トークン予測器」を「対話 AI」に変換

どの段階でも、モデルが出力するのは次のトークンの確率分布だ。この一見単純な仕組みを十分な規模に拡大すると、冒頭で挙げたコードの作成や質問への回答ができるようになる。

参考文献