(あぁ…パワポ150枚、本文は全部できた。図表もコーヒー器具のごとく整った。あとは 各スライドのタイトル だけ…30分 悩んでる。「攻めの新規事業戦略」か「成長軌道への転換」か「次の10年に向けた変革」か。…どれも、なんかピンと来ない。)
赤崎さん、まだ帰ってないんですか。あ、…タイトル付けで悩んでる んですね。それ、見たことあります。20年 パワポ作ってきても、最後の スライドタイトル が一番難しいって、よく言われてました。
そう、構成は固まってる。各スライドの中身ベクトルも、頭の中で 1スライドにつき数千次元くらい の意味で持ってる。でも、それを 「7〜13文字の見出し」 に圧縮して、しかも パワポ語彙20,000語 から1つ選ぶ作業が…本当に難しい。
(これ完全に アンエンベディング行列 W_u の話だ。内部の高次元意味ベクトル → 語彙への射影。LLM が毎回 次トークン1個出すたびにやってるのが、まさに赤崎さんが30分悩んでるこの作業。…20年やっても悩むんだから、AI が完璧にやれないのも当然。)

- ひとことで言うと、Transformer が頭の中で考え抜いた 「意味のかたまり」を、辞書に載っている単語ぜんぶの点数表に翻訳して、次に出す一語を決める出口の装置(行列名や数式は本文で)。
- これがないと、モデルの中身は意味を表す数字の列のままで 「で、次の単語は何?」に答えられない。入口で単語を数字に変える仕組みと対になっていて、出口で数字を単語に戻す係。
- イメージは 採点会場。考え終えた答案を全候補に配り、各単語が「自分が次にふさわしい度」を点数で名乗り出る。いちばん高得点の語が選ばれる、という最後の一押し。
マルチヘッドアテンション (#036) + MLP (#037) のペアが N 層スタックされ、各トークンのベクトルが 文脈を反映した最終ベクトル に育つ。
でも、ベクトルのままでは 「次の単語」 として出力できない。意味ベクトル(d_model 次元) → 語彙(vocab_size 個)のどれを出すかのスコア に変換する必要がある。それが アンエンベディング行列 W_u の役割。
W_u の役割 — 最終ベクトルを語彙スコアに翻訳する
Transformer 全体の出力フローを最後の方だけ書き出すと、こうなる:
- ① N 層スタックの出力: 最終ベクトル h(次元 d_model、例 4096)
- ② × W_u を掛ける: h @ W_u → ロジット(次元 vocab_size、例 50,257)
- ③ softmax (#024): ロジットを確率分布に変換
- ④ サンプリング (#025): 確率分布から1単語を選ぶ
ここで ② が W_u の仕事。形状は d_model × vocab_size(例: 4096 × 50,257)。重みの数は 約 2億。LLM の中でも比較的大きなパラメータ塊。
補足: 「射影行列」 って何? — 「影を落とす」 アナロジー
本記事のタイトルにも出てくる 「射影(projection)」 という言葉、聞き慣れないと止まる人が多いので一度整理する。
物理アナロジー: 太陽光が落とす影の長さ
真上から太陽光が地面に当たっているとする。地面に立った棒 がある。棒を 真っ直ぐ垂直 に立てれば、影は 真下のほぼ点(影=0)。棒を 地面に近い角度で倒す と、影は 長く伸びる(影=大)。
これが 射影 の原型イメージ。「ある方向(地面)に対して、別のベクトル(棒)が どれだけ 「その方向に沿っているか」」を 影の長さ で測る操作 = 射影。
数学では: 内積が 「影の長さ」
2つのベクトル a, b があるとき、a を b の方向に射影したときの影の長さ = a と b の 内積(を、b の長さで正規化したもの) (#005)。
- a と b が 同じ方向(角度ゼロ)→ 影=最大(内積が最大)
- a と b が 直角(90度)→ 影=ゼロ(内積=0)
- a と b が 逆方向(180度)→ 影=最小(内積がマイナス)
アンエンベディングは 「50,257本の方向への射影を一気に計算」 する装置
Transformer の最終ベクトル h は d_model 次元(例: 4096)の 「意味の方向」。W_u の各列(全 50,257 列)は、各単語に対応する d_model 次元の 「方向ベクトル」。
つまり h @ W_u という行列計算は、1本の意味ベクトル h を、50,257 個の 「単語方向」 それぞれに射影して、影の長さを一気に計算している。影が長い単語 = 意味が近い = ロジット高い → softmax で確率高い → サンプリングで選ばれやすい。
これが 「射影行列」(projection matrix) という名前の由来。W_u は「意味空間 → 語彙スコア空間」への射影装置。
幾何的イメージ — 各単語が 「投影先」 の方向を持つ
W_u は形状 d_model × vocab_size。各列(全部で vocab_size 列)が、1つの単語に対応する d_model 次元のベクトル。
つまり W_u は 「語彙の中の各単語が、d_model 空間のどの方向を表すか」 の辞書。最終ベクトル h が来ると、h と各単語ベクトルの内積 (#005) = 「どれくらい似ているか」 のスコア = ロジットになる。
- h が 「猫」 の方向に強く向いている → 「猫」 の列との内積が大きい → 「猫」 のロジット高い
- h が 「魚」 の方向にも傾いている → 「魚」 のロジットも中程度
- 関係ない単語(例: 「宇宙」)の列との内積はゼロ近く → 選ばれない
つまり W_u は 「内部の意味方向」 と 「語彙の各単語の方向」 を、内積で照合する仕組み。これは アテンションの Q · K と同型 の構造(意味ベクトル = 「質問者」、各単語ベクトル = 「見出し」)。
入口 Embedding との対称性 — 重み共有(weight tying)
W_u と対称的なのが、入口の Embedding 行列 W_e (#002)。Embedding は vocab_size × d_model の形状で、「単語 ID → ベクトル」 の変換を担う。
形状を比較すると:
- W_e(入口 Embedding): vocab_size × d_model — 単語 → ベクトル
- W_u(出口 Unembedding): d_model × vocab_size — ベクトル → 単語スコア
- 形状が 互いに転置の関係
そこで、多くのモデル(GPT-2, GPT-Neo, Llama 等)で W_u = W_e^T(転置)で重み共有 する設計が採用されている。これを weight tying(重み共有)と呼ぶ。
メリット:
- パラメータ節約: vocab_size × d_model 個の重みが半減(例: 50,257 × 4096 = 2億削減)
- 学習安定: 入口と出口で同じ 「単語ベクトル空間」 を共有するため、意味の一貫性が出る
ただし GPT-3 以降の大規模モデルでは weight tying を外す ことも増えている。理由: モデルが大きくなれば 2億パラメータの削減は相対的に小さい(GPT-3 175B 全体の 0.1%)、別行列にした方が表現力が上がる、など。
赤崎アナロジーで整理 — パワポタイトル付けの数学的構造
赤崎の 「30分悩むスライドタイトル付け」 は、構造的に W_u と同じ:
| 赤崎(パワポ職人) | LLM(W_u) |
|---|---|
| 頭の中の 「スライドの意味」 数千次元 | 最終ベクトル h(d_model 次元) |
| パワポ慣用語彙 約20,000語 | vocab_size(例 50,257) |
| 各候補語を吟味してスコア付け | W_u で各単語との内積 = ロジット |
| 最終的に1つ選ぶ | softmax + サンプリング |
| 30分悩む | 0.05秒で1万単語処理 |
赤崎がやっている 「意味を語彙に圧縮する」 工程は、Transformer の最終ステップそのもの。違いは 処理速度 と 候補吟味の徹底さ だけ。
裏返すと、パワポタイトル付けで20年悩み続ける作業を、LLM は毎トークン 0.05秒で律儀にやっている。GPT-4 が500トークン応答するなら、25秒間に W_u 計算を 500回やっている。
凡田くん、金曜の続きで、結局 「次の10年に向けた変革」 にしました。…で、君が言ってた アンエンベディング の話、確かに私のタイトル付けと同じ構造だね。「意味を語彙に圧縮」 の最終工程。…なら、AI に タイトル候補3本 出させて、私は選ぶだけにすればよかったか?
あら部長、それ 当社のアシスタント職を AI に置き換える って話でしょう? 私の銀座カフェ接客の 「最後の一言」 も、お客様にお返しする時 「ごゆっくりお過ごしくださいませ」 か 「またのお越しをお待ちしておりますわ」 で、毎回 0.2秒 悩んでおりますの。これも W_u ですわね。
(部長、赤崎さんのパワポタイトル比喩は weight tying の説明にも応用できます。入口で 「意味」 を埋め込む方向 と、出口で 「意味」 を取り出す方向が 同じ単語空間を共有 しているのが weight tying。GPT-2 / Llama は採用、GPT-3 以降は規模が大きくて節約効果が薄いから外している。…で、AI にタイトル3本出させる提案、学術界の関連研究も480本超 ありますので、当社の生成AI案件で見積もり書きます。)
フッ、Unembedding か。これは私の マリーナベイサンズ17回滞在 で言うと、「今夜何を食べるか」 を ホテル内の50店舗から1店舗に絞る 作業に等しい。17回 × 平均7泊 = 約120夕食 の選択を、私は毎回 d_model = 私の食欲ベクトル を 各店舗ベクトル と内積で照合してきた。これが私の 「美食 W_u」。
(御託の経費はどうなってるんだろう…でも比喩としては悪くない。)

W_u の 「サイズ」 と LLM 全体への影響
W_u はパラメータ数で言うと、LLM 全体の中でも一定の存在感:
- GPT-2 small(d_model=768, vocab=50,257): W_u ≒ 3,860万 パラメータ(モデル全体 1.24億の 約31%)
- GPT-3 175B(d_model=12,288, vocab=50,257): W_u ≒ 6.2億 パラメータ(全体の 0.35%、相対的には小さい)
- Llama-3 8B(d_model=4,096, vocab=128,256): W_u ≒ 5.25億 パラメータ(全体の 約 6.6%)
モデルが小さいと W_u がパラメータの大部分を占める。GPT-2 small のように 31% が W_u だと、weight tying のメリットは大きい(これがなぜ小型モデルで weight tying が標準だったかの理由)。
大規模モデルでは MLP(2/3) (#037) + アテンション(1/3)が圧倒的多数を占めるので、W_u の相対比は小さくなる。
深掘り記事 ・ 公開中ロジット(Logit) (#039)W_u が出力するスコアそのものの解説、softmax 前の生スコア。
