2016-01-20 14 views
7

我想根據訓練期間「正確標籤」的「當前預測」的近/遠程度來縮放每幅圖像的損失值。例如,如果正確的標籤是「貓」,並且網絡認爲它是「狗」,則如果網絡認爲它是「汽車」,則處罰(損失)應該小於該情況。根據caffe中的「不良」縮放損失值

,我做的方式是如下:

1-我所定義的標記物之間的距離的矩陣,
2-通該矩陣作爲一個底部到"softmaxWithLoss"層,
3-乘以每個日誌(概率),以此值按比例縮放損失forward_cpu

但是,我不知道我應該怎麼做在backward_cpu部分。我知道漸變(bottom_diff)必須改變,但不太確定,如何在這裏合併比例值。根據數學,我必須按比例縮放梯度(因爲它只是一個比例),但不知道如何。

而且,好像有loosLayer在朱古力稱爲"InfoGainLoss"如果我沒有記錯的話,做非常類似的工作,然而,這層的向後部分是有點混亂:

bottom_diff[i * dim + j] = scale * infogain_mat[label * dim + j]/prob; 

我不知道爲什麼infogain_mat[]除以prob而不是乘以!如果我使用身份矩陣infogain_mat是不是應該像softmax在向前和向後方面的損失一樣?

如果有人能給我一些建議,我們將非常感謝。

回答

6

你在觀察,你正在做的log(prob)縮放正是"InfogainLoss"層是做正確的(你可以閱讀更多關於它herehere)。

至於衍生物(背面丙):由該層中計算出的損失是

L = - sum_j infogain_mat[label * dim + j] * log(prob(j)) 

如果相對於區分該表達式到prob(j)(其是輸入變量這個層),你」會注意到的log(x)衍生物爲1/x這就是爲什麼你看到

dL/dprob(j) = - infogain_mat[label * dim + j]/prob(j) 

現在,你爲什麼不看到"SoftmaxWithLoss"層的背託類似的表達?
好吧,因爲該圖層的名稱表明它實際上是兩層的組合:softmax用於計算來自分類器的類概率輸出在其之上的對數損失層。結合這兩層可以對梯度進行更加數字穩健的估計。
"InfogainLoss"工作一點點我注意到,有時prob(j)可能有一個非常小的值,導致不穩定的梯度估計。

下面是"SoftmaxWithLoss""InfogainLoss"層前後通行證相對於所述原料預測x),而不是從用Softmax層這些預測導出的「SOFTMAX」概率的詳細計算。您可以使用這些方程來創建一個"SoftmaxWithInfogainLoss"層比上一SOFTMAX層頂部計算infogain損失數值上更穩固:

enter image description here

PS,
請注意,如果你要使用infogain損失稱重時,應喂Hinfogain_mat)與標籤相似,而不是距離。

更新:
最近我實現了這個強大的梯度計算和創建this pull request。該公關合併到2017年4月的主分公司。

+1

衍生產品應該是'dL/dprob(j)= - infogain_mat [label * dim + j]/prob(j)'。 – nn0p

+0

@ nn0p嗯...謝謝! – Shai