日本語版GPTにおけるzero shot, one shot, few shotでは、どのようにプロンプトを設定すればよいのか?いろいろと試してみた
昨今の自然言語処理の分野における進歩は著しく、今後も発展していくと考えられます。それらの流れの中でGPT-3、GLaM、LaMDAなど様々な大規模言語モデルが発表されており、これらのモデルのように大規模なモデルではそのモデルだけでいくつものタスクをこなせることが分かっています。そこで、rinna社が公開した13億のパラメータを持つGPTを用いて、どのようなプロンプトで推論すればいいのかを検証していきたいと思います。
zero shot, one shot, few shotとは
zero shotとは、推論時にはタスクに関する説明のみが与えられ、例は全く与えられないケースです。
# zero shot
Translate English to Japanese:
Cheese =>
一方でone shotとは、推論時にはタスクに関する説明と1つの例が与えられるケースです。
# one shot
Translate English to Japanese:
Tomato => とまと
Cheese =>
以上の説明からも分かる通りfew shotは、推論時にはタスクに関する説明と2つ以上の例が与えられるケースのことを指します。
# few shot
Translate English to Japanese:
Tomato => とまと
Cheese => チーズ
King =>
rinnaのGPT
rinnaが公開したGPTについてはこちらにまとめています。こちらでは、ポジネガ判定・Question and Answer・足し算のタスクを試しています。
適切なプロンプトを考える
タスクは上記の記事でまだやっていない翻訳を試していきます。また、それぞれのプロンプトにおいて例を1つずつ増やしていき、10回試してどれくらい正解できるのかを見ていきます。最大で9個まで例を増やし、9個まで増やした場合の例の順番は次の通りに固定します。
"""
英語から日本語に翻訳して:
Cheese => チーズ
Apple => りんご
King => 王様
September => 9月
Winter => 冬
Night => 夜
Dog => 犬
Chair => 椅子
Car => 車
egg =>
"""
さらに、GPTに何のタスクなのかを認識させるために「英語から日本語に翻訳して」という文を入れています。今回は固定して検証していますが、この部分を変更しても精度は変化すると思います。
英語モデルと同じプロンプト
まずは英語モデルにおけるプロンプトをマネして次のように推論してみます。
"""
英語から日本語に翻訳して:
Cheese => チーズ
Apple => りんご
King => 王様
September => 9月
Winter => 冬
Night => 夜
Dog => 犬
Chair => 椅子
Car => 車
egg =>
"""
結果はこちらです。
example | accuracy |
0 | 0 |
1 | 0 |
2 | 0 |
3 | 0 |
4 | 0.1 |
5 | 0.1 |
6 | 0.7 |
7 | 0.2 |
8 | 0.4 |
9 | 0.2 |
=>を=にしたプロンプト
=>だと何だか冗長なので=にして推論してみます。
"""
英語から日本語に翻訳して:
Cheese = チーズ
Apple = りんご
King = 王様
September = 9月
Winter = 冬
Night = 夜
Dog = 犬
Chair = 椅子
Car = 車
egg =
"""
結果はこちらです。
example | accuracy |
0 | 0 |
1 | 0 |
2 | 0.1 |
3 | 0 |
4 | 0.5 |
5 | 0.7 |
6 | 0.8 |
7 | 0.4 |
8 | 0.4 |
9 | 0.2 |
=の両側にある空白を取り除いたプロンプト
日本語を考えたときに英語のような空白の使われ方はしてないので、思い切って=の両側にある空白を取り除いて推論してみます。
"""
英語から日本語に翻訳して:
Cheese=チーズ
Apple=りんご
King=王様
September=9月
Winter=冬
Night=夜
Dog=犬
Chair=椅子
Car=車
egg=
"""
結果はこちらです。
example | accuracy |
0 | 0 |
1 | 0.9 |
2 | 0.7 |
3 | 0 |
4 | 0.7 |
5 | 0.6 |
6 | 1 |
7 | 0.6 |
8 | 0.8 |
9 | 0.6 |
=を→にしたプロンプト
では、=ではなく→にした場合も試してみます。
"""
英語から日本語に翻訳して:
Cheese→チーズ
Apple→りんご
King→王様
September→9月
Winter→冬
Night→夜
Dog→犬
Chair→椅子
Car→車
egg→
"""
結果はこちらです。
example | accuracy |
0 | 0 |
1 | 0.5 |
2 | 0.3 |
3 | 0 |
4 | 0.3 |
5 | 0.3 |
6 | 0.7 |
7 | 0.5 |
8 | 0.6 |
9 | 0.4 |
日本語で関係を教えるプロンプト
日本語なのだから日本語で教えるべき!ということで=などの意味合いを日本語で教えてみます。
"""
英語から日本語に翻訳して:
Cheeseは日本語でチーズ
Appleは日本語でりんご
Kingは日本語で王様
Septemberは日本語で9月
Winterは日本語で冬
Nightは日本語で夜
Dogは日本語で犬
Chairは日本語で椅子
Carは日本語で車
eggは日本語で
"""
結果はこちらです。
example | accuracy |
0 | 0 |
1 | 0.4 |
2 | 0 |
3 | 0 |
4 | 0.1 |
5 | 0.3 |
6 | 1 |
7 | 0.7 |
8 | 0.4 |
9 | 0.5 |
より丁寧に日本語で教えるプロンプト
さらに、丁寧な日本語で教えたらどうなるのか見てみます。
"""
英語から日本語に翻訳して:
Cheeseの日本語での意味はチーズ
Appleの日本語での意味はりんご
Kingの日本語での意味は王様
Septemberの日本語での意味は9月
Winterの日本語での意味は冬
Nightの日本語での意味は夜
Dogの日本語での意味は犬
Chairの日本語での意味は椅子
Carの日本語での意味は車
eggの日本語での意味は
"""
結果はこちらです。
example | accuracy |
0 | 0 |
1 | 0.3 |
2 | 0.3 |
3 | 0 |
4 | 0.3 |
5 | 0.8 |
6 | 0.6 |
7 | 0.8 |
8 | 0.4 |
9 | 0.4 |
検証結果
- ①英語モデルと同じプロンプト
- ②=>を=にしたプロンプト
- ③=の両側にある空白を取り除いたプロンプト
- ④=を→にしたプロンプト
- ⑤日本語で関係を教えるプロンプト
- ⑥より丁寧に日本語で教えるプロンプト
example | ① | ② | ③ | ④ | ⑤ | ⑥ |
0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0.9 | 0.5 | 0.4 | 0.3 |
2 | 0 | 0.1 | 0.7 | 0.3 | 0 | 0.3 |
3 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 0.1 | 0.5 | 0.7 | 0.3 | 0.1 | 0.3 |
5 | 0.1 | 0.7 | 0.6 | 0.3 | 0.3 | 0.8 |
6 | 0.7 | 0.8 | 1 | 0.7 | 1 | 0.6 |
7 | 0.2 | 0.4 | 0.8 | 0.5 | 0.7 | 0.8 |
8 | 0.4 | 0.4 | 1 | 0.6 | 0.4 | 0.4 |
9 | 0.2 | 0.2 | 0.6 | 0.4 | 0.5 | 0.4 |
考察
すべてのプロンプトにおいてone shot, three shotは翻訳が全く出来ていません。理由として、one shotの場合は、そもそもタスクを認識できていないためであり、three shotの場合は、解答が9月という数字が含まれていためではないかと考えられます。また、③のプロンプトが大体のexample数において良い結果が残せているのは、日本語における空白の表現が英語の表現と違っているからではないかと感じました。つまり、英語の場合では必要でも日本語の場合は邪魔な存在だと考えられます。さらに、日本語で説明した⑤、⑥と比べて少ないexample数で良い結果が出ているのは、=という文字の説明力の方が日本語の説明力を上回ったためではないかと考えられます。この意味では、④において使っている→の説明力よりも=の説明力の方が高いと言えると思います。
まとめ
今回は、プロンプトの違いは、どのような影響を及ぼすのかを検証していきました。タスクとしては、翻訳のみの検証だったので他のタスクでも同じような結果になるとは限りません。また、毎回推論結果は変化するため実際は考察が違っていることもあり得ますので、一つの結果として見ていただければ幸いです。
コメント