[caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大loss
本節(jié)說caffe中常見loss的推導,具體包含下面的cpp。
multinomial_logistic_loss_layer.cpp
01
multinomial_logistic_loss_layer.cpp
數(shù)學定義
x是輸入,y是label,l是loss
上述式只有當樣本i屬于第k類時,y?k=1,其他情況?y?k=0,我們計不為0的?y?k=y。
forward & backward
forward對所有求和,注意此處沒有對圖像維度的像素進行歸一化,只對batch size維度進行歸一化,num就是batch size,這與下面的softmaxlosslayer是不一樣的。
void MultinomialLogisticLossLayer<Dtype>::Forward_cpu(
backward可以自己去看,很簡單就不說了
02
softmax_layer.cpp
數(shù)學定義
softmax是我們最熟悉的了,分類任務(wù)中使用它,分割任務(wù)中依然使用它。Softmax loss實際上是由softmax和cross-entropy loss組合而成,兩者放一起數(shù)值計算更加穩(wěn)定。
令z是softmax_with_loss層的輸入,f(z)是softmax的輸出,則
單個像素i的softmax loss等于cross-entropy error如下
展開上式:
在網(wǎng)絡(luò)中,z是即bottom blob,l(y,z)是top blob,反向傳播時就是要根據(jù)top blob diff得到bottom blob diff,所以要得到?
下面求loss對z的第k個節(jié)點的梯度
可見,傳給groundtruth label節(jié)點和非groundtruth label是的梯度是不一樣的。
forward就不看了,看看backward吧。
Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();
Test_softmax_with_loss_layer.cpp
作為loss層,很有必要測試一下,測試也分兩塊,forward和backward。
Forward測試是這樣的,定義了個bottom blob data和bottom blob label,給data塞入高斯分布數(shù)據(jù),給label塞入0~4。
blob_bottom_data_(new
然后分別ingore其中的一個label做5次,最后比較,代碼如下。
Dtype accum_loss = 0;
至于backwards,直接套用checker.CheckGradientExhaustive就行,它自己會利用數(shù)值微分的方法和你寫的backwards來比較精度。
TYPED_TEST(SoftmaxWithLossLayerTest,
03
?eulidean_loss_layer.cpp
euclidean loss就是定位檢測任務(wù)中常用的loss。
數(shù)學定義:
forward & backward
void EuclideanLossLayer<Dtype>::Backward_cpu(const
testcpp就不說了。
04
sigmoid_cross_entropy_loss_layer.cpp
與softmax loss的應(yīng)用場景不同,這個loss不是用來分類的,而是用于預測概率,所以在loss中,沒有類別的累加項。
令第i個節(jié)點輸入Xi ,輸出總loss為l,label為 yi ,則loss定義如下
其中
上式子有個等價轉(zhuǎn)換,這是為了更好的理解caffe 中forward的計算,公式太多我就直接借用了,如果遇到了原作者請通知我添加轉(zhuǎn)載申明。
http://blog.csdn.net/u012235274/article/details/51361290
反向求導公式如下:
在經(jīng)過上面的轉(zhuǎn)換后,避開了數(shù)值計算不穩(wěn)定的情況,caffe中的源碼是對整個的bottom[0]->count進行計算累加的,沒有區(qū)分label項。
for (int i = 0; i < bottom[0]->count(); ++i) {
反向傳播很簡單就不看了
05
contrastive_loss_layer.cpp
有一類網(wǎng)絡(luò)叫siamese network,它的輸入是成對的。比如輸入兩張大小相同的圖,網(wǎng)絡(luò)輸出計算其是否匹配。所采用的損失函數(shù)就是contrastive loss
數(shù)學定義:
d就是歐氏距離,y是標簽,如果兩個樣本匹配,則為1,否則為0. 當y=1,loss就是歐氏距離,說明匹配的樣本距離越大,loss越大。當y=0,就是與閾值margin的歐式距離,說明不匹配的樣本,歐氏距離應(yīng)該越大越好,超過閾值最好,loss就等于0.
反向傳播其實就是分y=1和y=0兩種情況下的euclidean loss的反向傳導,由于與euclidean
06
hinge_loss_layer.cpp
這是一個多分類的loss, 也是SVM的目標函數(shù),沒有學習參數(shù)的全連接層InnerProductLayer+HingeLossLayer就等價于SVM。
數(shù)學定義:
這個層的輸入bottom[0]是一個N*C*H*W的blob,其中取值任意值,label就是N*1*1*1,其中存儲的就是整型的label{0,1,2,…,k}。tnk ?相當于SVM中的?
參考博客http://blog.leanote.com/post/braveapple/Hinge-Loss-%E7%9A%84%E7%90%86%E8%A7%A3
假如預測類別數(shù)是K個,正確的label是M,預測值為tnk,即是第n個樣本對第k類的預測值,那么當k=M時。
當k!=M時,
其中p=1,p=2分別對應(yīng)L1范數(shù)和L2范數(shù),以L1為例
Forward
caffe_copy(count, bottom_data, bottom_diff);
只需要根據(jù)上面的轉(zhuǎn)化后的式子,在正確label處乘以-1,然后累加即可。
再看反向梯度求導:
當進行一次forward之后,
bottom_diff=[max(0,1+t0),max(0,1+t1),...,max(0,1?tk),...,max(0,1?tK-1)]
我們現(xiàn)在要求梯度,期望是1+tk>0時為1,1-tk>0時為-1,其他情況為0,
當任意一項1+tk或者1-tk<0時,會有梯度=0。實際上就是求上面向量各自元素的符號,當1+tk>0,sign(1+tk),只是max(0,1?tk)這個應(yīng)該反過來,當1-tk>0時,sign(tk-1)=-1。
代碼如下:
Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();
}
07
infogain_loss_layer.cpp
數(shù)學定義:
輸入bottom_data是N*C*H*W維向量,bottom_label是N*1*1*1維向量,存儲的就是類別數(shù)。它還有個可選的bottom[2],是一個infogain matrix矩陣,它的維度等于num_of_label * num_of_label。每個通道c預測的是第c類的概率,取值0~1,所有c個通道的概率相加=1。是不是像soft Max?
實際上它內(nèi)部就定義了shared_ptr<Layer<Dtype> > softmax_layer_,用于映射輸入。
Loss定義如下:
其中?代表H的第ln行,K是所有類別數(shù),如果H是一個單位矩陣,那么只有對角線有值,回到文章開頭,這就是multinomial_logistic_loss_layer。當H是一個普通矩陣時,當groundtruth label為k,?
?時,值也可以非零。這樣各個類別之間就不存在競爭關(guān)系了,后來的mask-rcnn中實際上loss也就是去除了這重競爭關(guān)系。
Forward:
void InfogainLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
上面與multinomial_logistic_loss_layer的區(qū)別就在于每一項乘了infogain_mat[label_value *??num_labels_ + l]。
Backward:
for (int l = 0; l < num_labels_; ++l) {
這個,看了4篇了大家不妨自己推一推?不行咱再一起來
同時,在我的知乎專欄也會開始同步更新這個模塊,歡迎來交流
https://zhuanlan.zhihu.com/c_151876233
注:部分圖片來自網(wǎng)絡(luò)
—END—
打一個小廣告,我的攝影中的圖像基礎(chǔ)技術(shù)公開課程《AI 程序員碼說攝影圖像基礎(chǔ)》上線了,主要從一個圖像處理工程師的角度來說說攝影中的基礎(chǔ)技術(shù)和概念,歡迎大家訂閱交流。
加入我們做點趣事
往期精彩
?
[caffe解讀] caffe從數(shù)學公式到代碼實現(xiàn)1-導論。
為了壓榨CNN模型,這幾年大家都干了什么。
[caffe解讀] caffe從數(shù)學公式到代碼實現(xiàn)2-基礎(chǔ)函數(shù)類
總結(jié)
以上是生活随笔為你收集整理的[caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大loss的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [caffe解读] caffe从数学公式
- 下一篇: [caffe解读] caffe从数学公式