ランチェーン101:パート2c PEFT、LORA、およびRLでLLMを微調整する
ランチェーン101:パート2c PEFT、LORA、およびRLでLLMを微調整する - 美とファッションの専門家が説明
この記事をより理解するために、前のパートをご覧いただくことをおすすめします。そこでは大規模な言語モデルについて話しました。
LangChain 101: パート2ab. 大規模(言語)モデルについて知っておくべきこと
これはLangChain 101コースのパート2abです。理解するためには最初のパートをチェックすることを強くおすすめします…
pub.towardsai.net
もしLangChainと大規模な言語モデルに興味があるなら、このシリーズのパート1を訪れることを検討してください。
- 「Azureのコストを最適化するための10の方法」
- 「FinBERTとSOLID原則を活用して感情スコアの正確性を向上させる」
- 「AWS Step Functionsで機械学習パイプラインをオーケストレーションする」
LangChain 101: パート1. シンプルなQ&Aアプリの作成
この記事では、大規模なアプリケーションを構築するためのフレームワークであるLangChainの基礎を紹介します…
pub.towardsai.net
次のパートを見逃さないように、著者をフォローしてください 🙂
機械学習やデータサイエンスにおいて、予測を行うブラックボックスはしばしばモデルと呼ばれます。異なるモデルが存在し、その中の1つが言語モデルです。言語モデルは以前から存在していましたが、ChatGPTが登場するまではあまり人気がありませんでした。その理由の1つは、GPT-1モデルが少量のデータで訓練されたためです。GPTの後の数字が増えるにつれて、データ量も増え、よりよく知られるようになった大規模な言語モデル、またはLLM(Large Language Models)が登場しました。
モデルの微調整
モデルの微調整、または転移学習とも呼ばれる方法は、特定のタスクのパフォーマンスを向上させるために、事前に存在するモデルを新しいデータでさらに訓練する機械学習の技術です。微調整は、事前に訓練されたモデルが一般的な領域(私たちの場合、自然言語)の価値ある表現を学習し、より特定のタスクでより良い結果を出すように適応されるシナリオで一般的に使用されます。
私は多くの質問を聞きました。大規模な言語モデルを微調整する価値があるのか?プロンプトを使用しないほうがいいではないかという疑問がありました。代わりにベクトルストアを使用できるのか?そして、その他のトピックに関する質問がありました。
次の状況を考えてみてください:歯科医に行くことになったとします。あなたはどちらを選びますか:
- 歯科医として振る舞う人(プロンプト:”あなたが歯科医であると想像してください…”)
- 歯科のケアに関するすべての文献を読んだ人(ベクトルストアを使用)
- 歯科手術のために訓練された医師(微調整されたモデル)
私が話した観客は、明らかに最後のオプションを選びました(PyDataとData Scienceのミートアップ)
PEFT – パラメータ効率の良い微調整
PEFT(Parameter-Efficient Fine-tuning)は、事前に訓練された言語モデルのパフォーマンスを向上させる方法であり、モデルのすべてのパラメータを微調整する必要はありません。これにより、数百億または数兆のパラメータを持つ大規模なモデルの微調整をより効率的かつ費用対効果の高い方法で行うことができます。
PEFTは、事前に訓練されたモデルの一部のレイヤーをフリーズし、ダウンストリームのタスクに特化した最後の数層のみを微調整することで機能します。これは、LLMの下の層が一般的な目的であり、タスクに特化していないことが観察されているためです。クラシックな転移学習です。
ここでは、PEFTを使用してLLMをテキスト分類タスクに適用する方法の例を示します。
- 事前学習済みLLMの最初の数層を凍結します。
- ラベル付きテキストの小さなデータセットで、LLMの凍結解除層を微調整します。
- モデルを微調整し、未知のデータ上でテストできます。
LoRa — みんなが話題にしている低ランク適応
LoRa、またはLow-Rank Adaptationは、モデルのすべてのパラメータを学習せずに、大規模な言語モデル(LLM)を特定のタスクやドメインに適応するための微調整手法です。 LoRaは、現在のトランスフォーマーアーキテクチャーを基本的な方法で変更しません。 LoRaは、事前学習済みモデルの重みを凍結し、トランスフォーマーアーキテクチャーの各層に学習可能なランク分解行列を注入します。
LoRaは、事前学習済みトランスフォーマーモデルの重みを、元の事前学習済み重みと望ましい微調整重みの差を低ランクの2つの小行列に分解することで、特定のタスクやドメインに適応させることで機能します。 これらの2つの行列は、モデルパラメータの完全なセットの代わりに微調整されます。 これにより、トレーニング可能なパラメータの数を10000倍減らすことができ、完全パラメータの微調整と比較可能なパフォーマンスを実現できます。 微調整中、LORAは低ランク埋め込みおよび射影層の重みを通常のデータサイエンスと同様に更新し、損失関数を最小化します。
では、PEFTとLoRaの違いは何でしょうか? PEFTは、LoRaを含むさまざまなテクニックを使用して、大規模な言語モデルを効率的に微調整する方法です。
このアプローチにはいくつかの利点があります:
- 大規模なトランスフォーマーモデルの場合、完全パラメータの微調整よりも時間効率が高いです。
- メモリの使用量が少ないため、メモリ制約のあるデバイスでモデルを微調整できます。メモリ効率が高いです。
- 低ランク行列には、特定の知識や制約がエンコードされているため、より制御された微調整が可能です。
強化学習
強化学習(RL)は、モデルを微調整するための別の方法です。 オリジナルのモデルの2つのコピーが必要です。 1つのコピーはアクティブモデルであり、望ましいタスクを実行するために訓練されます。 もう1つのコピーは、アクティブモデルのトレーニングに制約を課すために使用される参照モデルであり、ロジット(モデルの非正規化された出力)を生成します。
LLMはどのようにテキストを生成するのか?
この記事では、トランスフォーマーまたは大規模言語モデルのトレーニング方法については議論しません。 代わりに、使用方法に焦点を当てます…
pub.towardsai.net
モデルの2つのコピーを持つ要件は、特に大規模なモデルの場合、GPUの制約となる場合があります。ただし、この制約は、RLアルゴリズムが予期しないまたは有害な出力を生成するモデルからの大きな逸脱を防ぐために必要です。
調整の過程を見ていきましょう:
- 参照モデルは事前に訓練された言語モデルのパラメータで初期化されます。
- アクティブモデルは強化学習を使用して訓練を開始します。
- 各最適化ステップでは、アクティブモデルと参照モデルの両方のログット(対数確率)が計算されます。
- 損失関数は、アクティブモデルと参照モデルのログットを使用して計算されます(KL指標)。
- アクティブモデルのパラメータは、損失関数またはプロキシマルポリシーオプティマイゼーションの勾配を使用して更新されます。
コーディングの時間です!
完全なコードはGitHubで入手できます。
まずは、peftをインポートし、パラメータを調整する準備をします。
from peft import prepare_model_for_kbit_trainingpretrained_model.gradient_checkpointing_enable()model = prepare_model_for_kbit_training(pretrained_model)
LoraConfigパラメータを設定し、get_peft_modelメソッドを使用してPeftModelを作成します:
- r:低ランク行列のランクは、元の事前訓練済み重みと目的の微調整済み重みの間の差を表します。rの値が高いほど、LORAはパラメータ間のより複雑な関係を学習できますが、計算量も増えます。
- lora_alpha:ダウンストリームタスクの損失関数と元の事前訓練済み重みを保護するための損失関数のトレードオフを制御するハイパーパラメータ。lora_alphaの値が高いほど、初期の事前訓練済み重みを保護するための損失関数に重みが与えられます。
- target_modules:LORAで微調整するモデル内のモジュールの名前のリスト。
- lora_dropout:トレーニング中に低ランク行列に適用するドロップアウト率。
- bias:低ランク行列で使用するバイアスのタイプ。有効なオプションは「none」、「shared」、「individual」です。
- task_type:モデルが微調整されるタスクのタイプ。有効なオプションは「CAUSAL_LM」と「CLASSIFICATION」です。
from peft import LoraConfig, get_peft_modelconfig = LoraConfig( r=16, lora_alpha=32, target_modules=["query_key_value"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM",)model = get_peft_model(model, config)
では、Trainerクラスをセットアップしましょう:
- data_collator:トレーニングデータをバッチにまとめるために使用される関数。
- per_device_train_batch_size:GPUごとのバッチサイズ。
- gradient_accumulation_steps:モデルパラメータを更新する前に勾配を蓄積するステップ数。これによりメモリ使用量を減らし、トレーニング速度を向上させることができます。
- warmup_ratio:線形学習率ウォームアップに費やすトレーニングステップの割合。
- fp16:浮動小数点16(FP16)精度のトレーニングを使用するかどうか。これによりトレーニング速度が向上し、メモリ使用量が減ります。
- logging_steps:ログ更新間のトレーニングステップ数。
- output_dir:訓練済みモデルやその他のトレーニングアーティファクトが保存されるディレクトリ。
- optim:モデルのトレーニングに使用するオプティマイザ。有効なオプションは「adamw」、「sgd」、「paged_adamw_8bit」です。
- lr_scheduler_type:使用する学習率スケジューラ。有効なオプションは「cosine」、「linear」、「constant」です。
trainer = transformers.Trainer( model=model, train_dataset=train_dataset, # eval_dataset=val_dataset, args=transformers.TrainingArguments( num_train_epochs=10, per_device_train_batch_size=8, gradient_accumulation_steps=4, warmup_ratio=0.05, max_steps=40, learning_rate=2.5e-4, fp16=True, logging_steps=1, output_dir="outputs", optim="paged_adamw_8bit", lr_scheduler_type="cosine", ), data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),)
残っているのは訓練を開始することだけです:
trainer.train()
トークン化された入力IDを使用してモデルをすぐに使用するか、さらに使用するために保存することができます:
trained_model = (trainer.model.module if hasattr(trainer.model, "module") else trainer.model) # 分散/並列トレーニングの処理を実行trained_model.generate(input_ids)# モデルを保存trained_model.save_pretrained("outputs")
リマインダー:完全なコードはGitHubで入手できます。
これで2cの終わりです。次のパート(de)では、ヒューマンフィードバックを使用してモデルの微調整に取り組みます。
LangChain 101:パート1。シンプルなQ&Aアプリの作成
この記事では、大規模なアプリケーションを作成するためのフレームワークであるLangChainの基本を紹介します…
pub.towardsai.net
LangChain 101:パート2ab。 (大規模な言語)モデルについて知っておく必要があるすべて
これはLangChain 101コースの2abのパートです。理解するために最初のパートを確認することを強くお勧めします…
pub.towardsai.net
拍手してフォローしてください。これは私が新しい記事を書くことを励まし、次のパートが公開されたことを知らせるためです。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- In this translation, Notes is translated to メモ (memo), CLIP remains as CLIP, Connecting is translated to 連結 (renketsu), Text is translated to テキスト (tekisuto), and Images is translated to 画像 (gazo).
- 「ゲームを一段と盛り上げる:スタートアップのスポーツビジョンAIが世界中にアスレチックを放送」
- カリフォルニア州での山火事との戦いにAIが役立つ方法
- プールに飛び込む:CNNプーリングレイヤーの魔法を解き明かす
- オペレーションの頭脳:人工知能とデジタルツインで手術の未来を地図化するアトラスメディテック
- 「5つのステップでPyTorchを始めましょう」
- クラウド上で機械学習モデルを本番環境にデプロイする