厦门市建设区网站首页,淘宝客推广网站模板,wordpress 修改ip,重庆做网站 熊掌号使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播一、what is 反向传播二、乘法节点的反向传播三、加法节点的反向传播四、加法层和乘法层混合应用一、what is 反向传播
误差反向传播法是一种高效计算权重参数的梯度的方法。所谓的反向传播#xff0c;…
使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播一、what is 反向传播二、乘法节点的反向传播三、加法节点的反向传播四、加法层和乘法层混合应用一、what is 反向传播
误差反向传播法是一种高效计算权重参数的梯度的方法。所谓的反向传播从图上看的话就是从右向左的传播。
举个例子如图所示jym买了两个100元一个的苹果消费税是10%最终输出支付金额这个图就表示了一个计算的流程。正向看都能理解就是100和2相乘得到200作为下一个节点的入然后200和1.1相乘得到220的支付金额。
那么如果jym想要知道苹果价格上涨会多大程度影响最终的支付金额就需要求支付金额关于苹果价格的偏导数。设苹果价格为x支付金额为L支付金额关于苹果价格的偏导数为dd的值表示x上涨a时支付金额会增加d*a。
图中反向传播用与正向相反的箭头表示。它传递的数是局部导数。而且通过图片可以了解到苹果价格如果增加1元那么最终支付金额将增加2.2元。 传递这个局部导数的原理是链式法则。表示链式法则的数学公式如下 反向传播计算流程
将节点的输入信号乘以节点输出关于输入的偏导数然后再传到下一个节点这里面传递的方向是和正向相反的。
把上面链式法则数学公式表示到图像上:
x是苹果j的价格z是最终的支付金额z对x求偏导就根据那个链式法则的流程逐步求出了。 这就很好因为偏导数是按照流程规则求出来的这样就可以用程序编程了。
二、乘法节点的反向传播
zxyz对x求偏导等于yz对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下面这个代码举了个例子用代码复现了这张图片。
from layer_naive import *apple 100
apple_num 2
tax 1.1mul_apple_layer MulLayer()
mul_tax_layer MulLayer()# forward
apple_price mul_apple_layer.forward(apple, apple_num)
price mul_tax_layer.forward(apple_price, tax)# backward
dprice 1
dapple_price, dtax mul_tax_layer.backward(dprice)
dapple, dapple_num mul_apple_layer.backward(dapple_price)print(price:, int(price))
print(dApple:, dapple)
print(dApple_num:, int(dapple_num))
print(dTax:, dtax)输出
price: 220
dApple: 2.2
dApple_num: 110
dTax: 200三、加法节点的反向传播
zxyz对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