はじめに
すべてのエンチャントを破壊する。 nikkieです
4月末に複数の勉強会でLLMのプロンプトについてインプットしました。
復習またハーケンとして、今回アウトプットします
目次
- はじめに
- 目次
- プロンプトってなんだったっけ?『大規模言語モデル入門』にあたる
- hoge-shotというのは、文脈内学習!
- 多段階の推論とchain-of-thought
- 例はからあげさんの登壇から(松尾研 Beginning LLM Level.1)
- 松尾研 LLM コミュニティ "Paper & Hacks Vol.03"
- 終わりに
- P.S. Chain-of-Thoughtを打ち切る!?
プロンプトってなんだったっけ?『大規模言語モデル入門』にあたる
「4.2 プロンプトによる言語モデルの制御」を参照します
モデルの大規模化にともなって、従来はファインチューニングを行わないと解けないと思われていた多くのタスクが、モデルにプロンプトと呼ばれるテキストを入力して後続するテキストを予測するという単純な方法で解けることがわかってきました。(Kindle版 p.121)
そうそう!数年前のBERTが主流だった頃はタスク専用にファインチューニングしていた1んですよ!
ところが(今から振り返ると)GPT-3が契機で、後続テキストを予測させる形で解けるようになったんですね。
後続テキストを予測させる形で解くとは、例えば日本の首都を知りたいときに
- プロンプトとして「日本の首都は」と入力し
- 後続テキストに「東京」と来ることを期待する
ようなやりかたです。
例えば、以下の記事に見られます2
ファインチューニングでタスク専用モデルを作らずに、1つのモデル+プロンプトで済ませられるというのは便利です。
しかも、プロンプトは自然言語で済むという!
いやー、これはゲームチャンジャーですね。
なお、GPT-3の先のChatGPT(GPT-3.5)などは、プロンプトをチャット形式で質問しても機能するように調整されています3(またの機会に)
hoge-shotというのは、文脈内学習!
『大規模言語モデル入門』4.2の中に「文脈内学習」の解説があります。
プロンプトを使ってタスクを解く際に有効な方法の一つに例示を与える方法があります。(Kindle版 p.123)
この例示の与えるプロンプトが、hoge-shotと言われるやつです。
- one-shot learning:1例与える
- アメリカの首都はワシントン。日本の首都は(きしださんブログ)
- 翻訳を解かせたい場合、翻訳例を1例与える
- few-shot learning:数例与える
- 翻訳例を数例与える
- zero-shot learning:例を与えない
- 「翻訳してください」だけ
one-shot / few-shot learningは推論時に学習させる方法というわけですね(モデルの重みを更新しない点で、ファインチューニングと異なる)。
few-shot learningは文脈内学習(in-context learning)とも言われるそうです。
このfew-shot learningまでが、GPT-3の論文で提案されていたのです!
For all tasks, GPT-3 is applied without any gradient updates or fine-tuning, with tasks and few-shot demonstrations specified purely via text interaction with the model.
ChatGPT以後注目を浴びている印象ですが、最近できたばかりの技術ではないのですね
多段階の推論とchain-of-thought
『大規模言語モデル入門』4.2には別の話題として「多段階の推論」があります(推論はreasoningの訳語)。
言語モデルは多段階推論が苦手と導入されます。
こうした複数の段階の推論が必要な際に、推論過程の例示を与えるchain-of-thought推論(chain-of-thought reasoning)を用いると性能が改善することが報告されています (Kindle版 p.129)
文脈内学習のように例を与えるわけですが、推論過程を例として示すことでうまくいくという!
提案論文はこちら
In particular, we show how such reasoning abilities emerge naturally in sufficiently large language models via a simple method called chain of thought prompting, where a few chain of thought demonstrations are provided as exemplars in prompting.
そして、chain-of-thought promptingにはzero-shot learning版が存在するのです!4
それがよく言われる「ステップ・バイ・ステップで考えましょう(Let's think step by step)」。
これだけプロンプトに書いて、推論過程の例示は無しで、うまくいくという!
例はからあげさんの登壇から(松尾研 Beginning LLM Level.1)
焼きちゃんぽんの作り方を題材に、文脈内学習・chain-of-thoughtの例が示されます!5
zero-shot learning
(からあげさんのスライドから見やすさのために整形、かつ、「日本語でお願いします」は省略しています)
1人前で水500mlを沸騰させるというレシピがあります。 2人前以上を一緒に作る場合1人前あたり100cc水を減らしてください。と書いてあります。 4人前だと水はどれだけになりますか?
few-shot learning
1人前で水500mlを沸騰させるというレシピがあります。 2人前以上を一緒に作る場合1人前あたり100cc水を減らしてください。と書いてあります。 4人前だと水はどれだけになりますか? +以下は他の人数の例です。 +2人前だと800ml +3人前だと1200ml
chain-of-thought reasoning
1人前で水500mlを沸騰させるというレシピがあります。 2人前以上を一緒に作る場合1人前あたり100cc水を減らしてください。と書いてあります。 4人前だと水はどれだけになりますか? +以下は他の人数の例です。 +2人前だと1人前500mlなので500×2=1000mlで、1人前あたり100ml減らすので100ml×2=200mlで1000ml-200ml=800ml
zero-shot chain-of-thought reasoning
1人前で水500mlを沸騰させるというレシピがあります。 2人前以上を一緒に作る場合1人前あたり100cc水を減らしてください。と書いてあります。 4人前だと水はどれだけになりますか? +ステップバイステップで考えてください。
焼きちゃんぽんという題材がうまく、文脈内学習やCoT(chain-of-thought)それぞれの差分が分かりやすくて見事でした👏
松尾研 LLM コミュニティ "Paper & Hacks Vol.03"
からあげさんの前週に、少しだけ専門的な形でも取り上げられていました(松尾研 原田さん)
上で挙げた論文も引かれています
- プロンプティング
- プロンプティングのtips6
- いくつかデモを見せる、few-shot prompting
- 結論に至るまでの思考過程を出力させる(CoT)
終わりに
LLMのプロンプトまわりを基本に立ち戻りました。
- 自然言語でプロンプトを与えて、後続テキストを予測させる形で多くのタスクが解けることがわかった
- プロンプトに例示を与える(few-shot learning)と、性能が改善する(GPT-3の論文)
- 文脈内学習と呼ばれる
- 例示を与えない=zero-shot learning(=単に後続テキストを予測させるだけ)
- 推論過程の例示を与える(chain-of-thought reasoning)と、性能が改善することがわかった
- zero-shot chain-of-thought reasoning:「ステップバイステップで考えましょう」
few-shot, CoTといった用語を一次情報の近くまで立ち戻って整理できたので、私としては大満足です!
このあたりは松尾研の大規模言語モデル講座資料にもあります(Day2)。
https://weblab.t.u-tokyo.ac.jp/llm_contents/
なんというかLLMを使う上での基本の知識になってくる(すでになっている?)のかなと思います
『大規模言語モデル入門』ではこの先のプロンプトエンジニアリングのリソースとしてこちらが紹介されていました。
P.S. Chain-of-Thoughtを打ち切る!?
メルカリさんの事例の中で気になっている点です。
工夫した点 4. max_tokensとCoTの活用によるLLM予測の高速化
ChatGPT 3.5 turbo + 精度向上のためのCoT
ChatGPTに説明を行わせるとずっと喋り続けることもあり、処理時間が問題となりました。そこで、max_tokensパラメータを利用して長い話を途中で打ち切ることで処理時間の短縮に努めました。
打ち切って生成されるJSON
{"item_category_id": 1, "reason": "商品名に「ぬいぐるみ」が含まれ"}
ここでやっているのはzero-shot chain-of-thought reasoning寄りだと思います(推論過程の例示を与えていないので)。
「ステップ・バイ・ステップで考えましょう」って、推論過程 -> 結論の順でLLMが出力するので精度が上がり、それには出力トークンが必要なので処理時間や料金の増加はやむを得ないと私はとらえていました。
メルカリさん記事によると「ステップ・バイ・ステップで考えましょう」で結論からまず返すようにプロンプトできるってことなのかな(本当に精度は上がっている??)