Copyright © Microsoft Corporation. All rights reserved.
適用於License版權許可
更多微軟人工智能學習資源,請見微軟人工智能教育與學習共建社區html
在這一章,咱們將簡要介紹一下損失函數~git
在有監督的學習中,須要衡量神經網絡輸出和所預期的輸出之間的差別大小。這種偏差函數須要可以反映出當前網絡輸出和實際結果之間一種量化以後的不一致程度,也就是說函數值越大,反映出模型預測的結果越不許確。github
仍是拿練槍的Bob作例子,Bob預期的目標是所有命中靶子的中心,但他如今的命中狀況是這個樣子的:算法
最外圈是1分,以後越向靶子中心分數是2,3,4分,正中靶心能夠得5分。網絡
那Bob每次射擊結果和目標之間的差距是多少呢?在這個例子裏面,用得分來衡量的話,就是說Bob獲得的反饋結果從差4分,到差3分,到差2分,到差1分,到差0分,這就是用一種量化的結果來表示Bob的射擊結果和目標之間差距的方式。也就是偏差函數的做用。由於是一次只有一個樣本,因此這裏採用的是偏差函數的稱呼。若是一次有多個樣本,那麼就要稱呼這樣子衡量不一致程度的函數就要叫作損失函數了。框架
以作線性迴歸的實際值和預測值爲例,若自變量x是[-2, -1, 0, 1, 2]這樣5個值,對應的指望值y是[-3, 0, 0, 3, 4]這樣的值,目前預測使用的參數是(w, b) = (2, 1), 那麼預測獲得的值y_ = [-3, -1, 1, 3, 5], 採用均方偏差計算這個預測和實際的損失就是\(\sum_{i = 0}^{4}(y[i] - y_\_[i])^{2}\), 也就是3。那麼若是採用的參量是(0, 0),預測出來的值是[0, 0, 0, 0, 0],這是一個顯然錯誤的預測結果,此時的損失大小就是34,\(3 < 34\), 那麼(2, 1)是一組比(0, 0)要合適的參量。函數
那麼經常使用的損失函數有哪些呢?
這裏先給一些前提,好比神經網絡中的一個神經元:學習
圖中 \(z = \sum\limits_{i}w_i*x_i+b_i=\theta^Tx\),\(\sigma(z)\)是對應的激活函數,也就是說,在反向傳播時梯度的鏈式法則中,測試
\[\frac{\partial{z}}{\partial{w_i}}=x_i \tag{1}\]
\[\frac{\partial{z}}{\partial{b_i}}=1 \tag{2}\]
\[\frac{\partial{loss}}{\partial{w_i}}=\frac{\partial{loss}}{\partial{\sigma(z)}}\frac{\partial{\sigma(z)}}{\partial{z}}\frac{\partial{z}}{\partial{w_i}}=\frac{\partial{loss}}{\partial{\sigma(z)}}\frac{\partial{\sigma(z)}}{\partial{z}}x_i \tag{3}\]
\[\frac{\partial{loss}}{\partial{b_i}}=\frac{\partial{loss}}{\partial{\sigma(z)}}\frac{\partial{\sigma(z)}}{\partial{z}}\frac{\partial{z}}{\partial{b_i}}=\frac{\partial{loss}}{\partial{\sigma(z)}}\frac{\partial{\sigma(z)}}{\partial{z}} \tag{4}\]優化
從公式\((3),(4)\)能夠看出,梯度計算中的公共項是\(\frac{\partial{loss}}{\partial{\sigma(z)}}\frac{\partial{\sigma(z)}}{\partial{z}} = \frac{\partial{loss}}{\partial{z}}\)。
下面咱們來探討\(\frac{\partial{loss}}{\partial{z}}\)的影響。因爲梯度的計算和函數的形式是有關係的,因此咱們會從經常使用損失函數入手來逐個說明。
函數形式:
\[loss = \frac{1}{2}\sum_{i}(y[i] - a[i]) ^ 2\],反向傳播:
\[\frac{\partial{loss}}{\partial{z}} = \sum_{i}(y[i] - a[i])*\frac{\partial{a[i]}}{\partial{z}}\]缺點:
和\(\frac{\partial{a[i]}}{\partial{z}}\)關係密切,可能會產生收斂速度緩慢的現象,如下圖爲例(激活函數爲sigmoid)
在激活函數的兩端,梯度(黃色)都會趨向於0,採起MSE的方法衡量損失,在\(a\)趨向於1而\(y\)是0的狀況下,損失loss是1,而梯度會趨近於0,在偏差很大時收斂速度也會很是慢。
在這裏咱們能夠參考activation中關於sigmoid函數求導的例子,假定x保持不變,只有一個輸入的一個神經元,權重\(w = ln(9)\), 偏置\(b = 0\),也就是這樣一個神經元:
保持參數統一不變,也就是學習率\(\eta = 0.2\),目標輸出\(y = 0.5\), 此處輸入x固定不變爲\(x = 1\),採用MSE做爲損失函數計算,同樣先作公式推導,
第一步,計算當前偏差
\[loss = \frac{1}{2}(a - y)^2 = \frac{1}{2}(0.9 - 0.5)^2 = 0.08\]
第二步,求出當前梯度
\[grad = (a - y) \times \frac{\partial{a}}{\partial{z}} \frac{\partial{z}}{\partial{w}} = (a - y) \times a \times (1 - a) \times x = (0.9 - 0.5) \times 0.9 \times (1-0.9) \times 1= 0.036\]
第三步,根據梯度更新當前輸入值
\[w = w - \eta \times grad = ln(9) - 0.2 \times 0.036 = 2.161\]
第四步,計算當前偏差是否小於閾值(此處設爲0.001)
\[a = \frac{1}{1 + e^{-wx}} = 0.8967\]
\[loss = \frac{1}{2}(a - y)^2 = 0.07868\]
第五步,重複步驟2-4直到偏差小於閾值
做出函數圖像如圖所示:
能夠看到函數迭代了287次從才收斂到接近0.5的程度,這比單獨使用sigmoid函數還要慢了不少。
這個損失函數的目的是使得預測獲得的機率分佈和真實的機率分佈儘可能的接近。兩個分佈越接近,那麼這個損失函數獲得的函數值就越小。怎麼去衡量兩個分佈的接近程度呢?這就要用到香農信息論中的內容了。兩個機率分佈之間的距離,也叫作KL Divergence,他的定義是這個形式的,給定離散機率分佈P(x), Q(x),這兩個分佈之間的距離是
\[ D_{KL}(P || Q) = - \sum_{i}P(i)log(\frac{Q(i)}{P(i)})\]
試想若是兩個分佈徹底相同,那麼\(log(\frac{Q(i)}{P(i)}) = 0\), 也就是兩個分佈之間的距離是零,若是兩個分佈差別很大,好比一個是\(P(0)=0.9, P(1)=0.1\),另外一個是\(Q(0)=0.1,Q(1)=0.9\),那麼這兩個分佈之間的距離就是0.763,若是是\(Q(0)=0.5,Q(1)=0.5\),那麼距離就是0.160,直覺上來講兩個分佈越接近那麼他們之間的距離就是越小的,具體的理論證實參看《信息論基礎》,不過爲何要選用這個做爲損失函數呢?
從最大似然角度開始說
關於最大似然,請參看:
https://www.zhihu.com/question/20447622/answer/161722019
將神經網絡的參數做爲\(\theta\),數據的真實分佈是\(P_{data}(y;x)\), 輸入數據爲\(x\),那麼在\(\theta\)固定狀況下,神經網絡輸出\(y\)的機率就是\(P(y;x, \theta)\),構建似然函數,
\[L = \sum_{i}log(P(y_i;x_i, \theta))\],
以\(\theta\)爲參數最大化該似然函數,即\(\theta^{*} = {argmax}_{\theta}L\)。
真實分佈\(P(x_i)\)對於每個\((i, x_i, y_i)\)來講均是定值,在肯定\(x_i\)狀況下,輸出是\(y_i\)的機率是肯定的。在通常的狀況下,對於每個肯定的輸入,輸出某個類別的機率是0或者1,因此能夠將真實機率添加到上述式子中而不改變式子自己的意義:
\[\theta^{*} = {argmax}_{\theta}\sum_{i}P_{data}(y_i;x_i)log(P(y_i;x_i, \theta))\]
將\(D_{KL}\)展開,獲得,
\[D_{KL}(P || Q) = - \sum_{i}P(i)log(\frac{Q(i)}{P(i)}) = \sum_{i}P(i)log(P(i)) - \sum_{i}P(i)log(Q(i)) \]
\(P(i)\)表明\(P_{data}(y_i;x_i)\), \(Q(i)\)表明\(P(y_i;x_i,\theta)\)。
上述右側式中第一項是和僅真實分佈\(P(i)\)有關的,在最小化\(D_{KL}\)過程當中是一個定值,因此最小化\(D_{KL}\)等價於最小化\(-\sum_{i}P(i)log(Q(i))\),也就是在最大化似然函數。函數形式(以二分類任務爲例)
\[loss = \sum_{i}y(x_i)log(a(x_i)) + (1 - y(x_i))log(1 - a(x_i))\]反向傳播
\[\frac{\partial{loss}}{\partial{z}} = (-\frac{y(z)}{a(z)} + \frac{1 - y(z)}{1 - a(z)})*\frac{\partial{a(z)}}{\partial{z}} = \frac{a(z) - y(z)}{a(z)(1-y(z))}*\frac{\partial{a(z)}}{\partial{z}}\]
在使用sigmoid做爲激活函數狀況下,\(\frac{\partial{a(z)}}{\partial{z}} = a(z)(1-a(z))\),也就是說,sigmoid自己的梯度和分母相互抵消,獲得,
\[\frac{\partial{loss}}{\partial{z}} = \frac{a(z) - y(z)}{y(z)(1-a(z))}*\frac{\partial{a(z)}}{\partial{z}} = a(z) - y(z)\]
在上述反向傳播公式中再也不涉及到sigmoid自己的梯度,故不會受到在偏差很大時候函數飽和致使的梯度消失的影響。
總的說來,在使用sigmoid做爲激活函數時,使用交叉熵計算損失每每比使用均方偏差的結果要好上一些。可是,這個也並非絕對的,須要具體問題具體分析,針對具體應用,有時須要自行設計損失函數來達成目標。
參考資料:
http://www.javashuo.com/article/p-orarojbi-ko.html
點擊這裏提交問題與建議
聯繫咱們: msraeduhub@microsoft.com
學習了這麼多,還沒過癮怎麼辦?歡迎加入「微軟 AI 應用開發實戰交流羣」,跟你們一塊兒暢談AI,答疑解惑。掃描下方二維碼,回覆「申請入羣」,即刻邀請你入羣。