rinna社が大規模な13億ものパラメータを持つGPTを公開!これまでのモデルサイズと性能は違うのか?zero shot, one shotぽいことで検証してみた
rinna株式会社が、日本語に特化した13億パラメータのGPT言語モデルを開発して公開しました。この言語モデルはNLPモデルライブラリHugging Faceに商用利用可能なMITライセンスで公開されています。
これまでもGPT-2やBERTの事前学習モデルがrinna社より公開されていますが、さらに大規模なモデルが公開されたということで性能が気になります。こちらにGPTに入力するテキストを工夫することで文章生成、分類、翻訳などの出力を得ることができると書かれているので、zero shot, one shotぽいことをして性能を検証してみようと思います。
rinna社が公開しているGPT
rinna社は次のように様々なモデルを公開してくれているので、それぞれのマシンスペックにあったモデルサイズを選択できます。今回公開されたjapanese-gpt-1bでは、学習データとしてJapanese C4が追加されています。C4はColosal Clean Crawled Corpusの略称で、Webから取得できるCommon Crawlを元にクリーニングされた大規模データセットです。この日本語の部分を使ったデータセットがJapanese C4になります。
model | layer | hidden size | parameter | training data |
japanese-gpt2-xsmall | 6 | 512 | 37M | Japanese CC-100 Japanese Wikipedia |
japanese-gpt2-small | 12 | 768 | 110M | Japanese CC-100 Japanese Wikipedia |
japanese-gpt2-medium | 24 | 1024 | 336M | Japanese CC-100 Japanese Wikipedia |
japanese-gpt-1b | 24 | 2048 | 1.3B | Japanese C4 Japanese CC-100 Japanese Wikipedia |
検証方法
すべてのモデルサイズで検証してもいいですが、今回はjapanese-gpt2-smallと比べていきます。
理由としては、一般的なマシンで扱える中で大規模なモデルである点が挙げられます。
Google Colaboratoryでjapanese-gpt-2-mediumをファインチューニングしようとしてもできない場合がありますが、japanese-gpt2-smallなら大体の場合できます。
検証については、ポジネガ判定・Question and Answer・足し算の3つのタスクで行います。例を何も与えずそのまま答えてもらうzero shotと例を1つだけ与えてから答えてもらうone shotで性能が変化するのかも見ていきます。
どのようなプロンプトの設定がいいのかについては、こちらで検証しています。
ポジネガ判定
GPTにポジネガ判定をタスクとして認識させるために文は「ポジティブかネガティブか判定してください。」から始まるようにしています。またタスクと問題文の間は改行を入れ、例と問題の間にはタブを入れています。また、回答は=の後にしてもらえるようにしています。このようにすることで、それぞれの役割をGPTに教えています。(確率的に性能が上がるような気がしました。)それっぽくなるなら間に入れる文字はなんでもいいと思います。
では性能を調べていきたいのですが、同じ文章を何度も試して正解した回数を計測するか、違う文章を一回ずつ試して正解した回数を計測するかによって意味合いが違ってきてしまうので、今回は前者の方法で調べていきます。理由としては、同じ入力でも出力が変化するので後者の方法で行うとたまたま上手くいった可能性を否定できないからです。
# zero shot
"ポジティブかネガティブか判定してください。\n今日は良い一日だった=" # 答えはポジティブ
# one shot
"ポジティブかネガティブか判定してください。\n今日は良い一日だった=ポジティブ\t今日は何もできなかった=" # 答えはネガティブ
上記の入力をzero shot, one shotそれぞれで10回行って返ってきた回答がこちらです。
model | zero shotでの回答 (答え:ポジティブ) | one shotでの回答 (答え:ネガティブ) |
japanese-gpt-1b | “ポジティブ”×9 “良い”×1 | “ネガティブ”×10 |
japanese-gpt2-small | “良い一日だった”×2 “明日も良い一日”×2 “良い習慣にするか”×1 “あなたにとって”×1 “一日を良い感じ”×1 “いつもの様に”×1 “何が良い”×1 “今日、仕事は”×1 | “ポジティブ”×4 “ネガティブ”×2 “いいことがあって”×1 “今日一日頑張”×1 “何かをしてなかったこと”×1 “いい気分だった”×1 |
違いが顕著に現れています。japanese-gpt2-smallは、zero shotにおいてタスクを認識できていないように感じます。one shotにおいては、少しだけタスクを理解しているように感じますが、あまり良い結果とは言えません。その一方でjapanese-gpt-1bは、zero shotにおいてほぼほぼタスクを理解しており、かなり精度もよさそうです。one shotにおいては、10回以上試してもすべてネガティブと回答してくれました。これは、13億のパラメータの中にタスクを理解する部分を獲得できているのではないかと考えられます。
Question and Answer
次は、文章が与えられ、その中に答えがある質問をして回答してもらうQuestion and Answerを試してみます。ポジネガ判定と同じように、「質問に答えてください。」から始めます。今回は、タスクと与えた文章の間に改行、与えた文章と質問の間にタブを入れています。
# zero shot
""質問に答えてください。\n山田はカレーを食べている。\t山田は何を食べている?="" # 答えはカレー
# one shot
"質問に答えてください。\n山田はカレーを食べている。\t山田は何を食べている?=カレー\n池崎の今日の夕飯は蕎麦だ。\t池崎の今日の夕飯は?=" # 答えは蕎麦
上記の入力をzero shot, one shotそれぞれで10回行って返ってきた回答がこちらです。
model | zero shotでの回答 (答え:カレー) | one shotでの回答 (答え:蕎麦) |
japanese-gpt-1b | “カレー”×5 “山”×1 “)”×1 “…”×1 “=”×1 “>”×1 | “蕎麦”×7 “カレー”×2 “うどん”×1 |
japanese-gpt2-small | “カレー”×3 “山田”×2 “トマト”×1 “うどん”×1 “ラーメン”×1 “食べ物”×1 “米”×1 | “カレー”×9 “ラーメン”×1 |
こちらも違いが顕著に現れています。Japanese-gpt2-smallは、zero shot, one shotどちらにおいてもタスクを認識しているというよりは文章として続く言葉を選んでいる印象です。一方でjapanese-gpt-1bは、zero shot, one shotのどちらにおいてもタスクをタスクとして認識している印象です。one shotではその傾向が強く出ていると感じます。簡単な文章だったのでできた可能性はありますが、Japanese-gpt2-smallではできていなかったことができているというのは良い結果だと思います。
足し算
最後は、足し算をさせてみてどれだけ正解するのか見ていきます。例に倣って、「足し算してください。」から文を始めます。改行とタブを入れるところはQuestion and Answerと同じです。
# zero shot
"足し算してください。\n7+2=" # 答えは9
# one shot
"足し算してください。\n7+2=9\t3+4=" # 答えは7
(一桁)+(一桁)の計算なので、これでできなかったらそれ以上はもっとできないと考えて一番簡単な部類の計算を与えています。上記の入力をzero shot, one shotそれぞれで10回行って返ってきた回答がこちらです。
model | zero shotでの回答 (答え:9) | one shotでの回答 (答え:7) |
japanese-gpt-1b | “4”×4 “6”×3 “8”×1 “13”×1 “10”×1 | “8”×4 “10”×3 “6”×1 “13”×1 “7”×1 |
japanese-gpt2-small | “1”×3 “÷”×3 “×”×2 “26”×1 “80”×1 | “1”×5 “×”×3 “÷”×2 |
japanese-gpt2-smallは、zero shot, one shotどちらにおいても足し算をやろうとする感じが見られません。数字ではない×や÷が出てきたので、タスクとしては認識できていない印象です。japanese-gpt-1bは、zero shot, one shotどちらにおいても数字を返してくれており、何かしら足し算をしようとしている印象は感じられます。しかし、精度はzero shot, one shotで違いはあまり感じられません。one shotにおいては一度だけ正解していますが、たまたま当たっただけだと考えられます。この精度の問題は、学習データの中に計算に関するデータが少なかった、もしくはなかったために起こったものだと思われます。
まとめと所感
今回は、rinna社が新たに大規模言語モデルを公開したということでその性能について検証していきました。足し算のタスクは不得意でしたが、ポジネガ判定・Question and Answerにおいて従来のモデルを上回る回答ができることを確認しました。このことからもモデルサイズの増加は、性能を向上させるために有効であることが分かりますが、なかなかそのような大規模モデルは個人には作成できないのが残念なところです。また、日本語の学習データセットは英語の学習データセットと比べてかなり少ないので、そのあたりもモデル作成の障壁になっていると思います。だからこそ今回riina社が大規模モデルを公開したのは大きな意味を持っていると考えます。例えば、このモデルを事前学習モデルとしてファインチューニングすることで少しのデータで分類問題に特化したモデルが作れます。このような活用が多くの分野でできると思うので、私もスペックを満たしたマシンがあればいろいろとやってみたいと思います。
コメント