最近、KaggleのLLMコンペ(LLM Prompt Recovery)に参加し、銀メダルを獲得しました。色々学びましたので、共有したいと思います。
このコンペでは、original_textとrewritten_textという2つの文字列が与えられます。rewritten_textはGemma-7Bを用いてoriginal_textから生成されたものです。その生成に使用されたプロンプト文を予測することが目的です。
アプローチとしては、LLMのファインチューニングとmean prompt2種類がありました。mean promptとは、すべてのテストデータに対して一つの固定されたプロンプトを予測する方法です。コンペの中盤で、ある参加者から逆の類似度計算を通じて、ほとんどのプロンプトに共通する単語を特定できました。これらの単語を組み合わせて作成したプロンプト文を提出すると、結構高いスコアを得ることができました。
取り組み
私のチームでもmean promptを試しました。
まず、トレーニング用のサンプルプロンプトを用意し、それらを全部ベクトル化しました。
次に、これらのベクトルのcosine類似度をT5モデルで計算し、平均値を取りました。(この平均値は、すべてのサンプルプロンプトの平均精度を示しており、中身の単語をランダムに置換・削除するなどして新しい文字列を生成し、ベクトルの平均値も更新しました。)
このプロセスを繰り返すことで、最適なmean promptも見つけました。(cosine類似度が上がった場合は新しい文字列を採用)
しかし、mean promptは高スコアを出す一方で、公開テストデータが15%に過ぎないため、最終的にはスコアが低下するリスクがあると考え、モデルのファインチューニングも試しました。(ですが最後はほぼほぼshakeなかったです)
コンペ後半には、Mistral-7B-Instruct-v0.2(LLM名)をファインチューニングしました。
データ生成に特定の推論テンプレートを用意し、テキストの種類に応じた書き換えテキストを生成できるようにしました。
このテンプレートを用いて複数のグループの学習データを作成し、それを使って複数のモデルをトレーニングした後、最後すべてのモデルをアンサンブルすることでさらに精度を向上しました。
結果として、この2つの方法のスコアは非常に近く、どちらにしても銀メダルは取れます。また、1位のチームのsolutionを見てみると、彼らはmean promptをさらに改良させて、最も精度に影響が高い単語「lucerarea」を見つけ出しました。この単語をprompt文に加えれば、普通に金メダル取れます(Magicですね)
まとめ
今回のコンペは非常に面白くて、LLMのトレーニングについての理解も深めることができたと思います。あと金一枚でMasterに上がれますので、引き続き頑張りたいと思います。
興味ある方: