我已经实现了如本视频中所述的反向传播。
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)。
当我用激活导数(S型导数)乘以增量时,我不再以与梯度检查相同的梯度结束(相差至少一个数量级)。
是什么让Andrew Ng(视频)忽略了输出增量的激活导数?为何起作用?但是,在添加导数时,会计算出不正确的梯度吗?
编辑
现在,我已经在输出上使用了线性和S型激活函数进行了测试,只有在两种情况下都使用Ng的delta方程(无S型导数)时,梯度检查才会通过。
最佳答案
找到了我的答案here。输出增量确实需要乘以激活的导数,如中所示。
d =(a-y)* g'(z)
但是,Ng正在利用交叉熵代价函数,该函数会产生抵消g'(z)的增量,从而导致视频中显示的d = a-y计算。如果改用均方误差成本函数,则必须存在激活函数的导数。
关于backpropagation - 反向传播激活导数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32963446/