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

ゼロからLLMを作成する、パート22 – LLMのトレーニング

概要

  • Sebastian Raschka著「Build a Large Language Model (from Scratch)」第5章のまとめ
  • クロスエントロピー損失やパープレキシティの理解が難所
  • コード実装と動作確認でモデルが実際に動き始める興奮
  • ランダム性、オプティマイザ、学習コスト、サンプリング手法の実践的な知見
  • GPT-2の重み適用や「記憶化」防止技術の補足説明

「Build a Large Language Model (from Scratch)」第5章のまとめ

  • クロスエントロピー損失パープレキシティ の理解が最も難しかった部分
  • 残りのページ はコードを組み合わせて動作を確認する作業中心
  • これまでの140ページ超で積み上げたものが、ここで一気に形になる体験
  • サンプルデータセット「The Verdict」(Edith Wharton著)を使い、モデルが実際に テキスト生成 する様子を確認
  • GPT-2のオリジナル 124Mパラメータ版の重み をOpenAIからダウンロードし、自作モデルに適用
  • プロンプト に対するモデル出力の質が大幅向上
  • 残りの章は主にこれまで作った部品を組み合わせる作業

ランダム性とシーディング

  • コードを 自分で入力・実行 することを強く推奨
  • 乱数シード (torch.manual_seed)を使っても、コード実行順序の違いで結果が完全一致しない場合あり
  • 重要なのは 損失値が同程度 であり、出力が学習前は不明瞭→学習後は明瞭化する傾向が一致すること
  • 学習開始時 に損失が下がり、検証損失が早期に安定化することを確認

オプティマイザの役割

  • 伝統的な SGD (確率的勾配降下法)では自分でパラメータ更新
  • 現代的な機械学習では オプティマイザ (AdamW等)が自動でパラメータ調整
  • オプティマイザは 学習率を動的に調整 し、損失関数の局所最小値を回避する仕組み
  • AdamWは 初期化時に学習率やweight decay を指定し、パラメータ管理
  • optimizer.zero_grad() で勾配初期化、 loss.backward() で勾配計算、 optimizer.step() でパラメータ更新
  • 詳細な仕組みの理解は今後の課題

学習速度とコスト

  • 「The Verdict」データセットでの学習は MacBook Airで約5分、RTX 3090では 11秒未満
  • GPUとCPUの速度差 の大きさを実感
  • Llama 2の学習コストは 数十万ドル規模 とされるが、124Mパラメータモデルを個人環境で学習するコストに興味
  • Andrej Karpathyは llm.c で124M GPT-2モデルを約$20で学習
  • 学習速度(トークン/秒)を測定し、全データセット1エポック分の所要時間を見積もる計画
  • Lambda Labs等のGPUクラウド 利用で、コストが数十~百ドルなら挑戦価値あり

「記憶化」、温度、top-kサンプリング

  • 「記憶化」(memorisation)の定義の違いに混乱
    • 本来は訓練時の「暗記」、ここでは「オウム返し」(parroting)の意味で使用
  • ソフトマックス確率分布 からサンプリングする基本手法
  • 温度 (temperature)で分布の鋭さを調整
    • 温度>1で分布が平坦化、<1で鋭くなる
    • 書籍内グラフやWebツールで体感的に理解
  • top-kサンプリング は上位k個のトークンのみを確率分布対象にする手法
    • k未満のロジットをマイナス無限大に置き換え、ソフトマックスで確率0に
  • 「記憶化」防止というより、 多様性・創造性 を高めるための技術

OpenAIの重みダウンロードと適用

  • GPT-2の 重みダウンロードコード はGitHubから取得推奨
  • load_weights_into_gpt 関数もGitHubからコピペ推奨
  • GPT-2シリーズの 埋め込み次元 は124Mモデルのみ768、それ以上はさらに大きいと判明

まとめと今後

  • 第5章は記述量が少ないが、 LLMの基礎が動作する到達点
  • 今後はこの基盤を活かし、 テキスト分類など応用課題 に挑戦予定
  • nanochat等、新たなプロジェクトへの意欲

次回:テキスト分類への応用とさらなる探究

Hackerたちの意見

これがパート1だよ。[1] アーカイブは日付順だから、どのパートがどの月に作られたかを推測しやすいね。[1] https://www.gilesthomas.com/2024/12/llm-from-scratch-1

面白いね、1年以内に22パートもあるなんて、楽しそうな最新プロジェクトだね。カーパシーもnanogptの後にnanochatみたいなのやってたし。

いいね、これは人類を滅ぼす悪のAIを作るレシピだね。

これは本に基づいてるんだね。https://www.manning.com/books/build-a-large-language-model-f... いい本なのかな?

これの前にちょっとだけDLのこと(keras使って)やったことあるよ。今はアテンションの章を読んでる。コードは載ってるけど、直感を育てる部分が少ない気がする。幸い、オンラインにはそれを助ける動画がたくさんあるから助かるね。すごく良いガイドだと思う。拡張チュートリアルって感じかな(少なくとも今のところは)。目の前にコードがあるのも大きいよ。例えば、埋め込みベクトルはword2vecみたいに静的だと思ってたけど、実は学習可能なパラメータなんだね。目の前にコードがなかったら、確信は持てなかったかも。

ローカルのRTX 3090とクラウドのA100クラスターのコスト比較は役立つけど、著者が隠れたオーバーヘッド、例えば大規模データセットのデータ転送時間やローカルハードウェアのCUDA互換性のデバッグにかかる時間を考慮してるか気になるな。