ゼロから作るDeep Learning ❻

―LLM編

[cover photo]
TOPICS
Data Science , Python , AI/LLM
発行年月日
PRINT LENGTH
384
ISBN
978-4-8144-0161-1
FORMAT
Print
Print
4,400円

人気シリーズの第6弾。今回のテーマは「大規模言語モデル(LLM)」です。ChatGPTの魔法のような能力、その仕組みを自らの手で解き明かしてみませんか? 本書では、トークナイザからTransformer、事前学習から事後学習まで、LLMを支える技術をゼロから実装します。実装の舞台となるのは、CodeBot→StoryBot→WebBotという3段階のチャットボット開発。作るほどに、見えてくる——そんな読書体験が待っています。

関連ファイル

目次

まえがき
0章 LLMができるまで

第I部 基本編――CodeBotを作る
    I.1 開発の流れ
    I.2 事前学習
    I.3 SFT(教師ありファインチューニング)
    I.4 強化学習

1章 トークナイザ【基本編】
    1.1 文字単位のトークン化
        1.1.1 文字をIDに変換する
        1.1.2 文字単位トークナイザの実装
        1.1.3 文字単位トークナイザの課題
    1.2 バイト単位のトークン化
        1.2.1 UTF-8エンコード
        1.2.2 バイト単位トークナイザの実装
        1.2.3 バイト単位トークナイザの課題
    1.3 BPEの学習アルゴリズム
        1.3.1 BPEの処理手順
        1.3.2 BPEの実装
        1.3.3 BPEの動作確認
    1.4 BPEによるエンコードとデコード
        1.4.1 BPEトークナイザの実装
        1.4.2 エンコードの実装
        1.4.3 デコードの実装
        1.4.4 動作確認
    1.5 特殊トークンへの対応
        1.5.1 特殊トークンの役割
        1.5.2 特殊トークンに対応したBPEの学習
        1.5.3 train_bpe関数の実装
        1.5.4 特殊トークンに対応したトークナイザの実装
    1.6 事前トークン化
        1.6.1 事前トークン化の必要性
        1.6.2 GPT-2の事前トークン化パターン
        1.6.3 事前トークン化に対応したBPE学習の実装
        1.6.4 事前トークン化に対応したトークナイザの実装
    1.7 TinyCodesを用いた学習
        1.7.1 トークナイザの読み込み機能
        1.7.2 これまでのコードの整理
        1.7.3 TinyCodesデータセットを用いた学習
    1.8 トークナイザの評価
        1.8.1 学習済みトークンの確認
        1.8.2 圧縮効率の測定
        1.8.3 他トークナイザとの比較
    1.9 TinyCodesのエンコード

2章 モデル【基本編】
    2.1 Attentionの基本原理
        2.1.1 Pythonのディクショナリ
        2.1.2 ソフトなディクショナリ
        2.1.3 ソフトなディクショナリの実装例
    2.2 Attentionの数式と実装
        2.2.1 Attentionを数式で表す
        2.2.2 複数クエリへの対応
        2.2.3 Attentionの実装
    2.3 Attentionスケーリング
        2.3.1 ソフトマックス関数の飽和問題
        2.3.2 スケーリングの導入
        2.3.3 スケーリングの効果
    2.4 Transformerの基本構造
        2.4.1 Transformerの動作プロセス
        2.4.2 TransformerにおけるAttentionの役割
    2.5 位置エンコーディング
        2.5.1 位置情報が必要な理由
        2.5.2 位置エンコーディングの仕組み
        2.5.3 絶対位置エンコーディング
        2.5.4 学習可能な位置エンコーディング
    2.6 Attentionマスク
        2.6.1 効率的なデータ形式
        2.6.2 Attentionの問題点
        2.6.3 Attentionマスクの仕組み
        2.6.4 Attentionマスクの実装
    2.7 バリュー行列の効率化
        2.7.1 大規模モデルにおけるAttentionの課題
        2.7.2 行列分解による低ランク近似
        2.7.3 行列分解によるAttentionの新たな解釈
        2.7.4 実装例
    2.8 マルチヘッドAttention
        2.8.1 複数の視点で捉える
        2.8.2 マルチヘッドAttentionの数式
        2.8.3 2つの等価な数式
        2.8.4 マルチヘッドAttentionの実装
        2.8.5 マルチヘッドAttentionの実装(まとめ)
    2.9 Transformerブロック
        2.9.1 LayerNormの仕組み
        2.9.2 LayerNormの実装
        2.9.3 FFNの実装
        2.9.4 Transformerブロックの実装
    2.10 GPT-2
        2.10.1 GPT-2の実装
        2.10.2 モデルの改良
        2.10.3 モデルの保存と読み込み
        2.10.4 動作確認

3章 学習【基本編】
    3.1 事前学習
        3.1.1 データセットの確認
        3.1.2 デバイスの設定
        3.1.3 事前学習のコード(前半部分)
        3.1.4 事前学習のコード(後半部分)
        3.1.5 学習結果の確認
    3.2 テキスト生成
        3.2.1 テキスト生成の方法
        3.2.2 温度パラメータ
        3.2.3 Top-kとTop-pサンプリング
        3.2.4 テキスト生成の実装
        3.2.5 テキスト生成の実行
    3.3 SFT(教師ありファインチューニング)
        3.3.1 SFT用データセットの形式
        3.3.2 Alpaca形式でトークン化する
        3.3.3 マスク処理
        3.3.4 パディング
        3.3.5 SFTの実装
        3.3.6 学習結果の確認
    3.4 SFTモデルとの対話
        3.4.1 インタラクティブな対話
        3.4.2 モデルの計算能力
    3.5 強化学習と言語モデル
        3.5.1 強化学習と言語モデルの対応関係
        3.5.2 軌跡
        3.5.3 報酬と収益
        3.5.4 言語モデルにおける報酬と収益
    3.6 方策勾配法
        3.6.1 方策を直接改善する
        3.6.2 方策勾配の導出
        3.6.3 方策勾配の近似
    3.7 ベースライン
        3.7.1 ベースラインのアイデア
        3.7.2 ベースライン付き方策勾配法
        3.7.3 GRPO:グループ平均をベースラインにする
    3.8 オフポリシーとクリッピング
        3.8.1 オンポリシー学習とオフポリシー学習
        3.8.2 重要度サンプリングによる勾配の導出
        3.8.3 重要度重みの近似
        3.8.4 クリッピングによる安定化
    3.9 GRPO
        3.9.1 GRPOのアルゴリズム
        3.9.2 GRPOの実装
        3.9.3 実験結果

第II部 応用編――StoryBotを作る
    II.1 データセット
    II.2 開発の流れ

4章 トークナイザ【応用編】
    4.1 BPE学習の改善①:重複除去
        4.1.1 元の実装の問題点
        4.1.2 重複の除去
        4.1.3 改良版のBPE学習
        4.1.4 改良版の動作確認
    4.2 BPE学習の改善②:部分更新
        4.2.1 現在の問題点
        4.2.2 キャッシュによる部分更新
        4.2.3 改良版の実装
        4.2.4 動作確認
    4.3 BPE学習の改善③:分割処理
        4.3.1 大規模データでの問題
        4.3.2 メモリ消費の原因
        4.3.3 ファイルの部分読み取り
        4.3.4 改良版のtrain_bpe関数
        4.3.5 動作確認
    4.4 BPE学習の改善④:並列化
        4.4.1 Pythonでの並列処理
        4.4.2 事前トークン化の並列処理
        4.4.3 動作確認
    4.5 トークナイザの評価
        4.5.1 学習済みトークンの確認
        4.5.2 圧縮効率の測定
        4.5.3 CodeBotトークナイザとの比較
    4.6 BPEエンコードの改善①:高速マージ
        4.6.1 現状のエンコード実装
        4.6.2 効率的なエンコード処理
        4.6.3 改良版の実装
        4.6.4 動作確認
    4.7 BPEエンコードの改善②:大規模データ対応
        4.7.1 分割処理
        4.7.2 チャンク処理の実装
        4.7.3 np.memmapによる効率的な書き出し
        4.7.4 エンコードの実装
        4.7.5 動作確認

5章 モデル【応用編】
    5.1 RoPE
        5.1.1 RoPEのアイデア
        5.1.2 高次元ベクトルへの拡張
        5.1.3 RoPEの実装
        5.1.4 MultiHeadAttentionクラスへの組み込み
    5.2 SwiGLU 
        5.2.1 Swish関数
        5.2.2 GLUとSwiGLU
        5.2.3 SwiGLUを使ったFFN 
        5.2.4 SwiGLUの実装
    5.3 RMSNormとその他の改良
        5.3.1 RMSNorm 
        5.3.2 Dropoutの削除
        5.3.3 バイアスの削除
        5.3.4 重み共有の廃止
    5.4 改良版GPTの実装
        5.4.1 Blockクラスの実装
        5.4.2 GPTクラスの実装
        5.4.3 モデルの保存と読み込み
        5.4.4 動作確認
    5.5 KVキャッシュ
        5.5.1 テキスト生成における無駄
        5.5.2 AttentionとKVキャッシュ
        5.5.3 PrefillとDecode 
        5.5.4 KVキャッシュの実装
        5.5.5 テキスト生成での使用

6章 学習【応用編】
    6.1 AdamWの仕組み
        6.1.1 SGD(確率的勾配降下法)
        6.1.2 Momentum(モーメンタム)
        6.1.3 Adam(Adaptive moment estimation)
        6.1.4 AdamW
    6.2 AdamWの実装
        6.2.1 SGDの実装
        6.2.2 AdamWの実装
        6.2.3 動作確認
    6.3 学習率スケジュール
        6.3.1 なぜ学習率を変化させるのか
        6.3.2 ウォームアップとアニーリング
        6.3.3 D2Zの実装
    6.4 混合精度
        6.4.1 低精度の問題点
        6.4.2 浮動小数点数の表現方法
        6.4.3 混合精度の活用
    6.5 事前学習(改良版)
        6.5.1 メモリマップによるデータ読み込み
        6.5.2 勾配クリッピング
        6.5.3 検証データによる評価
        6.5.4 事前学習の実装
    6.6 テキスト生成とモデル評価
        6.6.1 テキスト生成
        6.6.2 モデルの評価
        6.6.3 LLM-as-a-Judge 
    6.7 RLHFとDPOの理論
        6.7.1 RLHFとDPOが解く問題
        6.7.2 Bradley-Terryモデルと選好データ
        6.7.3 RLHFのアプローチ
        6.7.4 DPOのアプローチ
    6.8 DPOの実装
        6.8.1 選好データとマスクの設計
        6.8.2 DPOの実装
        6.8.3 DPOモデルの評価

第III部 挑戦編――WebBotを作る
    III.1 データセット
    III.2 開発の流れ

7章 トークナイザ【挑戦編】
    7.1 WebBotのトークナイザ
    7.2 ボトルネックの検出
    7.3 Rust/C++による高速化
    7.4 特殊トークンの追加
    7.5 他のトークナイザ
    7.6 トークナイザを使わないアプローチ

8章 モデル【挑戦編】
    8.1 モデルサイズの選択
    8.2 Flash Attention 
    8.3 Grouped-Query Attention(GQA)
    8.4 Mixture of Experts(MoE)
    8.5 torch.compile
    8.6 コンテキスト長の拡張

9章 学習【挑戦編】
    9.1 勾配蓄積
    9.2 勾配チェックポイント
    9.3 分散学習
    9.4 ZeRO
    9.5 Muonオプティマイザ
    9.6 Weights & Biases 
    9.7 WebBotの学習と生成結果

付録A UTF-8エンコーディングの仕組み
付録B Attentionのスケーリング効果の証明
付録C ベースライン付き方策勾配の不偏性の証明
付録D Adamのバイアス補正
付録E DPOの最適解の導出

おわりに
参考文献
索引

コラム目次
    BPEのタイブレーク(引き分け処理)
    Attentionの行単位の計算
    Transformerと文章の確率計算
    GRPOとDr.GRPO
    事前トークン化のメモリ効率化
    GPU環境でBF16が使えない場合