OpenCALM-7Bにファインチューニングを実施してポジネガ分析に関して賢くなるかを確認してみた

本記事は、当社オウンドメディア「Doors」に移転しました。

約5秒後に自動的にリダイレクトします。

このたびブレインパッドは、LLM/Generative AIに関する研究プロジェクトを立ち上げ、この「Platinum Data Blog」を通じてLLM/Generative AIに関するさまざまな情報を発信をしています。
今回、日本語LLMである「OpenCALM-7B」と日本語データセット「JGLUE」のポジネガ分析のデータセット(MARC-ja)を利用し、「ポジネガ分析」に特化したファインチューニングを実施したので、ご紹介します。


はじめに

こんにちは。アナリティスクスサービス部の中山です。
この記事では、「株式会社サイバーエージェント」*1が開発した商用利用可能なライセンスの日本語LLMである「OpenCALM-7B」に対して、「ヤフー株式会社」が公開している日本語データセット「JGLUE」*2のポジネガ分析のデータセット(MARC-ja)を利用して、「ポジネガ分析」に特化したファインチューニングを実施しました。

なお、この記事の執筆にあたっては以下の記事を参考にしています*3。この場にて感謝を申し上げます。

LLMとファインチューニング

現在LLM(大規模言語モデル)が新聞やニュース等で大きな話題となっています。そして、徐々にビジネスや社会生活での活用が始まっています。利用者にとってのLLMの利用目的は2種類考えられます。 一つは多くの幅広い目的があり、それらを達成したいというものです。もう一つは特定の目的があり、それを達成すれば良いというものです。

今回は後者の特定の目的を達成する使い方を主題とします。特定の目的を達成するにあたっては、特に何もせずそのままLLMを利用するという方法があります。一方、LLMがさらに良い回答を出すことを期待して、LLMに特定の目的に関するデータを学習して賢くするという方法もあります。後者のLLMを賢くすることをファインチューニングと呼びます。

ポジネガ分析を題材としてファインチューニングでLLMが賢くなるかを確認する

今回ファインチューニングを実施することでLLMが特定の目的に対して賢くなるかを確認しました。方法としてはポジネガ分析のデータセット「JGLUE」を使って株式会社サイバーエージェントの「OpenCALM-7B」をファインチューニングします。そして、ファインチューニングの前後でポジネガ分析の結果がどの程度変化するのかを確認します。

ポジネガ分析とは

ポジネガ分析とは、文章がポジティブ(うれしいなど)なのかネガティブ(悲しいなど)なのかのどちらかを当てるものです。JGLUEには「文章」と「ポジティブかネガティブか」のデータがセットとなっており、これを利用することでポジティブかネガティブかの判断がどの程度可能かを判定できます。

ポジネガ分析のファインチューニング前と後の結果

以下は、ポジネガ分析のファインチューニング前と後の結果をまとめた表になります。 正解率はポジティブかネガティブかを正しく回答できた確率になります。適切な回答をしなかった率は「ポジティブ」または「ネガティブ」で回答をしない率になります。LLMは質問文の意味を理解できずに質問に対して適切な回答をしないこと、つまり「ポジティブ」または「ネガティブ」で結果を返さないことがあります。

項目 正解率 適切な回答をしなかった率
ファインチューニング前 1.1% 98.5%
ファインチューニング後 95.3% 0.0%
94.2% ▲98.5%

結果はファインチューニング前はほとんど「ポジティブ」または「ネガティブ」で結果を返しませんでした。一方、ファインチューニング後では、ほぼ「ポジティブ」または「ネガティブ」で結果を返し、正解率は95.3%(ベンチマークは85%)と比較的高い正解率でした。

なお、このデータセットはポジティブ側に偏りがあり、ポジティブが約85%含まれます。そのため、85%をベースラインとしてそれをどれだけ上回るかがLLMの性能の良さを示すことになります。 ファインチューニング前はポジネガ分析に対して適切な回答をしない割合が高く、聞かれていることを理解できていないことが伺えます。 一方、ファインチューニングを実施することで聞かれていることが理解できるようになり、かつベースラインの85%を上回ることから、ある程度正確な回答が出来るようになります

以下にLLMに対するインプットとファインチューニング前の回答例とファインチューニング後の回答例を示します。

(インプットの例)

Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.

### Instruction:
この文章は、「ポジティブ」ですか?「ネガティブ」ですか?「ポジティブ」か「ネガティブ」のどちらかを書いて。

### Input:
最早、アークティック・モンキーズには彼らが持っていた強みがなくなった。今、1stと同じようなアルバムを作らせようとしても、不可能に違いない。自分達の持っているモノを昇華しきる前に、新しい事に取り組みすぎた。そのせいで、自分達の強みが何なのか分からなくなってきている。と言うか、これじゃただ単にアークティック・モンキーズにステレオフォニックスを足したようなサウンドだ...まぁ、アクモンはもう昔には戻れないだろう。かといって、その先に未来があるとは思えない。もう終わりだ。断言しよう。次のアルバムもクソだ。

(ファインチューニング前:回答例)

もうこれでザ・スミスやスマッシング・パンプキンズ、そしてアークティック・モンキーズ

(ファインチューニング後:回答例)

### Response:
ネガティブ

(JGLUEに示されている参考結果)

項目 正解率 適切な回答をしなかった率
東北大 BERT base 95.8% 0.0%
XLM-RoBERTa large 96.4% 0.0%
今回の結果 95.3% 0.0%

BERT系統のモデルの結果と比較すると若干劣る結果となっています。

技術的な話

具体的なファインチューニングの方法は*3の方法に準じています。Hugging Face上の「cyberagent/open-calm7b」モデルをロードし、LoRAを用いています。ファインチューニングの環境はNVIDIA A100 40GBx1、エポック数3、学習率は3e-4で学習に36時間要しました。モデルに投入する学習データ及び検証用データの1件は例えば以下のようになります。

学習データ1件(例)

学習用データは「Below」から「どちらかを書いて。」までは固定です。「### Input」以下にJGLUEのポジネガデータセットに基づく「ポジティブかネガティブか」を判定するための文章を入れます。最後に「### Response」以下に「ポジティブかネガティブか」のラベルを入れ学習データの1件を構成します。

Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.

### Instruction:
この文章は、「ポジティブ」ですか?「ネガティブ」ですか?「ポジティブ」か「ネガティブ」のどちらかを書いて。

### Input:
今日は嬉しい

### Response:
ポジティブ

検証用データ1件(例)

検証用データは、学習用データと同じ構成ですが「### Reponse」以下は入力として入れません。

Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.

### Instruction:
この文章は、「ポジティブ」ですか?「ネガティブ」ですか?「ポジティブ」か「ネガティブ」のどちらかを書いて。

### Input:
今日は嬉しい

失敗談

当初この「OpenCALM-7B」に対して「Seq2Seqモデル」と同様のファインチューニングの方法を実施しましたが、学習が完了したとしても文章の生成が上手くいきませんでした。具体的にはmodelの入力(input_ids、attention_mask)に「今日は嬉しい」出力(labels)に「ポジティブ」と与えて学習しました。この方法では、このモデルはうまくいかないようです。このモデルへの入力は入力出力ともに同じものを与える必要があります(「今日は嬉しい。ポジティブ」を入力と出力ともに与える)。

まとめ

今回の結果を踏まえるとLLMのモデルによってはそのまま活用するのは難しく、適用する領域に応じたデータを用意してファインチューニングをした方が良いかもしれません。 これはモデルが学習しているデータ量・内容やモデル自体のパラメーター数(例えばChatGPT(GPT-3.5)はパラメーター数が175Bでありそれ以上のものもある、今回は7B)にもよります。