我已经使用sigmoid激活函数实现了MLP的反向传播。
在前向阶段,我将每一层的输出存储在内存中。
在计算了输出误差和输出梯度向量后,我开始反向返回并计算每一层的隐藏误差(使用当前层的输出+层的权重+1 +层的输出误差+1)。然后我使用隐藏的误差和layer -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导数并应用,但对如何应用感到困惑。感谢您的建议
发布于 2021-03-24 20:02:58
假设您的类当前设置如下:
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)发布于 2021-03-24 20:33:19
在进行反向传播时,您将需要使用链规则的中间值。假设你只有一个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)的梯度。
https://stackoverflow.com/questions/66777458
复制相似问题