SIGNATE Student Cup 2020 17th Place Solution

0e73a0fbc9cf46ef9c65c932b221ba55?s=47 rinchi_math
September 02, 2020

SIGNATE Student Cup 2020 17th Place Solution

Signate Student Cup 2020 (https://signate.jp/competitions/281/) の17位解法をチズチズさん(@chizu_potato)主催のLT会にて発表した資料になります.

ソースコードは後日GitHubで公開する予定です(公開したらURL追加します).

関係各位の皆さん, ありがとうございました!

僕のtwitter -> @rinchi_math

0e73a0fbc9cf46ef9c65c932b221ba55?s=128

rinchi_math

September 02, 2020
Tweet

Transcript

  1. SIGNATE Student Cup 2020 17th Place Solution @rinchi_math

  2. ⽬次 • ⾃⼰紹介 • コンペの取り組み • コンペ所感

  3. ⾃⼰紹介 • 名前: rinchi(りんち). • 所属: 同志社⼤学 数理科学専攻M2. • 学部までは確率解析(数理ファイナンス周り)をやっていて,

    機械学習は⼤学院 になってから本格的にやり始めました. • 専攻は数理統計(⾊々やっていてそこまで胸を張って⾔える専攻分野がない…). Ø 異常検知の新たなアルゴリズムや, 曖昧性が⾼いText-Image特徴量で構成される Multimodal空間における効果的なEmbedding⼿法について論⽂書いたりしました. • 最近修論が終わって, あとは書くだけの状態になったのでHappy. • 修論終わってからは, 強化学習と因果推論に興味があって勉強してます. • 来年からは横浜で企業のR&D部⾨の下僕として働く予定なので, 関東⽅⾯の⽅ はよろしくお願いします!
  4. 僕の事前知識とか • コンペの参加経験について. Ø 本格的にコンペに参戦したのは今回が初めて. Ø バイト先にKaggleチームがあって, 今年の2~5⽉ぐらいまで社員や他のインターン⽣の GMやMaster, Expertの⽅々と⼀緒にworkshopを⾏い,

    ⾊々と教えていただいたのでコ ンペ周りの⼿法などはある程度理解している(はず). • NLPの知識. Ø Hands on系の参考書で基本的な知識はある程度知っている. Ø Transformerの仕組みは論⽂を読んである程度理解してる. Ø PyTorchでBERTまでのNLPモデルは, お遊び程度に実装したことがあった.
  5. コンペの取り組み 基本⽅針: • KaggleのNLP系過去コンペの上位解法を調べる. • BERT系⾊々試す. • ⽂章全体と局所的な単語の特徴量が効きそうだったので単純に[CLS] tokenを⽤いる以 外の⽅法も考える.

    • Trust LB • TrainデータとTestデータの分布が違うと判断したので, Trainデータにfitしすぎないよ うに, 各CVでF1 Scoreが0.55を超えたら次のCVに移るように実装. Ø これを⾏うと, LB Scoreが0.485を超えて安定しました. • ある程度宝くじゲームのような印象を抱いていた + コンペ中に調べた論⽂からBERTは モデルの初期重みやTrainデータの順番によって性能が結構変わるという報告があるの で, 最後はrandom seed averageしようと考えた(つまり神頼み…). Ø https://arxiv.org/abs/2002.06305
  6. 最終Subモデル概要 BERT Layer 1 Layer 12 ・ ・ ・ Max

    Pooling Mean Pooling d = 768 Concat Dropout FC Output Hack関数 Prediction • これを, BERTの初期重みを⾊々変更して random seed average.
  7. 最終Subモデル • データ Ø StratifiedKfold(K = 5)を使⽤. Ø K=10とかにしたら, Modelが安定しなくなった印象を受けた.

    • BERT uncased 全層Fine-Tuning. • Lossはclass weighted Cross EntropyをPyTorch documentに記載されているような感じで設定. • Batch sizeかmax_seq_lenを天秤にかけて, Batch sizeを優先. Ø Batch size 256 (GPU 2枚でPyTorch Parallelで実⾏したので, 実質128 batch). Ø max_seq_lenは85.(単語数は⼤体多くて120前後だったのでこれでも良いかと思った.) • Trainにfitしすぎないように, 各CVのF1 Scoreが0.55を超えたら, そのCVに対するOOFを計算して 次のCVに移⾏. • Last 12層⽬のdim = 1に対して, max poolingとmean poolingで特徴量抽出してから, Dropout(p = 0.3) からFCで分類. • 局所的な情報が取りたいと思ったのは, コンペ当初に⾏ったCBOWで特徴量を作った際に, Uni- gramやbi-gramで作った特徴量の⽅が効いていたから. ⽂章中の局所的な特徴量 を取りたかった. ⽂章全体を考慮した特徴量を 取りたかった. [CLS]Token使う よりもこっちの⽅が良かった.
  8. 結果: • Public3, 4位? → Private 17 • Shake downしちゃいました.

    結局Hack関数は効いたのか? • 各⼈の⼿法によると思いますが, 僕の投稿ファイルの中には効いてたものもいくつかあり ました. • ちなみに, Hack関数騒動は全く知らなかったです.
  9. あまり効かなかったこと • Bi-LSTM, RoBERTa, XLM-RoBERTa. Ø RoBERTa等はBERTとそこまで精度が変わらない印象を受けた. Ø RoBERTa単独で, Private

    0.498とかはありました. • 1 LevelがBERT族で2 LevelがLightGBMのStacking. • 再翻訳によるData Augmentation. Ø フランス, スペイン, ドイツ Ø Trainデータに対してのみAugmentationを⾏ったのがよくなかった? • Dice Lossによる, F1を直接最適化. Ø https://arxiv.org/abs/1911.02855 • BERT族のLast4層に対して[CLS] Token or Max/Mean Poolingを⾏い特徴量を抽出して Concat -> 2層のMLP. Ø 論⽂ではLast4層に⽂章の特徴が出るみたいな記述があったため, 使⽤する層を Last4, 3, 2, 1と試⾏錯誤した. Ø Adversarial Validationも⾏うとしたがAUCが0.58ぐらいだったので, それ以上 は何もしなかった.
  10. コンペ所感 • 分布が謎だったので, ある程度宝くじコンペと思い気楽に挑んでいた. Ø 絶対shake起こると思っていた. Ø 1週間前から作業をやめて, 1⽇の終わりに順位を確認する⽣活をしてました. •

    ⾃分の信頼できるValidationデータを作れなかったので, 結構⾟かった. Ø Trainデータから各Class毎にrandomで取って作ろうと思いましたが, ただえさえtrainデータが少ない のに, これ以上減らしても良いのかな?と思い実⾏できなかった. Ø Under samplingも同様に実⾏できなかった. • 曖昧な⽂章が多い気がしたので, 各クラスへの予測確率を⾒るような指標の⽅が良かったのでは? と思った(本当に良いのかは知らない). • メモリがたくさんのGPUが欲しい.. • 僕はTrust LBでした. Ø Publicデータは, 流⽯にPrivateデータからrandomに何割かを取ってきて作成しているはずと仮定した. Ø 上記の仮定が違うなら, 流⽯に与えられたデータ以外の情報も付随しているはずと考えた. • 今後, NLPコンペで使えそうなコードや考えが得られたのが⼀番良かった. • 関係者各位の皆さん, ありがとうございました!