這是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會長這樣。

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

可以明顯看出使用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的主要流程為下(這段可跳)
- Normalize input跟weight
- X跟W點乘(這裡X跟W就是最後一層fc的input跟weight,所以就相當於算出最後一層的output)
- 算出arccosine,變成角度的資訊
- 把target的那個維度+m,也就是讓他的角度多轉一點。(一般設m=0.4,就是多轉20度左右)
- 用cosine變回原本的feature space
- 照常算cross entropy
接下來我們要任意使用一個架構來抽feature。這邊就隨便叫宣告一個基礎的CNN,這邊的get_embs這個method只是為了visualization方便,並非必要。
最後宣告model為SimpleConv(ArcFaceClassifier(3,10),即可使用ArcFace,如果想要更方便的話可以使用fast.ai的Learner整個包起來,如下。
這樣就大功告成了!!
這邊我再推薦兩個notebook來讓大家更熟悉怎麼使用ArcFace。
跟ArcFace類似的方法來有
- CosFace: Large Margin Cosine Loss for Deep Face Recognition
- AdaCos: Adaptively Scaling Cosine Logits for Effectively Learning Deep Face Representations
實際上在shopee的比賽中,只要ArcFace接的好,然後挑一下pretrained model,就可以穩定殺到20~30%,是一個非常強的baseline。
而前10名的方法中也大多都有用到ArcFace或是有用到metric learning,非常推薦做分群、推薦、分類的大家試試看ArcFace!!
如果喜歡這篇文章可以幫我多拍手幾次XD,或是對於哪個類型文章有興趣都可以在留言區跟我講~ 後續會以中難度的ML/DS/AI知識為主,以及AI/HCI研究相關知識
參考資料
- https://www.kaggle.com/c/shopee-product-matching/discussion/226279
- https://www.kaggle.com/moeinshariatnia/indonesian-distilbert-finetuning-with-arcmargin
- https://www.kaggle.com/ragnar123/unsupervised-baseline-arcface
- https://www.kaggle.com/underwearfitting/pytorch-densenet-arcface-validation-training
- https://arxiv.org/abs/1801.09414
- https://arxiv.org/abs/1905.00292