class4-Back_Propagation

回顧上節(jié)課:

隨機(jī)梯度下降和損失函數(shù)

但是對于負(fù)責(zé)的神經(jīng)網(wǎng)絡(luò),很難做到去計(jì)算每一個(gè)梯度并保存下來扔仓,例如:


復(fù)雜的神經(jīng)網(wǎng)絡(luò)

引入了計(jì)算圖:

計(jì)算圖是用圖論語言表示數(shù)學(xué)函數(shù)的一種方式胚嘲。計(jì)算圖被定義為有向圖,其中節(jié)點(diǎn)對應(yīng)于數(shù)學(xué)運(yùn)算豆茫。節(jié)點(diǎn)由邊連接,圖中的一切要么是節(jié)點(diǎn)屋摇,要么是邊揩魂。
在計(jì)算圖中,節(jié)點(diǎn)是輸入值或用于組合值的函數(shù)摊册。當(dāng)數(shù)據(jù)流過圖形時(shí)肤京,邊會收到它們的權(quán)重颊艳。輸入節(jié)點(diǎn)的出站邊用該輸入值加權(quán)茅特;來自函數(shù)節(jié)點(diǎn)的出站節(jié)點(diǎn)通過使用指定函數(shù)組合入站邊的權(quán)重來加權(quán)。


計(jì)算圖

為了防止展開后出現(xiàn)下面的情況棋枕,引入了非線性函數(shù):


非線性函數(shù)的引入

Chain Rule:鏈?zhǔn)椒▌t

Chain Rule

BP 算法

BP算法的學(xué)習(xí)過程由正向傳播過程和反向傳播過程組成白修。在正向傳播過程中,輸入信息通過輸入層經(jīng)隱含層重斑,逐層處理并傳向輸出層兵睛。如果在輸出層得不到期望的輸出值,則取輸出與期望的誤差的平方和作為目標(biāo)函數(shù)窥浪,轉(zhuǎn)入反向傳播祖很,逐層求出目標(biāo)函數(shù)對各神經(jīng)元權(quán)值的偏導(dǎo)數(shù),構(gòu)成目標(biāo)函數(shù)對權(quán)值向量的梯量漾脂,作為修改權(quán)值的依據(jù)假颇,網(wǎng)絡(luò)的學(xué)習(xí)在權(quán)值修改過程中完成。誤差達(dá)到所期望值時(shí)骨稿,網(wǎng)絡(luò)學(xué)習(xí)結(jié)束笨鸡。

反向傳播

其中藍(lán)色為正向(forward)姜钳,紅色為反向傳播(backward)。
例子:
反向傳播舉例

線性模型的計(jì)算圖

linear_model

代碼實(shí)現(xiàn)

Tensor的概念:
Tensor(張量)是一個(gè)多維數(shù)組形耗,它是標(biāo)量哥桥、向量、矩陣的高維拓展.

Tensor

標(biāo)量是一個(gè)零維張量激涤,是沒有方向的拟糕,是一個(gè)數(shù)。一維張量只有一個(gè)維度昔期,是一行或者一列已卸。二維張量是一個(gè)矩陣,有兩個(gè)維度硼一,灰度圖片就是一個(gè)二維張量累澡。當(dāng)圖像是彩色圖像(RGB)的時(shí)候,就得使用三維張量了般贼。

w是Tensor(張量類型)愧哟,Tensor中包含data和grad,data和grad也是Tensor哼蛆。grad初始為None蕊梧,調(diào)用l.backward()方法后w.grad為Tensor,故更新w.data時(shí)需使用w.grad.data腮介。如果w需要計(jì)算梯度肥矢,那構(gòu)建的計(jì)算圖中,跟w相關(guān)的tensor都默認(rèn)需要計(jì)算梯度叠洗。
本算法中反向傳播主要體現(xiàn)在甘改,l.backward()。調(diào)用該方法后w.grad由None更新為Tensor類型灭抑,且w.grad.data的值用于后續(xù)w.data的更新十艾。

l.backward()會把計(jì)算圖中所有需要梯度(grad)的地方都會求出來,然后把梯度都存在對應(yīng)的待求的參數(shù)中腾节,最終計(jì)算圖被釋放忘嫉。取tensor中的data是不會構(gòu)建計(jì)算圖的。

import torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
 
w = torch.tensor([1.0]) # w的初值為1.0
w.requires_grad = True # 需要計(jì)算梯度
 
def forward(x):
    return x*w  # w是一個(gè)Tensor
 
 
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y)**2
 
print("predict (before training)", 4, forward(4).item())
 
for epoch in range(100):
    for x, y in zip(x_data, y_data):
        l =loss(x,y) # l是一個(gè)張量案腺,tensor主要是在建立計(jì)算圖 forward, compute the loss
        l.backward() #  backward,compute grad for Tensor whose requires_grad set to True
        print('\tgrad:', x, y, w.grad.item())
        w.data = w.data - 0.01 * w.grad.data   # 權(quán)重更新時(shí)庆冕,注意grad也是一個(gè)tensor
 
        w.grad.data.zero_() # after update, remember set the grad to zero
 
    print('progress:', epoch, l.item()) # 取出loss使用l.item,不要直接使用l(l是tensor會構(gòu)建計(jì)算圖)
 
print("predict (after training)", 4, forward(4).item())
權(quán)重更新

作業(yè)

作業(yè)

計(jì)算圖

計(jì)算圖
import numpy as np
import matplotlib.pyplot as plt
import torch

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

w1 = torch.Tensor([1.0])#初始權(quán)值
w1.requires_grad = True#計(jì)算梯度劈榨,默認(rèn)是不計(jì)算的
w2 = torch.Tensor([1.0])
w2.requires_grad = True
b = torch.Tensor([1.0])
b.requires_grad = True

def forward(x):
    return w1 * x**2 + w2 * x + b

def loss(x,y):#構(gòu)建計(jì)算圖
    y_pred = forward(x)
    return (y_pred-y) **2

print('Predict (befortraining)',4,forward(4))

for epoch in range(100):
    l = loss(1, 2)#為了在for循環(huán)之前定義l,以便之后的輸出访递,無實(shí)際意義
    for x,y in zip(x_data,y_data):
        l = loss(x, y)
        l.backward()
        print('\tgrad:',x,y,w1.grad.item(),w2.grad.item(),b.grad.item())
        w1.data = w1.data - 0.01*w1.grad.data #注意這里的grad是一個(gè)tensor,所以要取他的data
        w2.data = w2.data - 0.01 * w2.grad.data
        b.data = b.data - 0.01 * b.grad.data
        w1.grad.data.zero_() #釋放之前計(jì)算的梯度
        w2.grad.data.zero_()
        b.grad.data.zero_()
    print('Epoch:',epoch,l.item())

print('Predict(after training)',4,forward(4).item())

參考

PyTorch 深度學(xué)習(xí)實(shí)踐 第4講_錯錯莫的博客-CSDN博客
PyTorch的Tensor(張量)_然后就去遠(yuǎn)行吧的博客-CSDN博客_pytorch的tensor
PyTorch學(xué)習(xí)(三)--反向傳播_陳同學(xué)愛吃方便面的博客-CSDN博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鞋既,一起剝皮案震驚了整個(gè)濱河市力九,隨后出現(xiàn)的幾起案子耍铜,更是在濱河造成了極大的恐慌,老刑警劉巖跌前,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棕兼,死亡現(xiàn)場離奇詭異,居然都是意外死亡抵乓,警方通過查閱死者的電腦和手機(jī)伴挚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灾炭,“玉大人茎芋,你說我怎么就攤上這事◎诔觯” “怎么了田弥?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铡原。 經(jīng)常有香客問我偷厦,道長,這世上最難降的妖魔是什么燕刻? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任只泼,我火速辦了婚禮,結(jié)果婚禮上卵洗,老公的妹妹穿的比我還像新娘请唱。我一直安慰自己,他們只是感情好过蹂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布十绑。 她就那樣靜靜地躺著,像睡著了一般榴啸。 火紅的嫁衣襯著肌膚如雪孽惰。 梳的紋絲不亂的頭發(fā)上晚岭,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天鸥印,我揣著相機(jī)與錄音,去河邊找鬼坦报。 笑死库说,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的片择。 我是一名探鬼主播潜的,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼字管!你這毒婦竟也來了啰挪?” 一聲冷哼從身側(cè)響起信不,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亡呵,沒想到半個(gè)月后抽活,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锰什,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年下硕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汁胆。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梭姓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫩码,到底是詐尸還是另有隱情誉尖,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布铸题,位于F島的核電站释牺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏回挽。R本人自食惡果不足惜没咙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一乓梨、第九天 我趴在偏房一處隱蔽的房頂上張望蝴乔。 院中可真熱鬧,春花似錦丛肮、人聲如沸墙牌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喜滨。三九已至捉捅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虽风,已是汗流浹背棒口。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辜膝,地道東北人无牵。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像厂抖,于是被迫代替她去往敵國和親茎毁。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容