日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > pytorch >内容正文

pytorch

PyTorch深度学习——梯度下降算法

發(fā)布時(shí)間:2024/3/24 pytorch 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch深度学习——梯度下降算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一、梯度下降算法(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)建DatasetDataLoader對(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。