【Kaggle】2021 Shopee商品分類競賽 Part3:超強Baseline ArcFace!!

倢愷 Oscar
May 20, 2021

--

這是Shopee的商品分類競賽系列分析文的第三篇,如果還沒看前2篇的話推薦先回去補足基礎知識。

這篇我重點就是要介紹ArcFace,不會深入到論文細節(如果有興趣可以回覆跟我講,我可以再多開一篇來講),希望能夠讓大家了解甚麼時候、怎麼使用ArcFace。

本篇介紹1. ArcFace基礎知識
2. ArcFace參考Code使用教學

ArcFace基礎知識

先回頭想Shopee比賽的本質,在第一篇我有簡單說明過,Shopee商品分類比賽希望基於商品照片、標題來判斷哪些屬於同一個商品

所以Shopee比賽的本質其實不是分類(Classification)也不是迴歸(Regression)而更像是分群(Clustering)

分群的重點在於,找到一種抽feature的方法,讓比較相似的data,靠得比較近。

而在第一篇中,我介紹的baseline,不外乎就是用pretrained好的模型,來抽取feature,而使用pretrianed模型的目的是:我們預期pretrained模型抽出的feature會「更有意義」

但是目前的Baseline抽feature的方法,其實都是屬於Unsupervised的方法,舉TF-IDF為例,我們並沒有依據shopee提供給我們的label,來調整我們抽feature的方法,而只能調整最後的model。

ArcFace就是希望藉由Label來調整我們的feature,來讓分群更加容易,而ArcFace設計了。

下面我們來看ArcFace的效果,如果我們直接用Softmax來training,我們的feature space會長這樣。

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

而如果我們加入ArcFace則會長這樣。其中每個顏色就是一種類別的資料

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

可以明顯看出使用ArcFace後,我們的Feature(Embedding)明顯同類別更靠近,不同類別離更遠。

所以只要是做分群、推薦、分類等問題,我們都可以使用ArcFace或是其他類似ArcFace的方法。

而這種讓越相似的資料在feature space (Embedding space)靠的越近的技術,就稱為Metric Learning。

而如果沒有特殊需求,我建議想要使用Metric Learning可以直接先試試看metric-learn這個python package,之後有機會再介紹。

ArcFace 參考Code使用教學

這邊因為ArcFace本身作者並沒有把ArcFace做成工具,仍舊停留在論文階段的code,所以實際上要直接使用是有一點小難度的。

這邊我推薦參考ArcFace Explained這篇notebook來更深入了解如何使用,我這邊就直接貼上他的code。

整個ArcFaceClassifier的架構如下,直接使用的話直接宣告這個class即可。(如果有興趣這邊可以直接看arcface_loss的Step 4,那邊是整篇論文的精華。)

這邊可以看到ArcFace的主要流程為下(這段可跳)

  1. Normalize input跟weight
  2. X跟W點乘(這裡X跟W就是最後一層fc的input跟weight,所以就相當於算出最後一層的output)
  3. 算出arccosine,變成角度的資訊
  4. 把target的那個維度+m,也就是讓他的角度多轉一點。(一般設m=0.4,就是多轉20度左右)
  5. 用cosine變回原本的feature space
  6. 照常算cross entropy

接下來我們要任意使用一個架構來抽feature。這邊就隨便叫宣告一個基礎的CNN,這邊的get_embs這個method只是為了visualization方便,並非必要。

最後宣告model為SimpleConv(ArcFaceClassifier(3,10),即可使用ArcFace,如果想要更方便的話可以使用fast.ai的Learner整個包起來,如下。

這樣就大功告成了!!

這邊我再推薦兩個notebook來讓大家更熟悉怎麼使用ArcFace。

  1. pytorch Densenet+ArcFace
  2. Tensorflow ArcFace
  3. pytorch distillBERT+ArcFace

跟ArcFace類似的方法來有

  1. CosFace: Large Margin Cosine Loss for Deep Face Recognition
  2. AdaCos: Adaptively Scaling Cosine Logits for Effectively Learning Deep Face Representations

實際上在shopee的比賽中,只要ArcFace接的好,然後挑一下pretrained model,就可以穩定殺到20~30%,是一個非常強的baseline。

而前10名的方法中也大多都有用到ArcFace或是有用到metric learning,非常推薦做分群、推薦、分類的大家試試看ArcFace!!

--

--

倢愷 Oscar

我是倢愷,CTO at TeraThinker an AI Adaptive Learning System Company。AI/HCI研究者,超過100場的ML、DL演講、workshop經驗。主要學習如何將AI落地於業界。 有家教、演講合作,可以email跟我聯絡:axk51013@gmail.com