梯度下降的python實現
阿新 • • 發佈:2019-01-23
什麼是梯度下降法
梯度下降(Gradient Descent)是最基礎的優化演算法。在微積分中,梯度表示函式增長速度最快的方向。在機器學習問題中,我們的目標常常是求極大值或者極小值。梯度下降法就是沿著梯度的不斷走的方法,當求極小值時沿與梯度相反的方向
用通俗的話說,梯度下降法就像下山,我們會沿著當前最快下降的道路走,直至走至山底(當然這條路未必是最快到達山底的)。
如圖,在一個求極小值的問題中,我們會沿著梯度不斷往下走,直至走至一個最低點(區域性最優)。
怎麼進行梯度下降
先從簡單的一元二次方程開始說起。我們擁有一個函式,,他的導數就是。而對於大部分函式而言它的梯度就是它的負導數。
我們使用matplotlib畫出這個函式的圖
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5,3,20)
y = x**2+2*x+1
plt.plot(x,y)
我們想求得這個函式的最小值,從圖中可以得到,顯然是在-1處。
那麼梯度下降法會如何求得這個過程呢?
目標函式以及它的導數
f = lambda x:x**2+2*x+1
g = lambda x: 2*x+2
梯度下降法的python表示
def gd(x_start,step,g,itera):
#x_start 起始點
#step 步長
#g 梯度
#itera 迭代次數
x = x_start
for i in range(itera):
grad = g(x)
x -= grad*step
print("Epoch{0}:grad={1},x={2}".format(i,grad,x))
if abs(grad)<1e-6:
break
return x
Epoch29:grad=0.01856910058928074,x=-0.9925723597642877
最終答案離-1的舉例已經很小了
# 引數的選擇
當我們把step的值使用1.1代入時,迭代次數不變會怎麼樣呢?
>>>gd(5,1.1,g,30)
Epoch29:grad=-2373.7631379977083,x=1423.2578827986254
你會發現x會離目標越來越遠
當我們的step值使用0.0001代入時,迭代次數不變時的答案又是怎麼樣的呢
你會發現他雖然沿著梯度不斷向下走但在總體看來幾乎沒怎麼變·
當你把迭代次數增加到一定大時,它仍然能達到最低點。
引數選擇的總結
當步長過長時,有可能會使梯度下降法無法收斂。
當步長小時,適當增加迭代次數,仍能達到最優解。但是過多的迭代次數會增加訓練的時間。