吴恩达机器学习笔记:(三)梯度下降法
梯度下降法
知識(shí)點(diǎn):
偏導(dǎo)數(shù)、微積分、局部最優(yōu)解
概念介紹
梯度下降法目的是為了“下降”,下降的方法是按照“梯度”。比如你在一座山上,當(dāng)前你只能邁出一步,如何走才能使你的高度下降的最多呢,根據(jù)梯度的理論,我們沿著當(dāng)前梯度的反方向走,會(huì)讓我們的下降幅度最大。
上述例子中,山就是一個(gè)函數(shù),在山上的你就是函數(shù)中待優(yōu)化的變量,人的坐標(biāo)表示變量初始值,我們要 求的是函數(shù)最小值即到達(dá)山底,人該如何走即如何迭代變量。所以我們只要沿著函數(shù)梯度的反方向,就能最快的到達(dá)我們要去的地方。
梯度下降是一種更新參數(shù)的方法,具體如何更新跟原函數(shù)的在某點(diǎn)的梯度有關(guān)。不會(huì)改變要求的最優(yōu)解。
我們可以利用梯度下降法求最大值和最小值,求最大值沿著梯度方向走即可,求最小值則沿著梯度的反方向走。
公式
抽象的公式就一個(gè)
代碼實(shí)現(xiàn):
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)#定義代價(jià)函數(shù) def error_function(theta, x, y):diff = np.dot(x, theta) - yreturn (1./2*row) * np.dot(np.transpose(diff), diff)#求梯度的函數(shù) def gradient_function(theta, x, y):diff = np.dot(x, theta) - yreturn (1./row) * np.dot(np.transpose(x), diff)#利用梯度下降法不斷迭代參數(shù) 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]]上述代碼中 ,學(xué)習(xí)率為0.001,把學(xué)習(xí)率改成1會(huì)發(fā)生什么呢,自己試試看,會(huì)發(fā)現(xiàn)程序會(huì)一直運(yùn)行不停止,打印出梯度會(huì)發(fā)現(xiàn),梯度一直增加最終變成了無(wú)限大。
這是因?yàn)?#xff0c;如果學(xué)習(xí)率過大,會(huì)導(dǎo)致不收斂,因?yàn)榭绲牟綌?shù)太大,會(huì)越過那個(gè)最低點(diǎn),并一直震蕩。至于為什么梯度會(huì)變得越來(lái)越大以至于無(wú)限大;
舉個(gè)例子
在A(10,200)點(diǎn),梯度為40,所以下一時(shí)刻到B點(diǎn)的橫坐標(biāo)為10-140= -30,
在B(-30,1800)點(diǎn),梯度為-120,所以下一時(shí)刻到達(dá)的點(diǎn)的橫坐標(biāo)為-30+1120=90,這樣會(huì)導(dǎo)致離最優(yōu)值越來(lái)越遠(yuǎn)。
所以:
學(xué)習(xí)率太大會(huì)導(dǎo)致不收斂
學(xué)習(xí)率太小會(huì)導(dǎo)致到達(dá)最低點(diǎn)的迭代次數(shù)太大,費(fèi)時(shí)
總結(jié)
以上是生活随笔為你收集整理的吴恩达机器学习笔记:(三)梯度下降法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴恩达机器学习笔记:(二)代价函数
- 下一篇: C++:控制台程序弹出消息框