Quora コンペ入賞者手法まとめ

自分のコメントはかなり適当。後で更新するかも。

3rd

  • 3rd place kernel | Kaggle
  • Keras
  • embedding load 時に stemmer and lemmetizer してできるだけ dictionary の中から見つける
  • bidirectional GRU と LSTM の output の maxpool を concat
  • max_length = 55 と短め
  • Local solid CV to tune all the hyperparameters と書いてあるがどこだろう

13th

  • 13th place solution | Kaggle
  • Keras
  • latex 記法クリーニング
  • https/http/ftp クリーニング
  • punct クリーニング
  • Embedding:Glove0.64+ Params0.36
  • 3 model の ensemble
      1. bidirectional LSTM and GRU の output をconcat して maxpool1D 後 Dense。
      1. bidirectional GRU + AttentionWeightedAverage
      1. bidirectional LSTM + CNN

20th

  • Surprising 20th place - 2 models, various embeds, mixed loss | Kaggle
  • PyTorch
  • concat(GloVe, FastText) embedding + LSTM + TextCNN with kernel size [1, 2, 3, 4] + 2 dense layers, with some batch normalizations and dropout layers
  • mean(GloVe, Para) embedding + LSTM + GRU + concat(GlobalAvgPool, GlobalMaxPool) + 2 dense layers, with some dropout layers

22nd

27th

  • 27th kernel | Kaggle
  • embedding load 時に stemmer and lemmetizer してできるだけ dictionary の中から見つける
  • average blend of 5 models which includes all 4 embeddings with a local CV of 0.7028
  • 長さなどの extra features
  • tfidf
  • Kernel のCell 出力が長すぎて読めない

70th

Transformer - Attention Is All You Need の概要が理解できるリンク

で教えていただいた [1706.03762] Attention Is All You Need。最初は論文そのものを読もうと思ったが挫折したので。概要を理解できるリンク集。

今回のコンペでやるべきだったこと

今回のコンペでやるべきだったこと、次回のコンペで活かせることに絞って覚書。

  • debug mode をつけるべきだった。train/test data のサイズを極端に小さくするモード。
    • Kernel を commit する前に小さいデータで動作確認をすべき。特に自分は typo が多いので。
  • public kernel を fork して、そこから派生していく時点で1行ずつ読み込んで自分のものにしておくべきだった。
  • EDA 後に CV を安定させることに注力。
  • Record 専用 Kernel を作って試行錯誤と score を記録。これはコンペ途中からやっていて有用だった。最初は各 Kernel に markdown としてうめこんでいたがパラレルでものを進めると簡単に破綻した。

Quora コンペ takuko さんのコード

Twitter で takuko さんが使用したスクリプトを公開してくださった。こういうのは本当にありがたい。

自分なりに public kernel を読みまくったので、public kernel と takuko さんの kernel で気づいた違いを列挙。

  • glove と para を mean ではなく 0.8:0.2 で足している。
    • なぜこの比なのか?Local CV で search した?
  • emb_mean, emb_std を定数で埋め込んでいる(速度のため?)
  • Gaussian noise regularizer を使っている
  • lstm と gru の max_pool, avg_pool (計4つ)も Input として使っている
    • どこかで書いたが max_pool が特徴量として効く理由が直感的に理解できていないのでここは将来 revisit で。list of LSTM state (len = max_len) から最大のものを選ぶことに意味があるのだろうか。不思議だ。
  • 追記:コメント欄参照

Kaggle における K-Fold CV まとめ

背景

先日 submission の締切が過ぎて終了フェーズの Quora Insincere Questions Classification | Kaggle。 local CV と pubic LB の相関についてたくさんの議論があった。また local CV vs train test split の話もあった。別のコンペでもよくある議論だと思うのでここでまとめて理解を深める。

参考

K-Fold CV と Train Test Split 違い

  • Train Test Split
    • Train data の量が少ないともったいない。
    • 大きいデータセットに向いている
  • Cross validation
    • 2つ以上の model を学習させるので時間がかかる
    • model の性能についてより正しい理解が得られる
    • 小さいデータセットのときは Cross validation 一択。
  • cv strategy | Kaggle の議論からのまとめ。全ての trainig data を使った single model と比べて、K-Fold CV のほうが良いのはなぜか?という疑問。
    • K-Fold は異なるデータセットから K 個の異なるモデルを作る。そのため各モデルは微妙に異なる prediction をする。それゆえに K 個のモデルからの prediction を平均して使うと頑丈で良い結果になるし overfit しにくくなる(筆者:なぜ?より diverse なものに強いから?)
    • K-Fold は全ての traing データを使うことができる。single model だと validation 用に holdout が必要になる。
      • これは必ずしも真ではない。holdout で validation して model のベストパラメータを見つけたあとに、全ての train データを使って1から学習させればよい。その際には epoch などを注意深く設定して overfit しないように気をつけないといけない。(とある grandmaster は epoch * 1.1 くらいを推奨している)
      • 上記の調節が難しいので K-Fold が好まれる事が多いらしい。

K-Fold CV 例

K-Fold (4- 6) で train データ全体に対して prediction をして validation score を出す(average など)。K-Fold 時に使ったモデルすべてを使って test prediction を行い。final submission を average などで出す。

K-Fold 亜種

validationの切り方いろいろ(sklearnの関数まとめ)【kaggle Advent Calendar 4日目】 - u++の備忘録 がとても良くまとまっている。特にデータに偏りがある場合の visualization が分かりやすい。

CV FAQ

Local CV の値が安定しない

PyTorch を使おう。Keras よりも PyTorch の方が Deterministic に出来るので好まれている模様。Deterministic neural networks using PyTorch | Kaggle を参照のこと。下記の seed_everything が肝。

# Written by Benjamin Minixhofer
def seed_everything(seed=1234):
    random.seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.backends.cudnn.deterministic = True

Local CV と public LB で傾向が違う

例えば Local CV が改善したのに public LB が下がったとか。

考えられる理由1

validation, train, test セットの分布が異なる。EDA をきちんとやって適切な K-Fold 亜種を選ぶ。Adversarial validation という方法も。

考えられる理由2

それぞれが計算された方法が微妙に異なること。

  • Local CV は K 個のモデルからでた K 個のスコアを平均している
  • Public LB は K個のモデルから出た K 個の prediction を平均してスコアを計算している

A validation framework & impact of the random seed | Kaggle という手法がある。

Local CV と public LB どちらを信じるか

Local CV。通常 traing data の方が test data よりも大きいのでより信頼できる。