Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Shopee - 2nd Place Solutionと上位解法まとめ

lyakaap
July 15, 2021

Shopee - 2nd Place Solutionと上位解法まとめ

社内の勉強会での発表資料です。
Kaggleで開催された「Shopee - Price Match Guarantee」について、我々の2nd place solutionをメインに、コンペの概要や他の上位者のsolutionについて紹介しています。

lyakaap

July 15, 2021
Tweet

More Decks by lyakaap

Other Decks in Programming

Transcript

  1. 8 ▪ カーネルコンペ ▪ 制限時間:2時間 ▪ サンプル数|train=30k / test=70k ▪

    同一商品がtrainとtest両方に出てくることはない※ ▪ そのため、単純に分類のアプローチで解くことはできない コンペの設定など ※ 明言はされていないものの、おそらくそうだった。trainデータの商品IDをラベルとして学 習させたモデルを使ってtestデータに対してそのままラベルを分類させ、そのラベルが同じサ ンプルを同一商品とするアプローチは全然上手くいかなかったらしい
  2. 10 スコア変遷 概要 Public LB NFNet / tf-idf, simple thresholding

    0.74x + 同一商品判定モデル(LightGBM) 0.76x チームマージ with tkm 0.777 + Indonesian-BERT 0.780 + multi-modal model 0.783 + multilingual-BERT and Paraphrase-XLM and misc 0.788 + Pagerank feature 0.789 + Query expansion 0.790 + 同一商品判定モデル(Graph Attention Networks) 0.792
  3. 12 ▪ 距離学習(CurricularFace)を使って画像モデルを学習 ▪ ラベルは商品のID ▪ 商品IDをgroupとしたGroup-KFold(2-fold) ▪ CurricularFace: 学習の序盤は簡単なサンプルに、終盤は難しいサンプル

    にフォーカスすることで精度向上 ▪ ArcFaceやその他多数の〜Faceより良かった ▪ backbone: NFNet, DeiT ▪ 学習したモデルを使って画像特徴量の抽出 ▪ タイトルの特徴量抽出にはtf-idfを使用 ▪ それぞれの特徴量で近傍探索を行い、それぞれの類似度が一定 の値よりも高い場合に同一商品とする LB=0.74台時代|アプローチ
  4. 14 ▪ しきい値調整が難しい ▪ CVとLBで適切なしきい値が異なるため、結局は提出してみない とチューニングできない ▪ 画像類似度とタイトル類似度、2つのしきい値の調整が必要 ▪ サンプルごとに適切なしきい値が違うのでは...?

    ▪ 類似サンプルがたくさんあるようなサンプルだと、しきい値は厳 しめに切りたい気もする ▪ このあたりで Btbpanda, tkmさんに大きなスコア差で抜かれる LB=0.74台時代|このアプローチの限界
  5. 15 ▪ 「何かあるんだろうな」と思い、二人の過去コンペの実績を眺める ▪ → 二人とも「Quora Question Pairs」という同一質問文かどうかを 判定するコンペで好成績を収めていることに気づく ▪

    → このコンペみたいに、マッチするか(同一商品か)どうかをモデ ルに判定させれば上手くいくのでは?ということに気づく LB=0.74台時代|メタ読み tkmさんのQuoraの解法スライドはこちら (コンペ中参考にしていました)
  6. 16 ▪ 同一商品かどうかを判定する2nd-level model (LightGBM)を組むことでLBが0.74 → 0.76に ▪ 入力:サンプルのペアの特徴 ▪

    画像類似度、タイトル類似度、編集距離、近傍サンプルの類似度の 統計量、画像のサイズや容量、タイトルの長さや単語数など ▪ 出力:入力ペアが同一商品かどうかの確率値 ▪ 出力の値を見て、しきい値よりも大きければ同一商品とみなす ▪ 調整する必要のあるしきい値が一個になったのもメリット LB=0.76台時代|2nd-level model
  7. 17 ▪ この後色々試したものの停滞、モチベ低下で十日ほど放 置 ▪ CVとLBの相関が取れなくなってきたのもこのあたり ▪ グラフ系の特徴がCVでは良いもののLBでは効かない ▪ LightGBMの推論時間が遅すぎてモデルや特徴を積む余地がなく

    なる ▪ Kaggle NotebookのCPU性能はとても貧弱(2コア) ▪ このあたりで、ちょうどリーダーボードの一個上(2位)にいた tkm さんとチームマージする LB=0.76台時代|停滞期
  8. 18 •マージしたは良いものの、自分のパイプライン単体で制限時間ぎりぎり だったので、高速化は必須だった •ForestInferenceの存在をtkmさんに教えてもらう ◦ GBDT系のモデルがGPUで推論可能に ◦ これによって推論時間が40分から2分以下に! ◦ ↓のように学習済みのLGBモデルさえあれば簡単に利用可能

    チームマージ後|ForestInfereceによる高速化 import sklearn.datasets, numpy as np from numba import cuda from cuml import ForestInference model_path = 'xgb.model' # saved by XGBoost's save_model function X_test, y_test = sklearn.datasets.make_classification() X_gpu = cuda.to_device( np.ascontiguousarray (X_test.astype(np.float32))) fm = ForestInference.load( model_path, output_class=True) fil_preds_gpu = fm.predict(X_gpu)
  9. 19 • 制限時間の次は、OOMの壁にぶつかる ◦ Kaggle Notebook環境はメモリが13GBしかない • 変数の削除とgc.collect()で頑張ってもpythonがメモリを全て 開放してくれない •

    これまたtkmさんに %%python というipythonのマジックコマ ンドでpythonのプロセス実行が出来ることを教えてもらい、メ モリ問題が解決 ◦ %%python: セルの先頭にこれを書いておくと、そのセルがpython processとして実行されるため、クリーンな状態で各セルの実行が可能に なる チームマージ後|%%python(マジックコマンド)
  10. 20 • もろもろ最適化ができたので、二人のパイプラインを統合し、 提出してみた ◦ tkmさんのパイプラインも自分のものと大体一緒だった ▪ ResNet200d/tf-idf/同一商品判定モデル(LightGBM) ◦ LB

    score: tkm=0.765, lyakaap=0.763 • 二人のパイプラインはほぼ変えていない※にも関わらず、 LB=0.777まで到達 ◦ ※画像特徴だけNFNetの特徴を使うように統一した チームマージ後|LB0.777へ
  11. 21 • Kaggle Notebook環境はCPUが貧弱なので、GPUで高速 化できる処理はできるだけGPUでやるのが得 ◦ 近傍探索にはfaissのGPUモードを使う ◦ 画像のリサイズなどの前処理はtorchのcuda tensorに変換してか

    ら行う ◦ 画像の読み込みにnvidiaのDALIのGPUモードを使う ▪ 3位のチームが使っていた ▪ 自分たちはtorchvision.io.read_image()を使っていた (opencvやPILの画像読み込みに比べて高速) ◦ グラフの媒介中心性の計算にcugraphを使う その他の高速化tips
  12. 22 • BERTの話題をちらほらDiscussionで見かけるようになったの で、試してみることに ◦ 画像モデル同様、CurricularFaceによって学習 • 最終的には以下の事前学習済みのモデルを使用 ◦ Indonesian

    BERT ◦ Multilingual BERT ◦ Paraphrase XLM • Multi-modal modelも追加 ◦ NFNetとIndonesian BERTの同時学習 ◦ 最後から二番目のlayerでfeatureをconcat LB0.777→0.788|BERT, multi-modal modelの追加など
  13. 23 • BERTの追加などにより、スコアが大きく向上 ◦ 他にやったこと(スコアへの寄与は0.003ぐらい?) ▪ 画像特徴抽出時にアスペクト比を保存 ▪ 推論時にスコアでソートしてtop51件までに予測を絞る ▪

    再帰的に媒介中心性の高いエッジを消していく(もしクリーク間を 結ぶような余分なエッジが存在するのであれば、そのようなエッジ は媒介中心性が高くなるはず) • なぜBERTが効くのか? ◦ → 例えば同じBagでも、 "Victoria Secret Bag" と "Laundry Bag" とでは意味合いが違うからでは?(ディスカッション) LB: 0.777→0.788|BERT, multi-modal modelの追加など
  14. 25 • Query expansion:クエリと検索結果を混ぜて新しいクエリを 作成することで検索結果を向上させる手法 ◦ こちらの説明(22ページあたり)が分かりやすい ◦ AQE, αQE,

    DQEなどの様々な派生が存在する (今回のコンペではαQEを使用) • もとのembeddingとQuery expansionを適用したembeddingを concatさせて新たなembeddingとした • 大半の上位陣が使っていた ◦ 類似コンペのLandmarkコンペで有効だったためと考えられる LB: 0.789→0.790|Query expansion(クエリ拡張)
  15. 27 • GCNの中でも精度が良く、実装もシンプルでカスタマイズしや すいGraph Attention Networks(GAT)をベースにモデルを 組んだ • 今回興味があるのはノードではなくエッジなので、エッジに対 してgraph

    attentionを適用 • エッジの特徴は4つのみ(色々追加しても良くならなかった) ◦ 画像類似度 ◦ BERT類似度 ◦ マルチモーダル類似度 ◦ tf-idf類似度 LB: 0.790→0.792|GATをベースにしたモデル構築
  16. 28 LB: 0.790→0.792|GATをベースにしたモデル構築 エッジ特徴 [0.9, 0.7, 0.8, 0.6] [0.9, 0.6,

    0.8, 0.4] [0.8, 0.7, 0.7, 0.6] [0.8, 0.9, 0.8, 0.7] [0.5, 0.2, 0.7, 0.6] attention 適用対象エッジ 予測対象エッジ • 「予測対象エッジにつながっているノードにつながっている他 のエッジ」を近傍として、graph attentionを適用 attention 適用対象エッジ
  17. 29 • GAT単体モデルでLB=0.781 ◦ tkm LightGBM x5(LB=0.782) ◦ lyaka LightGBM

    x5 (LB=?) ◦ 最終サブはこれらのアンサンブル • 最終日の最後のサブミット枠でなんとかGAT入りの notebookが間に合い、LB=0.792に向上 ◦ 推論時のバッチサイズを大きくするのを忘れていてサブミット枠 を溶かしてしまった ◦ もっと早くから色々と進めておくべきだったと後悔 • そしてコンペ終了 LB: 0.790→0.792|GATをパイプラインに追加
  18. 34 上位者の解法早見表 Rank Image Text Loss Combining Method QE /

    DBA 1st NFNet BERT, XLM ArcFace union ✔ 2nd NFNet, DeiT BERT, XLM, tf-idf CurricularFace LightGBM, GAT ✔ 3rd EffNet, ViT (DINO), CLIP BERT, tf-idf, CLIP Triplet Loss CatBoost 4th NFNet, EffNet BERT, tf-idf ArcFace weighted average ✔ 5th NFNet, EffNet, ViT, Swin Transformer DistilBert, tf-idf, MLP ArcFace XGBoost ✔
  19. 35 • 画像側:NFNet, テキスト側:BERT/XLM • Iterative Neighborhood Blending (INB) ◦

    やってることはDBAの複数回の適用 ◦ cos類似度が一定以上のもののみblendingに使用 ◦ これがかなり効いてそう? • 自分自身しかマッチしないサンプルに対してはしきい値 を甘めに設定 • 解法自体はシンプルに感じたので、画像特徴・テキスト 特徴を抽出するモデルが結構強いのでは? 1st Place Solution
  20. 36 • 画像側:EffNet, ViT (DINO), CLIP • テキスト側:BERT, tf-idf, CLIP

    • 2nd-level model: CatBoost ◦ 特徴量:画像・テキスト類似度、サンプルの周りの密度(どれく らい近くにサンプルがあるか)など • 2nd-level modelの予測確率を類似度として、凝集型クラ スタリングによってサンプルをクラスタリング → 同じクラスタに属するサンプル同士を同じ商品とする 3rd Place Solution
  21. 37 • 画像側:NFNet, EffNet • テキスト側:BERT, tf-idf ◦ tf-idfをsparse random

    projectionで次元削減 • Query expansionによるembeddingの後処理 • それぞれの類似度のweighted averageによって同一商品 判定 4th Place Solution
  22. 38 • 画像側:NFNet, EffNet, ViT, Swin Transformer, ResNet • テキスト側:BERT,

    tf-idf, MLP • DBAによるembeddingの後処理 • 2nd-level model: XGB • 凝集型クラスタリング 5th Place Solution
  23. 39 • 画像側のモデルにVision Transformerベースのモデルを 使っているチームがたくさんいた ◦ 画像コンペにもTransformerの波が来ている? • QE/DBAがかなり有効だった ◦

    DBA: 大体QEと同じ。QEがクエリのみに対して適用するのに対して、こ ちらはデータ全体に適用するのが異なる点 • 複数の類似度指標をどう組み合わせるかが重要だった ◦ 2nd-level modelなど 上位者の解法まとめ
  24. 41 ▪ Shopeeコンペはとても良コンペでした ▪ データがマルチモーダルでやれることが多かった ▪ 含まれる要素:CV, NLP, Graph, Table

    ▪ 解法の多様性 ▪ ユニークなアプローチが多かったように思います ▪ リークや大きなシェイクもなかった ▪ (ラベルは汚かった...) ▪ チーム戦は楽しい ▪ モチベーションアップ ▪ 自分の知らなかった知見が増える ▪ 議論によってアイデアを思いつく 終わりに
  25. 42 ▪ 早い段階で近い順位の人とチームマージ出来てよかった ▪ 時間に猶予があったので、お互いのパイプラインを上手いこと統 合することで計算時間短縮にもつながった ▪ アンサンブルの伸びがすごかった ▪ コンペのために論文を読むのを減らした

    ▪ 学生のときみたいに時間をたくさん使えないので、コンペでの時 間の使い方を考え直した ▪ 経験上、時間をかけて論文読んで実験してもほとんど上手く行か ないことが多かったので、他のことに時間を使うようにした 終わりに|良かったこと