我已按照此视频中的说明实施了反向传播。 https://class.coursera.org/ml-005/lecture/51
这似乎已成功运行,通过渐变检查并允许我训练MNIST数字。
但是,我注意到反向传播的大多数其他解释都将输出增量计算为
d =(a - y)* f'(z)http://ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm
虽然视频使用了。
d =(a - y)。
当我将delta乘以激活导数(Sigmoid导数)时,我不再使用与梯度检查相同的梯度(差异至少为一个数量级)。
什么允许Andrew Ng(视频)省略输出增量的激活衍生物?为什么它有效?然而,当添加导数时,会计算出不正确的梯度?
修改
我现在已经在输出上测试了线性和sigmoid激活函数,只有在我使用Ng的delta方程(没有sigmoid导数)时才进行梯度检查。
答案 0 :(得分:10)
找到我的答案here。输出增量确实需要乘以激活的导数,如。
d =(a - y)* g'(z)
然而,Ng正在利用交叉熵成本函数,该函数导致取消g(#)的delta,从而导致视频中显示的d = a-y计算。如果使用均方误差成本函数,则必须存在激活函数的导数。
答案 1 :(得分:2)
使用神经网络时,取决于学习任务,您需要如何设计网络。回归任务的常用方法是对输入和所有隐藏层使用tanh()激活函数,然后输出层使用线性激活函数(img取自here)
我做了'找不到源,但有一个定理表明,使用非线性和线性激活函数可以更好地逼近目标函数。可以找到使用不同激活函数的示例here和here。
可以使用许多不同类型的acitvation函数(img取自here)。如果你看看衍生物,你可以看到线性函数的导数等于1,然后就不再提及了。这也是Ng的解释,如果你看一下视频中的第12分钟,你会看到他正在谈论输出层。
关于反向传播算法
"当神经元位于网络的输出层时,会向其提供自己的所需响应。我们可以使用e(n) = d(n) - y(n)
来计算与此神经元相关的误差信号e(n)
;见图4.3。确定e(n)
后,我们发现计算局部梯度是一件简单的事情[...]当神经元位于网络的隐藏层时,对该神经元没有指定的期望响应。因此,隐藏神经元的误差信号必须递归确定,并根据隐藏神经元直接连接的所有神经元的误差信号向后工作"
Haykin,Simon S.,et al。神经网络和学习机器。卷。 3. Upper Saddle River:Pearson Education,2009。p 159-164
答案 2 :(得分:0)
这里是link,其中说明了反向传播背后的所有直觉和数学原理。
Andrew Ng使用的交叉熵成本函数定义为:
在最后一层计算关于θ参数的偏导数时,我们得到的是:
请参阅本文结尾处的σ(z)的导数,该值已替换为:
对于最后一层“ L”,我们有
如果我们乘以:
对于σ(z)的偏导数,我们得到的是: