MLP 神经网络未正确训练,可能收敛到局部最小值

Posted

技术标签:

【中文标题】MLP 神经网络未正确训练,可能收敛到局部最小值【英文标题】:MLP Neural network not training correctly, probably converging to a local minimum 【发布时间】:2012-02-10 05:49:48 【问题描述】:

我正在 matlab 中制作一个带有反向传播的 MLP 神经网络。问题是,它似乎不能很好地处理函数中的曲线,也不能很好地与值缩放。例如,它可以达到 cos(x) 的 80%,但如果我输入 100*cos(x),它根本不会训练。

更奇怪的是,它可以很好地训练某些功能,而其他功能则根本不起作用。 例如: 训练有素:http://img515.imageshack.us/img515/2148/coscox3.jpg

不太好:http://img252.imageshack.us/img252/5370/cos2d.jpg(久违的流畅感)

错误的结果,像这样卡住:http://img717.imageshack.us/img717/2145/ex2ug.jpg

这是我正在尝试实现的算法:

http://img594.imageshack.us/img594/9590/13012012001.jpg

http://img27.imageshack.us/img27/954/13012012002.jpg

这是我的实现:

close all;clc;

j=[4,3,1]; %number neurons in hidden layers and output layer
i=[1,j(1),j(2)];

X=0:0.1:pi;
d=cos(X);

%-----------Weights------------%
%-----First layer weights------%
W1p=rand([i(1)+1,j(1)]);
W1p=W1p/sum(W1p(:));
W1=rand([i(1)+1,j(1)]);
W1=W1/sum(W1(:));

%-----Second layer weights------%
W2p=rand([i(2)+1,j(2)]);
W2p=W2p/sum(W2p(:));
W2=rand([i(2)+1,j(2)]);
W2=W2/sum(W2(:));

%-----Third layer weights------%
W3p=rand([i(3)+1,j(3)]);
W3p=W3p/sum(W3p(:));
W3=rand([i(3)+1,j(3)]);
W3=W3/sum(W3(:));
%-----------/Weights-----------%

V1=zeros(1,j(1));
V2=zeros(1,j(2));
V3=zeros(1,j(3));

Y1a=zeros(1,j(1));
Y1=[0 Y1a];
Y2a=zeros(1,j(2));
Y2=[0 Y2a];

O=zeros(1,j(3));
e=zeros(1,j(3));

%----Learning and forgetting factor-----%
alpha=0.1;
etha=0.1;
sortie=zeros(1,length(X));
while(1)

n=randi(length(X),1);
%---------------Feed forward---------------%

%-----First layer-----%
X0=[-1 X(:,n)];
V1=X0*W1;
Y1a=tanh(V1/2);

%----Second layer-----%
Y1=[-1 Y1a];
V2=Y1*W2;
Y2a=tanh(V2/2);

%----Output layer-----%
Y2=[-1 Y2a];
V3=Y2*W3;
O=tanh(V3/2);
e=d(n)-O;
sortie(n)=O;

%------------/Feed Forward-----------------%

%------------Backward propagation---------%

%----Output layer-----%
delta3=e*0.5*(1+O)*(1-O);
W3n=W3+ alpha*(W3-W3p) + etha * delta3 * W3;

%----Second Layer-----%
delta2=zeros(1,length(Y2a));
for b=1:length(Y2a)
delta2(b)=0.5*(1-Y2a(b))*(1+Y2a(b)) * sum(delta3*W3(b+1,1));
end

W2n=W2 + alpha*(W2-W2p)+ (etha * delta2'*Y1)';

%----First Layer-----%
delta1=zeros(1,length(Y1a));
for b=1:length(Y1a)
    for m=1:length(Y2a)
          delta1(b)=0.5*(1-Y1a(b))*(1+Y1a(b)) * sum(delta2(m)*W2(b+1,m));


    end
end


W1n=W1+ alpha*(W1-W1p)+ (etha * delta1'*X0)';                                    
W3p=W3;
W3=W3n;

W2p=W2;
W2=W2n;

W1p=W1;
W1=W1n;

figure(1);
plot(1:length(d),d,1:length(d),sortie);

drawnow;
end

我的问题是,我能做些什么来纠正它? 到目前为止,我的猜测是,我要么在反向传播中出现问题,特别是在计算 delta 和权重方面。或者我的权重初始化错误(太小,或者不依赖于初始输入)..

【问题讨论】:

当然,在 Matalb 中有一个神经网络工具箱和许多网络上的实现。为什么不将结果与已知有效的方法进行比较? 我似乎没有工具箱。 见homepages.cae.wisc.edu/~ece539/matlab 【参考方案1】:

我不是该领域的专家,但在使用基于 Matlab 和 Java 的神经网络系统方面有一些经验。

我可以建议使用工具箱可以帮助你,它帮助了我认识的其他人。

我可以提供几点信息:

不要指望神经网络对所有训练数据都有效,有时数据太复杂,无法以这种方式分类

NN 的格式将对收敛性能产生巨大影响

最后:

当各种参数被归一化为 +/- 1 时,这样的训练算法通常会训练得更好。cos(x) 是归一化的,100*cos*(x) 不是。这是因为所需的权重更新要大得多,而且训练系统可能会采取非常小的步骤。如果您是具有多个不同范围的数据,那么标准化至关重要。我是否建议您至少先调查一下

【讨论】:

以上是关于MLP 神经网络未正确训练,可能收敛到局部最小值的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow MLP 不训练 XOR

深度学习:带有 keras 的小型数据集:局部最小值

BP神经网络的参数改进参考?

模型不收敛的原因

学习毫末智行数据标注怎么分组

PyTorch 模型未收敛