トピックハブ

トランスフォーマーと大規模言語モデル

トランスフォーマーがトークンを次トークンの確率に変える仕組み。トークン化、ソフトな検索としての注意機構、事前学習とスケーリング則、デコーディング設定、そしてコンテキスト窓が与えるものと与えないものを解説します。

更新 2026年11月13日 · トランスフォーマー、注意機構、トークン化、スケーリング則、デコーディング、コンテキスト窓、KVキャッシュ、混合エキスパート

概要

大規模言語モデル(LLM)とは、非常に大きなコーパスで次トークンを予測するように学習されたトランスフォーマーで、通常はその後、指示に従うようにファインチューニングされます。アーキテクチャは2017年に生まれ、ほとんど変わっていません。変わったのはスケール、データ、そして推論周りのエンジニアリングです。このハブは、デプロイの規模を見積もり、モデルカードを読み、モデルがなぜそう振る舞うのかを理解するために現場のエンジニアが必要とするレベルで、その仕組みを説明します。

これが重要なのは、抽象化が漏れるからです。トークン数がコストとコンテキストを決め、注意機構がメモリとレイテンシを決め、デコーディング設定が同じプロンプトの2回の実行が一致するかどうかを決めます。モデルをブラックボックスとして扱うエンジニアは、この3つすべてに驚かされることになります。

重要な考え方

トークンが入り、トークンの確率が出る

モデルは単語を見ません。トークナイザ、通常はバイトペア符号化が、テキストを32 kから256 kエントリの固定語彙に含まれる断片に分割します。一般的な英単語は1トークン、珍しい単語や英語以外のほとんどのテキストは複数トークンになり、数字やコードは一見恣意的な方法で分割されます。1トークンは英語でおよそ4文字なので、128 kのコンテキストには約90 k語が収まります。あらゆる価格、上限、ベンチマークはトークン単位であり、モデルファミリーごとに独自のトークナイザをもつため、同じテキストでもベンダー間で数が異なります。tiktokenとHugging Faceのトークナイザを使えば、何かを送る前に正確な数が分かります。

注意機構はソフトな検索

各トークンは3つのベクトルを生成します。クエリ(何を探しているか)、キー(何を提供するか)、値(何を渡すか)です。あるトークンの出力は、そのクエリが各キーにどれだけ一致するかで重み付けされたすべての値の和で、一致度はソフトマックスを通して合計が1になります。デコーダではマスクが後続のトークンを隠し、これが次トークン予測を可能にしています。複数のヘッドが異なる射影でこれを並列に実行し、各注意層の後にはフィードフォワード層が続きます。そうしたブロックを残差接続と層正規化とともに数十個積み重ねれば、モデルの出来上がりです。

トークンt埋め込みx_tクエリq_tx_t W_qトークン1からt過去と現在キーK値Vスコアq_t K^T / sqrt(d)softmax重みの和は1出力o_tw_i v_iの和マスク: tより後のトークンのスコアは負の無限大にされ、デコーダは決して未来を読まない。過去トークンのKとVはステップ間でキャッシュされ(KVキャッシュ)、これが長いコンテキストが時間だけでなくメモリも食う理由。
1トークンに対するクエリ・キー・値の検索としての注意機構。クエリをそれまでのすべてのキーと比較し、スコアはソフトマックスで重みになり、出力は値の重み付き和です。

この仕組みはNumPyの数行に収まります。

import numpy as np

rng = np.random.default_rng(2)
n_tokens, d = 4, 8                      # 4 tokens, 8-dimensional
x = rng.standard_normal((n_tokens, d))  # one row per token
w_q, w_k, w_v = (rng.standard_normal((d, d)) / np.sqrt(d) for _ in range(3))

q, k, v = x @ w_q, x @ w_k, x @ w_v
scores = q @ k.T / np.sqrt(d)                       # how much each query matches each key
mask = np.triu(np.ones((n_tokens, n_tokens)), 1)   # causal: no looking at later tokens
scores = np.where(mask == 1, -np.inf, scores)
weights = np.exp(scores) / np.exp(scores).sum(axis=1, keepdims=True)
out = weights @ v                                   # weighted sum of values

np.set_printoptions(precision=2, suppress=True)
print(weights)
print("rows sum to one:", np.allclose(weights.sum(axis=1), 1.0))

出力される行列は下三角です。最初のトークンは自分自身にしか注意を向けられず、4番目のトークンは4つすべてに重みを広げます。実際のモデルは回転位置符号化(RoPE)を加えてスコアが距離に依存するようにし、FlashAttentionはスコア行列を実体化せずに同じ結果を計算します。これが長いコンテキストを手頃にしているものです。

事前学習とスケーリング則

事前学習は数兆トークンにわたって次トークンの交差エントロピーを最小化します。Kaplan et al.は2020年に、損失がパラメータ、データ、計算量に対して滑らかな冪則で下がることを示し、Hoffmann et al.は2022年にそのレシピを修正しました。固定の計算予算では、パラメータあたり約20学習トークンで損失が最小になります。現在のオープンモデルはその比率をはるかに超えて学習されています。より小さなモデルを長く学習したほうがサービングが安いからです。混合エキスパート(MoE)モデルは各トークンを多数のフィードフォワードブロックのうち少数にルーティングするので、総パラメータ109 B、トークンあたりアクティブ17 Bといったモデルが存在します。両方の数値が報告されるのはそのためです。

本稿執筆時点での典型的なオープンモデルを、モデルカードが示すべき数値とともに挙げます。Llama 3.1 8B(8 Bパラメータ、128 kコンテキスト、Llama 3.1 Community Licence、2024年7月、利用制限付きオープンウェイト)、Mistral 7B(7.3 B、スライディングウィンドウ注意で名目8 k、Apache-2.0、2023年9月)、Qwen2.5 7B(7.6 B、YaRNスケーリングで128 k、Apache-2.0、2024年9月)、SmolLM2-135M(135 M、8 k、Apache-2.0、2024年11月)です。最後のものは、このサイトの例をラップトップで動かせるほど小さなモデルです。GPT、Claude、GeminiのファミリーはAPI専用で、開発元はパラメータ数を公開していません。

デコーディングとコンテキスト窓

モデルはすべての語彙エントリに対する確率を出力します。貪欲デコーディングは最上位を取り、温度はサンプリング前に分布を平坦化または先鋭化し、top-pサンプリングは裾を切り落とします。温度0は決定性の保証ではありません。バッチ化された浮動小数点カーネルは、ほぼ同じロジットの順位を実行間で入れ替えることがあります。投機的デコーディングは小さなモデルで複数トークンの下書きを作り、大きなモデルが1パスで検証します。同じ分布を2倍から3倍の速度で得られます。

コンテキスト窓とは、モデルが注意を向けられるトークンの最大数です。その窓のためのKVキャッシュは、層数×コンテキスト長×隠れ次元に比例するメモリを消費し、8 Bモデルの128 kコンテキストを16ビットで扱うと、重みを除いて約16 GBになります。Liu et al.は2023年に、モデルは長いコンテキストの先頭と末尾を中央よりうまく使うことを示し、実タスクでの有効な窓はしばしば公称値の一部にすぎません。検索はこの2つの事実のゆえに存在します。

どこから始めるか

まずLLMをうまく使うを読んで、モデルに頼めることと頼めないことを知り、次にエンベディングと類似検索でその下にある表現を学んでください。PyTorchで最初のニューラルネットワークは、トランスフォーマーが他のすべてのネットワークと共有する学習ループを与え、ディープラーニングのハブは正規化とスケジュールを扱います。モデルのリファレンスには、現行モデルがサイズ、コンテキスト、ライセンスとともに一覧されています。

ツールとプラットフォーム

ツール 用途 ライセンス プラットフォーム
Transformers オープンモデルの読み込み、実行、学習 Apache-2.0 Hugging Face
vLLM ページ化KVキャッシュによる高スループットなサービング Apache-2.0 オープンソース
llama.cpp 量子化GGUF重みによるCPUおよびApple Silicon推論 MIT オープンソース
Ollama HTTP APIを備えたローカルモデルランナー MIT オープンソース
MLX and mlx-lm Apple Siliconでの推論とファインチューニング MIT Apple
TensorRT-LLM NVIDIA GPU向けに最適化された推論カーネル Apache-2.0 NVIDIA
tiktoken OpenAIトークナイザの正確なトークン数 MIT OpenAI

よくある間違い

  • コストやコンテキストを見積もるときにトークンではなく単語を数え、英語以外のテキストで30%の超過に驚く。
  • 温度を0にして、実行間やプロバイダ間でバイト単位で同一の出力を期待する。
  • 重みだけでGPUの規模を決める。フルコンテキストとバッチサイズでのKVキャッシュのほうが大きいことがよくあります。
  • リーダーボードで4ビット量子化モデルと16ビットモデルを比較し、差をアーキテクチャのせいにする。
  • 公称のコンテキスト窓を使えるものとして扱う。頼る前に、長いプロンプトの中央に置いた事実を取り出せるかテストしてください。

さらに深く