誤差的反向傳播

計算圖

用計算圖求解

  • eg.1 太郎在超市買了2個100日元/個的蘋果,消費稅10%,計算支付金額的過程可以表示成


    太郎買蘋果

    也可以表示成如下形式


    太郎買蘋果2
  • eg.2 太郎買了2個100日元/個的蘋果和3個150日元/個的橘子,消費稅10%,計算支付金額的過程


    太郎買蘋果和橘子

    圖中新增了加法節(jié)點,構(gòu)建計算圖后從左向右進行計算,到達最后一個節(jié)點后計算結(jié)束

  • 綜上,用計算圖解題時需要按照如下流程
    1. 構(gòu)建計算圖
    2. 在計算圖上自左向右進行計算

這里"自左向右進行計算"叫做正向傳播,從計算圖的出發(fā)點到結(jié)束點的傳播.
如果從圖中自右向左看的方式叫做"反向傳播",反向傳播可以用于導數(shù)計算

局部計算

"局部"表示與自己相關(guān)的范圍,無論全局其他地方發(fā)生了什么,局部計算只能根據(jù)和自己相關(guān)的信息輸出接下來的結(jié)果.
eg.3 太郎買了2個蘋果很其他很多東西


太郎買了2個蘋果很其他很多東西

這里各個節(jié)點的計算都是局部計算,意味著圖中(1)處只需要關(guān)心4000和200的求和運算,至于4000是怎么來的不需要關(guān)心.所以計算圖可以集中精力于局部計算,也意味著可以將其他部分的運算結(jié)果作為整體緩存起來.這里我們設蘋果的單價為x,支付金額為L,偏導數(shù)\frac{\partial L}{\partial x}可以通過反向傳播求解

反向傳播計算支付金額對蘋果單價的偏導數(shù)

結(jié)果是2.2

鏈式法則

計算圖的反向傳播

假設存在函數(shù)y = f(x)

計算圖的反向傳播

將這個局部導數(shù)乘以上游傳過來的值(E),然后傳給前面的節(jié)點

鏈式法則的定義

復合函數(shù):z = (x+y)^2可以認為由多個函數(shù)構(gòu)成的函數(shù)
z = t^2 \\ t = (x+y)
復合函數(shù)求導法則:
\frac{\partial z}{\partial x} = \frac{\partial z}{\partial t}\frac{\partial z}{\partial x}
現(xiàn)在我們將這個函數(shù)用計算圖表示

復合函數(shù)的計算圖表示



由于,可知

反向傳播

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

對于z=x+y,\frac{\partial z}{\partial x}=1,\frac{\partial z}{\partial y}=1,即加法節(jié)點的反向傳播只乘以1,輸入值會原封不到地(反向)傳給下一個節(jié)點

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

一個具體的例子,如果某次計算圖一個加法節(jié)點的正向傳播如左,從上游兩個節(jié)點分別傳來10和15正向傳播傳遞15給下游;反向傳播如右,上游傳來1.3,則改節(jié)點將1.3和1.3傳給下游2個節(jié)點
加法節(jié)點正反向傳播的具體例子

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

這里我們考慮z=xy,導數(shù)如下\frac{\partial z}{\partial x}=y\qquad \frac{\partial z}{\partial y}=x

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

乘法節(jié)點反向傳播的具體例子

乘法節(jié)點進行反向傳播計算時需要傳入正向傳播時的輸入信號值

指數(shù)函數(shù)和對數(shù)函數(shù)的反向傳播

指數(shù)函數(shù)
f(x) =e^x ;\qquad \frac{\partial f}{\partial x} = e^x
對數(shù)函數(shù)
f(x)=ln(x); \qquad \frac{\partial f}{\partial x} =x^{-1}

指數(shù)和對數(shù)函數(shù)反向傳播

反向傳播計算蘋果的例子

反向傳播計算蘋果的例子

如上可知,對于總支付金額L,蘋果價格的偏導是2.2,蘋果個數(shù)的偏導是110,消費稅的偏導是200
對于蘋果和橘子的例子,正向傳播和反向傳播的流程如下


蘋果和橘子的正向傳播和反向傳播

簡單層的實現(xiàn)

class MultiLayer:
    def __init__(self):
        self.x = None
        self.y = None

    def forward(self, x, y):
        self.x = x
        self.y = y
        return x * y

    def backward(self, dout):
        dx = dout * self.y
        dy = dout * self.x
        return dx, dy

class AddLayer:
    def __init__(self):
        self.x = None
        self.y = None

    def forward(self, x, y):
        self.x = x
        self.y = y
        return x + y

    def backward(self, dout):
        dx = dout
        dy = dout
        return dx, dy

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

ReLU

ReLU函數(shù)反向傳播示意圖
class Relu:
    def __init__(self):
        self.x = None
        self.mask = None

    def forward(self, x):
        self.mask = (x <= 0)
        return x * (1 - self.mask)

    def backward(self, dout):
        return dout * (1 - self.mask)

sigmoid函數(shù)

y=sig(x)=(1+e^{-x})^{-1} \\ \frac{\partial y}{\partial x} = e^x(1+e^x)^{-2} \\ 也可以寫成\quad \frac{\partial y}{\partial x}= y(1-y)\\ 或者\quad \frac{\partial y}{\partial x}= y^2e^{-x}\\

sigmoid函數(shù)的反向傳遞

實現(xiàn):

class Sigmoid:
    def __init__(self):
        self.y = None

    def forward(self, x):
        y = (1 + np.exp(-x)) ** (-1)
        self.y = y
        return y

    def backward(self, d_out):
        dx = d_out * (1. - self.y) * self.y
        return dx

Affine層的實現(xiàn)

矩陣仿射變換
Y = W·X + B \\ X(n,);W(n,o);B(o,);Y(o,)
的計算圖如下(假設n=2,o=3)

矩陣的反射變換

偏導如下:

帶反向傳播的計算圖
帶反向傳播的計算圖

batch版本的仿射變換

batch版本的仿射變換
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
        return X.dot(self.W) + self.b

    def backward(self, d_out):
        dx = d_out.dot(self.W.T)
        dW = self.X.T.dot(d_out)
        db = np.sum(d_out, axis=0)
        self.dW = dW
        self.db = db
        return dx

softmax-with-loss

一個典型的2層神經(jīng)網(wǎng)絡結(jié)構(gòu)如下


典型的2層神經(jīng)網(wǎng)絡

softmax和entropy層的正向和反向傳播結(jié)構(gòu)如下


softmax和entropy層結(jié)構(gòu)

代碼實現(xiàn):
class SoftmaxWithLoss:

    def _softmax(x):
        if x.ndim == 2:
            x = x.T
            x = x - np.max(x, axis=0)
            y = np.exp(x) / np.sum(np.exp(x), axis=0)
            return y.T

        x = x - np.max(x)  # 溢出對策
        return np.exp(x) / np.sum(np.exp(x))

    def _cross_entropy_error(y, t):
        if y.ndim == 1:
            t = t.reshape(1, t.size)
            y = y.reshape(1, y.size)

        # 監(jiān)督數(shù)據(jù)是one-hot-vector的情況下趁舀,轉(zhuǎn)換為正確解標簽的索引
        if t.size == y.size:
            t = t.argmax(axis=1)

        batch_size = y.shape[0]
        return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

    def __init__(self):
        self.loss = None
        self.y = None
        self.t = None

    def forward(self,x,t):
        self.t = t
        self.y = self._softmax(x)
        self.loss = self._cross_entropy_error(self.y,self.t)

    def backward(self,dout=1):
        batch_size = self.t.shape[0]
        dx = (self.y - self.t) / batch_size
       
## 反向傳播實現(xiàn)二層神經(jīng)網(wǎng)絡






最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钾菊,一起剝皮案震驚了整個濱河市俺祠,隨后出現(xiàn)的幾起案子幸斥,更是在濱河造成了極大的恐慌姆泻,老刑警劉巖身诺,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锭环,死亡現(xiàn)場離奇詭異,居然都是意外死亡科侈,警方通過查閱死者的電腦和手機载佳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臀栈,“玉大人蔫慧,你說我怎么就攤上這事∪ㄊ恚” “怎么了姑躲?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盟蚣。 經(jīng)常有香客問我黍析,道長,這世上最難降的妖魔是什么屎开? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任阐枣,我火速辦了婚禮,結(jié)果婚禮上奄抽,老公的妹妹穿的比我還像新娘蔼两。我一直安慰自己,他們只是感情好逞度,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布额划。 她就那樣靜靜地躺著,像睡著了一般第晰。 火紅的嫁衣襯著肌膚如雪锁孟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天茁瘦,我揣著相機與錄音品抽,去河邊找鬼。 笑死甜熔,一個胖子當著我的面吹牛圆恤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腔稀,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼盆昙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焊虏?” 一聲冷哼從身側(cè)響起淡喜,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诵闭,沒想到半個月后炼团,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澎嚣,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年瘟芝,在試婚紗的時候發(fā)現(xiàn)自己被綠了易桃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡锌俱,死狀恐怖晤郑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贸宏,我是刑警寧澤造寝,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站锚赤,受9級特大地震影響匹舞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜线脚,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一赐稽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浑侥,春花似錦姊舵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伶选,卻和暖如春史飞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仰税。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工构资, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陨簇。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓吐绵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親河绽。 傳聞我的和親對象是個殘疾皇子己单,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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