我已经实现了一个有2层的神经网络(使用CUDA)。 (每层2个神经元)。 我试图让它使用反向传播学习2个简单的二次多项式函数。
但不是收敛,而是发散(输出变得无穷大)
以下是我尝试过的更多细节:
3 * i + 7 * j+9
和j*j + i*i + 24
(我将图层i
和j
作为输入)我检查并重新检查了我的代码,但似乎没有任何问题。
所以这是我的问题:这里出了什么问题?
任何指针都会受到赞赏。
答案 0 :(得分:5)
如果您要解决的问题属于分类类型,请尝试3层网络(3对于Kolmogorov就足够了)从输入A和B到隐藏节点C的连接(C = A * wa + B * wb)代表AB空间中的一条线。该行划分正确和不正确的半空格。从隐藏层到输出的连接,将隐藏层值相互关联,为您提供所需的输出。
根据您的数据,错误功能可能看起来像梳子,因此实施动力应该会有所帮助。将学习率保持在1对我来说是最佳的。
您的培训课程每隔一段时间就会陷入局部最小化,因此网络培训将包括几个后续会议。如果会话超过最大迭代次数或幅度太高,或者错误显然很高 - 会话失败,则启动另一次。
在每个开头,使用随机(-0.5 - +0.5)值重新初始化您的权重。
绘制错误下降图表确实很有帮助。你会得到那个“啊哈!”因素。
答案 1 :(得分:3)
神经网络代码分歧的最常见原因是编码器忘记将负号放在权重表达式的变化中。
另一个原因可能是用于计算渐变的误差表达式存在问题。
如果这些不成立,那么我们需要查看代码并回答。