我已按照此视频中的说明实施了反向传播。 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乘以激活导数(S形导数)时,我不再以梯度检查的相同梯度结束(差异至少为一个数量级)。
是什么让Andrew Ng(视频)省略了输出增量的激活衍生物?为什么它有效?然而,当添加导数时,会计算出不正确的梯度?
编辑
我现在已经在输出上测试了线性和sigmoid激活函数,只有在我使用Ng的delta方程(没有sigmoid导数)时才进行梯度检查。
找到我的答案here。输出增量确实需要乘以激活的导数,如下所示。
d =(a - y)* g'(z)
然而,Ng正在利用交叉熵成本函数,其导致消除g'(z)的Δ,导致视频中所示的d = a-y计算。如果使用均方误差成本函数,则必须存在激活函数的导数。
使用神经网络时,它取决于您需要如何设计网络的学习任务。回归任务的常用方法是对输入和所有隐藏层使用tanh()激活函数,然后输出层使用线性激活函数(img取自here)
我没有找到源,但是有一个定理表明使用非线性和线性激活函数可以更好地逼近目标函数。可以找到使用不同激活函数的示例here和here。
可以使用许多不同种类的活化功能(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
这里是link,解释了Backpropagation背后的所有直觉和数学。
Andrew Ng正在使用定义的交叉熵成本函数:
当计算最后一层中θ参数的偏导数时,我们得到的是:
请参阅本文末尾的σ(z)衍生物,其替换为:
我们有最后一层“L”,
如果我们成倍增加:
对于σ(z)的偏导数,我们得到的是: