@tags: caffe 機器學習
在機器學習(暫時限定有監督學習)中,常見的算法大都可以划分為兩個部分來理解它
-
一個是它的Hypothesis function,也就是你用一個函數f,來擬合任意一個輸入x,讓預測值t(t=f(x))來擬合真實值y
-
另一個是它的cost function,也就是你用一個函數E,來表示樣本總體的誤差。
而有時候還會出現loss function,感覺會和cost function混淆。
上quora看了下,有個同名問題,回答的人不多,upvote更少。。回答者里面,普遍認為cost function就是loss function,一個意思。
anyway,還是有個答案提到了區別,我更支持這種看法,參考這里:http://image.diku.dk/shark/sphinx_pages/build/html/rest_sources/tutorials/concepts/library_design/losses.html
簡單說,loss function是對於單個樣本而言的,比如對於0-1分類問題,當前預測樣本x的輸出為t,實際值為y,那么loss function就是y-t,或者abs(y-t);對於連續型數據的預測,也就是回歸問題,loss function可以是差值的平方:(y-t)^2
而cost function是對於樣本總體而言的,對於0-1分類問題,loss function是n個樣本的loss function取值的均值;而對於回歸問題,cost function是n個樣本的平方誤差的平均,俗稱均方誤差(mean square error)
總結:cost function是各個樣本的loss funcion的平均
========== 那么caffe下的loss又是怎么一回事?===========
caffe通常是視覺任務用的深度學習框架,處理的原始數據是圖片。每次處理一張圖片,這本身可以run,算是OK,但不夠好。
每次處理多張圖片,稱為一個batch(批次),比如訓練圖片一共有4000張,每個batch處理50張。
按照batch來處理圖片后,每個batch算出一個loss,也就是這50張圖片的loss平均。當然這個loss其實並不是重點。重點是,用這50個樣本,在做梯度下降來更新權值的時候,梯度是根據這50個樣本算出來的均值,而不是用某一個圖片的梯度:
這也就是要使用batch的原因。
=========== error又是什么 ============
error是說,一個預測結果和實際標簽比較,一樣的話不算錯,不一樣就算錯(僅考慮分類問題)。
那么我在一個miniBatch之內,比如100張圖,每張圖對應一個分類的標簽,以及一個預測出來的結果,這個預測結果和標簽做比較,如果不一致說明“預測錯了”。統計所有100張圖上“預測錯誤的結果”的數量,比如有3個,那么error就認為是3,或者表示為3%。
也就是說,error表示的是“累計錯誤數量的占比”。從這一點來看,error關注的是“是否正確”的累計,而不是“單個結果上錯誤的程度”,error關注的是“質”,而loss關注的是“錯誤的程度”(根據loss函數來決定),這一點上,error和loss是有所不同的。