Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

4 01 Shopeeコンペの概要

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

6 ● あるサンプルの画像とタイトルをもとに、そのサンプルと同一の商品 を見つける ● 評価指標:mean F1 score ○ サンプルごとにF1 scoreを取って、全サンプルで平均をとる タスク クエリ、同一商品、異なる商品

Slide 7

Slide 7 text

7 タスク|もっと詳しく posting_id matches train_1598329973 train_1598329973 train_2496690777 train_2496690777 train_2771755203 train_2771755203 train_2771755203 train_2496690777 submission.csv train.csv

Slide 8

Slide 8 text

8 ▪ カーネルコンペ ▪ 制限時間:2時間 ▪ サンプル数|train=30k / test=70k ▪ 同一商品がtrainとtest両方に出てくることはない※ ▪ そのため、単純に分類のアプローチで解くことはできない コンペの設定など ※ 明言はされていないものの、おそらくそうだった。trainデータの商品IDをラベルとして学 習させたモデルを使ってtestデータに対してそのままラベルを分類させ、そのラベルが同じサ ンプルを同一商品とするアプローチは全然上手くいかなかったらしい

Slide 9

Slide 9 text

9 02 コンペでのスコア変遷

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

12 ▪ 距離学習(CurricularFace)を使って画像モデルを学習 ▪ ラベルは商品のID ▪ 商品IDをgroupとしたGroup-KFold(2-fold) ▪ CurricularFace: 学習の序盤は簡単なサンプルに、終盤は難しいサンプル にフォーカスすることで精度向上 ▪ ArcFaceやその他多数の〜Faceより良かった ▪ backbone: NFNet, DeiT ▪ 学習したモデルを使って画像特徴量の抽出 ▪ タイトルの特徴量抽出にはtf-idfを使用 ▪ それぞれの特徴量で近傍探索を行い、それぞれの類似度が一定 の値よりも高い場合に同一商品とする LB=0.74台時代|アプローチ

Slide 13

Slide 13 text

13 https://www.kaggle.com/c/shopee-product-matching/discussion/238033

Slide 14

Slide 14 text

14 ▪ しきい値調整が難しい ▪ CVとLBで適切なしきい値が異なるため、結局は提出してみない とチューニングできない ▪ 画像類似度とタイトル類似度、2つのしきい値の調整が必要 ▪ サンプルごとに適切なしきい値が違うのでは...? ▪ 類似サンプルがたくさんあるようなサンプルだと、しきい値は厳 しめに切りたい気もする ▪ このあたりで Btbpanda, tkmさんに大きなスコア差で抜かれる LB=0.74台時代|このアプローチの限界

Slide 15

Slide 15 text

15 ▪ 「何かあるんだろうな」と思い、二人の過去コンペの実績を眺める ▪ → 二人とも「Quora Question Pairs」という同一質問文かどうかを 判定するコンペで好成績を収めていることに気づく ▪ → このコンペみたいに、マッチするか(同一商品か)どうかをモデ ルに判定させれば上手くいくのでは?ということに気づく LB=0.74台時代|メタ読み tkmさんのQuoraの解法スライドはこちら (コンペ中参考にしていました)

Slide 16

Slide 16 text

16 ▪ 同一商品かどうかを判定する2nd-level model (LightGBM)を組むことでLBが0.74 → 0.76に ▪ 入力:サンプルのペアの特徴 ▪ 画像類似度、タイトル類似度、編集距離、近傍サンプルの類似度の 統計量、画像のサイズや容量、タイトルの長さや単語数など ▪ 出力:入力ペアが同一商品かどうかの確率値 ▪ 出力の値を見て、しきい値よりも大きければ同一商品とみなす ▪ 調整する必要のあるしきい値が一個になったのもメリット LB=0.76台時代|2nd-level model

Slide 17

Slide 17 text

17 ▪ この後色々試したものの停滞、モチベ低下で十日ほど放 置 ▪ CVとLBの相関が取れなくなってきたのもこのあたり ▪ グラフ系の特徴がCVでは良いもののLBでは効かない ▪ LightGBMの推論時間が遅すぎてモデルや特徴を積む余地がなく なる ▪ Kaggle NotebookのCPU性能はとても貧弱(2コア) ▪ このあたりで、ちょうどリーダーボードの一個上(2位)にいた tkm さんとチームマージする LB=0.76台時代|停滞期

Slide 18

Slide 18 text

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)

Slide 19

Slide 19 text

19 ● 制限時間の次は、OOMの壁にぶつかる ○ Kaggle Notebook環境はメモリが13GBしかない ● 変数の削除とgc.collect()で頑張ってもpythonがメモリを全て 開放してくれない ● これまたtkmさんに %%python というipythonのマジックコマ ンドでpythonのプロセス実行が出来ることを教えてもらい、メ モリ問題が解決 ○ %%python: セルの先頭にこれを書いておくと、そのセルがpython processとして実行されるため、クリーンな状態で各セルの実行が可能に なる チームマージ後|%%python(マジックコマンド)

Slide 20

Slide 20 text

20 ● もろもろ最適化ができたので、二人のパイプラインを統合し、 提出してみた ○ tkmさんのパイプラインも自分のものと大体一緒だった ■ ResNet200d/tf-idf/同一商品判定モデル(LightGBM) ○ LB score: tkm=0.765, lyakaap=0.763 ● 二人のパイプラインはほぼ変えていない※にも関わらず、 LB=0.777まで到達 ○ ※画像特徴だけNFNetの特徴を使うように統一した チームマージ後|LB0.777へ

Slide 21

Slide 21 text

21 ● Kaggle Notebook環境はCPUが貧弱なので、GPUで高速 化できる処理はできるだけGPUでやるのが得 ○ 近傍探索にはfaissのGPUモードを使う ○ 画像のリサイズなどの前処理はtorchのcuda tensorに変換してか ら行う ○ 画像の読み込みにnvidiaのDALIのGPUモードを使う ■ 3位のチームが使っていた ■ 自分たちはtorchvision.io.read_image()を使っていた (opencvやPILの画像読み込みに比べて高速) ○ グラフの媒介中心性の計算にcugraphを使う その他の高速化tips

Slide 22

Slide 22 text

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の追加など

Slide 23

Slide 23 text

23 ● BERTの追加などにより、スコアが大きく向上 ○ 他にやったこと(スコアへの寄与は0.003ぐらい?) ■ 画像特徴抽出時にアスペクト比を保存 ■ 推論時にスコアでソートしてtop51件までに予測を絞る ■ 再帰的に媒介中心性の高いエッジを消していく(もしクリーク間を 結ぶような余分なエッジが存在するのであれば、そのようなエッジ は媒介中心性が高くなるはず) ● なぜBERTが効くのか? ○ → 例えば同じBagでも、 "Victoria Secret Bag" と "Laundry Bag" とでは意味合いが違うからでは?(ディスカッション) LB: 0.777→0.788|BERT, multi-modal modelの追加など

Slide 24

Slide 24 text

24 ● 画像やテキスト類似度によって構築された近傍グラフを もとにグラフ系の特徴をいろいろ試してみたが、CVは上がるも ののLBは下がってしまうものばかりだった ○ おそらく原因はtrainデータとtestデータでデータセットのサイズ が違うから ● 唯一、ページランク特徴のみLBでも効いた ● ちなみに計算速度は速い順にざっくり並べるとこんな感じ cugraph > igraph > networkx ○ igraphで十分速かったのでigraphを使った LB: 0.788→0.789|ページランク特徴追加

Slide 25

Slide 25 text

25 ● Query expansion:クエリと検索結果を混ぜて新しいクエリを 作成することで検索結果を向上させる手法 ○ こちらの説明(22ページあたり)が分かりやすい ○ AQE, αQE, DQEなどの様々な派生が存在する (今回のコンペではαQEを使用) ● もとのembeddingとQuery expansionを適用したembeddingを concatさせて新たなembeddingとした ● 大半の上位陣が使っていた ○ 類似コンペのLandmarkコンペで有効だったためと考えられる LB: 0.789→0.790|Query expansion(クエリ拡張)

Slide 26

Slide 26 text

26 ● 近傍の情報を盛り込んだ特徴を色々と作ってLightGBMに入れて いたが、わざわざ特徴を作らずともネットワークに学習して欲 しい気持ちはあった ● サンプルをノードとした近傍グラフを考えると、サンプルのペ アが同一商品かどうかを判定するタスクはグラフのlink predictionの問題とみなすことができるのでは? ● → GCNを試してみることに LB: 0.790→0.792|Graph Attention Networksの追加

Slide 27

Slide 27 text

27 ● GCNの中でも精度が良く、実装もシンプルでカスタマイズしや すいGraph Attention Networks(GAT)をベースにモデルを 組んだ ● 今回興味があるのはノードではなくエッジなので、エッジに対 してgraph attentionを適用 ● エッジの特徴は4つのみ(色々追加しても良くならなかった) ○ 画像類似度 ○ BERT類似度 ○ マルチモーダル類似度 ○ tf-idf類似度 LB: 0.790→0.792|GATをベースにしたモデル構築

Slide 28

Slide 28 text

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 適用対象エッジ

Slide 29

Slide 29 text

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をパイプラインに追加

Slide 30

Slide 30 text

30 コンペ結果|Public/Private LB: 2位/2位(2426チーム中) PublicLB PrivateLB

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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 ✔

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

37 ● 画像側:NFNet, EffNet ● テキスト側:BERT, tf-idf ○ tf-idfをsparse random projectionで次元削減 ● Query expansionによるembeddingの後処理 ● それぞれの類似度のweighted averageによって同一商品 判定 4th Place Solution

Slide 38

Slide 38 text

38 ● 画像側:NFNet, EffNet, ViT, Swin Transformer, ResNet ● テキスト側:BERT, tf-idf, MLP ● DBAによるembeddingの後処理 ● 2nd-level model: XGB ● 凝集型クラスタリング 5th Place Solution

Slide 39

Slide 39 text

39 ● 画像側のモデルにVision Transformerベースのモデルを 使っているチームがたくさんいた ○ 画像コンペにもTransformerの波が来ている? ● QE/DBAがかなり有効だった ○ DBA: 大体QEと同じ。QEがクエリのみに対して適用するのに対して、こ ちらはデータ全体に適用するのが異なる点 ● 複数の類似度指標をどう組み合わせるかが重要だった ○ 2nd-level modelなど 上位者の解法まとめ

Slide 40

Slide 40 text

40 04 まとめ

Slide 41

Slide 41 text

41 ▪ Shopeeコンペはとても良コンペでした ▪ データがマルチモーダルでやれることが多かった ▪ 含まれる要素:CV, NLP, Graph, Table ▪ 解法の多様性 ▪ ユニークなアプローチが多かったように思います ▪ リークや大きなシェイクもなかった ▪ (ラベルは汚かった...) ▪ チーム戦は楽しい ▪ モチベーションアップ ▪ 自分の知らなかった知見が増える ▪ 議論によってアイデアを思いつく 終わりに

Slide 42

Slide 42 text

42 ▪ 早い段階で近い順位の人とチームマージ出来てよかった ▪ 時間に猶予があったので、お互いのパイプラインを上手いこと統 合することで計算時間短縮にもつながった ▪ アンサンブルの伸びがすごかった ▪ コンペのために論文を読むのを減らした ▪ 学生のときみたいに時間をたくさん使えないので、コンペでの時 間の使い方を考え直した ▪ 経験上、時間をかけて論文読んで実験してもほとんど上手く行か ないことが多かったので、他のことに時間を使うようにした 終わりに|良かったこと