a
SELF-REFINE: イテレーティブ・リファインメントとセルフフィードバック
大規模言語モデル(LLM)は、人間と同様に、常に最初の試みで最高の出力を生成するわけではない。人間がどのように文章を洗練させるかにヒントを得て、我々はSELF-REFINEを導入する。これは、イテレーティブなフィードバックと改良を通じてLLMの初期出力を改善するアプローチである。主なアイデアは、LLMを使用して初期出力を生成し、その後、同じLLMが自身の出力にフィードバックを提供し、それを使用して反復的に自己改良することである。SELF-REFINEは、教師あり訓練データ、追加の訓練、または強化学習を必要とせず、代わりに単一のLLMを生成器、改良器、フィードバック提供者として使用する。我々は、対話応答生成から数学的推論まで、7つの多様なタスクにわたってSELF-REFINEを評価し、最先端(GPT-3.5およびGPT-4)LLMを使用する。評価されたすべてのタスクにおいて、SELF-REFINEで生成された出力は、同じLLMを使用した従来の1ステップ生成と比較して、人間と自動評価指標の両方で好まれ、タスクのパフォーマンスで平均約20%の絶対的な改善を示した。我々の研究は、GPT-4のような最先端のLLMでさえ、我々のシンプルでスタンドアロンなアプローチを使用してテスト時にさらに改善できることを示している。
1. はじめに
大規模言語モデル(LLM)は一貫性のある出力を生成できるが、複雑な要件に対応する際にはしばしば不十分である。これは主に、複数の目的を持つタスクや、対話応答生成のような目標が明確に定義しにくいタスクを含む。これらのシナリオでは、現代のLLMは理解可能な初期出力を生成する可能性があるが、望ましい品質を確保するためにさらなる反復的な改良、つまり候補出力をより良いものに反復的にマッピングすることが有益である可能性がある。反復的な改良には通常、ドメイン固有のデータに依存する改良モデルのトレーニングが含まれる(例: Reid and Neubig (2022); Schick et al. (2022a); Welleck et al. (2022))。外部の監督や報酬モデルに依存する他のアプローチは、大規模なトレーニングセットや高価な人間のアノテーションを必要とし(Madaan et al., 2021; Ouyang et al., 2022)、これらは常に入手可能とは限らない。これらの制限は、広範な監督を必要とせずに様々なタスクに適用できる効果的な改良アプローチの必要性を強調している。
反復的な自己改良は、人間の問題解決の基本的な特徴である(Simon, 1962; Flower and Hayes, 1981; Amabile, 1983)。反復的な自己改良は、初期の下書きを作成し、その後自己提供のフィードバックに基づいてそれを改良するプロセスを含む。例えば、同僚に文書を要求するメールを作成する際、個人は最初に「データをASAPで送って」というような直接的な要求を書くかもしれない。しかし、反省すると、書き手はこの言い回しの潜在的な無礼さを認識し、「こんにちは、アシュリー。データを都合のよいときに送っていただけますか?」と修正するかもしれない。コードを書く際、プログラマーは最初に「クイック&ダーティ」な実装を行い、その後、反省して、より効率的で読みやすいソリューションにコードをリファクタリングするかもしれない。本論文では、LLMが追加のトレーニングなしで反復的な自己改良を提供でき、幅広いタスクでより高品質の出力につながることを実証する。
我々はSELF-REFINEを提出する:2つの生成ステップ - FEEDBACKとREFINE - を交互に行う反復的な自己改良アルゴリズムである。これらのステップは協調して高品質の出力を生成する。モデルMによって生成された初期出力が与えられると、我々はそれを同じモデルMに戻してフィードバックを得る。その後、フィードバックは同じモデルに戻され、以前に生成された下書きを改良する。このプロセスは、指定された回数の反復を行うか、またはMがさらなる改良が不要だと判断するまで繰り返される。我々は、フューショット・プロンプティング(Brown et al., 2020)を使用して、Mがフィードバックを生成し、改良された下書きにフィードバックを組み込むよう導く。図1は、SELF-REFINEが同じ基礎となる言語モデルを使用してフィードバックを生成し、出力を改良するという高レベルのアイデアを示している。
我々は、自然言語とソースコード生成を含む多様な領域にまたがる7つの生成タスクでSELF-REFINEを評価する。我々は、SELF-REFINEがGPT-3.5(text-davinci-003およびgpt-3.5-turbo; OpenAI; Ouyang et al., 2022)やGPT-4(OpenAI, 2023)などの強力なLLMからの直接生成を5-40%の絶対的な改善で上回ることを示す。コード生成タスクでは、SELF-REFINEはCodex(code-davinci-002; Chen et al., 2021)などの強力なコードモデルに適用された場合、初期生成を最大13%絶対的に改善する。我々は、他のLLMに容易に拡張可能なすべてのコードをリリースする。本質的に、我々の結果は、LLMが最初の試みで最適な出力を生成できない場合でも、LLMはしばしば有用なフィードバックを提供し、それに応じて自身の出力を改善できることを示している。その結果、SELF-REFINEは、イテレーティブな(自己)フィードバックと改良を通じて、追加のトレーニングなしで単一のモデルからより良い出力を得るための効果的な方法を提供する。
2. SELF-REFINEによるイテレーティブ・リファインメント
入力シーケンスが与えられると、SELF-REFINEは初期出力を生成し、その出力にフィードバックを提供し、フィードバックに従って出力を改良する。SELF-REFINEは、望ましい条件が満たされるまでフィードバックと改良を繰り返す。SELF-REFINEは適切な言語モデルと3つのプロンプト(初期生成、フィードバック、改良用)に依存し、トレーニングを必要としない。SELF-REFINEは図1とアルゴリズム1に示されている。次に、SELF-REFINEをより詳細に説明する。
初期生成 入力x、プロンプトp_gen、モデルMが与えられると、SELF-REFINEは初期出力y_0を生成する:
y_0 = M(p_gen || x) (1)
例えば、図2(d)では、モデルは与えられた入力に対して機能的に正しいコードを生成する。ここで、p_genはタスクに特化した数ショットプロンプト(または指示)であり、||は連結を表す。フューショットプロンプトにはタスクの入力-出力ペア<x^(k), y^(k)>が含まれる。
FEEDBACK 次に、SELF-REFINEは、フィードバックを生成するためのタスク固有のプロンプトp_fbが与えられた場合に、同じモデルMを使用して自身の出力に対するフィードバックfb_tを提供する:
fb_t = M(p_fb || x || y_t) (2)
直感的に、フィードバックは出力の複数の側面に対応する可能性がある。例えば、コード最適化では、フィードバックはコードの効率性、可読性、全体的な品質に対応する可能性がある。
ここで、プロンプトp_fbは入力-出力-フィードバックの3つ組<x^(k), y^(k), fb^(k)>の形式でフィードバックの例を提供する。我々はfb^(k)を通じて、実行可能で具体的なフィードバックを書くようモデルにプロンプトする。「実行可能」とは、フィードバックが出力を改善する可能性が高い具体的なアクションを含むべきであることを意味する。「具体的」とは、フィードバックが変更すべき出力内の具体的なフレーズを特定すべきであることを意味する。
例えば、図2(e)のフィードバックは「このコードはfor loopを使用しているため遅いです。これはブルートフォースです。より良いアプローチは...(n(n+1))/2の公式を使用することです」である。このフィードバックは実行可能である。なぜなら、「...公式を使用する」というアクションを提案しているからである。フィードバックは具体的である。なぜなら、「for loop」に言及しているからである。
REFINE 次に、SELF-REFINEはMを使用して、自身のフィードバックを与えられた最新の出力を改良する:
y_(t+1) = M(p_refine || x || y_t || fb_t) (3)
例えば、図2(f)では、初期出力と生成されたフィードバックを与えられると、モデルは初期実装よりもはるかに短く、速く実行される再実装を生成する。プロンプトp_refineは、入力-出力-フィードバック-改良された4つ組<x^(k), y^(k)_t, fb^(k)_t, y^(k)_(t+1)>の形式で、フィードバックに基づいて出力を改善する例を提供する。
SELF-REFINEの反復 SELF-REFINEは、停止条件が満たされるまでFEEDBACKとREFINEのステップを交互に行う。停止条件stop(fb_t, t)は、指定されたタイムステップtで停止するか、フィードバックから停止指標(例えば、スカラーの停止スコア)を抽出する。実際には、モデルはp_fbで停止指標を生成するようにプロンプトされ、条件はタスクごとに決定される。
モデルに以前の反復について知らせるために、我々は以前のフィードバックと出力の履歴をプロンプトに追加することで保持する。直感的に、これによりモデルは過去の間違いから学び、それらを繰り返すことを避けることができる。より正確には、式(3)は実際には以下のように具体化される:
y_(t+1) = M(p_refine || x || y_0 || fb_0 || ... || y_t || fb_t) (4)
最後に、我々はSELF-REFINEの出力として最後の改良y_tを使用する。
アルゴリズム1はSELF-REFINEを要約し、図2は対話応答生成(Mehri and Eskenazi, 2020)とコード最適化(Madaan et al., 2023)タスクにおけるSELF-REFINEの例を示している。付録Sは様々なタスクに対するp_gen、p_fb、p_refineプロンプトの例を提供している。重要なアイデアは、SELF-REFINEが同じ基礎となるLLMを使用して、出力を生成し、フィードバックを得て、自身のフィードバックに基づいて出力を改良することである。フューショットの例に存在する監督にのみ依存する。
3. 評価
我々は7つの多様なタスクでSELF-REFINEを評価する: 対話応答生成(付録M; Mehri and Eskenazi, 2020)、コード最適化(付録N; Madaan et al., 2023)、コード可読性向上(付録L; Puri et al., 2021)、数学的推論(付録O; Cobbe et al., 2021)、感情反転(付録P; Zhang et al., 2015)、そして我々が導入する2つの新しいタスク: 頭字語生成(付録Q)と制約付き生成(Lin et al. (2020)のより難しいバージョンで、3-5ではなく20-30のキーワード制約を含む; 付録R)
すべてのタスクの例とデータセットの統計は表4(付録A)に示されている。
3.1 SELF-REFINEの具体化
我々はセクション2の高レベルな説明に従ってSELF-REFINEを具体化する。FEEDBACK-REFINEの反復は、望ましい