反向传播,所有输出趋向于1

时间:2013-08-04 23:15:47

标签: machine-learning artificial-intelligence neural-network backpropagation gradient-descent

我在MATLAB中有这个Backpropagation实现,并且在训练时遇到了问题。在训练阶段的早期,所有输出都转到1.我已将输入数据(除了用于生成二进制目标向量的所需类除外)归一化到区间[0,1]。我一直指的是人工智能:现代方法,Norvig等人的实施。

根据我的代码检查了伪代码(并研究了算法一段时间),我无法发现错误。我没有长时间使用MATLAB,所以一直试图在需要的地方使用文档。

我还尝试了隐藏层中不同数量的节点和不同的学习率(ALPHA)。

目标数据编码如下:当目标要归类为2时,目标向量为[0,1,0],说它是1,{{1} } 等等等等。我还尝试为目标使用不同的值,例如(例如,对于[1, 0, 0]类)1

我注意到我的一些权重高于[0.5, 0, 0],导致净值很大。

1

2 个答案:

答案 0 :(得分:2)

从我们在评论中建立的内容来看,我脑海中唯一的所有食谱都记录在这个伟大的NN档案中:

ftp://ftp.sas.com/pub/neural/FAQ2.html#questions

你可以尝试的第一件事是:

1)How to avoid overflow in the logistic function?可能这就是问题 - 很多时候我已经实现了NN,问题就是这样的溢出。

2)How should categories be encoded?

更一般:

3)How does ill-conditioning affect NN training?

4)Help! My NN won't learn! What should I do?

答案 1 :(得分:1)

讨论后发现问题出在sigmoid函数中:

function outs = sigmoid(nets)
%...
            outs(i) = 1/1+exp(-nets(i)); % parenthesis missing!!!!!!
%...
end

应该是:

function outs = sigmoid(nets)
%...
            outs(i) = 1/(1+exp(-nets(i)));
%...
end

缺少括号导致sigmoid输出有时大于1。这使得梯度计算不正确(因为它不是此函数的梯度)。这导致梯度为负。这导致输出层的增量大部分时间处于错误的方向。修复后(正确维护错误变量之后 - 代码中似乎缺少这一点)似乎一切正常。


除此之外,此代码还有另外两个主要问题:

1)没有偏见。没有偏差,每个神经元只能代表穿过原点的线。如果数据被标准化(即值在0和1之间),则一些配置是不可分离的。

2)缺乏对高梯度值的防范(我之前的答案中的第1点)。