keras model.compile(loss='目標函數 ', optimizer='adam', metrics=['accuracy'])
目標函數,或稱損失函數,是網絡中的性能函數,也是編譯一個模型必須的兩個參數之一。由於損失函數種類眾多,下面以keras官網手冊的為例。
在官方keras.io里面,有如下資料:
-
mean_squared_error或mse
-
mean_absolute_error或mae
-
mean_absolute_percentage_error或mape
-
mean_squared_logarithmic_error或msle
-
squared_hinge
-
hinge
-
binary_crossentropy(亦稱作對數損失,logloss)
-
categorical_crossentropy:亦稱作多類的對數損失,注意使用該目標函數時,需要將標簽轉化為形如
(nb_samples, nb_classes)
的二值序列 -
sparse_categorical_crossentrop:如上,但接受稀疏標簽。注意,使用該函數時仍然需要你的標簽與輸出值的維度相同,你可能需要在標簽數據上增加一個維度:
np.expand_dims(y,-1)
-
kullback_leibler_divergence:從預測值概率分布Q到真值概率分布P的信息增益,用以度量兩個分布的差異.
-
cosine_proximity:即預測值與真實標簽的余弦距離平均值的相反數
mean_squared_error
顧名思義,意為均方誤差,也稱標准差,縮寫為MSE,可以反映一個數據集的離散程度。
標准誤差定義為各測量值誤差的平方和的平均值的平方根,故又稱為均方誤差。
公式:
公式意義:可以理解為一個從n維空間的一個點到一條直線的距離的函數。(此為在圖形上的理解,關鍵看個人怎么理解了)
mean_absolute_error
譯為平均絕對誤差,縮寫MAE。
平均絕對誤差是所有單個觀測值與算術平均值的偏差的絕對值的平均。
公式:(fi是預測值,yi是實際值,絕對誤差
)
mean_absolute_percentage_error
譯為平均絕對百分比誤差 ,縮寫MAPE。
公式:(At表示實際值,Ft表示預測值)
mean_squared_logarithmic_error
譯為均方對數誤差,縮寫MSLE。
公式:(n是整個數據集的觀測值,pi為預測值,ai為真實值)
squared_hinge
公式為max(0,1-y_true*y_pred)^2.mean(axis=-1),取1減去預測值與實際值的乘積的結果與0比相對大的值的平方的累加均值。
hinge
公式為為max(0,1-y_true*y_pred).mean(axis=-1),取1減去預測值與實際值的乘積的結果與0比相對大的值的累加均值。
Hinge Loss 最常用在 SVM 中的最大化間隔分類中,
對可能的輸出 t = ±1 和分類器分數 y,預測值 y 的 hinge loss 定義如下:
可以看出當 t 和 y 有相同的符號時(意味着 y 預測出正確的分類)
此時的 hinge loss
但是如果它們的符號相反
binary_crossentropy
即對數損失函數,log loss,與sigmoid相對應的損失函數。
公式:L(Y,P(Y|X)) = -logP(Y|X)
該函數主要用來做極大似然估計的,這樣做會方便計算。因為極大似然估計用來求導會非常的麻煩,一般是求對數然后求導再求極值點。
損失函數一般是每條數據的損失之和,恰好取了對數,就可以把每個損失相加起來。負號的意思是極大似然估計對應最小損失。
categorical_crossentropy
多分類的對數損失函數,與softmax分類器相對應的損失函數,理同上。
tip:此損失函數與上一類同屬對數損失函數,sigmoid和softmax的區別主要是,sigmoid用於二分類,softmax用於多分類。
一種解釋:
softmax公式:
logistic regression的目標函數是根據最大似然來做的.也就是假設x屬於類y,預測出概率為oy,那么需要最大化oy.
softmax_loss的計算包含2步:
(1)計算softmax歸一化概率
(2)計算損失
這里以batchsize=1的2分類為例:
設最后一層的輸出為[1.2 0.8],減去最大值后為[0 -0.4],
然后計算歸一化概率得到[0.5987 0.4013],
假如該圖片的label為1,則Loss=-log0.4013=0.9130
可選參數
(1) ignore_label
int型變量,默認為空。
如果指定值,則label等於ignore_label的樣本將不參與Loss計算,並且反向傳播時梯度直接置0.
(2) normalize
bool型變量,即Loss會除以參與計算的樣本總數;否則Loss等於直接求和
(3) normalization
enum型變量,默認為VALID,具體代表情況如下面的代碼。
enum NormalizationMode { // Divide by the number of examples in the batch times spatial dimensions. // Outputs that receive the ignore label will NOT be ignored in computing the normalization factor. FULL = 0; // Divide by the total number of output locations that do not take the // ignore_label. If ignore_label is not set, this behaves like FULL. VALID = 1; // Divide by the batch size. BATCH_SIZE = 2; // NONE = 3; }
歸一化case的判斷:
(1) 如果未設置normalization,但是設置了normalize。
則有normalize==1 -> 歸一化方式為VALID
normalize==0 -> 歸一化方式為BATCH_SIZE
(2) 一旦設置normalization,歸一化方式則由normalization決定,不再考慮normalize。
使用方法
layer { name: "loss" type: "SoftmaxWithLoss" bottom: "fc1" bottom: "label" top: "loss" top: "prob" loss_param{ ignore_label:0 normalize: 1 normalization: FULL } }
擴展使用
(1) 如上面的使用方法中所示,softmax_loss可以有2個輸出,第二個輸出為歸一化后的softmax概率
(2) 最常見的情況是,一個樣本對應一個標量label,但softmax_loss支持更高維度的label。
當bottom[0]的輸入維度為N*C*H*W時,
其中N為一個batch中的樣本數量,C為channel通常等於分類數,H*W為feature_map的大小通常它們等於1.
此時我們的一個樣本對應的label不再是一個標量了,而應該是一個長度為H*W的矢量,里面的數值范圍為0——C-1之間的整數。
至於之后的Loss計算,則采用相同的處理。
在kaggle比賽中,經常需要提交log loss,對數損失是經常用到的一個評價指標。其定義為給定概率分類器預測的真實
標簽的負對數似然率。
每一個樣本的對數損失就是在給定真實樣本標簽的條件下,分類器的負對數似然函數:
-log P(yt|yp) = -(yt log(yp) + (1 - yt) log(1 - yp))
當某個樣本的真實標簽y=1時,loss=-log(p),分類器的預測概率值為p=pr(y=1)的概率如果越大,越接近1,則損失越小;如果p=pr(y=1)的概率值越小,則分類損失越大。
在提交結果中,使用官方提供的測試集是沒有標簽的,提交基於測試集模型的預測值,屬於每一類預測值的概率值,官方評價指標使用log loss,會返回一個負對數似然值作為評價的目標值。
舉個例子:
兩個類別,spam,ham是真實標簽值,四個預測值,預測屬於正確類別的概率值基本正確,所以返回的對數損失是0.21......,值比較小,說明預測還是可以的。
sparse_categorical_crossentrop
在上面的多分類的對數損失函數的基礎上,增加了稀疏性(即數據中多包含一定0數據的數據集),如目錄所說,需要對數據標簽添加一個維度np.expand_dims(y,-1)。
kullback_leibler_divergence
(譯自WIKI)
對於離散隨機變量,其概率分布P 和 Q的KL散度可按下式定義為
即按概率P求得的P和Q的對數差的平均值。KL散度僅當概率P和Q各自總和均為1,且對於任何i皆滿足
Q(i)>0及P(i)>0時,才有定義。式中出現0Ln0的情況,其值按0處理。
對於連續隨機變量,其概率分布P和Q可按積分方式定義為
其中p和q分別表示分布P和Q的密度。
更一般的,若P和Q為集合X的概率測度,且Q關於P絕對連續,則從P到Q的KL散度定義為
其中,假定右側的表達形式存在,則為Q關於P的R–N導數。
相應的,若P關於Q絕對連續,則
即為P關於Q的相對熵,用以度量兩個分布的差異。
cosine_proximity
此方法用余弦來判斷兩個向量的相似性。
設向量 A = (A1,A2,...,An),B = (B1,B2,...,Bn),則有
余弦值的范圍在[-1,1]之間,值越趨近於1,代表兩個向量的方向越趨近於0,他們的方向更加一致。相應的相似度也越高。