使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播
使用反向傳播算法計算參數的梯度并用python實現加法和乘法節點的反向傳播
- 一、what is 反向傳播
- 二、乘法節點的反向傳播
- 三、加法節點的反向傳播
- 四、加法層和乘法層混合應用
一、what is 反向傳播
誤差反向傳播法是一種高效計算權重參數的梯度的方法。所謂的反向傳播,從圖上看的話,就是從右向左的傳播。
舉個例子,如圖所示,jym買了兩個100元一個的蘋果,消費稅是10%,最終輸出支付金額,這個圖就表示了一個計算的流程。正向看都能理解,就是100和2相乘得到200,作為下一個節點的入,然后200和1.1相乘得到220的支付金額。
那么,如果jym想要知道蘋果價格上漲會多大程度影響最終的支付金額,就需要求支付金額關于蘋果價格的偏導數。設蘋果價格為x,支付金額為L,支付金額關于蘋果價格的偏導數為d,d的值表示,x上漲a時支付金額會增加d*a。
圖中,反向傳播用與正向相反的箭頭表示。它傳遞的數是局部導數。而且,通過圖片可以了解到,蘋果價格如果增加1元,那么最終支付金額將增加2.2元。
傳遞這個局部導數的原理是鏈式法則。表示鏈式法則的數學公式如下:
反向傳播計算流程:
將節點的輸入信號乘以節點輸出關于輸入的偏導數,然后再傳到下一個節點,這里面傳遞的方向是和正向相反的。
把上面鏈式法則數學公式表示到圖像上:
x是蘋果j的價格,z是最終的支付金額,z對x求偏導就根據那個鏈式法則的流程逐步求出了。
這就很好,因為偏導數是按照流程規則求出來的,這樣就可以用程序編程了。
二、乘法節點的反向傳播
z=xy,z對x求偏導等于y,z對y求偏導等于x,那么,乘法的反向傳播會將上游的值乘以正向傳播時的輸入信號的翻轉值之后傳給下游,和加法的區別就是,需要正向傳播的輸入信號值,編程時需要保存正向傳播的輸入信號。乘法節點的反向傳播計算圖如下圖所示。
python實現乘法層的代碼:
init函數初始化實例變量x、y,保存正向傳播時的輸入值。
forward接收x、y兩個參數,將他們相乘后輸出。
backward將上游傳過來的導數dout乘正向傳播的翻轉值,然后傳給下游
class MulLayer:def __init__(self):self.x = Noneself.y = Nonedef forward(self, x, y):self.x = xself.y = y out = x * yreturn outdef backward(self, dout):dx = dout * self.ydy = dout * self.xreturn dx, dy下面這個代碼舉了個例子,用代碼復現了這張圖片。
輸出:
price: 220 dApple: 2.2 dApple_num: 110 dTax: 200三、加法節點的反向傳播
z=x+y,z對x和對y求偏導都是1。也就是說,加法的反向傳播只是將上游的值傳給下游。加法節點的反向傳播計算圖如下圖所示。
python實現加法層的代碼:
forward接收x和y兩個參數,將它們相加后輸出。
backward將上游傳來的導數原封不動傳給下游。
class AddLayer:def __init__(self):passdef forward(self, x, y):out = x + yreturn outdef backward(self, dout):dx = dout * 1dy = dout * 1return dx, dy四、加法層和乘法層混合應用
接下來用代碼表述下面這張圖。
from layer_naive import *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) # (1) orange_price = mul_orange_layer.forward(orange, orange_num) # (2) all_price = add_apple_orange_layer.forward(apple_price, orange_price) # (3) price = mul_tax_layer.forward(all_price, tax) # (4)# backward dprice = 1 dall_price, dtax = mul_tax_layer.backward(dprice) # (4) dapple_price, dorange_price = add_apple_orange_layer.backward(dall_price) # (3) dorange, dorange_num = mul_orange_layer.backward(dorange_price) # (2) dapple, dapple_num = mul_apple_layer.backward(dapple_price) # (1)print("price:", int(price)) print("dApple:", dapple) print("dApple_num:", int(dapple_num)) print("dOrange:", dorange) print("dOrange_num:", int(dorange_num)) print("dTax:", dtax)輸出:
price: 715 dApple: 2.2 dApple_num: 110 dOrange: 3.3000000000000003 dOrange_num: 165 dTax: 650總結
以上是生活随笔為你收集整理的使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机桌面程序名,深度技术win7旗舰版
- 下一篇: 使用python对数据集进行批处理