LLM 仕組みを直感だけで掘り下げてみる記事です。LLM理論集中コース · 1編
このコースはテイラー本人がLLMを学習しながら詰まった箇所をまとめ、その詰まりを解く流れそのままで書いた記事です。難しい数学なしで直感で最後まで進みます。
Ollamaを調べていてふと気になりました。重みって何で、ベクトルって何で、その中の数字たちが一体どう動くのか。整理して上げます。
最初は重み/ベクトル/学習/推論の4つだけで全部理解できると思っていたんですが、進めていくと文脈埋め込み·Attention·Transformerまで一緒に行く必要があるんですね。なのでシリーズで解きます。とりあえず1編では重みとベクトル領域を最後までやります。
今回つかむこと:
1. 重みとは何か (スパムモデル → 犬種分類器 → LLM 80億個)
2. 自然言語をどう数字に変えるか (トークン化 → 埋め込み)
3. ベクトル·次元·文脈埋め込みの正体
4. 最終出力層は結局、語彙との比較
まずは最も小さなモデルから — スパムメール判別器
複雑なLLMの話の前に、シンプルなモデルから始めましょう。メールがスパムかどうか判断するモデルがあるとします。
このモデルが見るのは3つだけ。
- 「当選」という単語が何回出たか
- 「会議」という単語が何回出たか
- 感嘆符が何個あるか
各項目の重要度を直感的に決めるとこんな感じ。
- 「当選」 → 多く出ればスパム確率↑ (正の値、+2.0)
- 「会議」 → 多く出ればむしろ正常メール (負の値、-1.5)
- 感嘆符 → 少しスパムっぽい (正の小さい値、+0.3)
この +2.0、-1.5、+0.3 がまさに 重み です。英語ではweight。
ニューロンがやることは1行で終わります。
出力 = (x₁ × w₁) + (x₂ × w₂) + (x₃ × w₃)
各入力に重みを掛けて足す。本当にこれだけ。
例えばあるメールに「当選」3回、「会議」0回、感嘆符5個あるとすると。
出力 = (3 × 2.0) + (0 × -1.5) + (5 × 0.3)
= 6.0 + 0 + 1.5
= 7.5 → スパム確率高い!
LLMは結局これを途方もない規模でやるだけです。この記事ではまずこのシンプルな式を頭に焼き付けて進みます。
重みの符号と大きさ
ここで微妙に紛らわしい点があります。「+2.0は -1.5より重要じゃないの?」 と思いがち。
結論から言うと、両方とも同じくらい重要です。符号と大きさは別のものを意味します。
- 符号(+/-): 入力が結果にどの方向に影響するか
- 絶対値: どれくらい強く影響するか
なので+5.0でも-5.0でも同じくらい重要です。方向が逆なだけ。本当に重要じゃない入力は重みが0に近い入力です。0に近ければ掛けても結果への影響がほぼないので。
整理すると:
- 重み +5.0 = 「結果を上に強く押し上げる」
- 重み -5.0 = 「結果を下に強く引き下げる」
- 重み 0.0 = 「この入力は無視してよい」
- 重み 0.1 = 「ほぼ影響なし」
では入力は? 単語をどう数字にするか
スパムモデルは入力がシンプルでした。「当選回数、会議回数、感嘆符の数」のように数字で数えられるものだったので。
でもLLMはユーザーが「今日の天気はどう?」のような自然言語をそのまま入れます。これをどう数字に変えればモデルが処理できるのでしょうか?
ここで2段階が必要。
- 1段階: トークン化 (Tokenization) — 文を小さな塊に分ける
- 2段階: 埋め込み (Embedding) — 各塊を数字ベクトルに変換
この2段階はよく混同されます。一緒に解いていきます。
トークンって何?
トークンはモデルが処理できる最小単位に分けた塊です。日本語LLMが「私はりんごを食べた」を受け取るとざっくりこう分けます。
"私" "は" "りんご" "を" "食べ" "た"
(実際の分け方はモデルごとに違います。あるモデルは「りんごを」を丸ごと1トークンに、別のモデルはもっと細かく分けます)
ここで トークンはまだ数字じゃありません。 ただのテキスト断片です。モデルが実際に処理するにはトークンを数字に変えないといけません。
方法は2段階。
まずトークンIDに変換。 モデルは語彙(vocabulary)というのを持っています。辞書のように全トークンに番号が振られています。
"私" → ID: 1024
"は" → ID: 47
"りんご" → ID: 8932
"を" → ID: 89
次にIDから埋め込みベクトルを取得。 語彙の各IDごとに埋め込みベクトルが事前に保存されています。
ID 1024 → [0.12, -0.45, 0.78, ...] ← これが「私」の埋め込み
ID 8932 → [0.34, -0.51, 0.82, ...] ← これが「りんご」の埋め込み
整理:
– トークン = テキスト断片 (「りんご」)
– トークンID = その断片の番号 (8932)
– 埋め込みベクトル = そのトークンの意味を含んだ数字の塊 ([0.34, -0.51, …])
トークンは文字、ベクトルはそのトークンの意味を含んだ表現。同じものではありません。
ベクトル、別物じゃない
ベクトルという言葉が漠然と難しく聞こえるけど、実体は本当に別物じゃない。
ベクトル = 数字が決まった順に並んだ塊
これだけ。
- 2次元ベクトル:
[3, 5]→ 数字2個 - 3次元ベクトル:
[3, 5, -2]→ 数字3個 - 100次元ベクトル: 数字100個
「次元」という言葉がSF映画の平行宇宙みたいに神秘的に感じますが、数学的には ベクトルの中に入っている数字の個数 です。それだけ。
なぜわざわざ束ねるか。単語1つの意味を表現するには数字1つでは足りないから。一回思考実験してみましょう。もし「りんご」の意味を 数字1つ で表現するならどうしますか? 0.5? 0.8? どんな数字を選んでもりんごの色、形、味が全部消えます。数字1つでは意味があまりに貧弱なんです。
なので複数の側面を束ねて表現します。
りんご = [赤:0.8, 丸い:0.9, 甘味:0.7, 果物:1.0]
このように4つの側面で表現すると4次元ベクトルになります。これがその単語の 「意味座標」 です。
不思議なのは意味が似ている単語たちはベクトル空間で近くに位置することです。
子犬 → [0.8, 0.2, 0.5]
犬 → [0.79, 0.21, 0.51] ← 子犬とほぼ同じ位置
車 → [0.1, 0.9, 0.3] ← 遠く離れる
では次元数は一体いくつにする?
ここで自然に湧く疑問。りんごを4次元で表現したけど、なぜ4個? 5個ではダメ? 全ての単語が同じく4次元じゃないとダメ?
順に答えます。
Q1. 次元数は誰が決める?
モデル設計者が決めます。決まった正解はありません。モデル設計時に決める ハイパーパラメータ の1つです。
実際のモデルが使う次元数を見るとこう。
- BERT base: 768次元
- BERT large: 1024次元
- GPT-3: 12288次元
- llama3: 4096次元
モデルごとに違います。 768次元はただBERTがこの値であるだけ。神聖な数字じゃない。
Q2. 次元が多いほど良い?
おおむねそう。次元が多いほど単語の意味を豊かに表現できる。4次元ではりんごを4側面でしか見れないけど、4096次元なら4096側面で見られる。
ただし トレードオフ があります。次元が大きくなるほど:
- 表現力は豊かになるけど
- 計算量が爆発的に増え
- メモリも食って
- 学習も難しくなる
なので小さいモデルは768次元程度、大きいモデルは12288次元というふうにモデルサイズに合わせて決めます。
Q3. 全ての単語が同じ次元じゃないといけない?
はい。1つのモデルの中では 全てのトークンの埋め込みが同じ次元 です。BERTを使うならりんごも768次元、車も768次元、人も768次元。そうしないと行列乗算のような計算が一貫して回らないので。
衝撃的な事実 — 各次元が何を意味するのか人間も知らない
ここまで私はりんごを [赤、丸い、甘味、果物] で表現していました。実はこれは 理解を助けるための説明用の嘘 です。すみません。
本物のLLMの埋め込みベクトルはこうなります。
りんご = [0.34, -0.51, 0.82, 0.11, -0.27, 0.65, ...] (4096個)
各数字が 何を意味するのか人間にはわかりません。 「1番目の次元が赤の度合い、2番目が丸さの度合い」のように綺麗に分かれません。学習が終わったらモデルが勝手に決めた抽象的な側面で、人間が解釈できる表現じゃない。
ところが不思議なことに モデルはその数字パターンで意味を正確に区別します。 「子犬」と「犬」の4096次元ベクトルはほぼ同じで、「車」のベクトルは遠く離れている。人間は各次元が何を意味するのか知らないけど、全体パターンが意味を含んでいるんです。
これが深層学習の最も興味深い点の1つ。人間が設計したのではなく、学習過程でモデルが自分で作り出した「意味の表現方式」 なんです。(なぜそうなるかは2編 学習編で詳しく解きます)
よくある疑問 — このあたりから紛らわしくなる
ここまで読むと自然に湧く疑問。私も学習中に同じところで詰まりました。
Q. 「幸福」のような抽象名詞も赤、甘味の次元がある?
あります。そして0に近いです。
[赤、丸い、甘味、果物] という次元があると仮定すると:
りんご = [赤:0.8, 丸い:0.9, 甘味:0.7, 果物:1.0, 抽象性:0.0, ...]
幸福 = [赤:0.0, 丸い:0.0, 甘味:0.0, 果物:0.0, 抽象性:0.95, ...]
民主主義 = [赤:0.0, 丸い:0.0, 甘味:0.0, 果物:0.0, 抽象性:0.97, ...]
幸福は赤、丸い、甘味の次元でほぼ0。その側面は幸福を説明するのに意味がないので。代わりに幸福の意味のある他の次元 — 抽象性、感情、理想 — で大きな値を取る。
(再度言いますが、本物の埋め込みでは「1番次元が赤」のように綺麗に分かれません。理解を助けるための説明です)
Q. 「勤勉なりんご」と書くとりんごベクトルの勤勉値が上がる?
これは本当にいい質問。答えが面白い。
埋め込みベクトル自体は変わりません。 「りんご」というトークンの埋め込みは学習が終わったら固定です。ユーザーが「勤勉なりんご」と書いても「許しのりんご」と書いても、「りんご」トークン自体の埋め込み値は同じ。
でもLLMの中では 単語同士が互いに影響し合います。 「勤勉なりんご」が入力として来ると、「りんご」の意味がモデル内部の処理過程で隣の「勤勉」の影響を受けて その文脈でのりんご として表現される。
これを 文脈埋め込み(contextual embedding) と言います。
- 固定埋め込み: 「りんご」というトークン自体の意味座標。変わらない。
- 文脈埋め込み: 文の中で処理されるとき周囲の単語の影響を受けた結果。毎回違う。
「勤勉なりんご」のりんごは勤勉な側面が強調されたりんごとして、「許しのりんご」のりんごは否定的な側面が強調されたりんごとして処理される。同じ単語が文脈によって違って表現されるんです。
これを可能にするメカニズムが Attention 。単語同士が互いに「注意を向ける」構造で、別の編(4編)で深く扱います。1編では「単語自体の埋め込みは固定だが、文の中で処理されるとき文脈が反映される」程度に押さえれば十分。
Q. 助詞にもベクトルがある? 「は、が、を、に」みたいな。
あります。 「は」「が」「を」「に」のような助詞も全部自分の埋め込みベクトルを持ちます。
ただ意味がちょっと違う。「りんご」の埋め込みはりんごの属性を含むけど、「は」の埋め込みは 文法的役割 を含む。「このトークンの後には動詞が来る」のような情報がそのベクトルに圧縮されているんです。
不思議なことに、助詞同士は意味空間で互いに近くに位置します。「を/に」は似た文法役割なので似た位置に、「が/は」も似た位置に。モデルが学習過程で自然にそう配置したんです。
Q. ではトークン化するときモデルは助詞と単語をどう区別する?
区別しません。
モデルから見たら両方ともただのトークンです。「りんご」だろうが「は」だろうが同じく1つのトークンで、同じ方法で埋め込みベクトルに変換される。モデルは「は」が助詞か名詞か気にしません。トークンIDから埋め込みを取ってくるだけ。
でも 学習過程で自然に「は」の埋め込みに助詞らしい役割が含まれるようになる。データで「は」の後には動詞が来るパターンが繰り返されるので、モデルがそれを学習して「は」の埋め込みにそんな情報を圧縮していくんです。
これ衝撃的じゃないですか? モデルは文法を見たことがない。助詞と名詞の違いを誰かに教えてもらったこともない。ただテキストを数百億回見ながらパターンを学習した結果、自然に「助詞らしい埋め込み」と「名詞らしい埋め込み」が分離して現れる。人間が文法を教えたんじゃなく、データからモデルが自分で発見したんです。
紛らわしいポイント — ベクトルの中の数字が重みなの?
私もここで詰まりました。りんごベクトルに 0.34、-0.51 のような数字があるけど、これらが重みなの? と。
答えは違います。
重みはベクトルの中にあるんじゃなく モデル内部に別途存在 します。スパムモデルでもう一度見ると明確。
入力ベクトル: [当選回数: 3, 会議回数: 0, 感嘆符の数: 5]
重み: [+2.0, -1.5, +0.3]
出力 = (3 × 2.0) + (0 × -1.5) + (5 × 0.3)
入力ベクトルと重みが 別個に存在 してるの見えますね。両方とも数字の塊だけど役割が完全に違う。
- 入力ベクトルの数字: 今モデルに入るデータ。毎回違う。
- 重みの数字: モデルが学習で得た知識。一度学習したら固定。
料理の比喩がよく合います。料理の比率(重み) と 材料の量(入力) が別ですよね。両方とも数字で表現されるけど役割が完全に違う。料理の比率はシェフが決めたもので変わらない。材料の量は注文ごとに違う。
LLMでも同じ。りんご埋め込み [0.34, -0.51, …] は入力で、モデル内部の重みは別途存在する。重みは80億個で、りんご埋め込みはその中の 最終出力層で再登場 します (下で扱います)。
出力が複数あったら? — 犬種分類器
少しスケールアップ。出力が1個でないモデルへ。犬の写真を見てどの犬種か当てるモデルを考えてみます。
入力 3個:
– x₁ = 赤いピクセルの平均
– x₂ = 毛の長さ測定値
– x₃ = 耳の大きさ
出力 5個: 各犬種の確率
– y₁ = プードルの確率
– y₂ = 柴犬の確率
– y₃ = 秋田犬の確率
– y₄ = ゴールデンレトリバーの確率
– y₅ = ビーグルの確率
このとき重みは何個でしょうか?
y₁ (プードル確率) を作るには:
y₁ = (x₁ × w₁₁) + (x₂ × w₁₂) + (x₃ × w₁₃)
プードル点数を作るのに重み3個必要。
y₂ (柴犬確率) を作るには:
y₂ = (x₁ × w₂₁) + (x₂ × w₂₂) + (x₃ × w₂₃)
柴犬も重み3個。でもこの重みはプードルの重みと 違う。
y₃, y₄, y₅も同様にそれぞれ重み3個ずつ。
この重みは 3 × 5 = 15個 。表で見ると明確。
x₁(赤) x₂(毛長さ) x₃(耳の大きさ)
y₁ (プードル): w₁₁ w₁₂ w₁₃
y₂ (柴犬): w₂₁ w₂₂ w₂₃
y₃ (秋田): w₃₁ w₃₂ w₃₃
y₄ (ゴールデン): w₄₁ w₄₂ w₄₃
y₅ (ビーグル): w₅₁ w₅₂ w₅₃
15マス = 重み15個。
ポイント: すべての入力がすべての出力に影響する。重みは 入力数 × 出力数 だけ必要。
ではLLMの1層へ
LLMの1層(layer)の中で起こることを見るとこう。
- 入力: 4096次元ベクトル (数字4096個)
- 出力: 4096次元ベクトル (数字4096個)
すべての入力がすべての出力に影響するので、重みは 4096 × 4096 = 約1677万個。
ここで「入力4096個」と「出力4096個」が何を意味するかは、上の埋め込み領域で全部解きました。4096次元 = トークン埋め込み次元で、各次元が意味する正確な内容は人間が分かりません。「ある抽象的な4096の側面があり、これを別の4096の側面に変換するのが1層の役割」程度に理解すれば十分。
層(layer)が複数あるって?
LLMは1層では終わりません。何十もの層 があります。
↓ 重みの束 1 (1677万個)
1層出力 (4096次元) → 2層の入力
↓ 重みの束 2 (1677万個)
2層出力 (4096次元) → 3層の入力
↓ …
↓ 重みの束 32
32層出力 (4096次元)
↓ 最終出力層変換
次トークン確率分布 (12万8千次元)
llama3-8b は32層あります。各層で4096 → 4096変換が起こるので重みが1677万個ずつ必要、32層で約5億個。最終出力層の重みまで足すと約5.2億個。付属構造の重みまで全部足すと 80億個 に達します。
ちょっと待って、ここで疑問 — 「重みは学習で決まったあと固定される」と言ったのに、「層ごとに新しい重みの束」って矛盾じゃない?
私もここで詰まりました。答えは矛盾していません。
- 「重みが決まっている」 = 学習が終われば全ての重みが固定されるという意味
- 「層ごとに新しい重みの束」 = モデルの中に重みが1つの束ではなく 複数の束 があるという意味。すべての束が決まっています。
レシピ本の比喩で説明します。レシピ本を1冊ダウンロードしたとしましょう。レシピ本の中には:
- 1章: 基本ソースのレシピ
- 2章: メインディッシュのレシピ
- 3章: デザートのレシピ
- … 32章: 仕上げのレシピ
この32章のすべてのレシピがすでに 印刷されて固定されています。本自体は変わらない。でも料理する時に32章を順に通ります。1章の結果でソースを作り、そのソースで2章のメインディッシュを作り…
LLMも同じです。32の層それぞれの重みの束が入っており、この32の束すべてが学習で決まったあと固定 されています。入力が来ると1層の重みで変換 → 2層の重みで変換 → … → 32層の重みで変換。この変換自体は毎回起こりますが、使われる重みは絶対に変わらない。
最終出力層 — 語彙との出会い
32層を通ると4096次元のベクトルが出ます。その後、最後の変換がもう1回あります。
この最後の変換は4096次元を 語彙のサイズ分 に拡大します。llama3 は語彙が12万8千個なので 4096 → 128,000 に変換。
ここで最後の変換の正体が興味深い。
最終出力層の重み = 語彙の全トークン埋め込みの集まり
本当にそうです。最後の変換で起こることを解くと:
32層出力ベクトル: [0.5, 0.3, 0.8, ...] (4096次元)
↓
語彙の全トークン埋め込みと各々掛けて足す
↓
「りんご」 埋め込み [0.4, 0.3, 0.7, ...] と掛けて足す → 点数
「バナナ」 埋め込み [0.45, 0.32, ...] と掛けて足す → 点数
「車」 埋め込み [0.05, 0.92, ...] と掛けて足す → 点数
...
↓
12万8千個の点数 → 確率に変換
この「掛けて足す」が私たちが見慣れた (入力 × 重み)の合計 その公式です。スパムモデルで見たあの1行。
点数 = (出力₁ × 埋め込み₁) + (出力₂ × 埋め込み₂) + ...
スパムモデルで見たのと同じことが起こり、重みの位置に語彙のトークン埋め込みが入る んです。
直感的に言えば、32層出力ベクトルの方向がどのトークンの埋め込みベクトルの方向と似ているほど、そのトークンの確率が高くなる。 「32層出力ベクトルが指す方向に近くにあるトークン」が最も確率高く選ばれる。
なのでLLMの最終段階は 「自分が作った4096次元ベクトルに最も近いトークンは何か?」 を語彙全体12万8千個のトークンと比較する過程です。
最初聞くと「え? 埋め込みが重みとして再利用される?」と思うけど、よく見ると自然。モデルが答えを出す = モデルがあるトークンの埋め込み方向に近いベクトルを作ること です。
最も確率の高いトークンを選んで出力。次にまた最初から繰り返し。これが次の単語予測。
「いい」 → 23%
「多い」 → 18%
「曇る」 → 12%
「どう」 → 9%
...
「バナナ」 → 0.0001%
LLMには重みが何個ある?
ではLLMの実規模で整理します。
犬種分類器 · 重み 15個 (入力 3 × 出力 5)
LLM 1層 · 重み 1677万個 (入力 4096 × 出力 4096)
LLM 32層合計 · 約 5億個
+ 最後の出力層 · 約 5.2億個
+ 付属構造まで · 80億個
これが llama3-8b の 8b (8 billion) です。
- llama3-8b: 重み 80億個
- llama3-70b: 重み 700億個
- GPT-4: 推定1兆個以上
- DeepSeek-V4-Pro: 1.6兆個
スパムモデルがとてつもなく膨らんだのが LLM。構造の本質は同じで、規模だけ途方もなく大きくなっただけ。
会員登録して次の記事を受け取る
今週のAI動向
今回のポイント整理
LLM = 重み80億個 + 語彙12万8千個の埋め込み。 これで1編が閉じます。
具体的に:
- 重みは入力に掛けられる数。 符号は方向、絶対値は強度。このルール一つが80億回繰り返されればLLM。
- 自然言語 → 数字変換はトークン化 → 埋め込みの2段階。 トークンはテキスト断片、埋め込みはその断片の意味を含んだ4096次元ベクトル。
- 各次元が何を意味するのか人間は分からない。 学習過程でモデルが自分で作った抽象表現。全体パターンが意味を含む。
- 固定埋め込み vs 文脈埋め込み。 トークン自体の埋め込みは固定だが、文の中で処理されるとき周囲の単語の影響を受けて文脈が反映される (Attention)。
- 最終出力層の正体 = 語彙の全トークン埋め込みとの距離比較。32層出力ベクトルに最も近いトークンが次の単語として選ばれる。
LLMは結局重み80億個の巨大な行列変換 + 語彙との距離比較。本質はシンプルな掛け算·足し算の途方もない繰り返し。
次の記事
2編: 学習 (Training)
重み80億個を誰が決めたかの答え。登山者の比喩から始まり、結局「AI学習 = 都市1つ分の電力を食う資本主義」まで到達します。1編でLLMの静的な本体を見たなら、2編はその本体がどう作られたかを扱います。
その後は推論(3編) → Attention(4編) → Transformer(5編) → 量子化·RAG·Fine-tuning(6編) の順に続きます。
よくある質問
Q. 重みとパラメータは同義語?
ほぼ同義語。日常的には同じように使ってOK。厳密にはパラメータ = 重み + バイアス(bias)。重みが99%以上、バイアスは少数なので、日常会話では同じものとして見て問題ない。
Q. モデル名の「b」って何?
billion(10億)のb。LLaMA-8b = 80億パラメータ、LLaMA-70b = 700億パラメータ、DeepSeek-V4-Pro 1.6T = 1.6兆パラメータ。
Q. トークンと単語は同じ?
違います。トークンは単語より小さくも大きくもなり得る。「りんごを」が1トークンの場合も、「りんご」+「を」の2トークンの場合もある。英語ではより頻繁に単語の一部だけがトークンになる (例: “tokenization” → “token”+”ization”)。
Q. 埋め込みとベクトルは同じ言葉?
ほぼ同じ。正確には埋め込みがベクトルの一種。ベクトル = 数字の塊そのもの。埋め込み = ある意味を含んだベクトル。
Q. 次元が4096なら、りんごを4096の側面で見るという意味?
大体そうだけど比喩的な表現。本物のLLM埋め込みでは1番次元が明確にある側面を意味しません。4096の抽象的な軸があり、その軸が合わさって意味を含むと見るのが正確。
Q. 語彙のサイズはどう決める?
モデル設計者が決める。小さすぎるとレアな単語を細かく分けないといけなくて非効率、大きすぎると最終出力層の重みが多すぎる。llama3は12万8千個、GPT-4推定10万個台、BERTは約3万個。
ソースリスト / Sources
- Andrej Karpathy, “Let’s build GPT: from scratch, in code, spelled out” — YouTube
- Andrej Karpathy, “Let’s build the GPT Tokenizer” — YouTube
- 3Blue1Brown, “But what is a neural network?” — YouTube
- Meta AI, “Introducing Llama 3” 公式発表 — ブログ
著者: VibeCoding Tailor (テイラー)
shuntailor.net 運営。高麗大学 新素材工学専攻。AIツール·バイブコーディングを実務目線で解説。Lovable 公式アンバサダー。累計受講生300名+のAI講義経験。日本語·韓国語バイリンガル。




