Kaggle で使える NLP トリックのあれこれ


# この記事は何？
[kunishou](https://www.kaggle.com/shouheikuniyoshi) が 2022 年 1 月 ～ 2023 年 3 月の期間に Kaggle の NLP コンペに参加していたときにまとめていた **NLP トリックの雑なメモ書きです** 。
　　
最近、[2023-24年のKaggleコンペから学ぶ、NLPコンペの精度の上げ方](https://zenn.dev/nishimoto/articles/974f2a445f9d74) という記事を拝見し、「そういえば、自分も NLP コンペのトリックをメモしてたな...」と思い出しました。
　
もともとは自分の振り返り目的でメモを取っており、たくさん蓄積してきたらそのうち何らかの形でアウトプットしようと考えていましたが、2023年後半に興味が LLM に移ってしまったため、 **供養の意味も込め、上記記事に便乗してアップしてみます** 。
　　
メモリ最適化など今となっては当たり前となっている技術も多いですが、メモのどれかがコンペに取り組む上での何らかのヒントになれば幸いです。
　　

（メモを取る中で頭の整理で作成した NLP トリックマップ）
![IMG_6040.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692165/17a9509c-98b1-1ca5-80e1-3c63204fcbc1.jpeg)

## 留意点
- 雑なメモ書き、リンク集です（見づらくてすみません）。
- 2022 年 1 月 ～ 2023 年 3 月までのコンペに参加する中でメモしたものです （そのため、少し情報は古いです）。
- 距離学習系のコンペ（ Learning Equality コンペ等）や Pooling 系の話は入っていません。
- メモリ最適化など、2024 年 7 月現在の今となっては当たり前になった手法も書かれています( 読み飛ばして大丈夫です )。
- 記事中の Feedback Pirze 1 とは [Feedback Prize - Evaluating Student Writing](https://www.kaggle.com/competitions/feedback-prize-2021)、Feedback Prize 2 とは [Feedback Prize - Predicting Effective Arguments](https://www.kaggle.com/competitions/feedback-prize-effectiveness)、Feedback Prize 3 とは [Feedback Prize - English Language Learning](https://www.kaggle.com/competitions/feedback-prize-english-language-learning) のコンペを指します。
  
## 1. Memory Optimization
- メモリ最適化手法です。今では当たり前になった手法となっているので読み飛ばしても大丈夫です。  

### Methods and tools for efficient training on a single GPU
- メモリ最適化に関する huggingface 公式チュートリアル（このページを見れば大丈夫）

https://huggingface.co/docs/transformers/perf_train_gpu_one

### 8bit Adam
- 字の如くAdamの8bit版。32bit Adamと比較してメモリ使用量を抑制

https://github.com/facebookresearch/bitsandbytes

https://www.kaggle.com/c/feedback-prize-2021/discussion/303131

https://www.kaggle.com/nbroad/8-bit-adam-optimization

### Adafactor
- Adam を元にした最適化アルゴリズムで、メモリ容量の削減とパラメータスケールに応じた学習率の調整を行う手法
### Gradient Checkpointing
- 計算速度を犠牲にしてメモリ使用量を抑える手法  
- Feedback Prize 1 コンペにおいて Kaggle GPU で Adam を使ってバッチサイズ 1 のシーケンス長 512 で DeBERTa-v2-xlarge を訓練しようとすると、OOM エラーが発生するが、8-bit Adam、float16、gradient checkpointing を使えば、バッチサイズ 8 で訓練できたとのこと

https://github.com/cybertronai/gradient-checkpointing  

https://www.kaggle.com/c/feedback-prize-2021/discussion/303131  

https://www.kaggle.com/code/kashiwaba/train-deberta-v3-large-with-optimization-approach  

### Mixed Precison Training
- 通常、32 ビットの単精度浮動小数点数で実施される計算を半分の 16 ビットの半精度浮動小数点数で行なうようにすることで計算時のメモリを半分に抑える手法
- PyTorch の場合、amp.autocast() を用いることで簡単に実装可能
- huggingface Trainer クラスを使用する場合は training_argments で fp16=True とすれば実施可能
 
https://www.ai-shift.co.jp/techblog/2138  

https://tawara.hatenablog.com/entry/2021/05/31/220936  

### Accelerate
huggingface 公式ページを参照  

### DeepSpeed
- GPU と CPU をパラレルに使用する方法。GPU 側で OverFlow したメモリを CPU 側にオフロードする
- CPU 側でも計算させるため、学習速度は遅くなる。huggingface Trainer クラスを使用する場合は training_argments で引数宣言すれば簡単に実装可能
 
https://www.kaggle.com/code/tanulsingh077/longformer-training-with-deepspeed-and-hf-trainer  

https://huggingface.co/docs/transformers/main_classes/deepspeed  

## 2. Optimizer
### Adabelief-Optimizer
- NeurIPS2020 にて Spotlight に選ばれた手法
- SGD のような「高い汎化性能」と Adam のような「速い収束性」「より良い安定性」の 3 つを兼ね備えたオプティマイザー
- Feedback Prize 1 で試してみたがあまり精度は向上せず( AdamW のほうが精度良かった)

https://qiita.com/omiita/items/5012afa3cba4d73a7aed  

https://github.com/juntang-zhuang/Adabelief-Optimizer  

https://arxiv.org/abs/2010.07468  

## 3. Model Ensemble
### Weighted Box Fusion
- NER タスクのコンペ（ Feedback Prize 1 ）において種類の異なる Transformer のアンサンブルに使用された

https://github.com/ZFTurbo/Weighted-Boxes-Fusion

https://www.kaggle.com/code/cdeotte/2nd-place-solution-cv741-public727-private740#Weighted-Box-Fusion  

### Ensemble Weight Optimization
- いくつかのモデルをアンサンブルする際の重みの決定方法のあれこれ
- Optuna 、リッジ回帰、 Nelder-Mead 、Hill-Climbing 、シンプルに平均を取る など
- [Feedback Prize 3 の上位解法](https://docs.google.com/spreadsheets/d/100zHnX7_qi4ZRWPa1Fe31cNioSNisHLg/edit#gid=986213092) を見ると Nelder-Mead が多い印象（ただ、1st place solution は Optuna を使っていたりするので単純にどれが最も良いとは言えない）

## 4. Data Augmentation
### Synonym Augmentation , Word2Vec Augmentaion , Contextual Embedding , Back Translation

- nlpaug モジュールを用いた様々な Data Augmentation 手法
- Feedback Prize 1 では Back Translation が一番効果があったとのこと
- 自分がこれまでコンペで色々と試した経験上、これらの Augmentation 方法では劇的な精度向上効果は得られませんでした

https://www.kaggle.com/mikiota/data-augmentation-csv-txt-using-back-translation/notebook#Augmentation-methods-Study  

### Let'S Talk Text Augmentations
https://www.kaggle.com/competitions/us-patent-phrase-to-phrase-matching/discussion/324868  
### Presudo Labeling  
- 一般的な手法なので説明は省略
- ハードラベル or ソフトラベル
- リークにはけっこう気を付ける
### Meta Pseudo Labels (MPL)  ★
https://qiita.com/takoroy/items/08ce473d304b8f987c32

https://www.kaggle.com/code/hengck23/playground-for-meta-pseudo-label

https://www.kaggle.com/code/conjuring92/nbme-meta-pseudo-labels

## 5. Faster Inference
### Uniform Length Batching
- 学習でインプットするデータのシーケンス長をソートして、バッチごとのシーケンス長をそろえることで無駄なゼロパディングの計算を抑制、推論速度を向上

https://www.ai-shift.co.jp/techblog/2138  
### Uniform Dynamic Padding
https://www.kaggle.com/code/anyai28/fast-inference-by-padding-optimization  
### FastTokenizer
- 標準の Tokenizer を huggingface で用意されている FastTokenizer に変更することで
推論時間を短縮
  
参考

https://www.kaggle.com/librauee/infer-fast-ensemble-models/comments  

## 6. Adversarial Training
### 各種 Advesarial Training の概要資料  

https://www.slideshare.net/ssuserc45ddf/adversarial-trainingpptx?utm_source=pocket_mylist

### Advesarial Weigthed Pertubations ( AWP ) ★

https://speakerdeck.com/masakiaota/kaggledeshi-yong-sarerudi-dui-xue-xi-fang-fa-awpnolun-wen-jie-shuo-toshi-zhuang-jie-shuo-adversarial-weight-perturbation-helps-robust-generalization

https://www.kaggle.com/code/kojimar/fb3-single-pytorch-model-train#Adversarial-Weight-Perturbation-(AWP)  

https://www.kaggle.com/code/junkoda/fast-awp

### FGM: Adversarial Training Methods for Semi-Supervised Text Classification (ICLR2017)
https://www.kaggle.com/code/kojimar/fb3-single-pytorch-model-train#Fast-Gradient-Method-(FGM)  
### TextAttack
- インプットするテキストに対して単語の並びを変えたり、一部を類義語に変えたりして摂動を加えるライブラリ
- 回帰と分類タスクのみ利用可能か？あまり効果がないというQiita記事もあり

https://qiita.com/dai335estl/items/1cf8e066869c0cc9ccb7

https://github.com/QData/TextAttack

https://textattack.readthedocs.io/en/latest/api/trainer.html#trainer

## 97. Other Tricks
### Layer-wise Learning Rate Decay ( LLRD )
- ファインチューニング時の学習率を一律ではなく層によって変える手法。層が深くなるにつれて減衰させた学習率を各層の訓練に適用
- [Feedback Prize - Predicting Effective Arguments](https://www.kaggle.com/competitions/feedback-prize-effectiveness/overview) にてよく利用されていた

https://www.kaggle.com/code/mozattt/fgm-fb3-deberta-v3-base-train

( layerwise_* 周辺が該当 )

### Last Layer Re-Initialization ( LLRI )
- 事前学習モデルの最後の層の重みを指定した層分だけ初期化してからファインチューニングすることでコンペのタスクにより最適化させる手法  
- [Feedback Prize - Predicting Effective Arguments](https://www.kaggle.com/competitions/feedback-prize-effectiveness/overview) にてよく利用されていた  

https://www.kaggle.com/code/mozattt/fgm-fb3-deberta-v3-base-train

( def re_initializing_layer が該当 )  

### Convert_checkpoint_to_lsg ★
- Short sequence モデルを Long seqence モデルに変換する手法
- 例えば、RoBERTa の Max length を 512 → 2048 に拡張する等が可能
- アンサンブルするモデルに多様性を持たせる目的で利用されていた（Feedback Prize 1 の [2nd place solution](https://www.kaggle.com/competitions/feedback-prize-2021/discussion/313389) で Chris チームが利用）

https://github.com/ccdv-ai/convert_checkpoint_to_lsg   

### Task-adaptive pretraining with MLM (Masked Lnaguage Modeling)  
- コンペデータを用いてモデルを MLM で事前学習させることで精度を向上させる手法  
- 過去のコンペでは MLM をするだけでメダル圏に入れるようなコンペもあった  
### Task-adaptive pretraining with WWM (Whole Word Masking)  
- WWM は MLM をより厳しくした事前学習方法。 MLM では精度上がらなかったけど、WWMでは精度が上がったという人もコンペでは見かけた
- ただし、WWM は MLM より学習時間が半端なく長い 

https://github.com/huggingface/transformers/tree/main/examples/pytorch/language-modeling  

https://www.kaggle.com/code/quincyqiang/maskedlm-pretrain-for-deberat-v3-large  

https://www.kaggle.com/code/currypurin/nbme-mlm  

### Span MLM  
- MLM のマスキングの確率を 40〜50 % に変更  
- 通常のランダムマスキングの代わりに、長さ 3 〜 15 の連続したトークンをマスキング
- 連続した token をマスクするという点では WWM とも似ているか
### Knowledge Distillation
- 一般的な手法なので説明は省略  
### Stochastic Weight Averaging (SWA)  
- 訓練中に複数のエポックから得られる異なるモデルの重みを平均化することで、より優れた性能を持つモデルを得る  
### Multi Sample Dropout  
- 過学習対策の手法
- 回帰タスクには不向きな例もあり

https://www.ai-shift.co.jp/techblog/2170  

### Mix Out ( 正則化手法 )

https://github.com/bloodwass/mixout  

https://www.kaggle.com/competitions/us-patent-phrase-to-phrase-matching/discussion/318070  

https://www.ai-shift.co.jp/techblog/2170  

### Ranodm Mask  

### Auxilliary Target Learning
関連する複数の課題を同時に学習し、精度の向上を図るマルチタスク学習  
NBME 1st solution (スライド28)を参照

https://www.docswell.com/s/currypurin/Z8L7L5-2022-05-23-081854  

### Adding Special Tokens 
DeBERTa で "\n" を加える等
### Custom Trainer / Model
Custom Trainer や Custom Model の方法について書かれた記事

https://jarvislabs.ai/blogs/hf-getting-started#customize-trainer

https://jarvislabs.ai/blogs/hf-getting-started#custom-model-implementation

https://www.kaggle.com/code/leehann/train-us-patent  

### Prompt Learning

https://www.kaggle.com/competitions/us-patent-phrase-to-phrase-matching/discussion/332418  

### SVM with Embedding Featrues
- これはテクニックではないですが、Embeddingしたベクトルを特徴量とし、モデルに SVM を用いると高い精度が出ることが稀にあります（ [Feedback Prize 3 の 1st place solution](https://docs.google.com/spreadsheets/d/100zHnX7_qi4ZRWPa1Fe31cNioSNisHLg/edit?gid=986213092#gid=986213092) など）。理由は不明なのでこのあたりを解説してくれる Discussion があればぜひ読んでみたいです。
  
### Box Embedding / Word2Box
- Kaggle で使われた実績のあるものではなく個人的に気になっている技術です
- 単語を箱で表現する技術。抽象的な単語ほど箱の面積が大きくなるので、これを文章に適用して文章の抽象度のようなものを算出し、その抽象度を特徴量として追加したら精度向上しないか？  （ネット上を探しても、試してみたような記事もあまりなく詳細は不明）  

https://ja.stateofaiguides.com/20221013-box-embeddings/  

## 98. Other Links
有益な記事のリンクです  
### ・Kaggleで学んだBERTをfine-tuningする際のTips①～⑤  
AI SHIFT さんのとても勉強になる記事です

https://www.ai-shift.co.jp/techblog/2138  
https://www.ai-shift.co.jp/techblog/2145  
https://www.ai-shift.co.jp/techblog/2170  
https://www.ai-shift.co.jp/techblog/2985
https://www.ai-shift.co.jp/techblog/3161

### BERTの精度を向上させる手法10選

https://qiita.com/YuiKasuga/items/343309257da1798c1b63

### DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-Disentangled Embedding Sharing ★
- DeBERTa に関する日本語の解説記事
- DeBERTa V1～V3 の違いがとても分かりやすく説明されている
- V3 で敵対的学習（SiFT）が行われてることをこの記事を読んで初めて知りました
- 一読しておくと DeBERTa のお気持ちが少しは分かるようにかも？

https://retarfi.hatenablog.jp/entry/2022/12/15/090815  

## 99. Kaggle Solutions
### NBME 1st solution ( currypurin さん )

https://www.docswell.com/s/currypurin/Z8L7L5-2022-05-23-081854  

### Kaggle NBME解法まとめ  

https://zenn.dev/ycarbon/articles/6b26cc19ff33f5?utm_source=pocket_mylist  

### Kaggle Feedback Prize 2021コンペ反省会 ( shimacos さん )  
Feedback Prize 1 は初めて参加した Kaggle NLP コンペでしたが、こちらの資料でモデルに Relative Positoinal Attension 系や Sinusosidal Positional Encoder 系など色々あることを知りとても勉強になりました（なぜ DeBERTa は token length 512 以上を扱えるのか）。

https://speakerdeck.com/shimacos/kaggle-feedback-prizekonpe-fan-sheng-hui  

### kaggle Feedback Prize 2022 上位解法まとめ

https://zenn.dev/yume_neko/articles/6e8f78a12a1d2a  

### Kaggle Feedback Prize 3 上位解法まとめ

私がコンペの振り返りのために自分でまとめたものです

https://docs.google.com/spreadsheets/d/100zHnX7_qi4ZRWPa1Fe31cNioSNisHLg/edit#gid=986213092