【詳解】日本語LLMのファインチューニングのパラメータ設定方法

【詳解】日本語LLMのファインチューニングのパラメータ設定方法

 
【詳解】LLMのファインチューニングのパラメータ設定方法

【チュートリアル動画】日本語LLMのファインチューニング入門
– Japanese LLM Fine Tuning Tutorial

 

 

【現代の魔法】日本語LLMのファインチューニング入門
– How to Fine Tunning LLM for Generative AI Beginners


視聴時間:38分3秒

このページで、ファインチューニングのパラメータについて少しずつ理解を深め、解説動画で日本語大規模言語モデル(LLM:Large Language Model)のファインチューニング(再学習・微調整)のチュートリアルコードの使い方を把握していただけますと幸いです。

 




 

【動画の内容:日本語LLMのファインチューニング入門】

0:00 はじめに
0:49 Google Colaboratoryの使い方
1:49 【ステップ1】ファインチューニング前のLLMで推論 編
5:48 【ステップ2】ファインチューニング 編 – 事前準備
8:57 【事前準備】自作データセット編
15:38 【事前準備】Hugging Faceの日本語データセット編
20:30 【事前準備】Google Driveのマウント
21:30 ファインチューニングのパラメータの指定と反映
26:21 ファインチューニングの実行
33:57 ファインチューニングしたLLMで推論・日本語化
37:04 おわりに

 

 

【LLMのファインチューニング】パラメータなどの解説

 

 

情報収集の利便性を考え、以下の日本語大規模言語モデルのファインチューニングのチュートリアル

日本語LLMのファインチューニング入門 – 自作・Hugging Face公開データセット対応

の記事や、Google Colaboratoryのチュートリアルコード

オリジナルデータセット対応のGoogle Colaboratoryのチュートリアルコード:
My-Dataset-LLM-FineTuning-for-Japanese-AI-Beginners.ipynb(Apache-2.0 license)| Google Colaboratory

Hugging Faceの公開データセット対応のGoogle Colaboratoryのチュートリアルコード:
HF-Dataset-LLM-FineTuning-for-Japanese-AI-Beginners.ipynb(Apache-2.0 license)| Google Colaboratory

上では見にくいかと思いますので、以下にファインチューニングのパラメータについてまとめておきます。

チュートリアルコードで、ファインチューニングを実践する中で、ファインチューニングをさらに深めたいと思った時などに、Google Colaboratoryのチュートリアルコードを別ウインドウで開きつつ、併せてこのページを参照いただけますと幸いです。

 

 

【データセットのパスの設定】

 

 

ROOT_DIR = “./dataset/”
コード解説:
ファインチューニングで使うデータセットのファイルが入っているフォルダのパスを指定します。
今回は、Google Colaboratory上のファイル機能の「content」直下に「dataset」フォルダを配置し、その中にデータセットのファイルを入れています。

 

 

【データクラスの設定】

 

 

@dataclass
class Config(ConfigProblemBase):

コード解説:
ここでデータクラスの設定をします。

 

output_directory: str = “/content/drive/MyDrive/LLM/output/MyFineTuningLLMdemo/”
コード解説:
ファインチューニングした学習済みモデルの出力先のパスを指定します。

 

experiment_name: str = “MyFineTuningExperimentDemo”
コード解説:
今回のファインチューニング名を指定します。

 

llm_backbone: str = “line-corporation/japanese-large-lm-1.7b-instruction-sft”
コード解説:
今回、ファインチューニングをするLLMモデル(Hugging Faceに公開されているLLM名)を指定します。

 

 

【①データセットの設定】

 

 

dataset: ConfigNLPCausalLMDataset = ConfigNLPCausalLMDataset
コード解説:
ここでデータセットに対する処理方法などを設定していきます。

 

train_dataframe=os.path.join(ROOT_DIR, “converted_dataset.csv”)
コード解説:
ファインチューニングで使うデータセットのファイル名を指定します。
上述の「【データセットのパスの設定】」でフォルダを指定しているので、データの前処理後に出力されるデータセットのファイルの名前を指定します。

 

validation_strategy = “automatic”
コード解説:
検証の戦略。
データセットの中から自動的に学習用のデータセットと検証用のデータセットを振り分ける場合には、ここの設定を「automatic」(自動)にします。
custom」(カスタム・手動)という設定もあるようですが、詳細はわかりません。

 

validation_dataframe = “”
コード解説:
検証用のデータフレーム。
おそらく「validation_strategy = “custom”」にした場合に、検証用のデータセットのパスなどを指定するのではないかと思います。
今回は「validation_strategy = “automatic”」にしているので、空欄で大丈夫なようでした。

 

validation_size = 0.01
コード解説:
検証用データのサイズを指定(0より大きく1.0未満)します。
validation_strategy = “automatic”」の場合「train」用データ(学習用データ)から指定した割合で分割されます。
チュートリアルでは、11個のデータセットを利用しています。「0.01」を掛けると1未満になりますが、その場合には「1」つだけ検証用に使われるようでした。

 

prompt_column = (“instruction”,)
コード解説:
データセット内のプロンプト(入力内容)の列名「instruction」を、プロンプト(入力内容)の列として指定します。

 

answer_column = “output”
コード解説:
データセット内の回答の列名「output」を、回答の列として指定します。

 

text_prompt_start = “”
コード解説:
お好みに応じて、各プロンプトの先頭に追加する文章を指定できます。

 

text_answer_separator = “”
コード解説:
お好みに応じて、各プロンプト/各回答の先頭に追加する文章を指定できます。

 

add_eos_token_to_prompt = True
コード解説:
会話形式(チャットボット形式)の場合には「True」にします。

 

add_eos_token_to_answer = True
コード解説:
会話形式(チャットボット形式)の場合には「True」にします。

 

mask_prompt_labels = False
コード解説:
プロンプトのラベルをマスクするかどうかを指定します。
学習中にプロンプトのラベルをマスクし、答えの損失のみを学習するかどうか設定します。
False」の場合には、この機能を無効化しています。

 

 

【②トークナイザーの設定】

 

 

tokenizer: ConfigNLPCausalLMTokenizer = ConfigNLPCausalLMTokenizer
コード解説:
ここでトークナイザーの設定をしていきます。
トークナイザーは、テキスト文章をトークン単位に分割する実装のことを意味します。

 

max_length_prompt = 128
コード解説:
プロンプト(instruction)の最大のトークン列(系列長)の指定をします。
トークン列を揃えるための設定です。

 

max_length_answer = 128
コード解説:
回答(output)の最大のトークン列(系列長)の指定をします。
トークン列を揃えるための設定です。

 

max_length = 256
コード解説:
max_length」を指定すると、指定した長さに足りない婆には特定の値(おそらく「padding_quantile」の値)で補完します。

 

padding_quantile = 1.0
コード解説:
パディングの分位数。
プロンプトや回答のトークン列が「max_length」より足りない場合に指定した値で補完します。

 

 

【③オーグメンテーション(拡張)の設定】

 

 

augmentation: ConfigNLPAugmentation = ConfigNLPAugmentation
コード解説:
ここでオーグメンテーション(拡張)の設定をします。

 

token_mask_probability = 0.0
コード解説:
token_mask_probability = 0.0」で、おそらくトークンをマスクする割合を「0」に設定しているのではないかと思われます。

 

 

【④アーキテクチャ(構造)の設定】

 

 

architecture: ConfigNLPCausalLMArchitecture = ConfigNLPCausalLMArchitecture
コード解説:
ここで、LLMのアーキテクチャ(構造)の設定をします。

 

backbone_dtype = “float16”
コード解説:
メモリの最適化 – 量子化。
LLMバックボーンのndarrayの要素のデータ型を指定します。
ここでビット数を指定します。
float16:半精度浮動小数点数16ビット」にしたい場合には

「backbone_dtype=”float16″」

で、LLMの重み(パラメータ)を16ビット精度 (FP16・BF16) でロードし「float16 量子化」をしているようです。

LLMの学習モデルの重みは「float32:半精度浮動小数点数32ビット」で表しているので、「float16 量子化」で

1/2の軽量化

をしていることになります。
今回のノートブックでは「float32」「float16」「bfloat16」(brain float 16)に対応しています。
数値が小さい場合には軽量化され、数値が大きい場合には高精度となりますがGPUで処理する際に重くなります。

 

gradient_checkpointing = False
コード解説:
メモリの最適化 – 勾配チェックポインティング。
batch_size=1」でもGPUメモリがオーバーしてしまう時に、メモリを最適化する方法です。
ただし、処理速度が低下します。
使用する場合には「gradient_checkpointing = True」に設定します。
ただし、実験的な仕様のため、他の設定と互換性のない場合があるようです(詳細不明)。

 

force_embedding_gradients = False
コード解説:
学習中に入力のEmbedding(エンベディング:埋め込み表現・ベクトル表現)に対する勾配の計算を強制するかどうか。LoRA(ローラ)に有用のようです。
使用する場合には「force_embedding_gradients = True」に設定します。

 

intermediate_dropout = 0
コード解説:
ドロップアウト率を指定します。
学習モデルの中間層に対してのドロップアウト率を設定します。

 

 

【⑤学習の設定】

 

 

training: ConfigNLPCausalLMTraining = ConfigNLPCausalLMTraining
コード解説:
ここで、学習の設定をします。

loss_function = “CrossEntropy”
コード解説:
今回は、損失関数(「正解値」と「予測値」のズレの大きさを示す値)に交差エントロピー誤差を利用します。

optimizer = “AdamW”
コード解説:
最適化アルゴリズムに「AdamW」(アダムW)を利用しています。
AdamWは「勾配のスケーリング処理」と「重み減衰」の2つの処理を分離した形式です。
その他に

・「Adadelta
*2012年に提唱された手法。AdaGrad・RMSPropを改良したアルゴリズム

・「Adam」(Adaptive moment estimation:アダム)
*2015年に提唱された手法。AdaGrad・RMSProp・AdaDeltaを改良したアルゴリズム

・「AdamW8bit
*2021年に提唱された手法。Adamを8bit量子化で軽量化したアルゴリズム

・「RMSprop
*2012年に提唱された手法。AdaGradを改良したアルゴリズム

・「SGD」(Stochastic Gradient Descent:確率的勾配降下法)
*初期に提唱された基本的なアルゴリズム

を指定できます。

 

learning_rate = 0.00015
コード解説:
学習率(学習の際に重みを更新する際に使用する割合)を指定します。
過学習(過剰適合・オーバーフィッティング)と学習不足(未学習・アンダーフィット)のバランスをとるための設定です。

 

batch_size = 4
コード解説:
ファインチューニングの「バッチサイズ」(1回あたりに処理をする塊の数)を指定

 

drop_last_batch = True
コード解説:
バッチ数の仲間外れを除去するかどうかを設定します。
今回は「True」で有効化しています。

 

epochs = 50
コード解説:
ファインチューニングの学習回数を指定します。
epochs = 1」は、学習回数1回という意味です。初期設定は「epochs = 50」にしています。

 

schedule = “Cosine”
コード解説:
学習率のスケジュールを定義します。
schedule=”Cosine”」でコサイン関数の値に従う学習率を適用します。
その他に

・「Constant」(一定の学習率を適用)
・「Linear」(線形の学習率を適用)

を指定できます。

 

warmup_epochs = 0.0
コード解説:
学習率をウォームアップするエポック数を指定します。
warmup_epochs=0.0」で0から増加という意味です。

 

weight_decay = 0.0
コード解説:
重み減衰の指定をします。
値を「0以外」(例:0.0001)にすると、L2正規化が働き過学習の抑制効果が働きます。

 

gradient_clip = 0.0
コード解説:
勾配クリッピング – 勾配の最大ノルムを指定します。
勾配が設定した閾値以上となった際に、勾配の値を閾値にクリッピングします。
デフォルトは「0で、勾配クリッピングなしになっています。
0より大きな値」が指定された場合、モデル学習中に勾配をクリッピングすることが適用されます。

 

grad_accumulation = 1
コード解説:
メモリの最適化 – 勾配累積。
バッチ全体の勾配を一度に計算せずに、小さなバッチサイズで計算したものを集約しでバッチサイズを増やします。

 

lora = True
コード解説:
LoRA(Low Rank Adaptation:ローラ)を有効化するかどうかを設定します。
今回は「lora = True」で有効化しています。
少ない学習パラメータで調整(全ての重みではなく、近似した小規模の行列を調整)できるようになります。

 

lora_r = 4
コード解説:
LoRA Rディメンション(次元)を指定します、
更新行列のランクを表すパラメータです。
一般的に
rが小さい」と、より短時間で計算量が少なくなる。
rが大きい」ほど、更新行列は元の重みに近くなるが計算量が増える
傾向があります。

ここの値を大きくするとファインチューニングを行うパラメータの割合を増やすことができます。
以下は「line-corporation/japanese-large-lm-1.7b-instruction-sft」の際のlora_rの値と利用割合です。

例:
lora_r = 4(0.05%)
lora_r = 8(0.1%)
lora_r = 16(0.2%)

 

lora_alpha = 16
コード解説:
LoRAアルファを指定します。
LoRAのスケーリングに使用されるパラメータです。
更新行列の大きさを制限し、LoRAの過学習などを抑制します。

 

lora_dropout = 0.05
コード解説:
LoRAのドロップアウト率を指定します。
更新行列の一部を無効化し、LoRAの過学習などを抑制します。

 

lora_target_modules = “”
コード解説:
LoRAの低ランク行列近似を適用するモデル内のモジュールを指定します。
デフォルトは線形層のようです。
その他に何を指定できるのかは分かりません。

 

save_best_checkpoint = False
コード解説:
何回も学習する際に便利な機能です。
チュートリアルでは「save_best_checkpoint = False」とし、この機能を無効化しています。
ファインチューニング中に一番良い結果が出た学習モデルを保存したい場合には「save_best_checkpoint = True」にします。

 

evaluation_epochs = 1.0
コード解説:
評価エポック数を指定します。
save_best_checkpoint = False」の時に適用されます。
検証データに対してモデル評価を実行する頻度(エポック数)を決定します。
数値を増やすと、処理の回数が減るので、その分、高速化されます。

 

evaluate_before_training = False
コード解説:
学習前の評価をするかどうかの設定です。
チュートリアルでは「evaluate_before_training = False」とし、この機能を無効化しています。
evaluate_before_training = True」で、ファインチューニング前にモデルを評価することができ、微調整を行う前にLLMバックボーンの品質を判断するのに役立ちます。

 

 

【⑥予測(推論)の設定】

 

 

prediction: ConfigNLPCausalLMPrediction = ConfigNLPCausalLMPrediction
コード解説:
ここで、予測(推論)の設定をします。

 

metric = “BLEU”
コード解説:
モデルのパフォーマンスを評価するためのメトリックを指定します。
その他に

・「Perplexity
・「OpenAI API

なども指定できるようです。

 

min_length_inference = 2
コード解説:
推論の最小の長さを指定します。
生成されるトークンの最小の長さを指定します。

 

max_length_inference = 256
コード解説:
推論の最大の長さを指定します。
生成されるトークンの最大の長さを指定

 

batch_size_inference = 0
コード解説:
推論の際のバッチサイズを指定します。
推論中のバッチサイズを指定します。

 

do_sample = False
コード解説:
サンプリングの設定をします。
単語間の確率を、確率の高い・低いに従ってランダムにピックアップすることをサンプリングというようです。
do_sample=True」で有効化されます。
予測されたシーケンス内の次のトークンが確率に基づいてサンプリングをします。
チュートリアルでは「do_sample = False」にしていますので、常に最も高い確率を選択します。

 

num_beams = 2
コード解説:
ビーム探索の対象となる本数を指定します。
num_beams = 1」でビーム探索を無効化できます。
ビーム探索では、後に続く単語の同時確率を参考に文章を生成します。
各ステップごとに確率の高いルートを保持し、計算量を低減します。
ビーム探索の値を大きく」すると、精度が向上する可能性がある一方で、予測実行時間が長くなる可能性があります。

 

temperature = 0.3
コード解説:
温度の指定をします。
ここで言う温度とは、生成されるトークンのランダム性・多様性を制御するパラメータのことを意味するようです。
0〜1」の範囲で指定します。

多様性のある回答を希望する場合
→ 数値を大きくする

一貫した回答を希望する場合
→ 数値を小さくする

 

repetition_penalty = 1.2
コード解説:
繰り返しペナルティを指定します、
repetition_penalty = 1.0」とすると、ペナルティなしの設定になります。
繰り返しペナルティを大きくすると単語の繰り返しが回避されます。

 

 

【⑦環境設定】

 

 

environment: ConfigNLPCausalLMEnvironment = ConfigNLPCausalLMEnvironment
コード解説:
ここで、環境の設定をします。

 

mixed_precision = True
コード解説:
メモリの最適化 – 混合精度の設定をします。
mixed_precision = True」で

・自動混合精度演算(AMP:Automatic Mixed Precision)

を有効化します。
有効化で、メモリ消費量が低減し、学習速度が向上します。

 

number_of_workers = 4
コード解説:
ワーカー数の指定をします。
Data Loaderに使用するワーカー数を指定します。
ワーカー数とは、モデル学習中にデータを読み込んでGPUにロードする際に使用するCPUプロセス数のことを意味するようです。

 

seed = 1
コード解説:
ランダムシード値を指定します。
seed = -1」で毎回乱数が生成されるようになります。
seed = -1」以外の数値に設定すると毎回同じ結果が再現されるようになるようです。
試した範囲では「seed = 1」でも、学習の結果に変動があるようでした。

 

以上、日本語LLMのファインチューニングのチュートリアルコード内の、ファインチューニングのパラメータの詳解です。

初めて見た時には、あまりのパラメータ数の多さに、面食らう…
のではないかと思いますが、このページの情報を参考に、1つずつパラメータについて確認していくと徐々に慣れてくるのではないかと思います。

ファインチューニングのパラメータに関しては、どのような名前のものがあるのか?と言うことを、チュートリアルコードを使う中で少しずつ把握しておくと今後のLLMのファインチューニングの学習の際に、役立つのではないかと思います。

 

 

by 子供プログラマー

 

 

日本語LLMのファインチューニング入門 – 自作・Hugging Face公開データセット対応

 

気軽にチャットAIが始められるおすすめの拡張機能です。会員登録やログイン不要で使えるチャットAIもあります。
【使い方】ChatHub入門 – チャットAIをはじめよう