第五章 误差反向传播法 第五节
激活函数层是实现
ReLU层
激活函数ReLU的公式
该函数求导后
python实现ReLU类
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
mask存储的是由True/False构成的Numpy数组,它会把正向传播时的输入x的元素小于等于0的地方保存为True,其他地方保存为False。out[self.mask] = 0表示当mask为True的时候对应的下标索引对应的out值为0。
Sigmoid层
sigmiod层的公式
用计算图表示
还出现了新的“exp”和“/”节点。“exp”节点会进行y = exp(x)的计算,“/”节点会进行 y=1/x的计算。
反向传播的流程
第一步
“/”节点会进行 y=1/x,它的导数表示为
该步骤的反向传播计算图
步骤2
“+”节点将上游的值原封不动地传给下游,计算图
步骤3
“exp”节点表示y=exp(x),它的导数公式为
计算图中,上游的值乘以正向传播时的输出,计算图如下图:
步骤4
“×”节点将正向传播时的值翻转后做乘法运算。因此,这里要乘以−1。
最后可以简化为下面的示意图
最后的导数相乘可以简化为
实现sigmiod层
class sigmiod:
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
把公式弄出来以后按照公式实现就可以了。