🐴

calm2-7b-chatで日本語Instructionデータセットを生成する【jimba-instruction-1k-beta】

2024/03/01に公開

要約

cyberagent/calm2-7b-chatの出力を人手でチェック・修正することで作成した日本語のInstructionデータセット『jimba-instruction-1k-beta』を商用利用可能なApache Licence 2.0で公開しました。
https://huggingface.co/datasets/Kendamarron/jimba-instuction-1k-beta

背景

ここ数ヶ月で、LLMを使った合成データ(Synthetic Data)をLLMの学習に用いるのが一つのトレンドになってきました。
1.3B/2.7Bでありながら高性能なMicrosoftのphi-1.5/2でも事前学習に合成データが使われていることで話題になっていたかと思います。
https://arxiv.org/abs/2309.05463

しかし、今の日本語オープンソースLLMの性能では事前学習に使える教科書のような文章は書けそうにないので、出力の使用に制約のないcalm2-7b-chatの出力を人力で修正することで、ファインチューニングに使うInstructionデータセット(指示データセット)の作成してみることにしました。

実施手順

作成手順は以下の通りです。

  1. OSCARを入力文として、calm2-7b-chatに与えられた文章と関連する指示文を生成するようにfew-shotで指示
  2. 出力を目視でチェック・修正して、いい感じの指示文になっているものを抽出
  3. 抽出した指示文を使って、calm2-7b-chatを指示文生成タスク特化にLoRAチューニング
  4. 1〜3を十分なデータ量が集まるまで繰り返す(今回は500件程度貯まるまで続ける)
  5. In-breadth Evolvingで指示文を量産
  6. 出力を目視でチェック・修正して、いい感じの指示文になっているものを抽出
  7. 5〜6を十分なデータ量が集まるまで繰り返す(似たinstructionが増えそうだったため、300件程度で打ち止め)
  8. 再び1〜3を目標の1000件まで繰り返す
  9. calm2-7b-chatの出力がGPT-4ライクになるようなfew-shotで応答部分生成
  10. 応答として成り立っていないレコードの修正・再生成

使用するモデルはすべてcyberagent/calm2-7b-chatです。
https://huggingface.co/cyberagent/calm2-7b-chat

指示部分の生成について

日本語のOSCARを入力として、それに関連する指示文を作成するようにしています。
https://github.com/kkendama/jimba-instuction-1k/blob/main/generate_instruction_prompt.py
OSCARのテキストに含まれている指示文をそのまま抽出するのは著作権的に問題だと思うので、あくまでも会話のテーマになるようなfew-shotを設定しています。
出力自体はあまり安定しないので、1レコードにつき2種類のtemperatureで出力して数を稼ぎました。

目視でのチェック・修正について

最初のうちはまともな指示文が出力されないので、原型を残さないレベルで修正していきました。
LoRAチューニングに使えるレコード数が増えるごとに少しずつ成功率が上がっていくので、終盤に近づくにつれて楽になっていきました。
とはいえ、実施手順1〜2のところでは合計で約16000個の出力を生み出してチェックしています。
完全なパワープレーです。

In-breadth Evolvingについて

以前、Evol-InstructのIn-breadth Evolvingを擬似的に実装したときに、この実装を使えば似たInstructionを量産できることがわかったので、今回も試してみました。
https://zenn.dev/kendama/articles/9092e0b4ed09ca

2000個の出力から132個採用しましたが、表現やテーマが学習データに引っ張られすぎていたため、それ以上の生成はやめました。

応答部分の生成について

生成した指示文に対して、GPT-4ライクな応答を3レコード分自作して、few-shotの要領でプロンプトに入れ込んで生成しました。
https://github.com/kkendama/jimba-instuction-1k/blob/main/generate_response_prompt.py
これについては想像を超えるクオリティの応答が出てきて驚きました。
また、いくつかおかしな出力(外国語になっていたり、途中で途切れる等)があったため、修正できるレベルなら修正、ダメそうなら再生成しました。
ハルシネーションを起こしているかのチェックには膨大な時間がかかるため、上記のような出力以外は一部を除いて修正していません(目についてすぐ直せそうなものだけ数件修正しました)。

結果

合計1000レコードのInstructionデータセットを作成しました。
作成したデータセットはHugging FaceにてApache Licence 2.0で公開しています。
https://huggingface.co/datasets/Kendamarron/jimba-instuction-1k-beta

注意点

instructionは全件チェックしていますが、outputは内容の精査を行っていません。
ほとんどがcalm2-chatの出力をそのまま使用していることで、ハルシネーションが多発してしまっています。
少しずつ修正していきたいとは思っていますが、ファクトチェックに膨大な時間がかかりそうなので気長にお待ち下さい。

まとめ

calm2-chatの出力をチェック・修正することで合成Instructionデータセットを作成しました。
このままの方法だとスケールさせるのが厳しいため、もっと良さげな方法がないか検討中です。

Todo

  • 出力部分の修正
  • 今回と似たような方法で算数・数学データセットを作成(1k程度)
  • 分類器を使って目視チェックする件数を減らす

Discussion