はじめに
この記事はAIで作成されています。multi-modal LLM関連のメモを記載しています。
目次
- プロンプト最適化の全体像
- ① AutoPrompt
- ② APE(Automatic Prompt Engineer)
- ③ Prompt Tuning
- よくある質問
- 最後に:3手法の比較とまとめ
- 参考文献
プロンプト最適化
プロンプト最適化は、モデルのタスク性能を高めるために、モデルへ与える入力やプロンプトを設計・探索・学習する方法の総称である。ここでは、代表的な3手法を、最適化する対象の違いから整理する。
| 手法 | 最適化するもの | 表現 | 主な探索・学習方法 | 代表的な対象 |
|---|---|---|---|---|
| AutoPrompt | プロンプト中のトークン | 離散トークン列 | 勾配情報を利用したトークン候補の探索 | マスク言語モデルの穴埋め形式タスク、知識抽出 |
| APE | タスク指示文 | 人間が読める自然言語 | LLMによる候補生成と、評価スコアに基づく選択 | 指示に従うLLMのゼロショットタスク |
| Prompt Tuning | 追加するプロンプト表現 | 学習可能な連続ベクトル(ソフトプロンプト) | 誤差逆伝播によるベクトルの学習 | 固定した事前学習済みモデルの下流タスク適応 |
これらは「プロンプトを改善する」という目的を共有するが、同じ種類のプロンプトを扱っているわけではない。AutoPromptとAPEは主に離散的なテキスト候補を探索し、Prompt Tuningは人が読める文章ではない連続ベクトルを学習する。
なお、「Prompt Tuning」は一般名詞として広く使われることがある。本記事では、Lester, Al-Rfou, and Constant(2021)の論文 The Power of Scale for Parameter-Efficient Prompt Tuning が提案・評価した手法を指す。
① AutoPrompt
AutoPrompt は、マスク言語モデルなどに対するプロンプトを、勾配に導かれた探索で自動的に作る手法である。
論文名: AutoPrompt: Eliciting Knowledge from Language Models with Automatically Generated Prompts
著者: Taylor Shin, Yasaman Razeghi, Robert L. Logan IV, Eric Wallace, Sameer Singh
発表先: EMNLP 2020(Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing), pp. 4222–4235
公開日: arXiv初版 2020-10-29(v2改訂 2020-11-07)。会議論文は2020年11月刊行(EMNLP 2020は11月16–20日開催)。
公式論文URL: ACL Anthology | arXiv | DOI
✅ ポイント
- モデルに入れる「穴埋め問題の文」を、勾配を手がかりに自動で調整。例:入力: この映画は [トリガー語1] [トリガー語2] [MASK]。正解ラベル: すばらしい。→トリガー語1,2を最適化
- 自然言語のタスクを穴埋め形式(cloze format)にし、モデルが予測するマスク位置の語から答えを得る。
- 人手で作ると試行錯誤が必要になるトリガー語(prompt tokens)を、勾配情報を使って候補探索する。
- 論文では、マスク言語モデルを追加パラメータやタスク固有のファインチューニングなしで、感情分析、自然言語推論、事実知識の抽出などに使えることを検証した。
- これはソフトプロンプトのように連続ベクトルを直接学習する方式ではなく、語彙に含まれる離散トークン列を選ぶ方式である。
- 探索対象のモデルにアクセスでき、勾配情報を利用できることが前提になる。ブラックボックスAPIしか使えない状況には、そのまま適用しにくい。
🧪 探索の概略疑似コード
# マスク言語モデル、タスク用のテンプレート、学習例を用意
initialize(masked_language_model, prompt_template, examples)
trigger_tokens = initialize_trigger_tokens()
while not converged:
batch = sample(examples)
# 入力文にトリガー語を挿入し、マスク位置の予測を得る
masked_inputs = build_cloze_inputs(batch, trigger_tokens, prompt_template)
loss = task_loss(masked_language_model(masked_inputs), batch.labels)
# 損失の勾配から、各位置で有望な語彙トークン候補を探す
gradients = gradient_wrt_trigger_embeddings(loss)
candidates = propose_token_replacements(trigger_tokens, gradients)
# 候補を評価し、スコアが改善する置換を採用
trigger_tokens = select_improving_replacements(candidates, examples)
上は手法の考え方を示す簡略化した疑似コードであり、論文中の実装をそのまま再現するものではない。実際には、語彙候補の選定や複数位置の更新などを含む勾配誘導型の探索を行う。
🧮 勾配に基づく候補の考え方
プロンプト中の位置 (i) のトークンを (t_i)、その埋め込みを (e(t_i))、タスク損失を ℒ とする。埋め込みに関する勾配
$$
g_i = \nabla_{e(t_i)} \mathcal{L}
$$
を使い、現在のトークンを語彙中の候補 (w) に置き換えたときに損失を下げそうかを一次近似で見積もる。
$$
\Delta \mathcal{L}(w) \approx g_i^\top (e(w)-e(t_i))
$$
候補をこの近似で絞り、実際に評価して改善するトークンを選ぶ。これにより、すべてのトークン列を総当たりせずに探索できる。
❓ よくある質問
Q. AutoPromptは通常の文章を生成するの?
- 必ずしも自然で読みやすい指示文を作るわけではない。
- 目標はモデルのタスクスコアを高めるトークン列を見つけることであり、人間にとって意味が通る文章になるとは限らない。
Q. AutoPromptはファインチューニングなの?
- 代表的な設定では、モデルの重みを更新せず、プロンプトのトークンを探索する。
- その意味で、モデル本体を学習するファインチューニングとは異なる。
Q. どのモデルにも使えるの?
- 論文の中心は、マスク位置の予測を利用するマスク言語モデルである。
- 勾配情報を必要とするため、勾配を取得できない閉じたAPIモデルにそのまま適用する手法ではない。
② APE(Automatic Prompt Engineer)
APE は、LLMを使って自然言語の指示候補を作り、別のLLMなどで候補を評価して、性能の高い指示を選択する枠組みである。
論文名: Large Language Models Are Human-Level Prompt Engineers
著者: Yongchao Zhou, Andrei Ioan Muresanu, Ziwen Han, Keiran Paster, Silviu Pitis, Harris Chan, Jimmy Ba
発表先: ICLR 2023(International Conference on Learning Representations)
公開日: arXiv初版 2022-11-03(v2改訂 2023-03-10)。学会版はICLR 2023の会議論文。
公式論文URL: arXiv | OpenReview PDF | ICLR 2023論文一覧
✅ ポイント
- プロンプトを「プログラム」とみなし、タスクを実行するモデルの出力スコアを最大化する指示を探索する。
- 入出力例などから、候補生成用のLLMに複数の自然言語指示を作らせる。
- 各指示を評価用モデルに与え、検証データ上の正解率など、定義したスコア関数で評価する。
- スコアの高い指示を選ぶ。必要に応じ、候補生成と評価を反復する。
- 24のNLPタスクを使った論文の実験では、19タスクで人間のアノテーターが作った指示と同等以上の結果を報告している。これは論文内の実験条件での結果であり、あらゆるモデルやタスクで人間を上回るという意味ではない。
- AutoPromptと異なり、候補は原則として人が読める自然言語の指示である。モデルの内部勾配を使わずに探索できる一方、候補生成・評価にLLMの呼び出しやラベル付き評価例が必要になることがある。
🧪 APEの概略疑似コード
# タスクの入出力例、候補生成モデル、候補評価モデルを用意
examples = load_task_examples()
# 入出力例から自然言語の指示候補を生成
instructions = instruction_generator.propose(examples)
scored_candidates = []
for instruction in instructions:
# 評価用データで指示の性能を測る
score = evaluate_instruction(
model=evaluator_model,
instruction=instruction,
examples=validation_examples,
metric=task_metric
)
scored_candidates.append((instruction, score))
# 最高スコアの指示を選択
best_instruction = max(scored_candidates, key=lambda item: item[1])[0]
論文の方法は、候補を生成するプロンプト、候補のサンプリング、スコアの種類などを含む。上記は「生成→評価→選択」という中核を示した簡略化である。
🧮 最適化問題としての表現
指示候補の集合を ℱ、指示 (I) を実行したモデルの出力を $(y\sim p_\theta(y\mid x,I))$、評価データを $(D_{eval})$、評価関数を $(S)$ とする。APEは概念的に次の指示を探す。
$$
I^* = \arg\max_{I\in\mathcal{I}}
S\bigl(p_\theta(\cdot\mid x,I), D_{eval}\bigr)
$$
ここで重要なのは、候補指示を生成するモデルと、その候補を実行・評価するモデルを分けて考えられる点である。目的に応じて、正解率、望ましい回答特性、別の評価器によるスコアなどを設定する。
❓ よくある質問
Q. APEは何を自動化するの?
- 指示文の候補作成と、候補の評価・選択を自動化する。
- タスクの定義や評価指標、評価用データを用意する作業までなくなるわけではない。
Q. APEとAutoPromptはどちらも離散プロンプト探索?
- 広い意味ではどちらも候補を探索するが、候補の作り方と表現が異なる。
- AutoPromptは勾配情報から離散トークンを探索する。APEはLLMが自然言語の指示候補を生成し、評価スコアで選択する。
Q. APEの指示はどのモデルにもそのまま使える?
- 指示の良し悪しは、評価に使ったモデルや設定に依存する。
- 別モデルに移すと性能が変わるため、対象モデル上で評価し直すのが基本である。
③ Prompt Tuning
Prompt Tuning は、モデル本体の重みを固定したまま、入力に追加する学習可能な連続ベクトル(ソフトプロンプト)を、教師ありデータなどから学習する方法である。
論文名: The Power of Scale for Parameter-Efficient Prompt Tuning
著者: Brian Lester, Rami Al-Rfou, Noah Constant
発表先: EMNLP 2021(Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing), pp. 3045–3059
公開日: arXiv初版 2021-04-18(v2改訂 2021-09-02)。会議論文は2021年11月刊行。
公式論文URL: ACL Anthology | arXiv | DOI
✅ ポイント
- 通常のテキストプロンプトは、語彙から選ばれる離散トークンで書かれる。Prompt Tuningでは、入力表現に学習可能なベクトル列を追加する。
- 学習中はモデル本体のパラメータを凍結し、追加ベクトルだけを誤差逆伝播で更新する。
- ソフトプロンプトは通常、人間が読める文章ではない。自然言語として解釈できる必要はない。
- 全モデルをタスクごとに保存・配布する代わりに、共通の凍結モデルとタスクごとの小さなプロンプトパラメータを使うことで、保存・配布コストを抑えられる。
- 論文はT5のモデル規模を比較し、モデルが大きくなるにつれてPrompt Tuningがモデル全体のチューニングに近い性能になることを報告した。これは論文の実験設定に基づく傾向であり、すべてのモデル・タスクで同じ性能になる保証ではない。
- 「ソフトプロンプト」は学習対象の表現形式、「Prompt Tuning」はそれを学習する方法として理解すると区別しやすい。
🧪 学習の疑似コード
# 事前学習済みモデルを読み込み、重みを固定
model = load_pretrained_model()
freeze(model.parameters())
# 入力埋め込みと同じ次元の学習可能なプロンプトベクトルを初期化
soft_prompt = initialize_trainable_vectors(prompt_length, embedding_dim)
while not converged:
inputs, labels = sample_labeled_batch()
# ソフトプロンプトを入力埋め込み列の先頭などに連結
input_embeddings = embed(inputs)
conditioned_embeddings = concatenate(soft_prompt, input_embeddings)
# モデル本体は固定したまま、タスク損失を計算
predictions = model(inputs_embeds=conditioned_embeddings)
loss = task_loss(predictions, labels)
# 更新対象はソフトプロンプトのみ
update(soft_prompt, loss)
🧮 最適化の計算式
入力トークン列 $x$ の埋め込みを $E(x)$、学習可能なソフトプロンプトを $P\in\mathbb{R}^{m\times d}$、凍結されたモデルを $f_\theta$ とする。モデルへの入力は、概念的に次のように作る。
$$
\tilde{E}(x)=[P;E(x)]
$$
ここで (m) はプロンプトベクトルの個数、(d) は埋め込み次元である。学習ではモデル重み θ を固定し、タスクデータ (D) 上の損失を最小化する。
$$
P^* = \arg\min_{P} \mathbb{E}_{(x,y)\sim D}{\mathcal{L(f\theta([P; E(x)]),y)}}
$$
つまり、更新するのは通常 $P$ であり、$\theta$ は固定する。このため、タスクごとに保持する学習パラメータを小さくできる。
❓ よくある質問
Q. Soft PromptとPrompt Tuningは同じ意味?
- 厳密には役割が異なる。
- Soft Promptは学習可能な連続ベクトル列という「表現」。Prompt Tuningは、そのベクトル列を凍結モデルに付加して学習する「手法」である。
Q. Prompt Tuningではモデルを一切学習しないの?
- モデル本体の重みは固定するが、ソフトプロンプトは学習する。
- したがって「学習なし」ではなく、「学習対象を小さなプロンプトパラメータに限定する」方法である。
Q. 学習後のプロンプトは文章として読める?
- 一般には読めない連続ベクトルである。
- トークンIDに変換して表示する通常の文章プロンプトとは異なる。
Q. Prefix Tuningとは同じ?
- 関連するパラメータ効率の高い適応手法だが、同一ではない。
- Lesterらの論文ではPrompt TuningをPrefix Tuningの簡略化として位置づけて比較している。実装上の挿入位置や学習する表現が異なる。
よくある質問
Q. 3手法はどれも「プロンプト最適化」なの?
- はい。タスク性能を高めるプロンプト関連の入力を、探索または学習で決めるという広い目的を共有する。
- ただし、AutoPromptとAPEは主に離散的なトークン列・指示文を候補から選び、Prompt Tuningは連続値ベクトルを学習する。
Q. どの手法を選べばよい?
- モデルの勾配にアクセスでき、マスク言語モデル向けのトークン探索を行う: AutoPromptの考え方が近い。
- LLMに自然言語の指示候補を作らせ、実行スコアで選びたい: APEが近い。
- 学習データとモデル重みへの学習環境があり、モデル本体を固定してタスク適応したい: Prompt Tuningが近い。
- 利用できるモデル、評価データ、計算資源、プロンプトを人間が読む必要があるかを合わせて判断する。
Q. APEで選んだ指示とPrompt Tuningを組み合わせられる?
- 概念上は、自然言語指示と学習済みソフトプロンプトを同じ入力に併用する設計は可能である。
- ただし、この3論文がその組み合わせを共通の標準手順として提案しているわけではない。併用時は、個別に性能を評価する必要がある。
最後に:3手法の比較とまとめ
| 比較項目 | AutoPrompt | APE | Prompt Tuning |
|---|---|---|---|
| 論文 | AutoPrompt: Eliciting Knowledge from Language Models with Automatically Generated Prompts | Large Language Models Are Human-Level Prompt Engineers | The Power of Scale for Parameter-Efficient Prompt Tuning |
| 発表先・年 | EMNLP 2020 | ICLR 2023(arXiv 2022) | EMNLP 2021 |
| 最適化対象 | トリガーとなる離散トークン列 | 自然言語の指示文 | 連続値のソフトプロンプト |
| 方法 | 勾配誘導型のトークン候補探索 | LLMで候補生成し、評価して選択 | 誤差逆伝播でベクトルを学習 |
| モデル本体の更新 | 代表的設定では更新しない | 通常、候補生成・評価対象モデルの重みは更新しない | 凍結する |
| 人間が読めるか | 必ずしも読めない | 読める自然言語 | 通常は読めない |
| 主な強み | 勾配を利用した離散トークン探索 | 既存のLLMを使って指示文を自動探索 | 少数のパラメータでタスク適応できる |
| 主な制約 | 勾配アクセスや対応モデルに依存 | 評価コスト・データ・評価指標に依存 | 学習環境が必要で、ベクトル自体は自然文でない |
まとめると、3手法の違いは「どの形のプロンプトを、どの情報で最適化するか」にある。AutoPromptはモデルの勾配情報を手がかりに離散トークンを探索する。APEはLLMが自然言語の指示案を作り、その実行結果を基準に選択する。Prompt Tuningは連続ベクトルを学習し、凍結したモデルの入力をタスクに適応させる。
したがって、これらは同じアルゴリズムの別名ではなく、プロンプト最適化という大きな枠組みの中にある異なるアプローチである。