論文紹介 part6 :"The Ultimate Guide to Fine-Tuning LLMs from Basics to Breakthroughs: An Exhaustive Review of Technologies, Research, Best Practices, Applied Research Challenges and Opportunities"を読む
はじめに
今回も同様に以下の論文を読んでいきます。
論文名:The Ultimate Guide to Fine-Tuning LLMs from Basics to Breakthroughs: An Exhaustive Review of Technologies, Research, Best Practices, Applied Research Challenges and Opportunities
著者:Venkatesh Balavadhani Parthasarathy, Ahtsham Zafar, Aafaq Khan, and Arsalan Shahid
今回はステージ3のTraining Setupについて見ていきます。データの準備、モデルの初期化に続き、いよいよ訓練のセットアップです。従来の機械学習で用いられる手法がこのファインチューニングのトレーニングにも現れます。実際にこれらの設定をする際に、この記事を見ることで何をしているかをざっくり確かめられるような、記事にできればと思います。
トレーニングの設定手順は主に以下の3つに大別できます。
トレーニング環境のセットアップ
ハイパーパラメータの定義
オプティマイザーと損失関数の初期化
まずは、GPUやTPU等のハードウェアを設定して、CUDA、cuDNN、PyTorchやTensorFlow等のソフトウェアを正しくインストールする必要があります。そして学習率やバッチサイズ、エポック数等のハイパーパラメータを調整していきます。適切なオプティマイザを選択して適切な損失関数を選んでモデルの性能を評価する必要があります。
以下、論文を箇条書きにまとめてみます。
5.2 トレーニング環境の設定
LLMのファインチューニングを行う際、GPUやTPUなどの高性能ハードウェアで環境を設定することが重要
たとえば、NVIDIA A100やV100のようなGPUは並列処理機能により深層学習モデルのトレーニングに広く利用されており、Google CloudのTPUはさらに大規模な処理の加速が可能
まず、CUDAやcuDNNがインストールされ、ハードウェアがディープラーニングフレームワークに正しく認識されていることを確認
PyTorchの場合、torch.cuda.is_available()でGPUの認識状況を確認できる。
さらに、Hugging Faceのtransformersライブラリなどを使用して、事前学習済みモデルやトークナイザーのロードを簡素化することが可能。
このライブラリはさまざまなLLMでの使用に適しており、モデルのファインチューニングに対して使いやすいインターフェースを提供。
LLMのトレーニングには通常、大量のGPUメモリが必要。
より大きなモデルや非常に大規模なデータセットでのトレーニングには、複数のGPUやTPUを使用した分散トレーニングが必要になる場合がある。
これには、データ並列やモデル並列技術を活用して、利用可能なハードウェアを効率的に利用することが求めらる。
5.3 ハイパーパラメータの定義
モデルの性能向上と最適な成果を得るために、学習率、バッチサイズ、エポックなどの主要なハイパーパラメータを慎重に調整する必要がある。
以下は重要なハイパーパラメータ:
学習率:
LLMのファインチューニングには、SGD(確率的勾配降下法)などの最適化アルゴリズムを使用。
学習率はモデルが問題に適応する速さを決定する。小さな学習率では、更新ごとの重みの調整が小さくなるため、トレーニングに時間がかかるが、大きな学習率は重みの変化が早くなることを意味する。
バッチサイズ:
バッチは、トレーニングデータのサブセットで、モデルの重みを更新する際に使用される。
バッチサイズは、モデルのパラメータが更新される前に処理されるサンプルの数を決定する。
エポック:
エポックとは、トレーニングデータセット全体を1回通過することを指指す。
エポックが完了すると、モデルは全バッチを処理し、計算された損失に基づいてパラメータを更新する。
5.3.1 ハイパーパラメータ調整方法
LLMのハイパーパラメータ調整は、最適な結果を得るためにトレーニング中にさまざまなハイパーパラメータを調整することを指す。
一般的な自動調整手法は、以下の3つ:
ランダムサーチ:指定範囲からランダムにハイパーパラメータの組み合わせを選び、評価。広範囲のパラメータを探索できるが、最適な組み合わせを見つける保証はない。
グリッドサーチ:指定範囲のすべてのハイパーパラメータ組み合わせを評価。リソースを大量に消費するが、最適なセットを見つけることが可能。
ベイズ最適化:確率モデルを使用してハイパーパラメータの性能を予測し、最適なものを選択。大規模なパラメータ空間を効率的に扱うことができるが、セットアップが複雑。
自動ハイパーパラメータ調整:複数の言語モデルを異なるハイパーパラメータでトレーニングし、最適な設定を見つける方法。
5.4 オプティマイザーと損失関数の初期化
LLMのトレーニングに適したオプティマイザーと損失関数の選択は重要。
以下は一般的な最適化アルゴリズムの概要:
勾配降下法(Gradient Descent):コスト関数を最小化するための基本的な最適化アルゴリズムで、全データを使用してパラメータを更新する。小規模なデータセットに適しているが、大規模なデータでは計算コストが高くなる。
利点:
シンプルで実装が簡単。
直感的で理解しやすい。
凸関数に対してはグローバル最小値に収束する。
小規模な問題に適している。
欠点:
大規模データセットでは計算コストが高い。
局所的な最小値に陥る可能性がある。
多くの反復が必要。
学習率の選択に敏感である。
確率的勾配降下法(SGD):勾配を計算する際に単一または少数のデータポイントを使用することで、計算負荷を軽減。大規模データセットに適しているが、更新にノイズが含まれるため、学習率が小さい場合に使用される。
利点:
高速で、大規模なデータセットに対応できる。
メモリ効率が良い。
シンプルで実装が簡単。
ノイズにより局所的な最小値から抜け出せる可能性がある。
欠点:
更新時の分散が大きく、不安定になることがある。
最小値を越えてしまう可能性がある。
学習率の選択に敏感。
バッチ法に比べて収束が遅くなることがある。
ミニバッチ勾配降下法:SGDとバッチ勾配降下法の折衷案で、小規模バッチを使用し、効率性と安定性のバランスを取る。
利点:
効率と安定性のバランスが取れている。
より汎用的な更新が可能。
パラメータ更新の分散を減らせる。
SGDとバッチ法の折衷案を提供。
欠点:
バッチサイズの調整が必要。
非常に大きなデータセットでは計算コストがかかる場合がある。
実装がやや複雑。
フルバッチの勾配降下法よりも多くの反復が必要になる場合がある。
AdaGrad (Adaptive Gradient Algorithm):スパースデータや高次元モデル向けで、各パラメータに学習率を調整し、スパースな特徴を扱う。
利点:
各パラメータに対して学習率を適応させる。
スパースデータに適している。
学習率を手動で調整する必要がない。
高次元データに対して効果的。
欠点:
学習率がゼロに近づき、学習が止まる可能性がある。
収束のために調整が必要になる場合がある。
二乗勾配の蓄積により、学習率が極端に小さくなることがある。
大幅に学習が遅くなる可能性がある。
RMSprop (Root Mean Square Propagation):非定常問題やオンライン問題に対する適応的学習率手法で、リカレントニューラルネットワークに適している。
利点:
AdaGradの学習率低下問題に対処できる。
直近の勾配に基づいて学習率を適応させる。
リカレントニューラルネットワークに効果的。
非定常なターゲットに対してもより堅牢である。
欠点:
非凸問題では局所的な最小値に陥ることがある。
ハイパーパラメータの調整が必要。
減衰率の慎重な調整が必要。
初期の学習率に敏感である。
AdaDelta:学習率の減衰を防ぐアダプティブ手法で、RMSpropと似たシナリオでの使用に適している。
利点:
デフォルトの学習率を設定する必要がない。
学習率の低下問題に対処できる。
学習率の手動調整が不要。
勾配のスパース性に対応できる。
欠点:
RMSpropやAdaGradよりも複雑。
初期段階で収束が遅くなることがある。
収束までに多くの反復が必要になる場合がある。
実装がより複雑になる可能性がある。
Adam:AdaGradとRMSpropの利点を組み合わせた手法で、大規模データセットや高次元空間に最適。
利点:
AdaGradとRMSpropの利点を組み合わせている。
適応的な学習率を持つ。
バイアス補正を含む。
収束が速い。
大規模データセットや高次元空間で効果的に機能する。
欠点:
ハイパーパラメータの調整が必要(デフォルト設定でもうまく機能することが多い)。
計算負荷が高い。
適切に正則化しないと過学習のリスクがある。
より多くのメモリを必要とする。
AdamW:L2正則化を組み込んだAdamの拡張版で、特に過学習を防ぐために適している。
利点:
ウェイト減衰を含み、より良い正則化が可能。
Adamの適応学習率とL2正則化を組み合わせている。
汎化性能が向上する。
Adamに比べて過学習が抑えられる。
欠点:
Adamよりやや複雑である。
ウェイト減衰パラメータの慎重な調整が必要。
追加の計算により、Adamよりわずかに遅くなる。
より多くのメモリを必要とする。
5.5 トレーニング設定における課題
省略
5.6 ベストプラクティス
最適な学習率:
安定した収束を確保するために、通常1e-4から2e-4の低い学習率を使用。
学習率のウォームアップと線形減衰スケジュールを組み合わせると安定性が向上。
バッチサイズの考慮:
メモリ制約とトレーニング効率のバランスを取り、小さなバッチサイズは高速な収束を促し、大きなバッチサイズは更新の安定性を向上させる。
チェックポイントの定期保存:
過学習を防ぐため、エポックごとにモデルの重みを保存し、早期終了メカニズムを導入する。
ハイパーパラメータ調整:
Optuna、Hyperopt、Ray Tuneなどのツールを使用してグリッドサーチ、ランダムサーチ、ベイズ最適化を行い、最適なハイパーパラメータセットを見つける。
データ並列およびモデル並列:
HorovodやDeepSpeedを利用して、複数のGPUやTPUで分散トレーニングを行い、メモリ使用量を管理する。
定期的なモニタリングとロギング:
TensorBoard、Weights & Biases、MLflowなどのツールでトレーニングメトリクスを監視し、ボトルネックを特定する。
過学習と未学習への対策:
L2正則化、ドロップアウト、データ増強などの技術で過学習を防ぐ。
未学習の場合はモデルの複雑さを増やしたり、エポック数を増やす。
混合精度トレーニング:
16ビットと32ビットの浮動小数点数を使用し、メモリ使用量を削減し、計算効率を向上させる。
NVIDIAのApexやTensorFlowの混合精度APIがこれをサポート。
評価と反復:
別の検証セットでモデル性能を評価し、結果に基づいてトレーニングプロセスを改善。
ドキュメントと再現性:
トレーニング設定、ハードウェア構成、ソフトウェア環境、使用したハイパーパラメータを詳細に記録し、ランダムシードを設定して再現性を確保。
ハードウェア、ソフトウェアの設定は初めは結構面倒なところがあります。CUDAのインストールは使用するGPUの型式などを確認しながら適切なバージョンをインストールする必要があります。
そしてそれに対応する開発環境を用意する必要があります。例えばjupyter notebookをCUDA対応にして、そこで開発することが挙げられます。
ハイパーパラメータは適切な組み合わせを探す必要があります。時間とリソースが許せばグリッドサーチをすべきと思います。
オプティマイザーは多くの場合、SGDを用いることが多いのではないかと思いますが、いろいろ試してみるのがいいと思います。非定常のデータにも対応していたり、学習率を適応的に変化させたり、L2正則化を行って過学習を防いだりできたり、それぞれ特徴があります。
次はステージ4:ファインチューニング手法の選択と適切なモデル構成を見ていこうと思います。