2024年のKaggleでのLLM利用の調査

# はじめに

## 私について
私はベイズ統計学について大学で専攻していたのですが、MLやLLMについてはあまり把握できていませんでした。

また、以前私の[Gemma2の論文概要の記事](https://qiita.com/making111/items/c799a8df4fa7c46e8a5b)で取り上げたようなモデルがKaggleでも広く利用されているため、本アドベントカレンダーの機会にこれらの使い方を調査したいと考えました。

## 本記事の目的
そのため、本記事の目的は、LLMを学習させるのに必要のありそうなライブラリがなにかをまとめることとします。

コンペの詳細の内容については、nishimotoさんの[2023-24年（上期）のKaggleコンペから学ぶ、NLPコンペの精度の上げ方](https://zenn.dev/nishimoto/articles/974f2a445f9d74)や、それぞれのコンペの解説記事（後述）で綺麗にまとめられてくださっているため、適宜参考にしてください。

# 今年あったLLM関連のコンペと使用ライブラリや技術について

まず、今年開催されたLLM関連のコンペを調査し、それぞれの上位解法を調べます（漏れているコンペもあると思います）。

### 1 [**LLM Prompt Recovery**](https://www.kaggle.com/competitions/llm-prompt-recovery)
- **概要**: LLMが生成したテキストから、元のプロンプトを推定するコンペティション。
- **期間**: 2024年2月28日～4月17日
- **詳細な解説記事**: s_shoheyさん [Kaggle LLM Prompt Recoveryコンペまとめ](https://zenn.dev/s_shohey/articles/be7260809e7a75)
   - キーワード:
      - EndOfSentenceトークンの処理

**上位解法で使用されていたライブラリ**: 参照元：Khoi Nguyenさん [1st place 0.71](https://www.kaggle.com/code/suicaokhoailang/1st-place-0-71) 
- 参考: [コード理解のためにリファクタ等を私が行ったもの](https://github.com/makinzm/llm_prompt_recovery_1st_solution)
- [How to generate text: using different decoding methods for language generation with Transformers](https://huggingface.co/blog/how-to-generate) に似た手法
- ファインチューニングするためのPeft, LoRAなど: [LoRA](https://huggingface.co/docs/peft/package_reference/lora)

### 2. [**Automated Essay Scoring 2.0**](https://www.kaggle.com/competitions/learning-agency-lab-automated-essay-scoring-2)
- **概要**: 学生のエッセイを自動的に採点するモデルを構築するコンペティション。
- **期間**: 2024年4月4日～7月3日
- **詳細な解説記事**: 
   - ML_Bearさん [Kaggle Automated Essay Scoring 2.0 コンペ上位解法まとめ](https://zenn.dev/ml_bear/articles/bd8bf184732de6)
   - ttkk22(tk2)さん [Kaggle Automated Essay Scoring 2.0 上位解法まとめ #NLP - Qiita](https://qiita.com/ttkk22/items/d631fe73b71b28421aab)
   - キーワード:
      - Quadratic Weighted Kappaの最適化
      - CVとLBの乖離の際にCVを信じる
      - Data-Centricに考えて学習をする

**上位解法で使用されていたライブラリ**: 参照元：Qamar mathさん ["DeBERTa & LightGBM for Automated Essay Scoring"](https://www.kaggle.com/code/qamarmath/deberta-lightgbm-for-automated-essay-scoring?scriptVersionId=175313277)
- 参考: [コード理解のために私がリファクタリングしたもの](https://github.com/makinzm/Automated-Essay-Scoring-2.0-Powerful-Notebook/tree/main)
- 使用ライブラリ：polars, transformers(Trainer, DataCollatorWithPadding, AutoModelForSequenceClassification), spacy

### 3. [**LLM 20 Questions**](https://www.kaggle.com/competitions/llm-20-questions)
- **概要**: 20の質問で秘密のキーワードを当てるゲーム形式のコンペティション。
- **期間**: 2024年5月16日～8月30日
- **詳細な解説記事**: Isaka-code(ねぼすけAI)さん [Kaggle LLM 20 Questionsの解説と上位ソリューションまとめ #Python - Qiita](https://qiita.com/Isaka-code/items/9b19b588f36c54845aa0)
   - キーワード:
      - 二分探索
      - LLM曖昧さ回避のための正規表現の利用
      - レスポンスを減らすための事前にデータの保持

**上位解法で使用されていたライブラリ**: 参照元： c-numberさん [LLM 20 Questions Final Submissions](https://www.kaggle.com/datasets/cnumber/llm-20-questions-final-submissions)

:::note warn
他のコンペも下の粒度でまとめたかったのですが、時間が取れなかったためこちらのコンペだけ以下の形式でまとめてみました。
:::

| ライブラリ      | 関数/メソッド名 | ドキュメントリンク | ソースコード例 |
|----------------|----------------|--------------------|----------------|
| **torch**      | `torch.backends`| [torch.backends — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/backends.html) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/68e3e5b8779f0f356c64f52f0340ae2c1a481f26/main.py#L9-L10) |
|                | `torch.ones`    | [torch.ones — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/generated/torch.ones.html) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/604d9db005d1c753a4b95488bbc7e51991763fb2/utils/beta.py#L62) |
|                | `torch.load`    | [torch.load — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/generated/torch.load.html) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/604d9db005d1c753a4b95488bbc7e51991763fb2/utils/beta.py#L65) |
|                | `torch.special.xlogy` | [torch.special.xlogy — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/special.html#torch.special.xlogy) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/604d9db005d1c753a4b95488bbc7e51991763fb2/utils/beta.py#L131-L133) |
|                | `torch.maximum` | [torch.maximum — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/generated/torch.maximum.html) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/604d9db005d1c753a4b95488bbc7e51991763fb2/utils/beta.py#L164C33-L164C40) |
|                | `torch.isnan`   | [torch.isnan — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/generated/torch.isnan.html) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/604d9db005d1c753a4b95488bbc7e51991763fb2/utils/beta.py#L166) |
|                | `torch.where`   | [torch.where — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/generated/torch.where.html) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/604d9db005d1c753a4b95488bbc7e51991763fb2/utils/beta.py#L212) |
|                | `torch.Tensor.bfloat16` | [torch.Tensor.bfloat16 — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/generated/torch.Tensor.bfloat16.html) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/68e3e5b8779f0f356c64f52f0340ae2c1a481f26/utils/model_deepmath.py#L118) |
|                | `torch.no_grad` | [torch.no_grad — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/generated/torch.no_grad.html) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/68e3e5b8779f0f356c64f52f0340ae2c1a481f26/utils/agent_gemma_answer.py#L68-L69) |
|                | `torch.nn.Softmax` | [Softmax — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/generated/torch.nn.Softmax.html) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/68e3e5b8779f0f356c64f52f0340ae2c1a481f26/utils/agent_gemma_answer.py#L78C23-L78C30) |
|                | `torch.cuda.empty_cache` | [torch.cuda.empty_cache — PyTorch 2.5 documentation](https://pytorch.org/docs/stable/generated/torch.cuda.empty_cache.html) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/68e3e5b8779f0f356c64f52f0340ae2c1a481f26/utils/agent_gemma_answer.py#L155C16-L155C27) |
| **transformers** | `transformers.pipeline` | [Pipelines](https://huggingface.co/docs/transformers/v4.46.0/en/main_classes/pipelines#transformers.pipeline) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/68e3e5b8779f0f356c64f52f0340ae2c1a481f26/utils/agent_deepmath_answer.py#L153) |
|                | `AutoModelForCausalLM(from_pretrained)` | [Auto Classes](https://huggingface.co/docs/transformers/ja/model_doc/auto#transformers.AutoModelForCausalLM) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/68e3e5b8779f0f356c64f52f0340ae2c1a481f26/utils/model_gemma.py#L138) |
|                | `AutoTokenizer` | [Auto Classes](https://huggingface.co/docs/transformers/ja/model_doc/auto#transformers.AutoTokenizer) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/68e3e5b8779f0f356c64f52f0340ae2c1a481f26/utils/model_gemma.py#L131) |
|                | `BitsAndBytesConfig` | [BitsAndBytesConfig — Quantization](https://huggingface.co/docs/transformers/v4.46.0/ja/main_classes/quantization#transformers.BitsAndBytesConfig) | [link](https://github.com/makinzm/llm_20_1st_place_solution/blob/68e3e5b8779f0f356c64f52f0340ae2c1a481f26/utils/model_gemma.py#L115) |
|                | `AutoConfig` | [Auto Classes](https://huggingface.co/docs/transformers/v4.46.0/ja/model_doc/auto#transformers.AutoConfig) | [link]( https://github.com/makinzm/llm_20_1st_place_solution/blob/68e3e5b8779f0f356c64f52f0340ae2c1a481f26/utils/model_gemma.py#L127C14-L127C24) |
| | `quantization_config` | [Quantize 🤗 Transformers models](https://huggingface.co/docs/transformers/ja/main_classes/quantization#quantization) | |
| | `meta-llama/Meta-Llama-3-8B-Instruct` | [meta-llama/Meta-Llama-3-8B-Instruct · Hugging Face](https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct) | | 

# 最後に

上位のコードやその際に利用していたアルゴリズムの大枠について理解をできました。

こちらの記事を参考に、現在開催中のコンペなどの使用ライブラリの理解の役になれば幸いです。

以下LLMが関連していそうな現在開催中のコンペを記載しています。

- [Google - Unlock Global Communication with Gemma | Kaggle](https://www.kaggle.com/competitions/gemma-language-tuning)
- [Google - Gemini Long Context | Kaggle](https://www.kaggle.com/competitions/gemini-long-context)
- [AI Mathematical Olympiad - Progress Prize 2 | Kaggle](https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-2)
- [Eedi - Mining Misconceptions in Mathematics | Kaggle](https://www.kaggle.com/competitions/eedi-mining-misconceptions-in-mathematics)