深度学习入门|第5章 误差反向传播法(二)
?誤差反向傳播法
前言
此為本人學習《深度學習入門》的學習筆記
四、簡單層的實現
本節將用 Python 實現前面的購買蘋果的例子。這里,我們把要實現的計算圖的乘法節點稱為“乘法層”(MulLayer),加法節點稱為“加法層”(AddLayer)。
1、乘法層的實現
層的實現中有兩個共通的方法(接口)forward()?和backward()。forward()?對應正向傳播,backward()?對應反向傳播。
實現乘法層。乘法層作為?MulLayer?類,其實現過程如下所示
?
class MulLayer:def __init__(self):self.x = Noneself.y = Nonedef forward(self, x, y):self.x = xself.y = yout = x * yreturn outdef backward(self, dout):dx = dout * self.y # 翻轉x和ydy = dout * self.xreturn dx, dy__init__()?中會初始化實例變量?x?和?y,它們用于保存正向傳播時的輸入值。forward()?接收?x?和?y?兩個參數,將它們相乘后輸出。backward()?將從上游傳來的導數(dout)乘以正向傳播的翻轉值,然后傳給下游。
使用?MulLayer?實現前面的購買蘋果的例子(2 個蘋果和消費稅)。
?
圖 5-16 購買 2 個蘋果
使用這個乘法層的話,圖 5-16 的正向傳播可以像下面這樣實現
?此外,關于各個變量的導數可由?backward()?求出。
調用?backward()?的順序與調用?forward()?的順序相反。此外,要注意?backward()?的參數中需要輸入“關于正向傳播時的輸出變量的導數”。比如,mul_apple_layer?乘法層在正向傳播時會輸出?apple_price,在反向傳播時,則會將?apple_price?的導數?dapple_price?設為參數。
2、加法層的實現
class AddLayer:def __init__(self):passdef forward(self, x, y):out = x + yreturn outdef backward(self, dout):dx = dout * 1dy = dout * 1return dx, dy加法層不需要特意進行初始化,所以?__init__()?中什么也不運行(pass?語句表示“什么也不運行”)。加法層的?forward()?接收?x?和?y?兩個參數,將它們相加后輸出。backward()?將上游傳來的導數(dout)原封不動地傳遞給下游。
使用加法層和乘法層,實現圖 5-17 所示的購買 2 個蘋果和 3 個橘子的例子。
圖 5-17 購買 2 個蘋果和 3 個橘子
用 Python 實現圖 5-17 的計算圖的過程如下所示
首先,生成必要的層,以合適的順序調用正向傳播的?forward()?方法。然后,用與正向傳播相反的順序調用反向傳播的?backward()?方法,就可以求出想要的導數。
五、激活函數層的實現
將計算圖的思路應用到神經網絡中。把構成神經網絡的層實現為一個類。先來實現激活函數的?ReLU?層和?Sigmoid?層。
1、ReLU層
激活函數 ReLU(Rectified Linear Unit)由下式(5.7)表示。
通過式(5.7),可以求出?y?關于?x?的導數,如式(5.8)所示。
在式(5.8)中,如果正向傳播時的輸入?x?大于 0,則反向傳播會將上游的值原封不動地傳給下游。反過來,如果正向傳播時的?x?小于等于 0,則反向傳播中傳給下游的信號將停在此處。用計算圖表示的話,如圖 5-18 所示。
實現?ReLU?層。在神經網絡的層的實現中,一般假定?forward()?和backward()?的參數是?NumPy?數組。
?
圖 5-18 ReLU 層的計算圖
class Relu:def __init__(self):self.mask = Nonedef forward(self, x):self.mask = (x <= 0)out = x.copy()out[self.mask] = 0return outdef backward(self, dout):dout[self.mask] = 0dx = doutreturn dxRelu?類有實例變量?mask。這個變量?mask?是由?True/False?構成的 NumPy 數組,它會把正向傳播時的輸入?x?的元素中小于等于 0 的地方保存為?True,其他地方(大于 0 的元素)保存為?False。
?2、Sigmoid層
實現sigmoid函數,sigmoid函數由式(5.9)表示
用計算圖表示式子(5.9)的話,則如圖5-19所示
圖 5-19 sigmoid 層的計算圖(僅正向傳播)
圖 5-19 中,除了“×”和“+”節點外,還出現了新的“exp”和“/”節點。“exp”節點會進行?y?= exp(x) 的計算,“/”節點會進行??的計算。
如圖 5-19 所示,式(5.9)的計算由局部計算的傳播構成。
下面我們就來進行圖 5-19 的計算圖的反向傳播。這里,作為總結,我們來依次看一下反向傳播的流程。
步驟 1
“/”節點表示?,它的導數可以解析性地表示為下式。
根據式(5.10),反向傳播時,會將上游的值乘以?(正向傳播的輸出的平方乘以 -1 后的值)后,再傳給下游。計算圖如下所示。
步驟 2
“+”節點將上游的值原封不動地傳給下游。計算圖如下所示。
步驟 3
“exp”節點表示?y?= exp(x),它的導數由下式表示。
計算圖中,上游的值乘以正向傳播時的輸出(這個例子中是 exp(-x))后,再傳給下游。
步驟 4
“×”節點將正向傳播時的值翻轉后做乘法運算。因此,這里要乘以 -1。
圖 5-20 Sigmoid 層的計算圖
?
轉載于:https://www.cnblogs.com/zyqy/p/10816953.html
總結
以上是生活随笔為你收集整理的深度学习入门|第5章 误差反向传播法(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试框架有哪些
- 下一篇: MVC 模式和模型 2