Auto Evol-Instructを実装してみる
はじめに
東京大学の松尾・岩澤研究室が主催する2024LLM講座に参加し、大規模言語モデルの勉強をさせて頂いております。この講座の終盤でコンペティション(課題は現時点で不明)が開催されることになっておりますが、良い結果を残すためには何かしら差別化できるような技術的な工夫が必須になると思われるので、事前調査をしているところです。
LLMに関して不勉強な小職の戯言なのですが、小規模かつ個人的な開発力でそれなりの成果を得るためには、蒸留など、先人の成果を最大限に活用した、技術的な応用が一つの鍵になるのではないかと、浅はかにも想定しております。その中でも特に合成データ(Synthetic Data)は、私のような超ナイーブな初学者でも工夫する余地があるように思いました。
特に面白そうな合成データ技術は無いかと調べてみたところ、「Auto Evol-Instruct」というWizardLM-2の開発に用いられた手法に興味が湧きました。Evol-Instructは既存の指示文をEvolving Method(進化のためのプロンプト)を使ってLLMに進化させる手法のことです。Auto Evol-InstructはこのEvolving Method自身もLLMで自動的に最適化させるアプローチのようです。面白そうですね。
Automatic Instruction Evolving for Large Language Models
ただ、どうやらpaperswithcode等でもまだコードが公開されていないようです。ついては、サンデー・プログラミングのお勉強を兼ねて実装してみることにしました(下記Github)。
前提
正直、原著論文の理解が不十分で、実装したと言えるレベルには程遠いです。また、幾つか把握できない点や現実的にトレースできそうに無い点があったため、以下のように都合よく仮定しております。
-
./client/concrete/inst_evol_gen.pyと./client/concrete/trajectory_analyser.pyに関わる処理Evol Trajectory Analysisに相当する処理において、instructionを複数回進化させるのですが、その処理を個別に行うとリクエスト数が重複しコスト的な負荷が高いです。そこで、1回のリクエストで複数回(10回程度)の進化を行い、その結果をまとめて出力するように処理しました。また、解析(Trajectory Analysis)に関する部分も1回のリクエストで複数同時に行うようにしています。
(langchainの理解が不十分で、この処理がinstructionの再帰的な進化を反映できているか厳密な検証はできていません) -
auto-evol-like/util/sentence_clustering.pyに関わる処理LLMから得られる複数の
feedbackの処理において、原著論文においてはある程度feedbackがカテゴライズかされているような記述がありますが、具体的な方法が読み取れませんでした。代案として、複数のfeedbackをベクトル化してクラスタリングし、代表的な文章をのみを取り出して利用するという処理でごまかしております。
結果
本技術の性質上、APIのリクエストがかなりの総数になります。環境を整える余裕が無いためgroqの無料枠(llama-3.1-70b-versatile)を用いて検証したのですが、現状groqで検討できる範囲では安定して稼働できておりません。
GPT-4o miniなどであればそれなりの結果は出そうなのですが、検証できるような環境が無いため、確認できませんでした。ついては、どなたかがより良いものを開発するための踏み台になれればと思い公開します。また、改善点や間違いがあればご指導いただければ幸いです。
参考リンク
参考にさせて頂きました。御礼申し上げます。
Discussion