我尝试实现一个神经网络。我使用反向传播来计算梯度。获得梯度后,我将它们乘以学习率,并从相应的权重中减去它们。(基本上是尝试应用梯度下降,如果有错误请告诉我)。所以在准备好反向传播和梯度下降后,我首先尝试训练一个简单的XOR分类器,输入可以是(0,0), (1,0), (0,1), (1,1),相应的输出是0, 1, 1, 0。因此,我的神经网络包含2个输入单元,1个输出单元和一个包含3个单元的隐藏层。当使用3.0的学习率训练超过100次(甚至尝试了超过5000次),成本下降到某个特定点后就卡住了,所以它保持不变。每次运行程序时,权重都是随机初始化的,但它总是卡在相同的特定成本上。无论如何,训练完成后,我尝试在上述任何输入上运行我的神经网络,输出总是0.5000。我考虑更改输入和输出,使它们为:(-1,-1), (1, -1), (-1, 1), (1, 1),输出为-1, 1, 1, -1。现在使用相同的学习率进行训练时,无论迭代次数多少,成本都在持续下降,但结果仍然是错误的,并且总是非常接近0。我甚至尝试了疯狂的迭代次数,结果如下:[迭代次数:(20kk),输入:(1, -1),输出:(1.6667e-08)],还尝试了[迭代次数:(200kk),输入:(1, -1),输出:(1.6667e-09)],也尝试了输入(1,1)和其他,输出也非常接近0。看起来输出总是mean(min(y), max(y)),无论我以何种形式提供输入/输出。我无法找出我做错了什么,有人能帮我吗?
回答:
你可能犯错的地方有很多:
- 数值上检查你的梯度
- 你需要使用非线性隐藏单元来学习XOR – 你有非线性激活吗?
- 你需要偏置神经元,你有吗?
一些次要问题不会导致上述问题,但无论如何都值得修复:
- 你的输出节点有S形激活函数吗(因为你的网络是一个分类器)?
- 你使用交叉熵成本进行训练吗(虽然这是一个次要问题)?