Kaggleコンペ(LLM Science Exam)の振り返りと上位解法まとめ

概要
- KaggleのLLMコンペの上位解法まとめ
- https://www.kaggle.com/competitions/kaggle-llm-science-exam/
- 科学系の難しい質問に対する答えを選択肢の中から選ぶコンペ
- いわゆるQuestion Answering的なもの
- 評価指標はMAP@3
- ブログで紹介されている以下の図が分かりやすい

- ベクトル検索としては、MTEB learderboardから探したEmbeddingを利用
- モデル
- e5-base/large (1位)
- gte-base/large
- bge-base/large
- largeだからといって精度が上がるわけでもないらしい
- どの単位でベクトル化するかも難しい
- 10thは3〜4文を1つの文章としてスライド
- BM25などの手法も複合で使っている
- 推論はLLM(7B〜70B)かDeBERTa-v3
ブログとは別になるが、1位解法
- 概要
- WikipediaのチャンクのRAG
- cirrcussearchのデータが一番良かった。https://dumps.wikimedia.org/other/cirrussearch/
- 公開されている埋め込みモデル、e5が最適。
- カスタムpytorch余弦類似度コード。- GPU上のチャンクでメモリの問題なく実行できる
- 5つのチャンクをコンテキストとして使用し、max_lengthに1kを使用するのが最適だった。
- ほとんどが7BのLLMのアンサンブルで、1つだけ13Bもあるが、それ以上のものは役に立たなかった
- Debertaを動作させようとしたが、LLMの方が優れており、アンサンブルにすら役立たなかった
- Llama-2-7b
- Mistral-7B-v0.1
- xgen-7b-8k-base
- Llama-2-13b
- 異なるwiki/chunking/embeddingをlate fusionするアンサンブル(つまり各LLMが異なるテクニックを得る)
- すべてのLLMはH2O LLM Studioで微調整され、バイナリ分類ヘッドを持つ
- context + questtion + Answer (a), context + questtion + Answer (b)のような形でそれぞれの選択肢について分類して並び替え
- LoRAで線型層を訓練した
- 最後の次のtokenを予測するlogitの後の二値分類層を追加
- 細かいHyper parameter tuningはそこまで役に立たなかった。単純にcosine decayとbceで1epochだけ学習させた
- トレーニングデータはあまり重要ではなく、いろいろ試したが、@radek1から共有された初期のデータを使うか、自分で似たようなものを生成するだけで、かなりうまくいく。
- 他の選択肢の次のtokenを予測するlogitの平均を各選択肢の二値分類層に入れた
- 他の選択肢のCross Attention的な情報を使いたいが、一度に学習させると位置のバイアスを受けやすくなってしまったらしく、選択肢をランダムに入れ替えたTTA的な戦略もあったらしいが、上の方法の方が良かったらしい
