神经网络-反向传播,训练误差

Posted

技术标签:

【中文标题】神经网络-反向传播,训练误差【英文标题】:neural network-back propagation, error in training 【发布时间】:2011-11-20 16:40:47 【问题描述】:

在阅读了一些关于神经网络(反向传播)的文章后,我尝试自己编写一个简单的神经网络。

我决定了 XOR 神经网络, 我的问题是当我尝试训练网络时, 如果我只使用一个示例来训练网络,可以说 1,1,0(作为输入 1,输入 2,目标输出)。 经过 500 次火车 +- 网络回答 0.05。 但是如果我尝试了一个以上的例子(让我们说 2 种不同的或所有 4 种可能性),网络的目标是 0.5 作为输出:( 我在谷歌搜索我的错误没有结果:S 我会尽力提供尽可能多的细节来帮助找出问题所在:

-我尝试了具有 2,2,1 和 2,4,1 的网络(输入层、隐藏层、输出层)。

-由以下定义的每个神经元的输出:

double input = 0.0;
        for (int n = 0; n < layers[i].Count; n++)
            input += layers[i][n].Output * weights[n];

而“i”是当前层,权重是前一层的所有权重。

-最后一层(输出层)错误定义为:

value*(1-value)*(targetvalue-value);

而 'value' 是神经输出,而 'targetvalue' 是当前神经的目标输出。

-其他神经元的误差定义为:

foreach neural in the nextlayer 
           sum+=neural.value*currentneural.weights[neural];

-网络中的所有权重都由这个公式适应(神经网络的权重 -> 神经网络 2)

weight+=LearnRate*neural.myvalue*neural2.error;

而 LearnRate 是网络学习率(在我的网络中定义为 0.25)。 - 每个神经元的偏差权重定义为:

bias+=LearnRate*neural.myerror*neural.Bias;

偏差是 const value=1。

我能详细说明的, 正如我所说,输出的目标是 0.5,不同的训练示例:(

非常感谢您的帮助^_^。

【问题讨论】:

您是自己编写实现还是使用框架? 被保护后居然回答不了他的问题,真是好笑:) 【参考方案1】:

如果不查看完整代码,很难判断错误在哪里。您应该仔细检查的一件事是您对每个单元的局部误差梯度的计算是否与您在该层上使用的激活函数相匹配。看看这里的通用公式:http://www.learnartificialneuralnetworks.com/backpropagation.html

例如,您对输出层进行的计算假设您使用的是逻辑 sigmoid 激活函数,但您没有在上面的代码中提及这一点,因此看起来您使用的是线性激活函数。

原则上,2-2-1 网络应该足以学习 XOR,尽管训练有时会陷入局部最小值而无法收敛到正确的状态。因此,重要的是不要从一次训练中得出关于算法性能的结论。请注意,简单的反向程序肯定会很慢,例如 Rprop 之类的更快、更健壮的解决方案。

有关该主题的书籍提供了简单网络的详细分步计算(例如 Negnevitsky 的“A.I.:智能系统指南”),这可以帮助您调试算法。另一种方法是使用现有框架(例如 Encog、FANN、Matlab)设置完全相同的拓扑和初始权重,并将计算结果与您自己的实现进行比较。

【讨论】:

以上是关于神经网络-反向传播,训练误差的主要内容,如果未能解决你的问题,请参考以下文章

误差反向传播 - 神经网络

MATLAB中BP神经网络的训练算法具体是怎么样的

反向传播 - 误差导数

基于误差反向传播法的神经网络学习的全貌图

编写C语言版本的卷积神经网络CNN之三:CNN的误差反向传播过程

cs231n 误差反向传播