#はじめに
GW中から一週間ちょっとの期間の参加でしたがなんとか銀メダル取れたので
1週間何をやっていたかという話をしていきます。
最終順位はPublic 73位, Private 65位でした。
ざっくりshopeeコンの概要は
商品の画像とタイトルが与えられるのでそれらをクラスタリングした精度で競う
というものです。
#方針
tensorflow使いとして
TPUをkaggle,colabで両方フルにぶん回して学習させました。
TPUだとGPUよりも4~5倍は速いですね。
学習待ち時間には公開ノートブックやwebで情報集めました。
#1~2日目
画像のクラスタリングをどのように学習させればよいか知らなかったので
公開ノートブックを読み漁り、Arcfaceという手法を見つけた。
モデルはほとんど公開ノートブックそのままで
model :EfficinetNetB5+arcface
loss : SparseCrossEntropy
optimizer :RAdam
テキストはBertを用いた。テキストの手法は以後特に変更なし。
LB0.72
#3日目
arcfaceを搭載したモデルの学習がうまくいっておらず、その解決策を模索していた。
arcfaceなしのモデルだと60後半の精度が出ていたが、arcfaceありだと
trainingのvalidataion精度が50%切ってしまっていた。
結論としてはハイパーパラメータの設定がまずかったみたいで、
自分でパラメータチューニングは諦めてadacosを採用し、
trainingのvalidataion精度が72%ほどまで上昇した。
しかしながらLB自体の上昇はなかった。
model :EfficinetNetB5+adacos
loss : SparseCategoricalCrossEntropy
optimizer :RAdam
#4日目
モデルをensembleした。efficientNet以外だとNFnetなども候補にあったが、
エラー吐いて動いてくれなかったのでEffcientB5,B4,B3で暫定的にensembleすることにした。
また実際にsubmissionを作る過程は
画像をベクトル化してK(=50)近傍法でthreshold以下の距離のものが同カテゴリーといったものなのだったのだが、ensembleしやくするためにも画像の距離で重み付けをしようと考えた。
具体的には
ベクトルa,b,に対して
diff=threshold-|a-b|
r=threshold
として
x=diff*log(3)*4/r
y=e^x/(1+e^x) (x>-r/4)
0 (x<=r/4)
で得られるyを類似スコアとした。
ensembleしたモデル毎に類似スコアを計算しそれらの平均が
score_threshold(ハイパーパラメータ)を超えたら同一カテゴリーとした。
これは完全に独自で考えました。
この手法だと素朴な距離判定に比べて0.002~3ポイントのLB改善が見られた。
しかしながら初日の公開ノートブックのLBは超えられなかった。
model :EfficinetNetB5(B4,B3 ensemble)+adacos
loss : SparseCategoricalCrossEntropy
optimizer :RAdam
- ベクトル距離重み付け
#5~6日目
公開ノートブックでは自身の似た構成でLB0.73前後を叩き出していたので、
ひたすらthreshold(画像クラスタリングのパラメータ)をいじっていた。
同時にoptimizerにSAMを導入したことでtrainingのvalidataion精度は73.5%まで上昇した。
しかしながらLB精度は一向に改善しなかった。
model :EfficinetNetB5(B4,B3 ensemble)+adacos
loss : SparseCategoricalCrossEntropy
optimizer :SAM(baseはRAdam) - ベクトル距離重み付け
#7日目
もはや諦めの境地だったが、
とりあえずパラメータいじるのは諦めて、過去の類似コンペの上位手法を眺めることにした。そこで見つけたのがquery expansionという手法。
実装が本当にあっているのかはわからないが、画像をベクトル化してK(=50)近傍法でthreshold以下の距離のものが同カテゴリーとしていた状態から
画像をベクトル化してから各画像ベクトルに対してk(=2)近傍法で最も近い2つのベクトルと平均をとってそれを画像ベクトルとした。そして
それらの画像ベクトルに対してK(=50)近傍法でthreshold以下の距離のものが同カテゴリーとした。
これによって劇的にLBが改善し0.025向上した。
model :EfficinetNetB5(B4,B3 ensemble)+adacos
loss : SparseCategoricalCrossEntropy
optimizer :SAM(baseはRAdam) - ベクトル距離重み付け
- query expansion
LB 0.745(private 0.736)
#さいごに
コンペのスコアに関しては一週間前から参加したので仕方ないが、もっと時間があれば伸びしろはいろいろあった気がしたので惜しい(ensembleのモデル変更やテキストのモデルもensembleするなど)。
上位勢の解法で特に印象に残ったのはクラスタリングにLightGBMを用いていた手法とViTを使った手法だった。VitとCNN系のensembleは自分も考えたのだが、モデルが重いので時間が間に合うのかという点と公開ノートブックに一件も情報がなかったので後回しにしていた。
今回棚ぼた的にgetできた銀メダルだったがすごい嬉しかった。これでexpertになれたので次はmaster目指してコンペに取り組んでいこうと思う。