Chapter5_誤差反向傳播法

誤差反向傳播法

計(jì)算圖

  1. 用計(jì)算圖解題
    1. 構(gòu)建計(jì)算圖
    2. 在計(jì)算圖上,從左向右進(jìn)行計(jì)算(正向傳播)
  2. 局部計(jì)算
    1. 通過傳遞"局部計(jì)算"獲得最終結(jié)果.
    2. 局部計(jì)算指無論全局發(fā)生了什么,都能只根據(jù)與自己相關(guān)的信息輸出接下來的結(jié)果
  3. 反向傳播
    1. 反向傳播傳遞"局部導(dǎo)數(shù)"

鏈?zhǔn)椒▌t

  • 復(fù)合函數(shù):由多個(gè)函數(shù)構(gòu)成的函數(shù)
  • 如果某個(gè)函數(shù)由復(fù)合函數(shù)表示,則該復(fù)合函數(shù)的導(dǎo)數(shù)可以用構(gòu)成復(fù)合函數(shù)的各個(gè)函數(shù)的導(dǎo)數(shù)的乘積表示

反向傳播

加法節(jié)點(diǎn)的反向傳播

  • 加法節(jié)點(diǎn)的反向傳播只乘以1,輸入的值原封不動(dòng)地流向下一個(gè)節(jié)點(diǎn)

乘法節(jié)點(diǎn)的反向傳播

  • 乘法的反向傳播會(huì)將上游的值乘以正向傳播時(shí)的輸入信號(hào)的"翻轉(zhuǎn)值"后傳遞給下游.翻轉(zhuǎn)值表示一種翻轉(zhuǎn)關(guān)系
  • 實(shí)現(xiàn)乘法節(jié)點(diǎn)的反向傳播時(shí),要保存正向傳播的輸入信號(hào)

簡單層的實(shí)現(xiàn)

#乘法層的實(shí)現(xiàn)
class MulLayer:
    def __init__(self):
        self.x = None
        self.y = None
    def forward(self,x,y):
        self.x = x
        self.y = y
        out = x * y
        
        return out
    
    def backward(self,dout):
        dx = dout * self.y
        dy = dout * self.x 
        
        return dx,dy
#加法層的實(shí)現(xiàn)
class AddLayer:
    def __init__(self):
        pass
    
    def forward(self,x,y):
        out = x+y
        return out
    
    def backward(self,dout):
        dx = dout * 1
        dy = dout * 1
        
        return dx,dy
#實(shí)現(xiàn)購買2個(gè)蘋果和3個(gè)橘子的例子
apple = 100
apple_num = 2
orange = 150
orange_num = 3
tax = 1.1

#layer
mul_apple_layer = MulLayer()
mul_orange_layer = MulLayer()
add_apple_orange_layer = AddLayer()
mul_tax_layer = MulLayer()

#forward
apple_price = mul_apple_layer.forward(apple,apple_num)
orange_price = mul_orange_layer.forward(orange,orange_num)
all_price = add_apple_orange_layer.forward(apple_price,orange_price)
price = mul_tax_layer.forward(all_price,tax)

#backward
dprice = 1
dall_price,dtax = mul_tax_layer.backward(dprice)
dapple_price,dorange_price = add_apple_orange_layer.backward(dall_price)
dorange,dorange_num = mul_orange_layer.backward(dorange_price)
dapple,dapple_num = mul_apple_layer.backward(dapple_price)

print(price)
print(dapple_num,dapple,dorange,dorange_num,dtax)
715.0000000000001
110.00000000000001 2.2 3.3000000000000003 165.0 650

激活函數(shù)層的實(shí)現(xiàn)

ReLU層

  • 正向傳播時(shí)的輸入x大于0,則反向傳播會(huì)將上游的值原封不動(dòng)地傳給下游.
  • 正向傳播時(shí)的x小于等于0,則反向傳播中傳給下游的信號(hào)將停在此處
#ReLu層的實(shí)現(xiàn)
#forward和backward的參數(shù)為numpy數(shù)組
class Relu:
    def __init__(self):
        self.mask = None
        
    def forward(self,x):
        self.mask = (x<=0)
        out = x.copy()
        out[self.mask]=0
        
        return out
    
    def backward(self,dout):
        dout[self.mask]=0
        dx = dout
        
        return dx

Sigmoid層

y = \frac{1}{1+exp(-x)}

  • 正向傳播
    1. "x"節(jié)點(diǎn): x*-1=-x
    2. "exp"節(jié)點(diǎn): exp(-x)
    3. "+"節(jié)點(diǎn): 1+exp(-x)
    4. "/"節(jié)點(diǎn): y=1/(1+exp(-x))
  • 反向傳播
      • "/"節(jié)點(diǎn) \begin{aligned}\frac{\partial y}{\partial x} &= -\frac{1}{x^2}\\ &=-y^2\end{aligned}
    * 反向傳播時(shí),將上游的值乘以$-y^2$,再傳給下游
    
    1. "+"節(jié)點(diǎn)將上游的值原封不動(dòng)地傳給下游
    2. "exp"節(jié)點(diǎn) \begin{aligned}\frac{\partial y}{\partial x}&=exp(x)\end{aligned}
    3. "x節(jié)點(diǎn)"將正向傳播時(shí)的值翻轉(zhuǎn)后做乘法運(yùn)算
  • 反向傳播簡潔版
    \begin{aligned} \frac{\partial L}{\partial y}&\to \frac{\partial L}{\partial y}y^2exp(-x)\\ &=\frac{\partial L}{\partial y}\frac{1}{(1+exp(-x))^2}exp(-x)\\ &=\frac{\partial L}{\partial y}\frac{1}{1+exp(-x)}\frac{exp(-x)}{1+exp(-x)}\\ &=\frac{\partial L}{\partial y}y(1-y) \end{aligned}
#sigmoid層實(shí)現(xiàn)
class Sigmoid:
    def __init__(self):
        self.out = None
    
    def forward(self,x):
        out = 1/(1+np.exp(-x))
        self.out = out
        return out
    
    def backward(self,dout):
        dx = dout*(1.0-self.out)*self.out
        return dx

Affine/Softmax層的實(shí)現(xiàn)

Affine層

  • 神經(jīng)網(wǎng)絡(luò)的正向傳播中進(jìn)行的矩陣的乘積運(yùn)算再幾何學(xué)領(lǐng)域被稱為"仿射變換".
  • 進(jìn)行仿射變換的處理實(shí)現(xiàn)為"Affine層"
  • 每個(gè)節(jié)點(diǎn)間傳播的是矩陣
#Affine層實(shí)現(xiàn)
class Affine:
    def __init__(self,W,b):
        self.W = W
        self.b = b
        self.x = None
        self.dW = None
        self.db = None
        
    def forward(self,x):
        self.x = x
        out = np.dot(x,self.W)+self.b
        
        return out
    
    def backward(self,dout):
        dx = np.dot(dout,self.W.T)
        self.dW = np.dot(self.x.t,dout)
        self.db = np.sum(dout,axis=0)
        
        return dx

Softmax-with-Loss層

P5-29.png
P5-30.png
  • Softmax層的反向傳播得到了(y_1-t_1,y_2-t_2,y_3-t_3)的結(jié)果.由于(y_1,y_2,y_3)是Softmax層的輸出,(t_1,t_2,t_3)是監(jiān)督數(shù)據(jù),所以(y_1-t_1,y_2-t_2,y_3-t_3)是Softmax層的輸出和監(jiān)督標(biāo)簽的差分.<font color="red">神經(jīng)網(wǎng)絡(luò)的反向傳播會(huì)把這個(gè)差分表示的誤差傳遞給前面的層.</font>這是神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)中的重要性質(zhì)
from sourcecode.common.functions import cross_entropy_error

#Softmax-with-Loss層的實(shí)現(xiàn)
class SoftmaxWithLoss:
    def __init__(self):
        self.loss = None #損失
        self.y = None    #softmax的輸出
        self.t = None    #監(jiān)督數(shù)據(jù)(ont-hot vector)
        
    def forward(self,x,t):
        self.t = t
        self.y = softmax(x)
        self.loss = cross_entropy_error(self.y,self.t)
        
        return self.loss
    
    def backward(self,dout=1):
        batch_size = self.t.shape[0]
        dx = (self.y-self.t)/batch_size
        
        return dx#向前傳遞的是單個(gè)數(shù)據(jù)的誤差
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末据途,一起剝皮案震驚了整個(gè)濱河市培遵,隨后出現(xiàn)的幾起案子履澳,更是在濱河造成了極大的恐慌蔬螟,老刑警劉巖吸重,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斟叼,居然都是意外死亡土陪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門笔喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來取视,“玉大人,你說我怎么就攤上這事常挚∽魈罚” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵奄毡,是天一觀的道長折欠。 經(jīng)常有香客問我,道長吼过,這世上最難降的妖魔是什么怨酝? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮那先,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赡艰。我一直安慰自己售淡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布慷垮。 她就那樣靜靜地躺著揖闸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪料身。 梳的紋絲不亂的頭發(fā)上汤纸,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音芹血,去河邊找鬼贮泞。 笑死楞慈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啃擦。 我是一名探鬼主播囊蓝,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼令蛉!你這毒婦竟也來了聚霜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤珠叔,失蹤者是張志新(化名)和其女友劉穎蝎宇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祷安,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姥芥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辆憔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撇眯。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虱咧,靈堂內(nèi)的尸體忽然破棺而出熊榛,到底是詐尸還是另有隱情,我是刑警寧澤腕巡,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布玄坦,位于F島的核電站,受9級(jí)特大地震影響绘沉,放射性物質(zhì)發(fā)生泄漏煎楣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一车伞、第九天 我趴在偏房一處隱蔽的房頂上張望择懂。 院中可真熱鬧,春花似錦另玖、人聲如沸困曙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慷丽。三九已至,卻和暖如春鳄哭,著一層夾襖步出監(jiān)牢的瞬間要糊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工妆丘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锄俄,地道東北人局劲。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像珊膜,于是被迫代替她去往敵國和親容握。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • Android的消息機(jī)制主要是指的Handler的運(yùn)行機(jī)制以及Handler所附帶的MessageQueue和Lo...
    Desirelife6閱讀 839評(píng)論 1 8
  • 1. 深度學(xué)習(xí)有哪些應(yīng)用 圖像:圖像識(shí)別、物體識(shí)別令花、圖片美化阻桅、圖片修復(fù)、目標(biāo)檢測兼都。 自然語言處理:機(jī)器創(chuàng)作嫂沉、個(gè)性化...
    mantch閱讀 1,821評(píng)論 0 14
  • 計(jì)算圖 用計(jì)算圖求解 eg.1 太郎在超市買了2個(gè)100日元/個(gè)的蘋果,消費(fèi)稅10%,計(jì)算支付金額的過程可以表示成...
    0xFFFFFG閱讀 2,090評(píng)論 0 1
  • 引言 機(jī)器學(xué)習(xí)欄目記錄我在學(xué)習(xí)Machine Learning過程的一些心得筆記,涵蓋線性回歸扮碧、邏輯回歸趟章、Soft...
    hfk閱讀 4,367評(píng)論 4 18
  • 尼莫和葉婭隱居在深山,過著簡單和清貧的生活慎王。陪伴他們的蚓土,只有一只跟隨了他們六年的老母雞,它原來是一只野雞赖淤,被尼莫找...
    一個(gè)都不正經(jīng)閱讀 311評(píng)論 0 0