反向传播激活函数导数

9
我已经按照这个视频中的说明实现了反向传播。https://class.coursera.org/ml-005/lecture/51。看起来这似乎成功了,通过梯度检查并允许我在MNIST数字上进行训练。
然而,我注意到大多数关于反向传播的解释都将输出delta计算为
d = (a - y) * f'(z) http://ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm 而该视频使用的是
d = (a - y).
当我将我的delta乘以激活函数的导数(sigmoid的导数)时,我不再得到与梯度检查相同的梯度(至少相差一个数量级)。
什么使得Andrew Ng(视频中的讲师)可以省略输出delta的激活函数导数?它为什么有效?但是,当添加导数时,会计算出错误的梯度?
编辑:
我现在已经在输出上测试了线性和sigmoid激活函数,只有在两种情况下都使用Ng的delta公式(没有sigmoid导数)时,梯度检查才能通过。

如果我的问题不太清楚,请告诉我。 - Kieren Anderson
3个回答

10

我在这里找到了答案(链接)。和之前一样,输出的delta需要乘以激活函数的导数。

然而,Ng使用的是交叉熵代价函数,这会导致一个可以取消g'(z)的delta,从而得到视频中展示的d = a - y计算结果。如果使用均方误差代价函数,则必须考虑激活函数的导数。


我也有同样的疑问(我也在跟随他的视频),感谢您澄清!不过,我还有另一个问题:我已经使用梯度检查检查了我的实现,输出几乎相同。然而,我的结果非常糟糕(50%的准确率识别数字)。但是,如果我从计算内部delta的sigmoid导数中删除它,我可以获得90%的准确率(但显然我的梯度不再与梯度检查相同)。您有任何想法为什么会发生这种情况吗? - Gonzalo Solera

2

使用神经网络时,你需要根据学习任务设计网络。对于回归任务,常见的方法是在输入和所有隐藏层中使用tanh()激活函数,然后输出层使用线性激活函数(图片来自这里)。

enter image description here

我没有找到来源,但有一个定理表明,使用非线性和线性激活函数可以更好地逼近目标函数。使用不同激活函数的示例可以在这里这里找到。
有许多不同种类的激活函数可以使用(图片取自这里)。如果您查看导数,您会发现线性函数的导数等于1,因此将不再提及。这也是Ng的解释的情况,如果您在视频中查看第12分钟,您会发现他正在谈论输出层。

enter image description here

关于反向传播算法:
当神经元位于网络的输出层时,它会被提供自己的期望响应。我们可以使用 e(n) = d(n) - y(n) 来计算与该神经元相关的误差信号 e(n);见图4.3。确定了 e(n) 后,我们可以很容易地计算局部梯度[...] 当神经元位于网络的隐藏层时,没有为该神经元指定期望响应。因此,一个隐藏神经元的误差信号必须通过递归和倒推来确定,其中递归涉及到该隐藏神经元直接连接的所有神经元的误差信号。
引用自:Haykin, Simon S., et al. Neural networks and learning machines. Vol. 3. Upper Saddle River: Pearson Education, 2009. p 159-164

你是指2分钟的标记吗?如果Ng(还有我自己)在输出时使用了线性激活函数,这将是有意义的,但在视频中,输出激活是被计算为h = a = g(z),其中g是用于输入和隐藏层的相同的sigmoid(逻辑)函数。 - Kieren Anderson
g(...)仅代表神经元的激活函数(根据一般的Delta规则定义),并没有说明它是什么类型。如果之前已经说过了(我没有看其他视频),也许已经说过需要解决回归任务,因此使用Sigmoid和线性输出是一种常见的方法。 - Westranger
他肯定在使用sigmoid函数,你可以在这里看到他提到它:https://class.coursera.org/ml-005/lecture/47(在4分钟处)。而且,在他的编程作业中要求使用它,我也用它来创建我的神经网络。 - Kieren Anderson
你说得没错,但输出层与其他层的处理方式不同。我在 Haykin09(我只有一本在家里)的书中查阅了相关内容,并相应地更新了我的答案。如果你在谷歌上搜索这本书,你很容易就能找到在线版本。 - Westranger
感谢您找到这个资源,不过那个摘录是关于具有线性输出的网络(而不是Sigmoid)。接下来提到了Sigmoid输出的Delta计算。http://imgur.com/OTE1yFR - Kieren Anderson

0

这里是链接,其中包含了反向传播背后所有直觉和数学的解释。

Andrew Ng使用交叉熵代价函数进行定义:

当计算最后一层中与θ参数相关的偏导数时,我们得到:

请参见此帖子末尾的σ(z)导数,该导数将被替换为:

对于最后一层“L”,我们有,

如果我们进行乘法运算:


对于σ(z)的偏导数,我们得到:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接