1. 程式人生 > >梯度下降的python實現

梯度下降的python實現

什麼是梯度下降法

梯度下降(Gradient Descent)是最基礎的優化演算法。在微積分中,梯度表示函式增長速度最快的方向。在機器學習問題中,我們的目標常常是求極大值或者極小值。梯度下降法就是沿著梯度的不斷走的方法,當求極小值時沿與梯度相反的方向
用通俗的話說,梯度下降法就像下山,我們會沿著當前最快下降的道路走,直至走至山底(當然這條路未必是最快到達山底的)。
這裡寫圖片描述
如圖,在一個求極小值的問題中,我們會沿著梯度不斷往下走,直至走至一個最低點(區域性最優)。
![enter description here][2]

怎麼進行梯度下降

先從簡單的一元二次方程開始說起。我們擁有一個函式,<code>!$y=x^2+2 x+1$</code>,他的導數就是<code>。而對於大部分函式而言它的梯度就是它的負導數。
我們使用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)

![enter description here][3]
我們想求得這個函式的最小值,從圖中可以得到,顯然是在-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會離目標越來越遠
![enter description here][4]
當我們的step值使用0.0001代入時,迭代次數不變時的答案又是怎麼樣的呢
這裡寫圖片描述
你會發現他雖然沿著梯度不斷向下走但在總體看來幾乎沒怎麼變·
當你把迭代次數增加到一定大時,它仍然能達到最低點。

引數選擇的總結

當步長過長時,有可能會使梯度下降法無法收斂。
當步長小時,適當增加迭代次數,仍能達到最優解。但是過多的迭代次數會增加訓練的時間。

參考文章