【发布时间】:2021-03-24 08:41:12
【问题描述】:
我已经使用 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 导数并应用,但对它的应用方式感到困惑。感谢任何建议
【问题讨论】:
-
为什么不用pytorch之类的框架呢?
-
这是个好主意...但现在我正在尝试使用 jupyter 学习基础知识:-)
-
对于反向传播阶段,你必须定义relu的导数函数。很难告诉你神经网络是如何进行前馈和反向传播的。首先,你可以实现导函数!
-
我了解如何在前向阶段实现 relu,但如何在后向阶段应用它?我有计算 relu 导数的功能,但不确定在哪里应用它。
def reluDerivative(self, x): return 1. * (x > 0) -
所以在反向传播阶段我是否必须使用 relu 导数重新计算每一层的输出?然后用它来计算隐藏的错误?
标签: python backpropagation mlp