我正在为一个简单的神经网络实现反向传播算法,它可以预测生存概率(1 或 0)。
但是,无论我如何尝试设置正确的超参数,我都无法达到 80% 以上。我怀疑那是因为我的反向传播实施不正确,因为我尝试了 2 种不同类型的代码并且都给了我相同的结果。
有没有办法确定我的反向传播实现是否正确?
我正在为一个简单的神经网络实现反向传播算法,它可以预测生存概率(1 或 0)。
但是,无论我如何尝试设置正确的超参数,我都无法达到 80% 以上。我怀疑那是因为我的反向传播实施不正确,因为我尝试了 2 种不同类型的代码并且都给了我相同的结果。
有没有办法确定我的反向传播实现是否正确?
不要因为有点错误而感到难过,因为反向传播是出了名的难以实施[1]。
有一种称为梯度检查的技术,您可以实施该技术来测试反向传播实现的正确性。我认为即使是梯度检查也很难实现。
梯度检查如何工作?
反向传播计算梯度, 在哪里表示模型的参数。是使用前向传播和您的损失函数计算的。
但是由于前向传播的实现相当简单,大多数人通常相信你的实现是正确的。所以,诀窍是使用验证您的计算代码.
我们知道,根据定义,梯度或导数由下式给出:
有关更多信息,请参阅Andrew Ng 的视频讲座和这些说明。
为了将来参考,您可以通过有限差分法检查您的正确性。
http://www.cedar.buffalo.edu/~srihari/CSE574/Chap5/Chap5.3-BackProp.pdf (p.23)
到目前为止给出的答案集中在检查梯度的数值方法上。它真的很有用,特别是如果一个人在反向传播方面没有太多经验。
但我想在这里添加一个纯粹实用的“健全性检查”,相对快速且易于执行,它也适用于其他问题,例如(粗略的)超参数选择。要查看您的网络是否有意义,请将训练集减少到几个示例并尝试过度拟合网络。如果损失降到零并且训练准确度飙升到 1,则意味着两个通道都可以正常工作并且可以继续进行真正的训练。否则,有些事情是不对的,应该深入到网络的特定部分,特别是用数字检查梯度。