ハクソク

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

Show HN: LLMの仕組み – カーパシーの講義に基づくインタラクティブなビジュアルガイド

概要

  • LLM(大規模言語モデル)の構築プロセスを段階ごとに解説
  • データ収集からトークナイズ、学習、アシスタント化までの流れ
  • データ品質や多様性の重要性を強調
  • Post-TrainingやRLHFによるモデルの高度化
  • LLMの心理的性質や限界についても触れる

LLM(大規模言語モデル)の仕組み

  • **LLM(Large Language Model)**は、インターネット上の膨大なテキストデータから学習し、会話型AIアシスタントとして機能するモデル
  • Andrej Karpathyによる技術解説を基に、LLMの構築・訓練・運用の全体像を解説

データ収集と前処理

  • Common Crawlなどの組織がウェブ全体をクロールし、生データを収集
  • URLフィルタリングでマルウェア・スパム・アダルトなどの低品質ドメインを除外
  • テキスト抽出によりHTMLから意味のあるテキストのみを抽出
  • 言語フィルタリングで、対象言語(例:英語)が65%以上含まれるページのみを残す
  • 重複排除(deduplication)により、同一・類似ページを除去し、記憶偏重を防止
  • 個人情報除去(PII removal)で、氏名・住所・メールなどを検出・削除
  • FineWeb Datasetなど、高品質・多様な44TB/15兆トークン規模のコーパスを作成

トークナイズ(Tokenization)

  • ニューラルネットワークは生テキストを直接処理できないため、トークン(サブワード単位)への分割とID割り当てが必要
  • **BPE(Byte Pair Encoding)**アルゴリズムで頻出ペアを逐次マージし、10万語規模のトークン語彙を形成
  • サブワード分割により、新語・誤字・多言語対応力を確保

ニューラルネットワークの訓練

  • Transformerアーキテクチャにランダム初期値パラメータを設定
  • 入力トークン列から「次のトークン」を予測し、誤差(loss)を計算
  • 誤差逆伝播でパラメータを微調整し、数十億回繰り返す
  • Embeddingで各トークンを意味空間上のベクトルに変換、文脈で多義語を適切に解釈
  • モデル規模例:GPT-2(1.6Bパラメータ)、Llama 3(405Bパラメータ)

推論とトークンサンプリング

  • 学習済みネットワークは自己回帰的にテキストを生成
  • 各ステップで次のトークン確率分布を計算し、確率的に選択・追加
  • Temperatureでランダム性を調整(低=決定的/高=創造的)

ベースモデルの性質

  • ベースモデルは高性能な補完エンジンであり、直接的なQ&Aやアシスタント機能は持たない
  • 記憶はパラメータ内に圧縮保存、知識の圧縮ファイル的存在
  • Few-Shot Promptingで翻訳・分類・Q&Aも可能だが、必ずしも正確性や一貫性は保証されない

Post-Trainingとアシスタント化

  • **Supervised Fine-Tuning(SFT)**で理想的な会話データを使い、アシスタントらしい応答を学習
  • **RLHF(Reinforcement Learning from Human Feedback)**で人間の好みを学習し、より自然で誠実な応答を強化
  • 会話はフラットなトークン列で記録、特殊トークンでユーザー/アシスタントを区別

LLMの心理的特徴・限界

  • 幻覚(Hallucination):自信満々に誤情報を生成する傾向
  • 二種類の記憶:パラメータ=長期記憶、コンテキストウィンドウ=作業記憶
  • ツール利用:特殊トークンで外部検索や計算などのツールを呼び出し、結果を作業記憶に取り込む
  • 恒常的な自己は存在しない:会話ごとに状態リセット、持続的なアイデンティティは持たない

まとめ

  • LLMは膨大な高品質データ高度な学習手法により構築
  • トークナイズや推論、ファインチューニングを経て実用的なアシスタントへ進化
  • 幻覚・記憶の限界を理解し、適切な運用・設計が重要
  • 最新モデルは人間の専門家の模倣として振る舞い、今後も進化が続く見通し

Hackerたちの意見

iOSのSafariでページがイライラするほどスクロールジャンプするんだけど。
そうそう、上のタイピングエフェクト(作成者の表示を展開するやつ)が問題みたいだね。
これのおかげで全然読めなかったし、Safariリーダーも使えなかったから、バックボタンを押すしかなかったよ。
iOSのSafariで「気を散らすアイテムを隠す」機能を使えば、そのボックスを削除できるよ。
LLMについての基本的な質問に答えてくれる説明がまだ見つからないんだ。例えば、ニュートラルネットワークの入力側はどんな感じなの?コンテキストサイズNを表すのに十分なビット数があるの?コンテキストサイズより短い入力はどう処理するの?埋め込み(embedding)はLLMの面白い概念の一つだと思うけど、ほとんどのページではサイドノート扱いだよね。埋め込みは、異なるコンテキストで全く違う意味を持つトークンをどう扱うの?例えば「bank」という単語が一つのトークンだった場合、川の岸(river bank)やお金の銀行(money bank)をどう考慮するの?ベクトルの要素は両方向を指すの?それに、埋め込みはトレーニングや推論プロセスとどう相互作用するの?推論時に埋め込みが更新されることはあるのか、それともトレーニング時に固定されるのか?(トレーニングと推論の違いについての説明はいつも曖昧でイライラする)
知ってる限りでは、入力は(基本的なレベルで)Lトークン(行)とd埋め込み長(列)のマトリックスだよ。入力トークンは最初に離散的なIDにコーディングされるけど、`torch.nn.Embedding`みたいなもので埋め込みに変換される。埋め込み層は「ルックアップテーブル」と考えられるけど、勾配降下法で学習された行列の掛け算なんだ(トレーニング時に調整され、推論時には固定値)。埋め込みの長さ(d)は固定だけど、Lはそうじゃない。埋め込み層とアテンションの行列の掛け算の公式をチェックすると、行数/トークン/Lの数に関係なく機能することがわかるよ(線形代数と行列の掛け算のルール)。コンテキストの制限は、補助的な要因、つまり位置エンコーディングや非常に長い入力に対して一貫した出力を生成するモデルの能力によって課せられる。埋め込みの「bank」の意味については、直接解釈できないけど、埋め込みに対して統計分析(PCAみたいな)を行うことはできるよ。「bank」の埋め込みがこの単語のすべての可能な意味を含んでいるとしたら、特定の意味は埋め込み層ではなく、後のアテンション操作によってこの特定のトークンをシーケンス内の他のトークンと関連付けることで推測されるんだ(例えば自己アテンション)。
LLMの入力は通常、トークンのシーケンス、つまり0から最大トークン数までの整数のリストだよ。シーケンスは可変長で、これはシーケンスモデリングの「初期」の問題の一つだったんだ:可変長の入力をニューラルネットワークでどう扱うか。これに関する文献はたくさんあるよ。これが様々な種類の静かな問題の原因になってるんだ: - 分布外データ(短いシーケンスと長いシーケンスではパフォーマンスが違うかも) - データコピーによる二次的な挙動 - 正規化の問題 - メモリの断片化 - 悪いアライメント これに対処する一つの方法は、可変長のシーケンスを固定サイズのシーケンスとして扱い、空の要素にはゼロを埋めて、操作中に無視すべき要素を指定する「マスク」を持つことだよ。 ---- 複数の意味を持つ埋め込みについては、最善を尽くすけど、あらゆる行動の組み合わせが起こりうる。埋め込み層は通常最初の層で、トークンの整数を浮動小数点数の埋め込み次元のベクトルに変換する。意味を分けるために最善を尽くして、次の層のニューラルネットワークのタスクを楽にしようとしてるんだ。処理できないものを次の層に押しやってる感じだね。実験として、2つのトークンを一つにまとめたり、特別な用途のためにトークンを解放するためにトークンにすることもできるよ。埋め込みは時には明確化された埋め込みの平均になることもあるし、時にはそれ自体のものになることもある。埋め込みに加えて、ニューラルネットワークの特定の深さで内部表現を見ることもできるよ。数層進むと、表現は通常コンテキストに基づいて明確化されてる。最後の層も特に興味深いのは、元のトークンスペースに戻すために使われる層だから。時には埋め込み層と重みを共有することを強制することもある。この投影層は通常コンテキストを使えないから、トークンスペースに非常にシンプルにマッピングするために必要な情報を全て持っていなきゃいけない。この最後の表現は、次のより専門的なトレーニングタスクに使える完全なシーケンス表現ベクトルとしてよく使われるよ。埋め込みの重みはトレーニング後に固定されるけど、コンテキスト内学習は推論中に起こる。プロンプトの初期トークンが新しいトークンをより簡単に明確化するのを助けるんだ。例えば、bank vs bank vs bankはbankトークンに対して同じ入力埋め込みを持つけど、一つか二つ層下に行くと、関連する表現は非常に異なり、適切な意味に近くなるんだ。
公開する前にClaude Codeが生成したものを再確認した?最初の段落の一つにこんなのがあるよ:> 約44テラバイトに達する — 大体一つのハードドライブに収まる量 44TBが普通のハードドライブのサイズだなんて、普通の人は思わないよね(そもそもそんなの存在するの?私の選んだ小売店では32TBが最大みたい)。LLMを使ってクールなビジュアライゼーションを作るのは間違ってないと思うけど、校正が足りないのは信頼感を欠くよね(特に44TBが目立つ色で表示されてるし)。
君のコメントを読んだときは同意したけど、実際にはほとんど動画から直接引用されてたね。https://youtu.be/7xTGNNLPyMI の2:20あたりから彼はこう言ってる:“[…] 実際には約44TBのディスクスペースになる。USBメモリは1TBくらい簡単に手に入るし、これなら今日の時点でほぼ一つのハードドライブに収まるかも。” だから、元の動画で言われたことからほんの少しだけ変えられてるだけなんだ。そしてLLMが書き直したバージョンでも「roughly」と言ってるけど、彼は「almost」と言ってたし、44TBは32TBに対してかなり「roughly」または「almost」だと思う。個人的には「今日の時点で2つのそこそこのサイズのハードドライブに収まる」と言うかな(例えば24TBのドライブ2つで)。それでも、元の動画で言われたことにかなり近いから、LLMがどこからも作り出したものではないよ。
現在、ハードドライブは市場の影響で不足してるから、32TBが地元の小売店で一番大きいのは驚くことじゃないよね。でも、1、2年前は40TB以上のSSDももうちょっと手に入った気がする。とはいえ、どんな「平均的」なサイズを考えるのもクレイジーだけど、特にその分野で働いてる人にとっては、全然驚くべきことじゃないよね。
そうだね、クラウドはバカだし、幻覚見てる。確かに存在するし、主要メーカーが作ってるもっと大きなドライブもあるよ。
もしかしたらカーパシーもLLMを使ったのかもね。44TBって数字は、シーゲイトがエンタープライズ向けに売ってる現在の最大容量のドライブとぴったり一致するんだ。40TBでも50TBでもなくて、44TB…偶然かな? - [1] SSDの記録は245TBみたいだね - [2] [1] - https://www.seagate.com/stories/articles/seagate-delivers-in... 「シーゲイトのMozaic™ 4+ハードドライブは、最大44TBの容量をサポートしており、現在、2つの主要なハイパースケールクラウドプロバイダーに大量出荷中です。」 [2] - https://fudzilla.com/kioxia-showcases-245-76tb-lc9-enterpris...
これ、完全にAI生成だよ…読む価値なし。
更新: 「シングルハードドライブ」の主張は間違ってたから、「約10個のコンシューマハードドライブ」に修正したよ(44TB ÷ ~4TB = ~11)。カーパシーへの帰属は今や直接リンクになった。統計の下に、これが2024年の代表的な数字であることを注記したよ — 正確な数字はリリースごとに変わるし、それがポイントでもある。あと、いくつかビジュアルデザインの改良もした(ヘッダーにv2としてリンクあり)。いくつかの人がドットナビが使いにくいって言ってたから、ちゃんとしたトップナビゲーションバーを追加した。すべての事実確認はしてないけど、読んでみた感じ、講義で説明されてることと合ってるみたい。
このページは「Noinceolik fiyulnabmed fyvaproldge」というフレーズを「Noinceolik fiyulnabm ed fyvaproldge」にトークン化するのがすごく下手だね。「ed」サフィックスだけを考慮してる。まるで「noinceolik」みたいな作り言葉が100Kトークンの語彙の一部みたいに扱われてる。実際にGPT-5トークナイザーを使ってみたら、私の作ったフレーズは14トークンになって、そのうちの2つだけが4文字で、スペースを含むトークンもあったよ。[1] https://gpt-tokenizer.dev/ それでも読み進めるけどね。
フィードバックありがとう!私もそれに気づいてたし、もしかしたら直す価値がないかもって思った。tiktokenizerへのリンクもあるしね。だから、削除して、tiktokenizerへの目立つリンクを追加することにしたよ。
BPEの可視化はちょっと誤解を招くと思うんだよね。古い(小さい)トークンが捨てられて、長いトークンに置き換えられるみたいに見えるけど、実際はそうじゃない。実際には、純粋に加算的なプロセスで、最も頻繁に出現するペアをセットに追加していくんだ。望ましいトークン数に達するまでね。でも、トークンを削除することはなくて、最初の256トークンも含めて、すべてを保持している。これによって、モデルはすべての可能なユニコードシーケンスを生成できるんだ。実際、すべての可能なバイトシーケンスも生成できると思うけど、無効なユニコードのバイトはサンプリング中にフィルタリングされるよ。編集 #1: それと、このページは注意メカニズムを完全にスキップしてるんだけど、これは私にとって最も興味深い部分であり、理解するのが一番難しい部分だと思う。完全に理解してるとは言えないけど、私にとってはただの線形代数の行列の掛け算の魔法みたいな感じ。
LLMが生成したから読まない方がいいっていうコメントには賛成できないな。トランスクリプトをダウンロードしたってことははっきり言ったのに。LLMは、情報がコンテキストウィンドウに直接読み込まれると、正確な情報を生成するのがすごく得意なんだよ。
人間が作った「The Illustrated GPT-2」を読むことを強くおすすめするよ。Jay Alammarの作品で、こちらのリンクね - https://jalammar.github.io/illustrated-gpt2/ 彼の似たような作品もあるし、「LLMがどう働くか」っていう無料のコースもやってるよ。
> WITHOUT RAG > 「Ares Baseというコロニーについての信頼できる情報は持っていません。私のトレーニングのカットオフ時点では、そのような火星のコロニーは設立されていませんでした…」 もしこれが「without rag」の教科書的な例なら、私たちは平行宇宙に住んでいたに違いないね。