ランチェーン 101:パート2d. 人間のフィードバックでLLMの微調整
「ランチェーン 101:パート2d. 人間からのフィードバックでLLMを微調整する方法」
これはLangChain 101コースのモデルセクションの2d部分であり、最後の部分です。この記事の文脈をより理解するために、最初の2つのパートをチェックすることを強くお勧めします。
LangChain 101:パート2ab。 (大規模な言語)モデルについて知っておくべきすべて
これはLangChain 101コースの2ab部分です。全体を理解するために最初の部分をチェックすることを強くお勧めします。
pub.towardsai.net
LangChain 101:パート2c。 PEFT、LORA、およびRLでLLMを微調整する方法
LLMの微調整、PEFT、LORA、および大規模言語モデルのトレーニングについて知っておくべきすべて
pub.towardsai.net
(次の部分を見逃さないように、著者をフォローしてください)。
RLHF(人間のフィードバックからの強化学習)は、高度な言語モデルの現在のトレーニング方法の重要な要素です。モデルの微調整時に人々のフィードバックを取り入れ、モデルをより価値あるものにし、セキュリティを向上させるのに役立ちます。
最も一般的なトレーニング方法について説明します:
ベースモデル
ベースモデルは、大量の一般的なテキストデータセット(時にはコード)で事前にトレーニングされた大規模な言語モデルです:GPT、LLAMA、Falconなど。
ベースモデルは、一般的な用途のドメインにおいてテキスト生成に使用するのに適しています。ただし、特定のタスクやドメインに対するパフォーマンスは、品質に欠ける場合があります。
プロンプティング
プロンプティングは、LLMのパフォーマンスを向上させるためのテクニックであり、タスクに固有のプロンプトをモデルに提供します。
たとえば、あなたが料理のアドバイスをLLMに求めたい場合、クエリの最初に「プロフェッショナルなミシェルシェフとして行動する」というような内容を追加したいかもしれません。そうすればLLMはこのプロンプトを使用して「経験豊富な料理人として行動します」。
プロンプティングはLLMのパフォーマンスを向上させる簡単な方法ですが、既存のLLMでトレーニングされた追加情報や語彙が必要なタスクには効果が少ないです。
微調整
微調整は、LLMのパフォーマンスを向上させるためのテクニックであり、特定のデータセット(望ましい入力と出力の例)でトレーニングします。
たとえば、英語からアラビア語への翻訳LLMを微調整したい場合、英語-アラビア語の翻訳対のデータセットを提供する必要があります。
微調整は、新しいデータと情報を多く学習する必要があるタスクにとって、通常はプロンプティングよりも効果的です。ただし、より多くのデータと計算リソースが必要です。
LangChain 101:パート2c。 PEFT、LORA、およびRLでLLMを微調整する方法
LLMの微調整、PEFT、LORA、および大規模言語モデルのトレーニングについて知っておくべきすべて
pub.towardsai.net
微調整+ RLHF
人間のフィードバックによる強化学習(RLHF)による微調整は、モデルを特定のデータセットによってトレーニングすることでLLMのパフォーマンスを向上させるテクニックです。このようなデータには、タスクの望ましい入力と出力の例、および人間の評価者からのプロデュース品質に関するフィードバックが含まれます。
RLHFを使用した微調整は、特にLLMが人間の価値観や好みを学ぶ必要があるタスクにおいて、単独の微調整よりも効果的です。ただし、より多くのデータ、計算リソース、および人間の取り組みが必要です。
(インストラクト)GPT RLHFパイプライン
では、この(Instruct)GPT RLHFパイプライン(おそらくChatGPTパイプラインも同様です)がどのように構築されているか、詳しく見てみましょう。
Instruct(GPT) RLHFパイプラインは、事前学習されたモデルを取り、教師付きトレーニングを通じてそれを洗練させる(「伝統的なトレーニングパイプライン」の「教師ありfine-tuning」と同様)ことから始まります。その後、更新されたモデルは近接ポリシーオプティマイゼーションを使ってさらに洗練されます。
RLHFパイプラインは、以下の3ステップのトレーニングプロセスで構成されています:
- 教師ありfine-tuningを通じた事前学習モデルの洗練
- 報酬を提供するモデルの開発
- 近接ポリシーオプティマイゼーション(PPO)を使った追加の洗練
RLHFパイプラインの最初のステップでは、プロンプト(おそらくデータセットやデータベースから生成または選択)を作成し、人間に高品質な応答を作成してもらいます。このデータ収集を使用して、事前に存在するベースモデルをガイド付きで微調整します。
RLHFパイプラインのステップ2では、教師ありfine-tuningを経た微調整モデルを教師付きトレーニングを介して使用し、次のステップのための報酬モデルを構築します。これには、各プロンプトに対して複数の応答を生成し、それらを個人が好みに基づいてランク付けする作業が含まれます。
RLHFパイプラインのステップ1から報酬モデルへのモデル変換には、出力レイヤー(次のトークンレイヤー)を、単一の出力ノードを持つ回帰レイヤーで置き換えます。
RLHFパイプラインの3番目のステップでは、報酬モデル(v2)を使用して教師ありfine-tuning(v1)を行った以前のモデルをさらに微調整します。
RLHFパイプラインのステップ2で確立した報酬モデルから得られた報酬スコアに基づいて、報酬モデルをガイドとしてv1モデルを近接ポリシーオプティマイゼーション(PPO)を使って調整します。
これが(Instruct)GPT RLHFパイプラインの動作原理のほとんどです。この方法は品質の高い結果を提供しますが、多くの時間と人的労力を必要とします。より効果的に行うことはできるでしょうか?
LLAMA RLHFパイプライン
Meta AIのLlama 2モデルは、InstructGPTと似たRLHF手法を使用していますが、いくつかの注目すべき違いがあります:
- 2つの報酬モデル
- マージンロス
- 拒否サンプリング
2つの報酬モデル: Llama2は、助けになる度合いと安全性に焦点を当てた2つの報酬モデルを使用しています。モデルの最終的な最適化は、これら2つのスコアの組み合わせに基づいて行われます。
マージンロス: Llama2は、モデルの応答をランキングする際に「マージン」ラベルを導入し、好みの間隔を測定します。このマージンパラメータは、ランキングの損失計算を洗練するのに役立ちます。
リジェクションサンプリング: Llama2では、反復的なRLHFアプローチを使用して、モデルの複数バージョン(RLHF-V1からRLHF-V5まで)を作成します。PPOに加えて、リジェクションサンプリングも使用されています。
この手法では、複数の出力を生成し、最も高い報酬を選択して最適化中の勾配更新に使用します。これは、単一のサンプルに基づいて更新するPPOとは異なります。
最終的なパイプラインは次のようになります:
2つのうちより良い応答を選ぶことは、4つのセットをランク付けするよりも速いことがわかります。また、マージンを追加することで、モデルがより速く学習するのは理解できます。これは、クラシックな機械学習のトレーニングプロセスに類似しています。最後に、サンプルの拒否は、パイプの終わりで品質を向上させるための興味深い概念のように聞こえます。
名誉ある言及
コードに移る前に、他のRLHFテクニックをいくつかリストアップします:
研究者は、人間によって提供された一連のルールに基づく自己トレーニングメソッドを紹介しています。
この研究では、ヒンサイト指示ラベリング(HIR)という、プロンプトのサンプリングとトレーニングを含む2段階の方法を紹介しており、言語モデルが指示から逸脱する場合に効果的に変換します。
RLAIFに関する研究は、RLHFで報酬モデルトレーニングに使用される評価を、人間の入力だけでなく、LLMによって生成することができることを示しています。
ReSTは、サンプリングベースのアプローチを通じて言語モデルを人間の選好と調整し、徐々に高品質なサブセットで反復的に訓練することで、報酬関数を強化する方法です。
コーディングの時間です
完全なコードはGitHubで入手できます。
まず、使用する一般的なトレーニングおよびLora構成パラメータを定義する必要があります。これは、シリーズのファインチューニング部分から非常に似ています。
from transformers import TrainingArgumentsfrom peft import LoraConfig# Prepare training parameterstraining_args = TrainingArguments( output_dir="./train_logs", # 出力フォルダー max_steps=100, # 最大トレーニングステップ数 per_device_train_batch_size=4, # トレーニング用のGPUごとのバッチサイズ gradient_accumulation_steps=1, # 勾配を蓄積するステップ数 learning_rate=1.0e-4, # 学習率 optim="adamw_torch", # オプティマイザー save_steps=50, # チェックポイントを保存する頻度 logging_steps=10, # トレーニング情報をログする頻度 report_to="tensorboard", # 報告方法(この場合、TensorBoard) remove_unused_columns=False, # 未使用の列を削除するかどうか evaluation_strategy="steps", # 評価戦略 num_train_epochs=5, # トレーニングエポック数)# Prepare PEFT parameterspeft_config = LoraConfig( r=16, # rの値 lora_alpha=16, # lora_alphaの値 bias="none", # バイアス設定 task_type="SEQ_CLS", # タスクタイプ(シーケンス分類) modules_to_save=["scores"], # 保存するモジュール)
さあ、RLHFパイプラインを定義する時が来ました。
まず、データを定義しましょう。通常、RLHFは、不正解の質問データセットを持っている場合に製品化に優れています。たとえば、ネガティブな回答であるかもしれません。
後で、このデータセットを整形して分割して、モデルのトレーニングとテストに使用します。人間のフィードバックが備わっているため、強化学習のためのコードを指定しましょう:
from trl import RewardTrainer# Prepare RewardTrainertrainer = RewardTrainer( model=model, # 強化学習モデル tokenizer=tokenizer, # 入力データ処理のためのトークナイザー args=training_args, # トレーニング引数 train_dataset=formatted_dataset["train"], # トレーニングデータセット eval_dataset=formatted_dataset["test"], # 評価データセット peft_config=peft_config, # PEFTの設定 max_length=512, # 最大入力長)# トレーニングを実行trainer.train()# 事前学習済み報酬モデルを保存trainer.model.save_pretrained("./reward_model")
これだけで、人間のフィードバックを使用した強化学習を実行するために必要なものが揃いました!
今では、いつRLHFを使用するか、データの形式はどのようになるべきか、コードの実行方法を知っています。
これがPart 2dの終わりです。これにより、LangChain 101コースのModelsパートが終了します。
投稿に拍手し、フォローしてくれると、新しい記事を書く意欲がわきます 🙂
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