PyTorch深度学习——梯度下降算法
目錄
一、梯度下降算法(batch gradient descend)
二、隨機(jī)梯度下降算法(stochastic gradient descend)
三、 小批量梯度下降算法(mini-batch gradient descend)
一、梯度下降算法(batch gradient descend)
原理:梯度下降算法是深度學(xué)習(xí)中很常見的一種方法,為了找到最優(yōu)解,可以嘗試?yán)酶F舉法,分治法或者貪心算法,梯度下降算法就是一種貪心的算法。通過(guò)不斷的迭代,每次選取損失下降最快的方向去更新參數(shù),可以很快達(dá)到局部最優(yōu)解。如果函數(shù)是凸函數(shù),局部最優(yōu)解就是全局最優(yōu)解;如果函數(shù)是非凸函數(shù),可能會(huì)陷入局部最優(yōu)解,或者神經(jīng)網(wǎng)絡(luò)中梯度為0的鞍點(diǎn)處,從而停止迭代。
使用求導(dǎo)(Derivative)來(lái)獲得梯度:
?w的更新公式:
?其中α是學(xué)習(xí)率,一般在開始訓(xùn)練前將其設(shè)置為learning_rate = 0.01。
代碼
對(duì)線性目標(biāo)函數(shù)的迭代更新過(guò)程:
import numpy as np import matplotlib.pyplot as plt#1.training set x_data = [1.0,2.0,3.0,4.0] y_data = [2.0,4.0,6.0,8.0]#2.initial_w,initial_a w = 1.0 a = 0.01#3.functions def forward(x):return x * wdef cost(xs, ys):cost = 0for x, y in zip(xs, ys):y_pred = forward(x)cost += (y_pred - y) ** 2return cost / len(xs)def gradient(xs, ys):grad = 0for x, y in zip(xs, ys):grad += 2 * x * (forward(x)-y)return grad / len(xs)#4.迭代100次 epoch_list = [] cost_list = [] #訓(xùn)練初始的預(yù)測(cè)值 print('Predict (before training):',4.0,forward(4.0)) for epoch in range(100):cost_val = cost(x_data, y_data)grad_val = gradient(x_data, y_data)w -= a * grad_valprint('epoch:', epoch, ' w=', '%.2f'%w, ' cost=', '%.2f'%cost_val)epoch_list.append(epoch)cost_list.append(cost_val) #更新w后對(duì)y進(jìn)行預(yù)測(cè) print('Predict (before training):', 4.0, forward(4.0))#畫圖 plt.plot(epoch_list,cost_list) plt.ylabel('cost') plt.xlabel('epoch') plt.show()運(yùn)行結(jié)果
經(jīng)過(guò)100次的迭代后,權(quán)重更新到近似目標(biāo)值2.0,預(yù)測(cè)值接近8.0。并且使用加權(quán)均值后的cost_function更加平滑。
二、隨機(jī)梯度下降算法(stochastic gradient descend)
原理:不再使用全部樣本的梯度均值來(lái)進(jìn)行更新,而是在每一次的迭代中,從N個(gè)樣本中隨機(jī)抽取一個(gè)樣本,利用單個(gè)樣本的損失loss對(duì)權(quán)重w求導(dǎo)得到梯度,并對(duì)權(quán)重w進(jìn)行更新。當(dāng)遇到鞍點(diǎn)或者局部最小值時(shí),隨機(jī)的梯度有利于幫助跳出這塊區(qū)域,使算法向最優(yōu)點(diǎn)繼續(xù)前進(jìn)。
?代碼
import numpy as np import matplotlib.pyplot as plt#1.training set x_data = [1.0,2.0,3.0,4.0] y_data = [2.0,4.0,6.0,8.0]#2.initial_w,initial_a w = 1.0 a = 0.01#3.functions def forward(x):return x * wdef loss(x, y): y_pred = forward(x)loss = (y_pred - y) ** 2return lossdef gradient(x, y):return 2 * x * (forward(x)-y)#4.迭代100次 epoch_list = [] loss_list = [] #訓(xùn)練初始的預(yù)測(cè)值 print('Predict (before training):',4.0,forward(4.0)) for epoch in range(100):for x, y in zip(x_data, y_data):loss_val = loss(x, y)grad_val = gradient(x, y)w -= a * grad_valprint('epoch:', epoch, ' w=', '%.2f'%w, ' cost=', '%.2f'%loss_val)#選取每個(gè)數(shù)據(jù)進(jìn)行更新w權(quán)重epoch_list.append(epoch)loss_list.append(loss_val) #更新w后對(duì)y進(jìn)行預(yù)測(cè) print('Predict (before training):', 4.0, forward(4.0))#plot plt.plot(epoch_list,loss_list) plt.ylabel('loss') plt.xlabel('epoch') plt.show()運(yùn)行結(jié)果
梯度下降算法和隨機(jī)梯度下降算法的區(qū)別是:
1、損失函數(shù)cost()更改為loss(),cost()計(jì)算的是全部數(shù)據(jù)的損失均值,而loss()計(jì)算的是單個(gè)數(shù)據(jù)的損失值。
2、梯度函數(shù)gradient()也從全部數(shù)據(jù)求出來(lái)的梯度均值變?yōu)閱蝹€(gè)數(shù)據(jù)所求的。
3、當(dāng)epoch = 1時(shí),即迭代100次,前者的w更新100次,而后者的w共更新100×4。
三、 小批量梯度下降算法(mini-batch gradient descend)
原理:將樣本分成等量的子集,對(duì)每一個(gè)子集(mini-batch)做一次梯度下降并更新參數(shù),這樣可以在提高學(xué)習(xí)率的同時(shí)降低迭代次數(shù)。mini-batch的迭代成本函數(shù)是上下波動(dòng)的,但總體呈下降趨勢(shì)。
該算法需要?jiǎng)?chuàng)建Dataset和DataLoader對(duì)象,詳情見下文鏈接。
三種算法的優(yōu)缺點(diǎn):
1、第一種梯度下降要遍歷全部數(shù)據(jù)集之后才算一次損失函數(shù),然后求各個(gè)參數(shù)的梯度并更新。這種方法的時(shí)間復(fù)雜度高且不支持在線學(xué)習(xí)。
2、第二種隨機(jī)梯度下降是每次隨機(jī)選取一個(gè)數(shù)據(jù)就要計(jì)算損失函數(shù)并更新參數(shù),雖然更新迭代速度很快,但是收斂性能不好,因?yàn)榭赡艽嬖谠肼晹?shù)據(jù)的影響,導(dǎo)致在最優(yōu)點(diǎn)附近來(lái)回跳動(dòng),很難達(dá)到最優(yōu)點(diǎn)。
3、為了中和上述兩種算法的優(yōu)缺點(diǎn),采用小批量的梯度下降,把數(shù)據(jù)分成若干份,并對(duì)每一份進(jìn)行參數(shù)更新。在一次參數(shù)更新中,是由一小批數(shù)據(jù)共同決定梯度方向,就避免了方向的巨大波動(dòng),能有效減少更新的隨機(jī)性。
總結(jié)
以上是生活随笔為你收集整理的PyTorch深度学习——梯度下降算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 移动端特效
- 下一篇: 【深度学习】梯度下降算法和随机梯度下降算