Copyright © Microsoft Corporation. All rights reserved.
適用於License版權許可
更多微軟人工智能學習資源,請見微軟人工智能教育與學習共建社區git
預警:本篇博客中會涉及到偏導數的概念,可是很是初級,很容易理解,建議硬着頭皮看,跟着算一遍,看完以後保證會以爲人生美好了不少。github
反向傳播和梯度降低這兩個詞,第一眼看上去似懂非懂,不明覺厲。這兩個概念是整個神經網絡中的重要組成部分,是和偏差函數/損失函數的概念分不開的。算法
神經網絡訓練的最基本的思想就是:先「蒙」一個結果,咱們叫預測結果a,看看這個預測結果和事先標記好的訓練集中的真實結果y之間的差距,而後調整策略,再試一次,這一次就不是「蒙」了,而是有依據地向正確的方向靠近。如此反覆屢次,一直到預測結果和真實結果之間相差無幾,亦即|a-y|->0,就結束訓練。網絡
在神經網絡訓練中,咱們把「蒙」叫作初始化,能夠隨機,也能夠根據之前的經驗給定初始值。即便是「蒙」,也是有技術含量的。框架
舉個通俗的例子,Bob拿了一支沒有準星的步槍,或者是準星有bug,或者是Bob眼神兒很差看不清靶子,或者是霧很大......反正就是Bob很倒黴。第一次試槍後,拉回靶子一看,彈着點偏左了,因而在第二次試槍時,Bob就會有意識地向右側偏幾毫米,再看靶子上的彈着點,如此反覆幾回,Bob就會掌握這支步槍的脾氣了。下圖顯示了Bob的5次試槍過程:機器學習
在這個例子中:函數
上圖是每次單發點射,因此每次訓練樣本的個數是1。在實際的神經網絡訓練中,一般須要多個樣本,作批量訓練,以免單個樣本自己採樣時帶來的偏差。在本例中,多個樣本能夠描述爲連發射擊,假設一次能夠連打3發子彈,每次的離散程度都相似,以下圖所示:post
其實損失就是全部樣本的偏差的總和,因此有時候損失函數能夠和偏差函數混用概念。學習
其實射擊還不這麼簡單,若是是遠距離狙擊,還要考慮空氣阻力和風速,在神經網絡裏,空氣阻力和風速能夠對應到隱藏層的概念上。測試
咱們再用一個純數學的例子來講明反向傳播的概念。
假設咱們有一個函數 \(z = x * y,其中: x = w * 2 + b, y = b + 1,即: z = (w * 2 + b) * (b + 1)\)
關係以下圖:
注意這裏x, y, z不是變量,w, b是才變量,由於在神經網絡中,咱們要最終求解的是w和b的值,x,y,z只是樣本值。
當w = 3, b = 4時,會獲得以下結果
最終的z值,受到了前面不少因素的影響:變量w,變量b,計算式x,計算式y。常數是個定值,不考慮。目前的z=50,若是咱們想讓z變大一些,w和b應該如何變化呢?
咱們從z開始一層一層向回看,圖中各節點關於變量b的偏導計算結果以下圖:
由於z = x * y,其中x = w * 2 + b,y = b + 1
因此:
\[\frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}}*\frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}*\frac{\partial{y}}{\partial{b}}=5*1+10*1=15\]
其中:
\[\frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x*y)=y=5\]
\[\frac{\partial{z}}{\partial{y}}=\frac{\partial{}}{\partial{y}}(x*y)=x=10\]
\[\frac{\partial{x}}{\partial{b}}=\frac{\partial{}}{\partial{b}}(w*2+b)=1\]
\[\frac{\partial{y}}{\partial{b}}=\frac{\partial{}}{\partial{b}}(b+1)=1\]
有一個頗有趣的問題是:z = x * y = 10 * 5 = 50,表面看起來x=10,y=5,彷佛x對z的貢獻較大。那麼x的微小變化和y的微小變化對z來講,哪個貢獻大呢?
咱們假設只有x變化時,△x = 0.1, 則z = (x + △x) * y = 10.1 * 5 = 50.5
咱們再假設只有y變化時,△y = 0.1, 則z = x * (y +△y) = 10 * 5.1 = 51
50.5 < 51,說明y的微小變化對z的貢獻比較大,這個從
\[\frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x*y)=5 < \frac{\partial{z}}{\partial{y}}=\frac{\partial{}}{\partial{y}}(x*y)=10\]
和這兩個值的比較來看也能夠證實。而△x和△y就能夠理解爲梯度值。
同理,咱們也能夠獲得圖中各變量對w的偏導值:
從以上兩圖能夠看出,反向微分保留了全部變量(包括中間變量)對結果z的影響。若z爲偏差函數,則對圖進行一次計算,能夠獲得全部節點對z的影響,即梯度值,下一步就能夠利用這些梯度值來更新w和b的權重。
w的變化和b的變化,哪個對z的變化貢獻大?從圖中還能夠注意到:
\[\frac{\partial{z}}{\partial{b}}=15\]
\[\frac{\partial{z}}{\partial{w}}=10\]
因此每次w和b的變化值是不相同的,b的變化會比w大一些,也就是每一步的跨度大一些,這個是與z = xy = (w2+b)*(b+1)這個算式相關的,並不表明神經網絡中實際狀況。
仍是用上面的例子,目前:
假設咱們最終的目的想讓z = 60,只改變b的值,如何實現?
答案就是偏導數:
\[\frac{\partial{z}}{\partial{b}}=\frac{\Delta{z}}{\Delta{b}}=15\]
目前z=50, 距離60相差10,因此咱們令\(\Delta{z}=60-50=10\),則:
\[ \frac{\Delta{z}}{\Delta{b}}=15=\frac{10}{\Delta{b}} \\ \]
因此:
\[\Delta{b} = 0.66667\]
再帶入式子中(順便說一句,下面這個計算過程就叫作前向計算)
一會兒超過60了,咋辦?再來一次(下面的過程就叫作反向傳播):
咱們令\(\Delta{z}=60-60.4445=-0.4445\),則:
\[ \frac{\Delta{z}}{\Delta{b}}=15=\frac{-0.4445}{\Delta{b}} \\ \]
因此:
\[\Delta{b} = -0.02963\]
再帶入式子中:
咦哈!59.96了!再迭代幾回,應該能夠近似等於60了,直到偏差不大於0.00001時,咱們就能夠結束迭代了,對於計算機來講,這些運算的執行速度很快。
有的同窗會說了:這個問題不是用數學公式倒推求解一個二次方程,就能直接獲得準確的b值嗎?是的!可是咱們是要說明機器學習的方法,機器並不會解二次方程,並且不少時候不是用二次方程就能解決實際問題的。而上例所示,是用機器所擅長的迭代計算的方法來不斷逼近真實解,這就是機器學習的真諦!並且這種方法是廣泛適用的。
不少資料中會用下面這個圖來講明梯度降低,可是都沒有說清楚如下幾個問題:
1) 爲啥用這個看上去像\(y = x^2\)族的函數來講明梯度降低?
2) 在最低點的左側,梯度值是負數;在最低點的右側,梯度值是正數。爲何說是「降低」?
3) 爲何1—>2,2—>3等等的連線不是這條曲線的切線呢,而好像是絃線?
這是由於有一種損失函數的形式就是均方差,亦即:
\[loss = \sum_{i}(a_i - y_i) ^ 2\]
其中a是本次迭代的預測結果,y是樣本中的真實結果。咱們的目的就是在這個函數上求最小值,使loss最小,這樣樣本值和預測值就會很是很是接近,以便於咱們之後預測不在樣本中的真實數據。
「梯度降低」,剛接觸這個詞時,我老是往「下降難度」或「下降維度」方面去理解,由於有個「降低」的動詞在裏面。而實際上,「降低」在這裏面的含義是「與導數相反的方向」的意思。
咱們假設上面這個圖形的函數是\(y = (x-1)^2+0.001\),則\(y’_x = 2(x-1)\)。
而在標準的權重更新公式裏:
\[w = w – η*\Delta{w}\]
\[b = b – η*\Delta{b}\]
能夠看到不管是w仍是b,都是用上一次的權重值減去步長\(\times\)梯度。注意,咱們在上一個例子中,是用b直接加減\(\Delta{b}\)的,並無用到η,或者說η=1。這樣的問題就是步長可能過大,一會兒就跳過了極值點。
因此整體上看,不管x在極值的左側仍是右側,都會向中間(坡底)靠攏,確實是「降低」了。
不知不覺中,咱們已經接觸到了第一個神經網絡中的超參η,即步長值,這個值對於神經網絡訓練很是重要,決定了訓練時間的長短,它的取值通常是從0.1到0.0001,本身選擇。
因此,絃線在這裏面沒啥用途,只是表示一個迭代跳躍的動做而已。實際的變化值已經由綠色的線定義好了。
點擊這裏提交問題與建議
聯繫咱們: msraeduhub@microsoft.com
學習了這麼多,還沒過癮怎麼辦?歡迎加入「微軟 AI 應用開發實戰交流羣」,跟你們一塊兒暢談AI,答疑解惑。掃描下方二維碼,回覆「申請入羣」,即刻邀請你入羣。