日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【技术综述】一文道尽softmax loss及其变种

發布時間:2025/3/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【技术综述】一文道尽softmax loss及其变种 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文首發于龍鵬的知乎專欄《有三AI學院》

https://zhuanlan.zhihu.com/c_151876233

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

?

01 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.cpp

Forward測試是這樣的,定義了個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(new
SoftmaxWithLossLayer<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 but
once.
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 them
layer_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的改進,下面一一道來。

?

02 weighted softmax loss【1】

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

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

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

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

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

?

03 soft softmax loss【2】

首先我們看下面的式子。

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

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

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

?

04 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來共同實現,可參考代碼。

?

05 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學習到的特征,本來就依據角度有很強的區分度,另一方面,人臉是一個流形,將其特征映射到超平面表面,也可以解釋。

?

06 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層,作者還計算出了該值的下界,具體可自行參考。

?

07 additive margin softmax loss【7】

定義如下

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

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

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

我們看一個公式如下

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

?

08 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.

同時,在我的知乎專欄也會開始同步更新這個模塊,歡迎來交流

https://zhuanlan.zhihu.com/c_151876233

注:部分圖片來自網絡

—END—

感謝各位看官的耐心閱讀,不足之處希望多多指教。后續內容將會不定期奉上,歡迎大家關注有三公眾號 有三AI

?

?

?

總結

以上是生活随笔為你收集整理的【技术综述】一文道尽softmax loss及其变种的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。