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

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

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

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

Bf71b646607bbe6916ccefc6548ebedd?s=128

lyakaap

July 15, 2021
Tweet

Transcript

  1. 2021.05.27 横尾 修平 株式会社ディー・エヌ・エー + 株式会社 Mobility Technologies Shopeeコンペ振り返り

  2. 2 •Kaggleコンペ:Shopee - Price Match Guaranteeで準優勝できた ので、その取り組み内容について紹介します ◦ ECサイトの商品同士が同じ商品かどうかを当てるタスクのコンペティション •他の上位解法についても簡単に紹介します

    今日の発表内容
  3. 3 項目 01|Shopeeコンペの概要 02|コンペでのスコア変遷 03|他の上位者の解法紹介 04|まとめ

  4. 4 01 Shopeeコンペの概要

  5. 5 ▪ 東南アジア最大級のECプラットフォームであるShopeeが 開催したコンペティションで、ユーザが投稿した画像と テキスト情報から類似した商品を検索するという課題 ▪ 意義:ショッピングサイトにおいて類似商品を精度良く 発見することは、ユーザ体験の向上やスパムの発見など に繋がることが期待されている Shopeeコンペの概要

  6. 6 • あるサンプルの画像とタイトルをもとに、そのサンプルと同一の商品 を見つける • 評価指標:mean F1 score ◦ サンプルごとにF1

    scoreを取って、全サンプルで平均をとる タスク クエリ、同一商品、異なる商品
  7. 7 タスク|もっと詳しく posting_id matches train_1598329973 train_1598329973 train_2496690777 train_2496690777 train_2771755203 train_2771755203

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

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

  10. 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
  11. 11 •Shopeeコンペのページを眺め、結構自分が過去コンペで取り組んだよう なタスクで、割と戦えるんじゃないかと思い参戦 ◦ Landmarkコンペみたいな検索タスクと近いのかなと思っていた •見立て通り、Landmarkコンペで使ったような距離学習ベースのモデル とtf-idfを組み合わせただけで上位に ◦ 商品タイトルは、正直BERTとかそのへん使わずともシンプルなカ ウントベースの手法で十分だと思っていた(後に反省することに)

    LB=0.74台時代
  12. 12 ▪ 距離学習(CurricularFace)を使って画像モデルを学習 ▪ ラベルは商品のID ▪ 商品IDをgroupとしたGroup-KFold(2-fold) ▪ CurricularFace: 学習の序盤は簡単なサンプルに、終盤は難しいサンプル

    にフォーカスすることで精度向上 ▪ ArcFaceやその他多数の〜Faceより良かった ▪ backbone: NFNet, DeiT ▪ 学習したモデルを使って画像特徴量の抽出 ▪ タイトルの特徴量抽出にはtf-idfを使用 ▪ それぞれの特徴量で近傍探索を行い、それぞれの類似度が一定 の値よりも高い場合に同一商品とする LB=0.74台時代|アプローチ
  13. 13 https://www.kaggle.com/c/shopee-product-matching/discussion/238033

  14. 14 ▪ しきい値調整が難しい ▪ CVとLBで適切なしきい値が異なるため、結局は提出してみない とチューニングできない ▪ 画像類似度とタイトル類似度、2つのしきい値の調整が必要 ▪ サンプルごとに適切なしきい値が違うのでは...?

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

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

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

    なる ▪ Kaggle NotebookのCPU性能はとても貧弱(2コア) ▪ このあたりで、ちょうどリーダーボードの一個上(2位)にいた tkm さんとチームマージする LB=0.76台時代|停滞期
  18. 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)
  19. 19 • 制限時間の次は、OOMの壁にぶつかる ◦ Kaggle Notebook環境はメモリが13GBしかない • 変数の削除とgc.collect()で頑張ってもpythonがメモリを全て 開放してくれない •

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

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

    ら行う ◦ 画像の読み込みにnvidiaのDALIのGPUモードを使う ▪ 3位のチームが使っていた ▪ 自分たちはtorchvision.io.read_image()を使っていた (opencvやPILの画像読み込みに比べて高速) ◦ グラフの媒介中心性の計算にcugraphを使う その他の高速化tips
  22. 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の追加など
  23. 23 • BERTの追加などにより、スコアが大きく向上 ◦ 他にやったこと(スコアへの寄与は0.003ぐらい?) ▪ 画像特徴抽出時にアスペクト比を保存 ▪ 推論時にスコアでソートしてtop51件までに予測を絞る ▪

    再帰的に媒介中心性の高いエッジを消していく(もしクリーク間を 結ぶような余分なエッジが存在するのであれば、そのようなエッジ は媒介中心性が高くなるはず) • なぜBERTが効くのか? ◦ → 例えば同じBagでも、 "Victoria Secret Bag" と "Laundry Bag" とでは意味合いが違うからでは?(ディスカッション) LB: 0.777→0.788|BERT, multi-modal modelの追加など
  24. 24 • 画像やテキスト類似度によって構築された近傍グラフを もとにグラフ系の特徴をいろいろ試してみたが、CVは上がるも ののLBは下がってしまうものばかりだった ◦ おそらく原因はtrainデータとtestデータでデータセットのサイズ が違うから • 唯一、ページランク特徴のみLBでも効いた

    • ちなみに計算速度は速い順にざっくり並べるとこんな感じ cugraph > igraph > networkx ◦ igraphで十分速かったのでigraphを使った LB: 0.788→0.789|ページランク特徴追加
  25. 25 • Query expansion:クエリと検索結果を混ぜて新しいクエリを 作成することで検索結果を向上させる手法 ◦ こちらの説明(22ページあたり)が分かりやすい ◦ AQE, αQE,

    DQEなどの様々な派生が存在する (今回のコンペではαQEを使用) • もとのembeddingとQuery expansionを適用したembeddingを concatさせて新たなembeddingとした • 大半の上位陣が使っていた ◦ 類似コンペのLandmarkコンペで有効だったためと考えられる LB: 0.789→0.790|Query expansion(クエリ拡張)
  26. 26 • 近傍の情報を盛り込んだ特徴を色々と作ってLightGBMに入れて いたが、わざわざ特徴を作らずともネットワークに学習して欲 しい気持ちはあった • サンプルをノードとした近傍グラフを考えると、サンプルのペ アが同一商品かどうかを判定するタスクはグラフのlink predictionの問題とみなすことができるのでは? •

    → GCNを試してみることに LB: 0.790→0.792|Graph Attention Networksの追加
  27. 27 • GCNの中でも精度が良く、実装もシンプルでカスタマイズしや すいGraph Attention Networks(GAT)をベースにモデルを 組んだ • 今回興味があるのはノードではなくエッジなので、エッジに対 してgraph

    attentionを適用 • エッジの特徴は4つのみ(色々追加しても良くならなかった) ◦ 画像類似度 ◦ BERT類似度 ◦ マルチモーダル類似度 ◦ tf-idf類似度 LB: 0.790→0.792|GATをベースにしたモデル構築
  28. 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 適用対象エッジ
  29. 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をパイプラインに追加
  30. 30 コンペ結果|Public/Private LB: 2位/2位(2426チーム中) PublicLB PrivateLB

  31. 31 我々の解法のパイプライン図

  32. 32 コード :https://www.kaggle.com/lyakaap/2nd-place-solution Solution: https://www.kaggle.com/c/shopee-product-matching/di scussion/238022 我々の解法のコード・Solution

  33. 33 03 他の上位者の解法紹介

  34. 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 ✔
  35. 35 • 画像側:NFNet, テキスト側:BERT/XLM • Iterative Neighborhood Blending (INB) ◦

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

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

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

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

    DBA: 大体QEと同じ。QEがクエリのみに対して適用するのに対して、こ ちらはデータ全体に適用するのが異なる点 • 複数の類似度指標をどう組み合わせるかが重要だった ◦ 2nd-level modelなど 上位者の解法まとめ
  40. 40 04 まとめ

  41. 41 ▪ Shopeeコンペはとても良コンペでした ▪ データがマルチモーダルでやれることが多かった ▪ 含まれる要素:CV, NLP, Graph, Table

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

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