神經網絡在進行學習的過程中,會通過前一次學習所得到的權重參數作爲一個指標來進行下一輪的學習,如果學習到的權重參數已經是最優解的話,那麼學習將結束,得出最優權重參數,繼而進行泛化能力(指處理未被學習過的數據是否準確的能力)的測試。所以,神經網絡以某個指標爲基準尋求最優權重參數,而這個指標即可稱之爲 “損失函數” 。(例如:在使用神經網絡進行識別手寫數字時,在學習階段找出最佳參數中,最常用的方法是通過梯度下降法找出最優參數,使得通過損失函數計算的值降到最低)
———————————————下面是正文————————————————
損失函數是體現了神經網絡在學習過程中對於監督數據(訓練數據)在多大程度上不擬合(實際結果與預期結果相差多少)的函數,通常,神經網絡在學習的過程中,如果對權重參數的損失函數進行求導操作,即可通過查看結果來了解到權重參數如果稍微增加或者減少時,損失函數的值將會如何進行變化,如果得出的結果爲正,則需要通過將權重參數調小來減少損失函數的值,相反,如果損失函數爲負,則需要通過將權重參數增大來減少損失函數的值,由此可知,損失函數得出的值越小,該權重參數就越優。
下面介紹幾種比較常用的損失函數
一.均方誤差
話不多說,先直接給出公式:
其中y表示神經網絡經過了訓練和激活之後的輸出信號,t表示監督數據(訓練數據),k表示維度
在這裏假定y的輸出信號爲:
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0] 十個數據,分別代表了十個輸入信號爲正確解的概率
而:
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] 十個數據,用1表示真實信號,0表示假信號,從中可以得知,第三個數據即爲正確解
下面我們將使用python來對公式進行檢驗,選取 t 中的第三個數據作爲正確解,而第三個正確解的 y 中概率爲:0.6,所以:
def mean_squared(y,t):
return 0.5 * np.sum((y-t)**2)
y = np.array([0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0])
t = ([0, 0, 1, 0, 0, 0, 0, 0, 0, 0])
print(mean_squared(y,t))
得到的結果爲:
而如果選取選取 t 中的第一個數據作爲正確解,那麼得出的結果爲:
我們可以從例子中發現,第一個例子的損失函數的值更小,和監督數據之間的誤差較小,所以第一個例子的輸出結果和監督數據更加吻合。
二.交叉熵誤差
公式:
此處先上公式的實現:
def cross_entropy(y,t):
value = 1e-10
return -np.sum(t*np.log(y+value))
從代碼可以看出,公式中多出了一個值 value ,這是因爲當對數 log 的輸入 x 爲 0 時,將會出現 log(0) = 負無限大,在代碼裏表示爲 -inf:
如此,當加上一個極小值時,可以防止負無限大的情況發生。如此,我們使用上面的例子,選取 t 中的第三個數據作爲正確解,而第三個正確解的 y 中概率爲:0.6,所以:
def cross_entropy(y,t):
value = 1e-10
return -np.sum(t*np.log(y+value))
y = np.array([0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0])
t = ([0, 0, 1, 0, 0, 0, 0, 0, 0, 0])
print(cross_entropy(y,t))
得到的結果爲:
而如果選取選取 t 中的第一個數據作爲正確解,那麼得出的結果爲:
參考文獻:
《深度學習入門-基於python的理論與實現》(日)齋藤康毅. 人民郵電出版社