C中的非收敛神经网络

时间:2016-05-19 07:15:09

标签: c neural-network

我在C中编写了我的第一个前馈神经网络,使用sigmoid 1.0 / (1.0 + exp(-x))作为激​​活函数和梯度下降来调整权重。我尝试近似sin(x)以确保我的网络有效。然而,输出层上神经元的输出似乎总是在极值0和1之间振荡,并且神经元的权重增长到荒谬的大小,无论有多少隐藏层,隐藏层中有多少神经元(s),我提供了多少训练样本,甚至目标输出是什么。

1)是否有任何标准的“经过试验和测试”的数据集用于验证神经网络的错误?如果是,那么哪种结构效果最好(例如隐藏层中的神经元数量)会收敛到所需的输出?

2)是否存在产生相同症状的常见错误?我发现this thread,但问题是由于数据错误,我认为这不是我的情况。

3)是否有任何首选的网络培训方式?在我的实现中,我循环训练集并每次调整权重,然后冲洗并重复约1000次。还有其他更好的订单吗?

1 个答案:

答案 0 :(得分:2)

所以,总结一下:

  1. 假设您的梯度传播正常工作,通常使用称为网格搜索或网格搜索的技术计算拓扑,学习速率,批量大小或与权重惩罚(L1和L2衰减)相关的常量值等参数值。随机搜索。经验证明,随机搜索在task中表现得更好。

  2. 体重分歧的最常见原因是错误的学习率。它的巨大价值可能会使学习变得非常困难。但另一方面 - 当学习率太小时 - 学习过程可能需要很长时间。通常 - 您应该照看学习阶段。可能会找到指定的指令,例如here

  3. 在您的学习阶段,您使用了一种名为SGD的技术。通常 - 它可能会取得良好的效果,但它容易受到数据集的差异和学习率的巨大价值的影响。我的建议是使用批量学习并将批量大小设置为在网格或随机搜索期间学习的额外学习参数。你可以在这里阅读,例如here

  4. 您可以考虑的另一件事是将激活功能更改为tanhrelu。饱和区域sigmoid存在很多问题,通常需要正确初始化。您可以阅读here