世界を動かす技術を、日本語で。

LLMを理解するために必要な数学

概要

この記事は、Large Language Model(LLM)がどのように動作するかを、AIの専門知識がない技術者向けに解説。 高校数学レベルの知識(ベクトル・行列)があれば理解可能。 主に推論フェーズ(学習済みAIの利用)に必要な数学を中心に説明。 LLM内部の「高次元空間」の使い方や意味、行列による射影について解説。 次回はニューラルネットワーク層の詳細へと続く。

LLMの「高次元空間」入門

  • LLM の理解に必要な数学は、高校で習う ベクトル・行列 程度
  • 本記事では 推論 (既存AIの利用)に必要な知識に限定し、 学習プロセス は次回以降で解説予定

ベクトルと高次元空間

  • ソフトウェアエンジニアが使う「ベクトル」は 数値の配列 を指す
  • 数学的には、ベクトルは n次元空間 での「距離と方向」または「点」を表現
  • 2次元例:(2,−3)は「右に2、下に3」の点、3次元例:(5,1,−7)は「右に5、上に1、奥に7」の点
  • 次元が増えても 概念は同じ、ただし視覚化は困難
  • LLMでは、 ロジットベクトル が「次トークンの確率」を多次元空間で表現

Vocab Space(語彙空間)

  • LLMのロジットは、 各トークンごとに1つの数値 を持つベクトル
    • 例:GPT-2は 50,257個のトークン → ロジットベクトルは50,257次元
    • 例:トークンID464は"The"、ロジットベクトルの464番目が"The"の出現確率
  • このベクトル空間を vocab space (語彙空間)と呼ぶ
  • ロジットベクトルは「 乱雑な空間」であり、同じ確率分布を複数のベクトルで表現可能
  • softmax関数 で正規化することで、「 確率分布」となり、全ての値が0〜1の範囲かつ合計1
    • 例:(1,2,3)と(−9,−8,−7)はsoftmax後に同じ分布(約0.09,0.24,0.66)になる
    • (1,2,5)は同じ順位だが、3つ目のトークンの確率がより高い分布(約0.02,0.05,0.94)になる
  • 正規化後の空間では、 one-hotベクトル (1つだけ1で他は0)も重要な役割

Embedding Space(埋め込み空間)

  • 埋め込み空間 は「意味」を表現する高次元空間
    • 例:「domestic cat」「lion」「tiger」は近く、「dog」「wolf」は別のクラスタ
    • 用途に応じて、様々な意味空間が構築可能
      • 動物学用(分類群ごと)、日常用途(ペット/野生動物ごと)など
      • 品詞(動詞・名詞・形容詞)のクラスタリングも可能
  • 埋め込み空間では、 ベクトルの長さ よりも「方向」が重視されることが多い
    • 例:(1,2)と(8,16)は同じ方向なので、実質的に同じ意味とみなす場合も

行列による射影(プロジェクション)

  • 行列 はベクトルを積み重ねたもの
    • 例:(2,−3)と(5,1)を並べて2×2行列に
  • 行列のサイズは「行×列」で表記(例:2×3行列)
  • 行列の積は 幾何学的変換 (回転・射影)を実現
    • 例:2次元回転行列[cosθ−sinθ; sinθcosθ]で点群をθ度回転
  • 機械学習では 行ベクトルを縦に積む (row-major)形式が主流
    • 計算時は X·R (点群×変換行列)の形で射影
  • 3次元→2次元のような 次元削減 も行列で可能
    • 例:n×3行列(3次元点群)×3×2行列→n×2行列(2次元射影)
  • d1×d2行列 はd1次元空間→d2次元空間への射影
    • 例:50,257×768行列で50,257次元→768次元への射影
  • 射影は「 情報の喪失」を伴う場合がある
    • 例:3次元→2次元射影で元の奥行き情報は復元不可能

まとめ

  • LLM内部では、 ベクトル・行列 を使って多次元空間間の射影や意味表現を実現
  • 「語彙空間」「埋め込み空間」など、用途に応じた高次元空間を使い分け
  • 行列積は「空間間の変換」として直感的に理解できる
  • 次回はこの仕組みを使った ニューラルネットワーク層 の動作にフォーカス予定

Hackerたちの意見

まあ、要するに - 基本的な線形代数、基本的な確率、解析(expみたいな関数)、勾配。ある時、これらの概念をみんながインタラクティブに体験できるように、ステップバイステップの入門を作ろうとしたことがあるんだ。PyTorchでどう表現するかも見られるようにね。

でも、これは本当に「理解」しているってことなのか、それともただ公式を書けるだけなのか…?

これは_大きな_言語モデルについてではないよ。これは単語ベクトルやトークン埋め込みのための数学を説明している。多くの人がここで混乱しているのがわかる。彼らはLLMが次の単語を統計的に予測するためだけにこれをやっていると思っているけど、それは2020年以前の話。彼らは1.8兆以上のパラメータを持つトランスフォーマーネットワークを無視している。埋め込みはその巨大な機械の入力に過ぎない。あの兆単位のパラメータの中で何が起こっているのかは、正確にはわからないんだ。

え、つまりそれは高次元の行列の掛け算じゃないってこと?

でも、LLMを理解するためにはこの数学が必要だよね。理解を深めるために必要な数学ではないけど。

でも、私たちはやってるよ。次のトークンを予測するために一連の数学的関数が使われてるんだ。魔法じゃないけど、そう見えるよね。みんなまるで中世に戻ったみたいで、マーリンが帽子からウサギを消したみたいに振る舞ってる。

著者が言ってた「Build a Large Language Model (from Scratch)」って本読んだ人いる?カーパシーの動画を見た後、もっと深く掘り下げるための良い資料を探してるんだ。

いい感じだよ。今、取り組んでるところ。

うん、ほんとにいいね。

LLMの仕組みをざっくり理解したいなら、[1]は見る価値あるかな?

こちらが本で使われているコードだよ - https://github.com/rasbt/LLMs-from-scratch

これはLLMの一部として行われる計算の技術的な詳細だよ。最も低レベルのMLライブラリを書いている人以外には全く意味がない(つまりほとんどの人にとって)。これではLLMが実際にどう機能しているかを理解するのには役立たない。まるでICE車の仕組みを説明するのにガソリンの化学的特性から始めるようなものだ。確かにそれが全ての基礎だけど、車がどう動くかを説明するのはそこから始めるべきじゃない。

それに、人々は何年も普通のプログラミングをやってきたことを受け入れるべきだし、何でも好きなことに飛び込めるわけじゃない。開発者が万能なエンジニアだという考えは、主にそのバブルの中で広まった神話だよ。ここにいるほとんどの人の教育には、線形代数が含まれていなかったかもしれない(これは大胆な主張だけど、ここにいるみんなが高学歴だっていう前提があるからね、冗談じゃないよ)。

LLMを動かしたいなら、ハードウェアで計算をする必要があるよね。だから、行列の掛け算が得意なハードウェアを選ぶのが大事なんだ。たとえ自分でゼロからLLMを開発してなくてもね。基本的な数学を知ってると、最近のGPUやTPUの購入ラッシュの理由もわかる。でも、そういうのはちょっと本質を外してる気がする。人々が好奇心を持って技術のメンタルモデルを磨くのは、一般的にはいいことだと思うよ。もしLLMが線形代数の塊だって知らなかったら、何ができるかできないかについて歪んだ見方をしてしまうかもしれない。

これは、ICE車の仕組みを説明するのに、ガソリンの化学特性から始めるようなものだね。でも、タイトルが「内燃機関を理解するために必要な化学」とかだったら、化学を説明するのも許容されるんじゃない?著者がやったことに似てる。タイトルは「数学...」だったし、記事の内容はLLMに関連する数学を説明してタイトルを満たしてる。あなたは、著者がタイトルに合わない別の記事を書いてほしかったみたいだね。

最も低レベルのMLライブラリを書いていない人には完全に無意味だね(つまり、ほとんど全員)。これは、LLMが実際にどう機能するかを理解するのには役立たないかも。もしかしたら、LLMを理解するために特定の「数学」が必要な人たちがターゲットグループなのかも。

著者は、冗長にならずに自分の投稿に十分な注意書きをしてると思う。過去の投稿を読んでたら、「ゼロからLLMを書く」というシリーズを見つけて、すごく面白かった。もっと楽しいコンテンツを書き続けてほしいな。

私にとって最も興味深い数学的側面の一つは、LLMがロジットを出力することだね。そして、その出力には不確実性が伴う。多くの人がエージェントのネットワークについて話してるけど、実際にやってるのは不確実性を蓄積してるだけなんだ。チェーンの中の各モデルが、自分の不確実性を引き継いで加えていくからね。3つのLLMコールを連結させた後に完全に崩壊することも見たことがある。だから、多くの人が「人間をループに入れる」ことをできるだけ推奨して、不確実性を減らそうとしてるんだ(ポスティリアをシフトさせるってことね);あるいは、どの関数を呼ぶかを決める単一のオーケストレーターを持つワークフローアプローチを勧めてる。ほとんどの強調点(とコンテキストエンジニアリング)はそのオーケストレーターに置かれるけど、全てはLLMの数学に結びついてるんだ。

個々のトークンの出力の不確実性やエラーは実際には蓄積しないんだ。モデルは後のステップでそれを修正できるからね。これは自己回帰モデルに関するよくある誤解なんだ。より複雑なLLMベースのシステムのエラー耐性はアーキテクチャに依存するよ。これを実装するのはエンジニアリングの問題であって、根本的な方法の弱点ではないんだ。オーケストレーターを使って検証を行ったり、データを基にしたり、冗長性を持たせたりすることもできるし。どんな複雑なシステムでも、設計時に考慮すべき欠陥やエラーの条件があるよ。

今、Deeplearning.AIの「機械学習とデータサイエンスのための数学スペシャリゼーション」を進めてるところ。これが今まで見つけた中で一番の線形代数の入門だよ。クイズやラボだけでも月50ドルの価値がある。今は「深層学習の数学とアーキテクチャ」という本も同時に進めてて、コースのアイデアを強化して具体化するのに役立ってる。

「ソフトマックス」は、各値を指数関数にして合計が1になるように正規化することで見つかるみたいだね(リンクをクリックする前に結果を見て仮説を立てたけど)。これを明確に説明する価値があると思う。指数関数も「高校数学」だし、こういう説明の方がウィキペディアの記事よりずっと分かりやすいよね(ここではあまり厳密さが求められないし)。

MLは面白いけど、正直言って未来がどうなるか分からなくて、技術を学んで仕事を得るべきか、時代遅れにならないようにするべきか悩んでる。確かに盛り上がりはあるけど、市場の多くは実際には持続可能じゃないよね。

カーパシーの動画シリーズを「見る」だけじゃなくて、ちゃんと取り組むことで、LLMの仕組みを理解するのにすごく役立ったし、もっと高度な資料を読む自信もついたよ。正直、彼の動画から得た知識だけでも十分なんだ。CPUの仕組みを一般的に学んで、興味のない派手な最適化ステップは無視するみたいな感じかな。アンドレイ、動画にかけた時間と労力に感謝!