Kaggleは最近LLMのコンペを開催しました。初めてのLLMコンペなので、Kaggleで有名なデータサイエンティストの方はほとんど参加してきました。(2600チーム)
タイトルは「Kaggle-LLM Science Exam」です。
今回のコンペの目的は科学の多肢選択問題を回答するLLMをトレーニングすることです。
問題はChatGPT3.5とWikipediaの科学スレ(stem)から生成されて,それでtrainデータは200件くらい用意して,testデータは4000件くらいがあります。
公平性を保つために、今回はGPUの性能が制限されて、16GBメモリ+9時間以内で処理を完了する条件があります。
また、モデルの実行はローカル環境で行われるため、ChatGPTなどのapiを使うこともダメです。(ただし、学習データの生成には利用されています)
皆さんやり方自体は様々で、あと初めてのLLMコンペなので、従来のBert系モデル(Bert,Deberta,Distilbert)使ってる方もいるし、LLM(7B,13B,70B)使ってる方もいます。
finetuningに関しても、LoRAやP-tuningまたは全パラメータチューニングまでやっっている方もいました。あとはRAGも基本みんな使ってます。
GPU性能の制限などもあるため、Bertなどの小規模モデルでチューニングしてもLLMと大きな差はないですが、
パラメータ数が少ないために(一番多いDeberta v3でも1.5Bしかない)、やはりちょっと使いにくいなと感じていました。
多くの参加者のsolutionを見て、精度のランキングは大体以下のような感じだと思います。
1.LLM finetuningのアンサンブル+RAG
2.70B finetuning+RAG
3.Deberta finetuning+RAG
4.70B zeroshot+RAG
5.他のLLM
6.他のbert
7.Faiss
*私はLLMのfinetuning、DebertaのfinetuningとRAG全部やりました。
ステップごとのやり方+tipsについて以下にまとめています。
1.データセットの作成:
①基本的な方法や半教師あり学習でGPT4使って生成します。
tips:科学問題なので、科目別にデータセットを用意すれば精度が上がります。
②API使ってWikipediaから関連する領域のデータをクローリングします。(私は約20GBのデータを取りました。)
2.promptのチューニング
prompt文の書き方は人それぞれなので、試して自分のモデルで最適なpromptを探すことが大事です。
tips:回答の順序を変更してモデルに投げること(強化学習)が大事です。また、よく間違っている問題をまとめてboostモデルを構築することも効果的です。
3.モデルの選び方(7B,13B,70B):
70Bの方が基本性能が上ですが、必ず70Bが高いというわけでもないです。(top1の方は70Bモデルさえ使ってないですね)
tips:16GBメモリーで70Bのモデルをトレーニングする方法についてはコンペの途中で、あるフランスの方が公開しました。
一言で簡単に言うと、モデルをいくつに分割してメモリーに入れることでトレーニングします。この方法が公開されてから、多くの参加者が70Bモデルのトレーニングを始めました。
やり方自体は非常に複雑なので、詳細は次回共有したいと思います。
4.パラメーターチューニング(learning rate、batch size、epochなど)
みんな精度の差が小さすぎるので、パラメーターのチューニングが結構大変だったです。
tips:色々試してlossを見ながら経験を積むことしかないですね。
5.RAG
RAGするとほぼ必ず精度上がるためにみんな使ってます。
ちなみに、RAGとfinetuiningがどんな状況に使うのかについては下図に非常にわかりやすくまとめてます。
モデルが外部データを必要とする場合はRAG、モデルに特定な行動を求める場合はfinetuining。
今回は質問に対しての回答(QA)を求める+外部データセットも参照するために、両方要ります。
ちなみに、今回一番上の日本チームはPreferred Networksだったです。(4位と5位)
しかも完全に異なる手法でfinetuningしました。
4位はDeberta+データの並び替え調整
5位はMistral 7B+Llama 70B +Qlora
どちらでも非常にすばらしいやり方です。
私は銅メダル取りました。今回のコンペで特に惜しかったのは、Debertaに色々finetuningして、trainデータではずっとLLMより精度が高かったです。
ですが、testデータの量はtrainデータよりかなり多いために、Debertaの汎用性には自信なくて、どちらを提出するのか悩んで、チームメートともかなり議論しましたが、最後はDebertaを提出しました。
やはり、testデータにはランキングが結構落ちてしまいました。もしLLMを提出すればもとの順位に残す可能性もあるかもしれません。
このメダルのおかげでランクがKaggle Expertに上がりました。次はMasterになるように頑張りたいと思います。