オープンソースLLMの日本語評価結果 - W&Bローンチで誰でも再現可能に
LLMの日本語性能
ChatGPTが発表されて半年あまりが経ち、世の中は激変しました。少し冷め始めていたAIへの注目は突然急騰し、この新しい技術の可能性を探究すべく、日本では世界的にも突出した数の方々がその動向に関心を持っているようです。
ChatGPTは幅広い言語で高い性能を示している一方で、モデルは公開されておらず、またAPIの利用においてプライバシーや機密性の高いデータを送信することはできないため、オープンソースのモデルにも注目が集まっています。
オープンソースのモデルにもいくつかの系譜があります。
LLaMA:Meta社が公開したアカデミック向けのLLM (商用利用不可)
GPT-NeoX:Eleuther AIの開発した完全にオープンソースな技術スタックで開発されたモデル
Bloom:BigScienceプロジェクトという研究者のコラボレーションから生まれたオープンLLM
その他
などのアーキテクチャーを主なベースとして、さまざまな発展系のモデルが発表されています。
もちろん国内でも多くの企業が独自のLLM(大規模言語モデル)の開発に名乗りをあげています。特に先陣を切って5月中旬に公開されたrinna社とCyberAgent社のLLMは、上記のGPT-NeoXをベースに開発され、多くの注目が集まっています。W&Bの6月のマンスリーセミナーでもこの二社の開発リーダーをお招きしてマンスリーミートアップを開催しました。
これらのオープンソースのLLMモデルの中には「ChatGPTを超える」などと触れ込みのあるものもありますが、多くの場合その性能評価は英語のみで行われており、日本語の性能に関しては未知数なものも多いです。これら国内外のオープンソースモデルの日本語性能が気になる方はぜひ読み進めてください。
JGLUEを使ったLLMモデルの精度評価の結果
JGLUEとは、早稲田大学とYahoo! JAPAN研究所が構築・公開した日本語言語理解ベンチマークで、GLUE(General Language Understanding Evaluation) Benchmark(一般言語理解評価ベンチマーク)の日本語版と言えます。この中には複数のタスクが含まれており、今回は特に下記の5つのタスクを取り上げました。
MARC-ja: アマゾンのレビュー内容を"positive"か"negative"に分類
JSTS: 日本語の文章のペアが与えられた際に0(類似度最低)から5(類似度)までの範囲で類似度を測定
JNLI: 日本語の文章のペアが与えられた際に、それらが含意(entailment)、矛盾 (contradiction)、中立(neutral)のいずれの推論関係かを推定
JSQuAD: 問題文と質問が与えられ、答えに該当する箇所を問題文から抜き出す
JCommonsenseQA: 常識推論能力を評価するための5択の選択式問題
MARC-ja, JNLIなどは基本的な言語能力の評価に有効な一方、JSQuADやJCommonsenseQAなどでは知識や論理的思考を試す側面も含まれます。JSTSは文章の類似度を数値で出す問題で、人間に対して行われる言語能力テスト等と比較すると異色な質問に見えるかもしれません。
これらのテストを各モデルにプロンプトとして渡し、その結果をwandbで集約したテーブルがこちらです:
なお、より詳細な結果の説明は、こちらのwandbレポートに記載があります:
今回対象にしたのは多くの現在オープンソース化されているLLMモデルのほとんどが公開されているHuggingFace上で、特にダウンロード数の多いものを選びました。また、比較のために、同テストをOpenAI社のGPT-3.5及びGPT-4に行った結果も含まれ、順位は平均点で並べてあります。
まずOpenAIのモデルの精度の高さが際立っています。ほとんど全てのテストで他のモデルを大きく凌駕しています。その次にMosaicMLのmpt-7bがランクインしています。つい先日Databricks社による買収が大きなニュースとなったMosaicMLですが、ここでテストされた7Bパラメーターよりもさらに巨大な30Bパラメーターのモデルも発表されており、その精度は英語だけではなく他言語でも高いことがわかります。
国産LLMの中ではrinna社の強化学習版モデルが上位にランクインしています。日本語に特化したモデルの中でも特にチャットに特化した応答の質を高めるファインチューニングや強化学習に力を入れたモデルを公開しており、その結果が数字にも現れています。一方でCyberAgentの公開モデルは一問一答を前提としたインストラクションチューニングがされていないため、このJGLUEのテスト形式に答えるにはそもそも不利な前提があることを留意してください。OpenCALMのファインチューニングには先日AWSのチームがチャレンジした素晴らしい記事が公開されていました。
他のテストとの比較
同様の評価をしているのは私たちだけではなく、例えばStability AIでもJGLUEを使ったモデルの評価を公開しています。
この結果を私たちの結果と比較すると、概して高い評価が出ていることがわかります。これについてStability AIのエンジニアのMakotoさんにもご協力いただき調査したところ、いくつか興味深いことがわかりました:
MARC-ja, JNLI, JCommonsenseQAのテストにおいて、Stability AIの評価方法では選択肢に含まれる候補の中から対数尤度最大のものを回答とするいわば分類器的なアプローチを採用しているために無関係な回答やフォーマットエラー、スペルミスなどが起こり得ないのに対して、私たちは全てのボキャブラリから自由に出力させているためにこれらを克服しないと得点できない。
JSQuADのテストにおいて、Stability AIの評価方法では正解のトークン数を与えてその分だけ出力させているのに対して、私たちの評価では自力で打ち切らなければならない。
JSTSのテストはStability AIの評価方法では対象とされていないのに対して、私たちの評価では対象としている。確かに、文章の類似度を明確な基準なくゼロショットで評価させるというのは若干無茶振りにも思え、またembeddingモデルによるsimilarityを用いる方が自然かもしれないが、GPT-4 / GPT-3.5-Turboでは高度に達成できていることであり、また「これとこれどれくらい似ているか」という質問にざっくり答えられるのは然るべきと考えてあえて残している。
総じていうと、Stability AIのアプローチではそのままでは期待されている答えを返してくれないモデルに対して、評価者側が工夫をしている印象です。ある意味で現状レベルのモデルにより寄り添った評価ではありますが、「モデルが日本語をどれだけ潜在的に理解しているか」を解き明かすためには意味のある評価ともいえます。
素のJGLUEでの評価は難易度が高すぎる?
これに比べると、私たちの今回のテストはJGLUEのテストを手加減せずに適用したという点において純粋ではありましたが、多くのモデルにとっては難易度が高すぎたようにも見えます。それでもOpenAIのモデルはかなり高得点を出しているので、「さすが」と言わざるを得ません。
オープンソースモデルがなぜ間違ったのか分析してみると、多くの場合は選択肢の選び間違いではなく、全く予期されていないアウトプットをしていることがわかります。例えばrinna/japanese-gpt-neox-3.6b-instruction-ppoのJCommonsenseQAに対する解の一つを見てみると、数字での答えを聞かれているのに言葉で答えを返しています(上記wandbのレポートから):
プロンプトの返答を見ていくとほとんどのケースでこのような間違い方をしています。そもそもOpenCALMに関しては、チャット形式の対話で良い結果を返すためのファインチューニングがされていない状態で公開されているモデルであり、このテストで求められるような挙動をするということは期待できないですし、強化学習でチャット形式のチューニングをされているrinnaのモデルにとっても、この形式で答えを返すことは難しいようです。
より求められている答えの形式に総回答を得るためにプロンプトにいくつかの例を渡すFew-Shot学習の手法もありますが、この手法は与える例やプロンプトの書き方によって結果が安定しない特徴も指摘されています。今回もいくつかのモデルでこの手法を試しては見たものの、結果の向上にはばらつきがあり、インストラクションチューニングされていないモデルにおいてはほとんど結果の向上が見られませんでした。
W&B Launch(ローンチ)でワンタッチでLLMモデルの日本語能力を評価
この記事でご紹介したLLMモデルの日本語性能評価に使ったプログラムを、W&Bのローンチ機能を使い、簡単に再現していただくことができるジョブを公開しています。HuggingFace上にあるモデルであればモデル名を指定するだけで簡単に評価を走らせることができるようになっています。
Launch実行のプロセスの詳細は、下記のReportに記載されているので是非ご一読下さい:
ここではその概要を説明します。
Launchの環境構築
Launchの環境構築は大きく分けて3つあります。
モデルの学習や推論を行うジョブの構築:今回、LLMの日本語評価タスクを行うpythonのファイルや環境構築のファイルをコンパイルしたジョブをW&Bが作ったので、それを皆様が自由に使える形になります。
キューの作成:実行したい計算環境にジョブを投げる設定を行います。
エージェント起動:エージェントは、1つ以上のLaunchキューをポーリングし、キューから取り出したジョブを実行する長時間実行プロセスになるのですが、エージェントを実行することで、計算のリクエストを受け付けることができるようになります
一度上記の設定をMLエンジニアが行えば、あとはW&B上でジョブを何回でも実行することができます。
Launchの実行
W&b上で、モデルの学習や推論の細かい設定を行い、ジョブを実行します。例えば、今回のmodel_nameに、Hugging Face上のモデルの名前を入力すると、Hugging Faceからモデルをダウンロードし、それを実行することができます。ジョブを実行したあとは、W&B上で結果を簡単なUIで確認することができるようになります。