【发布时间】:2016-05-19 23:46:26
【问题描述】:
我用 C 语言编写了我的第一个前馈神经网络,使用 sigmoid 1.0 / (1.0 + exp(-x)) 作为激活函数并使用梯度下降来调整权重。我试图近似sin(x) 以确保我的网络正常工作。然而,输出层神经元的输出似乎总是在极值 0 和 1 之间振荡,并且神经元的权重增长到荒谬的大小,无论有多少隐藏层,隐藏层中有多少神经元(s),我提供了多少训练样本,甚至目标输出是什么。
1) 是否有任何标准的“经过验证的”数据集用于验证神经网络的错误?如果是,哪些结构(例如隐藏层中的神经元数量)最能收敛到所需的输出?
2) 是否存在产生相同症状的常见错误?我找到了this thread,但问题是由于数据错误,我认为这不是我的情况。
3) 有没有首选的网络训练方式?在我的实现中,我循环遍历训练集并每次调整权重,然后冲洗并重复约 1000 次。还有其他更好的顺序吗?
【问题讨论】:
-
你最终的激活函数是什么?它也是sigmoid吗?那么你可能对罪可能是消极的事实有疑问。
-
@MarcinMożejko 为了清楚起见,我只取了 0 到 1 之间的 50 个随机实数,并使用每个实数的 sin(x) 作为输出目标。所以这些数字都是正数,介于 0 和 1 之间。我也不确定你的最终激活函数是什么意思?
-
最终激活是最后一层的激活函数。好的 - 那么这个任务的学习率和丢失功能是多少?你用过 MSE 吗?
-
@MarcinMożejko 我还在输出层使用了 sigmoid 作为激活函数,除此之外没有补充函数——我直接将最后一层的输出与目标进行比较。我尝试了不同的学习率,从 0.7 到低至 0.01,但振荡现象仍然存在,只是慢了一点。至于成本函数,我确实使用了输出和期望目标之间的平方差。但是现在我想起来了,在调整权重之前计算整个训练集的均方差会更有意义吗?
-
那么 - 在每个示例之后更新它之前?它称为 SGD,可能会导致一些问题。您可以计算整个集合的错误或使用批量学习代替(当您在计算错误后更新权重时,例如 20 个示例)。学习率 0.7 也可能很大。
标签: c neural-network