如何解决Relu 激活和反向传播
我已经使用 sigmoid 激活函数为 MLP 实现了反向传播。
在前向阶段,我将每一层的输出存储在内存中。
在计算输出误差和输出梯度向量后,我开始反向返回并计算每层的隐藏误差(使用当前层的输出+层+1的权重+层+1的输出误差)。然后我使用隐藏错误和第 -1 层的输出来计算梯度向量。反向传播完成后,我会使用计算出的每一层的梯度向量更新权重。
我的问题与relu激活函数的实现有关。我有以下应用激活函数的函数。第一个是我在初始运行时使用的,第二个是用于 relu 激活。
def sigmoid(self,a):
o = 1/(1+np.exp(-1*a))
return o
def relu(self,a):
return np.maximum(0,a)
def reluDerivative(self,x):
return 1. * (x > 0)
要实现 relu 激活函数,我是否需要在前向阶段或反向传播阶段进行任何其他更改。我读到我可能需要在向后阶段计算 relu 导数并应用,但对此如何应用感到困惑。感谢任何建议
解决方法
假设您的课程目前设置如下:
def logistic(z):
return 1./(1. + np.exp(-z))
class backpropagation(object):
...
def get_activation(self,a):
return logistic(a)
def get_delta_activation(self,a):
y = logistic(a)
dy = y * (1. - y)
return dy
那么新的派生类将是
class BPwithRelu(backpropagation):
def get_activation(self,a):
return np.max(0,a)
def get_delta_activation(self,a):
return (x > 0).astype(np.float)
,
在进行反向传播时,您将需要使用链式法则的中间值。假设您只有一个 relu 后跟一个 sigmoid,则:
f(x) = relu(sigmoid(x))
relu(x) = max(0,x)
sigmoid(x) = 1/(1+exp(-1*a))
使用链式法则(拉格朗日符号)推导 f(x)
:
f'(x) = relu'(sigmoid(x)) * sigmoid'(x)
你看到来自 sigmoid 的梯度与来自 relu 的梯度相乘。另请注意,relu 计算其相对于 sigmoid 输出的梯度,而 sigmoid 计算其梯度相对于输入 (x)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。