系列博客,原文在筆者所維護的github上:https://aka.ms/beginnerAI,
點擊star加星不要吝嗇,星越多筆者越努力。git
在大多數文章中,都以「一我的被困在山上,須要迅速下到谷底」來舉例,這我的會「尋找當前所處位置最陡峭的地方向下走」。這個例子中忽略了安全因素,這我的不可能沿着最陡峭的方向走,要考慮坡度。github
在天然界中,梯度降低的最好例子,就是泉水下山的過程:安全
梯度降低的數學公式:網絡
\[\theta_{n+1} = \theta_{n} - \eta \cdot \nabla J(\theta) \tag{1}\]函數
其中:學習
「梯度降低」包含了兩層含義:spa
亦即與上升相反的方向運動,就是降低。code
圖2-9 梯度降低的步驟blog
圖2-9解釋了在函數極值點的兩側作梯度降低的計算過程,梯度降低的目的就是使得x值向極值點逼近。get
假設一個單變量函數:
\[J(x) = x ^2\]
咱們的目的是找到該函數的最小值,因而計算其微分:
\[J'(x) = 2x\]
假設初始位置爲:
\[x_0=1.2\]
假設學習率:
\[\eta = 0.3\]
根據公式(1),迭代公式:
\[x_{n+1} = x_{n} - \eta \cdot \nabla J(x)= x_{n} - \eta \cdot 2x\tag{1}\]
假設終止條件爲J(x)<1e-2,迭代過程是:
x=0.480000, y=0.230400 x=0.192000, y=0.036864 x=0.076800, y=0.005898 x=0.030720, y=0.000944
上面的過程如圖2-10所示。
圖2-10 使用梯度降低法迭代的過程
假設一個雙變量函數:
\[J(x,y) = x^2 + \sin^2(y)\]
咱們的目的是找到該函數的最小值,因而計算其微分:
\[{\partial{J(x,y)} \over \partial{x}} = 2x\]
\[{\partial{J(x,y)} \over \partial{y}} = 2 \sin y \cos y\]
假設初始位置爲:
\[(x_0,y_0)=(3,1)\]
假設學習率:
\[\eta = 0.1\]
根據公式(1),迭代過程是的計算公式:
\[(x_{n+1},y_{n+1}) = (x_n,y_n) - \eta \cdot \nabla J(x,y)\]
\[ = (x_n,y_n) - \eta \cdot (2x,2 \cdot \sin y \cdot \cos y) \tag{1}\]
根據公式(1),假設終止條件爲\(J(x,y)<1e-2\),迭代過程如表2-3所示。
表2-3 雙變量梯度降低的迭代過程
迭代次數 | x | y | J(x,y) |
---|---|---|---|
1 | 3 | 1 | 9.708073 |
2 | 2.4 | 0.909070 | 6.382415 |
... | ... | ... | ... |
15 | 0.105553 | 0.063481 | 0.015166 |
16 | 0.084442 | 0.050819 | 0.009711 |
迭代16次後,J(x,y)的值爲0.009711,知足小於1e-2的條件,中止迭代。
上面的過程如表2-4所示,因爲是雙變量,因此須要用三維圖來解釋。請注意看兩張圖中間那條隱隱的黑色線,表示梯度降低的過程,從紅色的高地一直沿着坡度向下走,直到藍色的窪地。
表2-4 在三維空間內的梯度降低過程
觀察角度1 | 觀察角度2 |
---|---|
在公式表達時,學習率被表示爲\(\eta\)。在代碼裏,咱們把學習率定義爲learning_rate,或者eta。針對上面的例子,試驗不一樣的學習率對迭代狀況的影響,如表2-5所示。
表2-5 不一樣學習率對迭代狀況的影響
學習率 | 迭代路線圖 | 說明 |
---|---|---|
1.0 | 學習率太大,迭代的狀況很糟糕,在一條水平線上跳來跳去,永遠也不能降低。 | |
0.8 | 學習率大,會有這種左右跳躍的狀況發生,這不利於神經網絡的訓練。 | |
0.4 | 學習率合適,損失值會從單側降低,4步之後基本接近了理想值。 | |
0.1 | 學習率較小,損失值會從單側降低,但降低速度很是慢,10步了尚未到達理想狀態。 |
ch02, Level3, Level4, Level5