吴恩达机器学习笔记:(三)梯度下降法
梯度下降法
知識點:
偏導數、微積分、局部最優解
概念介紹
梯度下降法目的是為了“下降”,下降的方法是按照“梯度”。比如你在一座山上,當前你只能邁出一步,如何走才能使你的高度下降的最多呢,根據梯度的理論,我們沿著當前梯度的反方向走,會讓我們的下降幅度最大。
上述例子中,山就是一個函數,在山上的你就是函數中待優化的變量,人的坐標表示變量初始值,我們要 求的是函數最小值即到達山底,人該如何走即如何迭代變量。所以我們只要沿著函數梯度的反方向,就能最快的到達我們要去的地方。
梯度下降是一種更新參數的方法,具體如何更新跟原函數的在某點的梯度有關。不會改變要求的最優解。
我們可以利用梯度下降法求最大值和最小值,求最大值沿著梯度方向走即可,求最小值則沿著梯度的反方向走。
公式
抽象的公式就一個
代碼實現:
import numpy as nprow = 20 x0 = np.zeros((row,1)) x1 = np.arange(0,row+0).reshape(row,1) x2 = np.arange(10,row+10).reshape(row,1) x3 = np.arange(21,row+21).reshape(row,1) x = np.hstack((x1,x2,x3)) y = 2*x1 +3*x2 + 4*x3 + np.random.random(row).reshape(row,1)#定義代價函數 def error_function(theta, x, y):diff = np.dot(x, theta) - yreturn (1./2*row) * np.dot(np.transpose(diff), diff)#求梯度的函數 def gradient_function(theta, x, y):diff = np.dot(x, theta) - yreturn (1./row) * np.dot(np.transpose(x), diff)#利用梯度下降法不斷迭代參數 def gradient_descent(x, y, alpha):theta = np.array([1, 1, 1]).reshape(3, 1)gradient = gradient_function(theta, x, y)while not np.all(np.absolute(gradient) <= 1e-5):theta = theta - alpha * gradientgradient = gradient_function(theta, x, y)# print(gradient)return thetaalpa = 0.001 theta = gradient_descent(x,y,alpa) print(theta)result:
[[1. ][1.97155845][2.96137676][4.05017691]]上述代碼中 ,學習率為0.001,把學習率改成1會發生什么呢,自己試試看,會發現程序會一直運行不停止,打印出梯度會發現,梯度一直增加最終變成了無限大。
這是因為,如果學習率過大,會導致不收斂,因為跨的步數太大,會越過那個最低點,并一直震蕩。至于為什么梯度會變得越來越大以至于無限大;
舉個例子
在A(10,200)點,梯度為40,所以下一時刻到B點的橫坐標為10-140= -30,
在B(-30,1800)點,梯度為-120,所以下一時刻到達的點的橫坐標為-30+1120=90,這樣會導致離最優值越來越遠。
所以:
學習率太大會導致不收斂
學習率太小會導致到達最低點的迭代次數太大,費時
總結
以上是生活随笔為你收集整理的吴恩达机器学习笔记:(三)梯度下降法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴恩达机器学习笔记:(二)代价函数
- 下一篇: C:#define用法