🗑️

RoBERTaの分類器で合成Instructionの品質チェック作業を効率化する

2024/03/09に公開

要約

Instructionか否かを判定する分類器を作ることで、LLMが生成した合成Instructionの品質チェックを効率化できそうです。

背景

先日、calm2-chatを使って作成した合成Instructionデータセット「jimba-instruction-1k-beta」を公開しました。
https://zenn.dev/kendama/articles/dc727218a2eae6
データセットはこちら

このデータセットはcalm2-chatに、与えられたテキストを参考にInstructionを生成するタスクを与え、その出力の中からいい感じのものを抽出、そして、それらに対してcalm2-chatでResponse部分を生成したものになっています。

このデータセットを作るときに大変だったのが、LLMの出力がInstructionの形式になっているか確認するところでした。
inputとして与えてテキストをそのまま出力していたり、ただの感想文になっているケースがかなり混入していたため、それらを取り除く作業を目視で行う必要がありました。
結果として合計で18000件の出力をチェックして、その中から1000件を抽出するのに(おそらく)40時間くらいかかっています。

もう少しデータセットをスケールさせていきたいと考えているので、このチェック作業を省力化するため、Instructionの形になっているか判定する分類器を学習していこうと思います。

実施手順

上記データセットと、その作成過程で生まれたボツ文章を使います。
学習に使ったデータの件数は以下の通りです。

ラベル レコード数
Instruction 1000
ボツにした文章 5912

なお、「ボツにした文章」はデータセットへの採用を見送った文章なので、「上記の文章から〇〇を答えよ」のような単体で完結していなかったためにボツにした文章も含まれているため、「Instructionではない文章」というわけでもありません。

学習のパラメータ類は以下の通りです。

パラメータ
test_size 0.2
pretrained_model_name_or_path roberta-base
max_length 512
num_train_epochs 3
per_device_train_batch_size 16
learning_rate 1e-5

評価はRecallで行い、3epoch学習を回した段階で74%程度でした。

少し取りこぼしが多い気がしますが、生成する数でカバーできるだろうということで一旦許容します。

jimba-instructionと同じ手法で4000件のInstruction候補を生成して、それらに対して今回学習した分類器のスコアを付けていきました。

結果

スコア(下画像の右列)は分類器の出力を0~1にスケールしたもので、1に近いほどInstructionである確度が高いものになっています。

スコア上位の出力

スコア0.64付近

スコア0.3前後

スコア下位の出力

結果を見ると、スコア上位の中には「上記〇〇を使って~」系のものが含まれているものの、基本的にはInstructionの形にはなっていました。

一方で、スコア下位については、多くのInstructionになっていない文章を判定できている一方で、2タスクがセットになっているものや、前後に余計な文章が入っているだけでInstructionは含まれている文章など、取りこぼしてしまっているケースも散見されます。
また、文章が短いほどスコアが高くなりやすい傾向があるようにも感じます。

パッと見た感じでは、スコアが0.6付近からボツ文章が増え始め、0.3付近で大半がボツ文章になっていました。

スコア0.6以上は全体の約18%なので、スコアの閾値を設定すれば確認作業を大幅に短縮できそうです。

まとめ

合成データセットを作成する中で生まれたボツデータを使ってInstructionか否かを判定する分類器を作成しました。
品質チェックの手間を減らせそうで嬉しい限りです。

さすがに需要はないと思いますが、今回の分類器はHugging Faceにアップロードしてありますので、興味がある方はお試しください。
https://huggingface.co/Kendamarron/jimba-instruction-or-not-classifier-beta

Todo

  • データを増やして学習
  • モデルサイズを大きくする
  • これを使ってデータセット作成を頑張る

Discussion