【技術本】ゼロから作るDeepLearning❻―LLM編
https://amzn.to/4ojX69b
【技術本】ゼロから作るDeepLearning❻―LLM編
へポスト
本書はシリーズ6冊目であるが、本作から読み始めても全く問題ない。本作はあのオープンAIのChatGPTの元ともなったGPTのバージョン2の段階(GPT-2)をベースに、Pythonで以下のBotを作成する。
・CodeBot:プロンプト(英文)で指定したpythonコードを生成するBot
・StoryBot:子供向けの物語を生成するBot(英文で処理)
・WebBot:ネット上の大規模なデータを活用したBot(WebBotの章は詳細な実装解説まではなく、足がかり的な解説とポイント的な実装に押さえてある)
なぜ実装演習対象がGPT-2で、3や4、5でないのか。
著書にも書かれていますが、もはやAI開発は膨大な計算リソースとエネルギー消費が必要で、最先端LLMの開発に参入できるのは、大規模な資本力を持つ少数の組織のみの領域となっている。
GPT-2まではローカルPCで完結して動作できるが、GPT-3以降は、極端に大規模となり学習する場合GPUクラスタを組んだ構成にする必要が出てくる。単体のGPU(RTX8000相当)では事前学習に数百年単位で時間がかかるレベルの話になる。(GPT-2:15億パラメータ、GPT-3:1750億パラメータ、GPT-4:1.8兆パラメータ)
それゆえ個人でAI開発の仕組みを学習する規模としてはGPT-2が最適。オープンソース化もされていて理解しやすい教材となっている。
本書でも、性能が高いAIを作り上げるのでなく、小規模でもゼロから作り上げ、学習させて能力が上がっているのを体感し、育てていくのを楽しく味わうのが重要な経験でありLLM技術の本当の理解につながると述べている。
本作シリーズ6は、ゼロから作るシリーズ4、5よりも高度な数式は極力抑えられており、絵図や日本語だけでTransformerアーキテクチャのイメージがされやすいように配慮されている。色々AI関連の本を読みましたが一番噛み砕いて解説してくれていると思います。絵図、文章解説、数式が良いバランスで、必要な箇所はきっちり数式で証明されているので仕組みの理屈はスッキリ腑に落ちるようにしてくれている。それを踏まえてPythonで実装して演習体験ができる。
まるでシリーズ1、2のようなわかりやすさで、シリーズ3のような実装を段階を踏んで改善して作り上げる開発の追体験もできるといった集大成的な著書にもなっている気がします。もし、シリーズ途中で積んでしまってる人がいたら、本シリーズから再開してみる価値はあるかもしれません。
実装方法は、まずは仕組みや理屈、手順がわかりやすい方法で実装してから、後から改善理由を踏まえて性能改善していくので、段階を踏まえて高度な実装を行う追体験ができる。
他の先行した書籍でもGPT-2相当を実装して検証するものがあったが、本書はより最新の技術でGPT-2をカスタマイズできる改善案も示してくれている。その新しい改善技術を知って仕組みを理解するだけでも本書の価値があると感じた。
最終的には、ChatGPT-2.X(バージョン2より現代的な改善を含めた実装のため2.X)を個人実装して学習して性能を検証できるまで導いてくれる。ユーザに資金があればGPUクラスタをクラウドで組んでChat-GPT-3相当、もしくはそれ以上のものを展開できる足がかりまで用意し橋渡しをしてくれている。
何より価値があるのは本書を読むことで、ゼロベースから学習データを用意して、自分の方策にあったアライメントでLLMを学習できるようになる事である。
本書のgitから入手できるソースコードは、2026年現在のGoogle Colabで問題なく動作する。ただしColabで動かすにはJupyter-Notebook対応化や、任意で出力データをGoogle Driveに保存するなどの修正は必要。(もちろん他のGPUを活用できるクラウドサービスで動かしても問題ない。)
CodeBotまでは無料枠内で全ての学習ができるが、StoryBot以降は課金か、無料枠では時間枠足りずが枠が復活するまで待ちが必要の規模。自分は、学習を無料枠時間ごとに分割して、モデルの途中保存と途中読み込み、分割全体で学習率のウォームアップとアニーリングを引数で引き継げるよう実装を変えるなどして無料枠内に押さえてみた。
ColabのデフォルトのGPUは本書に記載されているRTX4090の処理時間の大体6〜8倍の時間がかかるイメージで作業時間、学習時間を見積もると良さそうな感じです。
今後の本書のシリーズはどう続くのでしょうか。
個人的には、Googleと共同開発になったAppleのSiri AIのようにデバイス上とクラウドの双方で動くハイブリッド(高度な推論、リッチな画像生成、端末パワーで足りない重いタスクはクラウド)のAI技術が個人で開発できる実装余地を残していて面白そうです。クラウドでのAIは規模的にもはや個人開発は厳しいですが、動画生成AI、LLMの進化系のマルチモーダルAIの実装とかに興味があります。
きっと次作もあるとしたら、ワクワクして驚くテーマを引っ提げてシリーズは続いていくのではと思いました。
本書では英語で学習してますが日本語モデルで学習したい、または、異なる尺度でもLLMを学んでみたい人は以下に参考書籍がありますので試してみてはいかがでしょうか。
**参考書籍
・日本語向けトークナイザ、日本語モデルのGPT2学習済みデータ、日本語Wikiのデータセット。
大規模言語モデル入門
・本書同様にGPT-2を実装して検証する書籍。規模感など大規模LLM開発と比較しながら解説しているので本書と異なった切り口でLLMを学べる。
作りながら学ぶ!LLM自作入門
ーーーーーーーーーーーーーーーーーー
⚫︎LLMアーキテクチャ処理イメージのまとめメモ:本書を読めば絵図数式を踏まえてPython実装まで理解できるようになります。
[トークナイザ]
文章を、LLM が扱えるトークン列(整数 ID 列)へ変換する仕組みである。変換する理由はLLM内で数値計算できるようにするためである。
世界中のあらゆる文字を統一的に扱うためUTF-8を使用する。トークナイザの学習時に文字列をUTF-8バイト列へ変換する。これにより語彙を256種類のバイトから開始でき、未知文字を発生させずに扱える(語彙数は、学習により増えていき、後述のBPEで調整される。LLMの事前学習時には、トークナイザは語彙の学習済みであり、トークナイザの処理としては学習して登録ずみのトークンIDを直接参照して文章をトークンID列に変換する。)。つまり世界中のどんな文字も1バイト〜4バイトの文字コードに置き換えられる。しかし、アルファベットは1バイトで済む一方、ひらがな・漢字などは1文字が3〜4バイトになるなど可変長になり、結果としてトークン数(文章をトークナイザで分割して得られたトークン数)が多くなりやすいという問題がある。これを緩和するのがBPE(Byte Pair Encoding)の学習アルゴリズムである。(問題が「解決」でなく「緩和」の理由:日本語が3バイトになったり、英語よりトークン数が増える問題は完全には消えない)
仕組み:
• コーパス内で最も頻出する隣接する2つのトークン(最初はバイト)のペアを1つの新しいトークンにマージする。
• このマージを繰り返し適用し、目標の語彙サイズ(例:50,000〜128,000程度)になるまで続ける。
• これにより、よく出現する単語やフレーズは効率的に短いトークンとして表現される。
その他の工夫:
• 特殊トークンの追加:<|endoftext|> など、文章の終わりや特別な制御をモデルに伝えるためのトークン。
• 事前トークン化(Pre-tokenization):句読点(「?」「!」「.」「,」など)や空白を先に分離する。これにより単語と記号がくっついたまま重複して学習されるのを防ぎ、より効率的なトークナイザを実現する。
入出力:
入力 = 文章(文字列)
出力 = トークンIDの列(長さ = 文章をトークナイザで分割して得られた「トークン数」)
注意:ChatGPTでは頻出する文字列で”New York(複数の単語が含まれる)”が一つのトークンになることがある。
[Embedの処理]
入力値には文章がトークナイザでトークンID列になったもの(列の大きさは、トークン数)が入る。Embedでトークン ID列は、トークンIDに対応した埋め込みベクトルの列に変換される。この埋め込みベクトルは、学習可能な重み行列であるルックアップテーブルから生成している。その埋め込みベクトル列は次で位置エンコーディングされる。
[位置エンコーディング]
位置エンコーディングは、埋め込みベクトル列に、埋め込みベクトルに、対応する学習可能な位置ベクトルを加算する。位置エンコーディングをする理由としてSelf-Attentionでは位置情報を持っていないため。埋め込みベクトルの数だけ、それぞれ対応する位置ベクトルを加算するので、位置情報を含んだ埋め込みベクトル列となる。この値はAttentionに渡される。
[Attentionの処理]
入力された埋め込みベクトル列の値から、クエリ、キー、バリューが生成(トークン数だけそれぞれ生成)される。
・クエリのデータ形状:(c,d)
・キーのデータ形状:(c,d)
・バリューのデータ形状:(c,e)
c=トークン数
e=埋め込みベクトルの長さ
d=次元数
Query = 探したい特徴
Key = 自分が持っている特徴
Value = 実際に渡す情報
それぞれ、クエリ、キー、バリューは、それぞれの学習可能な重み行列から計算される。
一つのトークンに相当するクエリに対して、それぞれのキー(入力したトークン数分の対応するキー)と内積(類似度計算:(QK^T)/√(d_k) 実際には内積とスケーリング)が計算がされる。ここでのスケーリング対応は、内積計算で次元数が大きくなると計算結果も大きくなり、ソフトマックス関数の入力で飽和問題(一部の要素が極端に大きくなり、Softmaxの出力が0または1に近づいて勾配が小さくなる)が起きて学習が進みにくくなる問題の対処である。
この出力された行列は、予測したいトークンID以降の未来のトークンIDも全て参照している状態(”A cat sat on the mat”という文章が入力なら、”A cat”の次の”sat”を予測する段階でも、全部の単語を参照している状態)。そこでAttentionマスクで、未来のクエリとキーの内積結果の行列の要素部分の値を全部マイナス無限大(catのクエリなら、”cat”とそれぞれ”sat”,”on”,”the”,”mat”との内積した要素をマイナス無限大にする。それを全てのクエリで予想する単語に合わせてそれぞれ実施する)にしてSoftmaxに渡し未来の単語部分の出力割り当て0%にして正規化する。
Softmaxから出力される値は、各クエリに対して、全トークンへのAttention重みが生成される。
クエリごとに、入力した文章のトークン数分のSoftmaxの出力値を重みとして、対応するValueベクトルの重み付き和(加重和)を計算してAttentionの出力を得る
Softmaxで出力された重みの配分がそれぞれ異なるので、それぞれの合算値は多様な異なる数値表現の値となる。
Attentionでの出力は、埋め込みベクトルの長さとなる行がトークン数分ある行列となる。
これにより全てのクエリ(各トークンから生成されたQueryベクトル)に対して複雑な位置や関連性の理解ができるようになる。
マルチヘッドAttentionは、Attentionが複数あり、それぞれのAttentionが異なった解釈、尺度で学習される。
このような流れでAttention全体で、入力と出力はソフトなディクショナリとして機能している。
(ハードなディクショナリはクエリに完全一致したバリューしか取得しないが、ソフトなディクショナリは、類似度計算、重み付けを考慮して全ての値からやんわりと共通した値を返すイメージ)
[FFN]
入力(c,e)->Linear →GELU->Linear->Dropout->出力(c,e)
処理としては線形変換だけでなく非線形変換を挟む。Dropoutで過学習を防いでいる。データの入出力の形状は、Attentionから出力された形状をそのまま維持する。
このFFN処理が入る理由として、Attentionが集めた情報を、単なる線形変換では表現できない複雑な特徴へ変換するためである。
[LayerNorm]
正規化層。データの分布を平均0、分布1のように、あらかじめ決められた統計性質を持つように調整する層。これにより極端な値に偏ってしまうのを防ぎ、学習を安定させる。GPT-2では、Attention,とFFNの前にそれぞれこの処理が入る。
[Transformerブロック:Attention-FFN]
Transformerの核心部はAttentionとFFNで構成される。この処理単位をTransformerブロックといい、繰り返し適用される。Transformerブロックでは、AttentionとFFNの出力は元の入力(Embed〜位置エンコーディングで変換された埋め込みベクトル列)から渡ってきた値と次々と直接加算されていく(残差接続)。残渣接続があると、逆伝播の際に勾配が直接伝わる経路が確保されるため、勾配消失問題が緩和され、より深いネットワークの学習が可能となる。Transformerの入力と出力のデータ形状は(c,e)であるため、Transformerブロックによる複数回の処理が可能となっている。
[Transformerブロックを抜けた後の最後の処理]
ここでトークン列のトークンを語彙サイズと同じ次元数に変換し、ソフトマックス関数を用いて次のトークンの確率分布を生成する。
ここは、GPT-2ではLyaerNorm → Liner → Logitsの実装となる。LayerNormで正規化され、
Linear層によって(c,e)→(c,V)へ変換する。
V=語彙サイズ
出力はロジット(Logits)と呼ばれ、各語彙に対する未正規化スコアを表す。
GPT-2本体はここで終了する。
Softmaxは生成時や学習時の損失計算時に適用され、ロジットを確率分布へ変換する。
**以上がLLMの実装アーキテクチャのまとめメモだが、事前学習、事後学習、強化学習の技術もモデルの性能を上げるために非常に重要。本書ではその点についても丁寧に絵図、数式、Python実装を踏まえて紹介してくれている。
へポスト
|
【技術本】生成AIアプリケーション開発入門 のレビュー2024年前後における以下のほぼ最前線の生成AI活用方法を一冊で学べる。・ディープラーニングの技術遍歴・近年のLLM、生... 続きを読む |
|
【技術本】Pythonでスラスラわかるベイズ推論「超」入門 のレビューベイズモデルで最低限必要な基礎的な確率分布から解説してくれる書籍。よく利用される確率分布として、ベルヌーイ分布、二項分布... 続きを読む |
|
【技術本】つくりながら学ぶ!LLM自作入門 のレビューGPT2相当のLLMをローカルのPC上で動かして検証できる。コードはPythonでPytorch、Tensorflow、... 続きを読む |
|
【技術本】ゼロから作るDeepLearning❺ のレビュー本書では、単純な1次元の正規分布を数式でモデル化して擬似データを生成できることから始め、徐々に複雑さを上げて、最終的に任... 続きを読む |
|
【技術本】大規模言語モデル入門 のレビューChatGPTの登場によりさまざまな技術が塗り替えられつつある昨今だが、2023年当時におけるTransformer技術... 続きを読む |
|
【技術本】ゼロから作るDeepLearning❹ のレビュー本書の前半1〜6章は強化学習の基礎(実装あり)を紹介し、後半の7〜9章でディープラーニングの強化学習問題を解くところまで... 続きを読む |
|
【技術本】セキュリティエンジニアのための機械学習 のレビュー以下の各種情報セキュリティに対する機械学習を活用した防御と、攻撃の内容について、コードを踏まえて解説してくれている。・フ... 続きを読む |
|
【技術本】実践・時系列解析―統計と機械学習による予測 のレビュー時系列解析とはなにか。歴史的背景の解説から、データの前処理整形方法、データのシミュレーション、機械学習を想定した前処理(... 続きを読む |
|
【技術本】ゼロから作るDeepLearning❸ のレビュー独自の機械学習用フレームワークをゼロから実装し、最終的にはCNN, RNN(LSTM含む)を構築して機械学習できるまでが... 続きを読む |
|
【技術本】Pythonではじめる教師なし学習 のレビュー教師あり学習と対比し、教師なし学習の利点や特性などを踏まえながら、以下の順で教師なし学習を紹介してくれている。内容は、機... 続きを読む |
|
【技術本】詳説DeepLearning のレビュー本書の肝は、並列反復アルゴリズムを実行できるSparkを活用し、YARNベースのHadoopクラスタ、Mesosベースの... 続きを読む |
|
PythonによるAI・機械学習・深層学習アプリのつくり方 のレビュー機械学習という一見曖昧なものを識別する仕組みも、評価するものが文章であったり画像であったとしても、最終的にデータを数値定... 続きを読む |
|
【技術本】ゼロから作るDeepLearning❷―自然言語処理編 のレビューゼロベースから実装(ブラックボックスの機械学習ライブラリ使用ゼロ)してディープラーニングの中身を理解できる著作の第2弾。... 続きを読む |
|
【技術本】ゼロから作るDeep_Learning―Pythonで学ぶディープラーニングの理論と実装 のレビュー人の脳神経回路の仕組みを模したニューラルネットワークをどのように実装して、どのように学習させていくべきかを絵図数式、さら... 続きを読む |
