目錄
1.為什么要使用反向傳播算法
2.二層神經(jīng)網(wǎng)絡(luò)
3.反向傳播算法更新權(quán)值的過程
4.張量Tensor
推薦課程:04.反向傳播_嗶哩嗶哩_bilibili
1.為什么要使用反向傳播算法
簡單模型可以使用解析式更新w
復(fù)雜模型,如圖,輸入矩陣為5*1矩陣,等一層權(quán)重矩陣H1為6*5矩陣,則需要30個解析式,第二層權(quán)重矩陣H2為6*7矩陣,則需要42個解析式,第三層……可以看出我們無法通過解析式的方式來更新w。
因此需要反向傳播算法,反向傳播算法可以在網(wǎng)絡(luò)中傳播梯度,最終通過鏈?zhǔn)椒▌t完成每個節(jié)點(diǎn)的梯度計(jì)算,從而完成每個節(jié)點(diǎn)的w更新。
反向傳播算法,又稱 BP 算法,它將輸出層的誤差反向逐層傳播,通過計(jì)算偏導(dǎo)數(shù)來更新網(wǎng)絡(luò)參數(shù)使得誤差函數(shù)最小化。
2.二層神經(jīng)網(wǎng)絡(luò):
?MM為矩陣乘法,ADD為矩陣加法,是預(yù)測值,w為權(quán)重,b為偏移量(bias)。
第一層H1為w1*x+b1,第二層H2為w2*H1+b2。
不難發(fā)現(xiàn),如果一直進(jìn)行線性變換,最終得到的化簡函數(shù)依然是一個線性函數(shù),因此需要在每一層的輸出,引入一個的非線性的變換函數(shù)。
3.反向傳播算法更新權(quán)值的過程
根據(jù)鏈?zhǔn)椒▌t可以向前推出前一個節(jié)點(diǎn)的偏導(dǎo)數(shù),根據(jù)梯度向下算法的權(quán)重更新公式=-,實(shí)現(xiàn)反向更新權(quán)重w。
(1) 一個計(jì)算圖正向傳播和反向傳播的過程
如圖,根據(jù)鏈?zhǔn)椒▌t,得到,進(jìn)行w更新。L為損失值Loss。
(2)具體實(shí)現(xiàn)過程
r為損失值loss。反向過程的最后,會得到可以根據(jù)梯度向下算法更新。
練習(xí)1:
?答案為-8
練習(xí)2:
?答案為2 ,2
4.張量Tensor
單個元素叫標(biāo)量(scalar),一個序列叫向量(vector),多個序列組成的平面叫矩陣(matrix),多個平面組成的立方體叫張量(tensor)。在深度學(xué)習(xí)中,標(biāo)量、向量、矩陣、高維矩陣都統(tǒng)稱為張量。在pytorch中,一個Tensor內(nèi)部包含數(shù)據(jù)和導(dǎo)數(shù)兩部分。
線性模型pytorch實(shí)現(xiàn)代碼:
import torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# 將w轉(zhuǎn)化為一個只含一個標(biāo)量的張量
w = torch.Tensor([1.0])
# 配置
# 設(shè)置需要計(jì)算梯度
w.requires_grad = True
# 預(yù)測值函數(shù)
def forward(x):
return x * w
# 誤差值函數(shù)
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) ** 2
print("predict (before training)", 4, forward(4).item())
# 100輪的訓(xùn)練
for epoch in range(100):
for x, y in zip(x_data, y_data):
# 先正向傳播,生成計(jì)算圖
l = loss(x, y)
# 再反向傳播,backward()用于自動計(jì)算圖中所有張量的梯度(偏導(dǎo)數(shù))然后存入對應(yīng)張量中的grad中
l.backward()
# item()函數(shù)的作用是從包含單個元素的張量中取出該元素值,并保持該元素的類型不變。grad是張量,使用item()進(jìn)行取值,否則會生成計(jì)算圖。
# grad和data都是torch的屬性,可以直接調(diào)用
print('\tgard:', x, y, w.grad.item())
# 更新w的值。注意grad也是一個張量,包含data和梯度。
# grad是張量,grad.data取到其data,grad.data不會計(jì)算圖
w.data = w.data - 0.01 * w.grad.data
# 將w的梯度值清零
w.grad.data.zero_()
# 注意l也是張量,需要使用item()取值
print("progress:", epoch, l.item())
print("predict (after training)", 4, forward(4).item())
backward():用于自動計(jì)算圖中所有張量的梯度(偏導(dǎo)數(shù))然后存入對應(yīng)張量中的grad中
item():用于從包含單個元素的張量中取出該元素值,并保持該元素的類型不變
w.grad.data.zero_():將w的梯度值清零,防止累積造成空間浪費(fèi)
grad和data都是torch的屬性,可以直接調(diào)用
注意:grad也是一個張量。grad.data取到其data,grad.data不會生成計(jì)算圖,使用item()有等同效果。
練習(xí)(代碼實(shí)現(xiàn)):
文章來源:http://www.zghlxwxcb.cn/news/detail-420857.html
矩陣手冊:http://faculty.bicmr.pku.edu.cn/~wenzw/bigdata/matrix-cook-book.pdf文章來源地址http://www.zghlxwxcb.cn/news/detail-420857.html
到了這里,關(guān)于Pytorch深度學(xué)習(xí)筆記(五)反向傳播算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!