「技術綜述」一文道盡softmax loss及其變種

2021-01-11 有三AI

本文首發於知乎專欄《有三AI學院》,https://zhuanlan.zhihu.com/c_151876233

今天來說說softmax loss以及它的變種

1 softmax loss

softmax loss是我們最熟悉的loss之一了,分類任務中使用它,分割任務中依然使用它。softmax loss實際上是由softmax和cross-entropy loss組合而成,兩者放一起數值計算更加穩定。這裡我們將其數學推導一起回顧一遍。

令z是softmax層的輸入,f(z)是softmax的輸出,則

單個像素i的softmax loss等於cross-entropy error如下:

展開上式:

在caffe實現中,z即bottom blob,l(y,z)是top blob,反向傳播時,就是要根據top blob diff得到bottom blob diff,所以要得到

下面求loss對z的第k個節點的梯度

可見,傳給groundtruth label節點和非groundtruth label節點的梯度是不一樣的。

我們看看caffe中Backward的代碼。

Dtype* bottom_diff =bottom[0]->mutable_cpu_diff();const Dtype* prob_data = prob_.cpu_data();caffe_copy(prob_.count(), prob_data,bottom_diff);const Dtype* label =bottom[1]->cpu_data();int dim = prob_.count() / outer_num_;int count = 0;for (int i = 0; i < outer_num_; ++i) {for (int j = 0; j < inner_num_; ++j) {const int label_value =static_cast<int>(label[i * inner_num_ + j]);if (has_ignore_label_ &&label_value == ignore_label_) {for (int c = 0; c <bottom[0]->shape(softmax_axis_); ++c) {bottom_diff[i * dim + c *inner_num_ + j] = 0;}} else {bottom_diff[i * dim + label_value *inner_num_ + j] -= 1;++count;}}}作為loss層,很有必要測試一下,測試分兩塊,forward和backward,我們看看caffe中的代碼。

Test_softmax_with_loss_layer.cppForward測試是這樣的,定義了個bottom blob data和bottom blob label,給data塞入高斯分布數據,給label塞入0~4。

blob_bottom_data_(new Blob<Dtype>(10, 5, 2, 3))blob_bottom_label_(new Blob<Dtype>(10, 1, 2, 3))然後分別ingore其中的一個label做5次,最後比較,代碼如下。

Dtype accum_loss = 0;for (int label = 0; label < 5; ++label) {layer_param.mutable_loss_param()->set_ignore_label(label);layer.reset(newSoftmaxWithLossLayer<Dtype>(layer_param));layer->SetUp(this->blob_bottom_vec_,this->blob_top_vec_);layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_);accum_loss +=this->blob_top_loss_->cpu_data()[0];}// Check that each label was included all butonce.EXPECT_NEAR(4 * full_loss, accum_loss, 1e-4);至於backwards,直接套用checker.CheckGradientExhaustive就行,它自己會利用數值微分的方法和你寫的backwards來比較精度。

TYPED_TEST(SoftmaxWithLossLayerTest,TestGradientIgnoreLabel) {typedef typename TypeParam::Dtype Dtype;LayerParameter layer_param;//labels are in {0, ..., 4}, so we'll ignore about a fifth of themlayer_param.mutable_loss_param()->set_ignore_label(0);SoftmaxWithLossLayer<Dtype> layer(layer_param);GradientChecker<Dtype> checker(1e-2, 1e-2, 1701);checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_,this->blob_top_vec_, 0);}原始的softmax loss非常優雅,簡潔,被廣泛用於分類問題。它的特點就是優化類間的距離非常棒,但是優化類內距離時比較弱。

鑑於此,就有了很多對softmax loss的改進,下面一一道來。

2 weighted softmax loss【1】

這第一個改進就是weighted,怎麼說?假如我們是一個分類問題,只有兩類,但是兩類的樣本數目差距非常之大。比如邊緣檢測問題,這個時候,明顯邊緣像素的重要性是比非邊緣像素大的,此時可以針對性的對樣本進行加權。

wc就是這個權重,像剛才所說,c=0代表邊緣像素,c=1代表非邊緣像素,則我們可以令w0=1,w1=0.001,即加大邊緣像素的權重。

當然,這個權重,我們還可以動態地計算讓其自適應。

具體的反向公式推導,就跟上面差不多不再贅述,詳細的實現我會在git中給出代碼。【1】中用了weighted sigmoid_cross_entropy_loss,原理類似。

固定權重的fixed softmax loss和自適應權重的adapted softmax loss大家可以去git中自行查看。

3 soft softmax loss【2】

首先我們看下面的式子。

當T=1時,就是softmax的定義,當T>1,就稱之為soft softmax,T越大,因為Zk產生的概率差異就會越小。文【2】中提出這個是為了遷移學習,生成軟標籤,然後將軟標籤和硬標籤同時用於新網絡的學習。

為什麼要想到這麼用,這是因為當訓練好一個模型之後,模型為所有的誤標籤都分配了很小的概率;然而實際上對於不同的錯誤標籤,其被分配的概率仍然可能存在數個量級的懸殊差距。這個差距,在softmax中直接就被忽略了,但這其實是一部分有用的信息。

文章的做法是先利用softmaxloss訓練獲得一個大模型,然後基於大模型的softmax輸出結果獲取每一類的概率,將這個概率,作為小模型訓練時soft target的label。

4 Large-Margin Softmax Loss【3】

這是文【3】中提出的loss,被稱為L-Softmax loss。我們先從一張圖來理解下softmax loss,這張圖顯示的是不同softmax loss和L-Softmax loss學習到的cnn特徵分布。第一列就是softmax,第2列是L-Softmax loss在參數m取不同值時的分布。通過可視化特徵可知學習到的類間的特徵是比較明顯的,但是類內比較散。而large-margin softmax loss則類內更加緊湊,怎麼做到的呢?

先看一下loss的定義形式如下。

由於 zk 是全連接層的輸出,所以它可以寫成

的形式,將內積更具體的表現出來,就是

我們看二分類的情況,對於屬於第1類的樣本,我們希望

如果我們對它提出更高的要求呢?由於cos函數在0~PI區間是遞減函數,我們將要求改為

其中m>=1,

在這個條件下,原始的softmax條件仍然得到滿足。

我們看下圖,如果W1=W2,那麼滿足條件2,顯然需要θ1與θ2之間的差距變得更大,原來的softmax的decision boundary只有一個,而現在類別1和類別2的decision boundary不相同,這樣類間的距離進一步增加,類內更近緊湊。

更具體的定義如下:

L-Softmax loss中,m是一個控制距離的變量,它越大訓練會變得越困難,因為類內不可能無限緊湊。

作者的實現是通過一個LargeMargin全連接層+softmax loss來共同實現,可參考代碼。

5 angular softmax loss【4】

也稱A-softmax loss。它就是在large margin softmax loss的基礎上添加了兩個限制條件||W||=1和b=0,使得預測僅取決於W和x之間的角度θ。

上圖分別比較了原softmax loss,原softmax loss添加||w||=1約束,以及在L-softmax loss基礎上添加||w||=1約束的結果。

為什麼要添加|w|=1的約束呢? 作者做了兩方面的解釋,一個是softmax loss學習到的特徵,本來就依據角度有很強的區分度,另一方面,人臉是一個流形,將其特徵映射到超平面表面,也可以解釋。

6 L2-constrained softmax loss【5】

將學習的特徵x歸一化。作者觀測到好的正面的臉,特徵的L2-norm大,而特徵不明顯的臉,其對應的特徵L2-norm小,因此提出這樣的約束來增強特徵的區分度。

上面式就是將其歸一化到固定值α。實際訓練的時候都不需要修改代碼,只需要添加L2-norm層與scale層,如下圖。

為什麼要加這個scale層?NormFace【6】中作出了解釋。

該文章指出了直接歸一化權重和特徵,會導致loss不能下降。因為就算是極端情況下,多類樣本,令正樣本|wx|=1取最大值,負樣本|wx|=-1取最小值,這時候分類概率也是

當類別數n=10,p=0.45;n=1000,p=0.007。當類別數增加到1000類時,正樣本最大的概率還不足0.01,而反向求導的時候,梯度=1-p,會導致一直傳回去很大的loss。

所以,有必要在後面加上scale層,作者還計算出了該值的下界,具體可自行參考。

7 additive margin softmax loss【7】

定義如下

看明白了吧,就是把L-Softmax的乘法改成了減法,同時加上了尺度因子s。作者這樣改變之後前向後向傳播變得更加簡單。其中W和f都是歸一化過的,作者在論文中將m設為0.35。

值得注意的是,normalization是收斂到好的點的保證,同時,必須加上scale層,scale的尺度在文中被固定設置為30。

那到底什麼時候需要normalization什麼時候又不需要呢?這實際上依賴於圖片的質量。

我們看一個公式如下

其中α就是向量x的模,它說明模值比較小的,會有更大的梯度反向傳播誤差係數,這實際上就相當於難樣本挖掘了。不過,也要注意那些質量非常差的,模值太小可能會造成梯度爆炸的問題。

8 argface additive angular margin【8】

定義如下:

在定義這個loss的時候,作者乾脆做了一個表把現有基於softmax loss及其改進的loss的二分類決策邊界條件都列了出來。

說累了,一句話,有效。。。

到此可以說為了改進softmax loss用盡了手段了,至於有沒有用,具體效果大家去嘗試吧,附上未完整的GitHub連結。

https://github.com/longpeng2008/Caffe_Long先寫到這裡,後續再充實實驗結果和更多原理。

【1】Xie S, Tu Z.Holistically-nested edge detection[C]//Proceedings of the IEEE international conference on computer vision. 2015: 1395-1403.

【2】Hinton G,Vinyals O, Dean J. Distilling the knowledge in a neural network[J]. arXiv

preprint arXiv:1503.02531, 2015.

【3】Liu W, Wen Y,Yu Z, et al. Large-Margin Softmax Loss for Convolutional Neural

Networks[C]//ICML. 2016: 507-516.

【4】Liu W, Wen Y,Yu Z, et al. Sphereface: Deep hypersphere embedding for face

recognition[C]//The IEEE Conference on Computer Vision and Pattern Recognition

(CVPR). 2017, 1.

【5】Ranjan R, Castillo C D, Chellappa R. L2-constrained softmax loss for discriminative face verification[J]. arXiv preprint arXiv:1703.09507, 2017.

【6】Wang F, Xiang X, Cheng J, et al. NormFace: $ L_2 $ Hypersphere Embedding for Face Verification[J]. arXiv preprint arXiv:1704.06369, 2017.

【7】Wang F, Liu W,Liu H, et al. Additive Margin Softmax for Face Verification[J]. arXiv preprint arXiv:1801.05599, 2018.

【8】Deng J, Guo J, Zafeiriou S. ArcFace: Additive Angular Margin Loss for Deep Face

Recognition[J]. arXiv preprint arXiv:1801.07698, 2018.

相關焦點

  • 從最優化的角度看待 Softmax 損失函數
    Softmax交叉熵損失函數應該是目前最常用的分類損失函數了,在大部分文章中,Softmax交叉熵損失函數都是從概率角度來解釋的,本周二極市就推送了一篇Softmax相關文章:一文道盡softmax loss及其變種。本文將嘗試從最優化的角度來推導出Softmax交叉熵損失函數,希望能夠啟發出更多的研究思路。
  • 敘敘loss(總算來一更)
    與smooth L1 loss一樣,結合了L1 loss和L2 loss,具有兩者的優點,但是多了一個參數趨於無窮時,Huber loss趨向於L2 loss.Huber loss對於離群點非常的有效。
  • 楊植麟等人瞄準softmax瓶頸,新方法顧表達性和高效性
    但是,正如楊植麟等人在之前研究 [19]中所指出的,softmax 限制了神經語言模型的表達能力,因為它將輸出表示限制在低秩,這不足以建模自然語言的複雜性。該局限叫做「softmax 瓶頸」。為了打破這一瓶頸,[19] 提出新方法 Mixture of Softmaxes (MoS),它將離散潛在變量引入到輸出層中,通過 log-sum-exp 非線性變換使對數概率矩陣變為高秩。但是,MoS 的內存和時間成本均高於 softmax,這使得它在計算資源有限的情況下實際應用性減弱。
  • CMU楊植麟等人再次瞄準softmax瓶頸,Mixtape兼顧表達性和高效性
    但是,正如楊植麟等人在之前研究 [19]中所指出的,softmax 限制了神經語言模型的表達能力,因為它將輸出表示限制在低秩,這不足以建模自然語言的複雜性。該局限叫做「softmax 瓶頸」。為了打破這一瓶頸,[19] 提出新方法 Mixture of Softmaxes (MoS),它將離散潛在變量引入到輸出層中,通過 log-sum-exp 非線性變換使對數概率矩陣變為高秩。但是,MoS 的內存和時間成本均高於 softmax,這使得它在計算資源有限的情況下實際應用性減弱。
  • 如何寫好一篇文獻綜述?師兄給你劃重點
    利用 Google scholar 可以通過鍵入「keyword」+「keyword」+「keyword」...... 的形式,主要是取決於你研究的主題。利用 Endnote,可一鍵管理和處理你所搜集的文獻,相當方便(可參考往期文章:一文掌握 Endnote 核心功能使用方法…)。
  • 「古風詩文」百鳥鳴,千魚喚,情亦寥寥思盡斷
    若問吾所想,便是在繁華盡處,尋一無人山谷,蓋一竹樓小屋,鋪一青石小路,朝起暮鼓,安之若素。生活宛如一杯美酒,讓你我醉得一塌糊塗。菱花夢,醒無言,終是夢破人已別。世事難辨,無劫亦渡,道不盡人世百苦,說不完夙願輪迴,惟願餘年,賞盡天下繁華,亦無何處牽掛,瀟灑入極殿。方圓千裡,地丈萬頃,天下茫茫大無際,然道無憂,心曰無悔,相思斷腸入輪迴。人言畏,天命違,君與星河兩難為。彼岸葉,空離怨,花葉千年不相見。忘川河,又一潛,斷腸情思已無牽。孟婆水,難下咽,紅淚一落夢無緣。萬物生,自有眠,人生悠悠不可言。
  • RBF-Softmax:讓模型學到更具表達能力的類別表示
    在訓練的後期,softmax也會有問題。如圖2(c)所示,當一個樣本的類間sample-prototype距離顯著大於其類內的sample-prototype距離的時候,損失會很小,即便此時類內的logit很大。但是,我們希望能有個較大的loss來讓這個樣本可以更加靠近其類別的prototype。
  • 一文詳解bundle adjustment
    來源:公眾號|3D視覺工坊(系投稿)作者:李城「3D視覺工坊」技術交流群已經成立,目前大約有12000人,方向主要涉及3D視覺、CV&深度學習、SLAM、三維重建、點雲後處理、自動駕駛、CV入門、三維測量、VR/AR、3D人臉識別、醫療影像、缺陷檢測、行人重識別、目標跟蹤、視覺產品落地、視覺競賽、車牌識別、硬體選型、學術交流、求職交流、ORB-SLAM系列源碼交流、
  • 語義分割之dice loss深度分析(梯度可視化)
    值得說明的是,一般分割網絡輸出經過sigmoid 或 softmax,是不存在輸出為絕對0的情況。這裡加平滑係數主要防止一些極端情況,輸出位數太小而導致編譯器丟失數位的情況。不同實現形式計算不同,但本質並無太大區別,本文主要討論形式1。
  • 多重耐藥菌防控的「術、法、道」
    2017 年 4 月 22 日,由青島市醫學會主辦,青島大學附屬醫院承辦的「山東省第三屆多重耐藥菌感控「天御千菌」論壇在青島市召開。臨床醫生如何綜合運用檢驗、影像、抗生素等「武器」來遏制多重耐藥菌,挽救患者生命是多重耐藥菌防控的「術」;在國內外專家學者的努力下,制定並推廣用來規範、指導臨床多重耐藥菌診治的相關指南共識,這是多重耐藥菌防控的「法」;而研究細菌與人體的宿主關係,探求細菌在人體裡繁殖、共存和平衡的規律,這就是多重耐藥菌防控的「道」。
  • PTMs|2020最新NLP預訓練模型綜述
    「非上下文感知的詞嵌入」。缺點是:「靜態的」,不隨上下文變化而變化,不管這個詞位於哪個句子中,詞的表示都是唯一的,無法解決一詞多義問題。「上下文感知的詞嵌入」:詞嵌入會隨著詞所在的「上下文」不同而動態變化,能夠解決一詞多義問題。形式化的,給定文本,每個token 是個詞或子詞,為了形成上下文感知的嵌入,的表示需要「依賴於整個文本。」 即: 。
  • 包學包會,這些動圖和代碼讓你一次讀懂「自注意力」
    BERT 及其多種變體已經在多種語言理解任務上取得了非常出色的表現,這些架構全都基於 Transformer,而 Transformer 又使用了一種名為「自注意力」的方法。 本文將通過圖示和代碼對自注意力機制進行透徹的解讀。 當然,在閱讀本文之前,你可能也想了解什麼是注意力機制。
  • 圖靈獎「擁抱」深度學習
    但它只有一層神經元,這意味著它的功能極其有限。後來馬文·明斯基撰寫了一本書,詳細地介紹了 Perceptron 和神經網絡的局限性,學界對神經網絡的研究因此擱置了。Bengio 在採訪中回憶道,「1985 年,神經網絡是一個邊緣事物,我在麥吉爾大學的課上只是學習符號主義人工智慧。
  • 從「不和你飛」到「想飛都難」……國泰大裁員,天災還是人禍?
    這一消息「震動」全港,有在港龍工作10年的空中服務人員感慨,港龍有如大家庭,雖然預計過被裁員,絕對沒預計整個公司會停止營運。只可惜連累一眾無辜同事,連工都無得開。>反對派航空業「代言人」公民黨立法會議員譚文豪,昨日急急跑出來「政治抽水」,批評國泰獲政府注資仍然大規模裁員,又將裁員矛頭指向政府,聲稱政府沒有「盡責任」阻止裁員云云。
  • 不只是智能投研,「超對稱技術」想成為所有B端用戶的「外腦」
    在此之外,「超對稱技術」也從數據盡職調查層面,幫助風險投資機構篩選早期項目(deal sourcing),和對機構有投資意向的公司進行審核。 「超對稱技術」目前已經籤約數十家著名金融機構客戶以及企業客戶,主要客戶包括高瓴資本(Hillhouse Capital),九坤投資,紅杉資本和紀源資本等。在和客戶合作方面,「超對稱技術」正在和鵬華基金探索基於超對稱的AI技術研究宏觀經濟,包括消費,製造,地產和基建四大板塊。
  • 入門| 獻給新手的深度學習綜述
    引言 「深度學習」(DL)一詞最初在 1986 被引入機器學習(ML),後來在 2000 年時被用於人工神經網絡(ANN)。深度學習方法由多個層組成,以學習具有多個抽象層次的數據特徵。DL 方法允許計算機通過相對簡單的概念來學習複雜的概念。
  • 「The Zone」模式 (一)
    你會認為「天方夜譚」?覺得「不可能」?還是「我想要」?The Zone模式,便是這樣的狀態,不是變成超人,而是正常人都可以進入的狀態。若是進入The Zone模式,便是以最強大腦的狀態,提升至少50%以上,甚至到達300%的日常反應。
  • 《巫師之昆特牌》最新擴展包「獵魔人之道」即將上線
    《巫師之昆特牌》最新擴展包「獵魔人之道」即將上線 2020-11-18 18:57  遊戲時光VGtime