2017-06-02 96 views
1

我正试图用matlab上的一个隐藏层实现带有反向传播的多层感知器。目标是复制一个函数与两个我试图实现一个多层感知器反向传播与Matlab上只有一个隐藏层。目标是复制一个具有两个输入和一个输出的函数。多层感知器 - 错误平台

我遇到的问题是错误开始与每个时间段减少,但它只是达到一个平台和似乎并不完善,如看到:

enter image description here

这是一个图像一个时代中所有的错误:

enter image description here

,你可以看到有一些不被正确

处理一些极端的情况下,

im使用:

  • 重量初始化从-1到1
  • 均方误差
  • 可变数目隐含神经元的
  • 动量
  • 随机
  • 输入顺序
  • 没有偏压
  • 隐藏层的tanh激活函数
  • 身份作为输出层
  • 的输入在输入

-3至3

  • 最小 - 最大归一化的范围我试图改变上隐藏层神经元的数目的激活功能,试图将学习率降低到非常小的数量,似乎没有任何帮助。

    这里是Matlab代码:

    clc 
    clear 
    %%%%%%%  DEFINITIONS %%%%%%%% 
    i=0; 
    S=0; 
    X=rand(1000,2)*6-3; %generate inputs between -3,+3 
    Xval=rand(200,2)*6-3; %validation inputs 
    Number_Neurons=360; 
    Wh=rand(Number_Neurons,2)*2-1; %hidden weights 
    Wo=rand(Number_Neurons,1)*2-1; %output weights 
    Learn=.001;% learning factor 
    momentumWh=0; %momentums 
    momentumWo=0; 
    a=.01;%momentum factor 
    WoN=Wo; %new weight 
    
    [email protected](x,y) (3.*(1-x).^2).*(exp(-x.^2-(y+1).^2))-10.*(x./5-x.^3-y.^5).*(exp(-x.^2-y.^2))-(exp(-(x+1).^2-y.^2))./3; %function to be replicated 
    
    [email protected](x) tanh(x); %hidden layer activation function 
    dfh= @(x) 1-tanh(x).^2; %derivative 
    
    [email protected](x) x; %output layer activation function 
    dfo= @(x) 1; %derivative 
    
    %%GRAPH FUNCTION 
    %[Xg,Yg]=meshgrid(X(:,1),X(:,2)); 
    % Y=fxy(Xg,Yg); 
    % surf(Xg,Yg,Y) 
    %%%%%%%%% 
    Yr=fxy(X(:,1),X(:,2)); %Y real 
    Yval=fxy(Xval(:,1),Xval(:,2)); %validation Y 
    Epoch=1; 
    Xn=(X+3)/6;%%%min max normalization 
    Xnval=(Xval+3)/6; 
    E=ones(1,length(Yr));% error 
    Eval=ones(1,length(Yval));%validation error 
    MSE=1; 
    
    %%%%%  ITERATION %%%%% 
    while 1 
        N=1; 
        perm=randperm(length(X(:,:))); %%%permutate inputs 
        Yrand=Yr(perm); %permutate outputs 
        Xrand=Xn(perm,:); 
        while N<=length(Yr) %epoch  
    
         %%%%%%foward pass %%%%% 
         S=Wh*Xrand(N,:)'; %input multiplied by hidden weights 
         Z=fh(S); %activation function of hidden layer 
         Yin=Z.*Wo; %output of hidden layer multiplied by output weights 
         Yins=sum(Yin); %sum all the inputs 
         Yc=fo(Yins);% activation function of output layer, Predicted Y 
         E(N)=Yrand(N)-Yc; %error 
    
         %%%%%%%% back propagation %%%%%%%%%%%%% 
         do=E(N).*dfo(Yins); %delta of output layer 
         DWo=Learn*(do.*Z)+a*momentumWo; %Gradient of output layer 
         WoN=Wo+DWo;%New output weight 
         momentumWo=DWo; %store momentum 
         dh=do.*Wo.*dfh(S); %delta of hidden layer 
         DWh1=Learn.*dh.*Xrand(N,1); %Gradient of hidden layer 
         DWh2=Learn.*dh.*Xrand(N,2); 
         DWh=[DWh1 DWh2]+a*momentumWh;%Gradient of hidden layer   
         Wh=Wh+DWh; %new hidden layer weights 
         momentumWh=DWh; %store momentum 
         Wo=WoN; %update output weight 
         N=N+1; %next value 
        end 
    
        MSET(Epoch)=(sum(E.^2))/length(E); %Mean Square Error Training 
        N=1;  
        %%%%%% validation %%%%%%% 
        while N<=length(Yval) 
         S=Wh*Xnval(N,:)';  
         Z=fh(S); 
         Yin=Z.*Wo; 
         Yins=sum(Yin); 
         Yc=fo(Yins); 
         Eval(N)=Yc-Yval(N); 
         N=N+1;  
        end 
    
        MSE(Epoch)=(sum(Eval.^2))/length(Eval); %Mean Square Error de validacion 
        if MSE(Epoch)<=1 %stop condition 
         break 
        end 
        disp(MSET(Epoch)) 
        disp(MSE(Epoch)) 
        Epoch=Epoch+1; %next epoch 
    end 
    
  • +0

    您是否尝试过提高学习速度并查看错误是否下降? – Simon

    +0

    我试过错误率从.1到.00001 我的最佳速率是.001,动量因子为.01 更高的速率会在MSE上产生更多的振荡,并且实际上会使性能变差。 –

    +0

    当我试图学习带有一个隐藏层的神经网络时,它并没有学到什么时候我只提供了带有错误预期结果的数据。如果预期的结果是“混合”(有些是假的,有些是真的,有些是假的,...),它解决了这个问题。 – Luke

    回答

    0

    有许多可以发挥作用的特定问题的因素,你试图解决:

    • 的复杂性问题:神经网络解决问题容易吗(如果使用标准数据集,是否将结果与其他研究进行比较?)
    • T他输入:输入与输出强相关吗?是否有更多的输入可以添加到NN?他们是否正确预处理?
    • 本地最小值vs全局最小值:你确定问题已经停止在局部极小值(一个地方,神经网络停滞在学习中,阻止神经网络达到更优化的解决方案)?
    • 输出:输出样本是否以某种方式偏斜?这是一个二进制输出类型的问题,并且双方有足够的样本吗?
    • 激活功能:是否有另一个适当的激活功能的问题?

    然后你会看到已经试过的隐藏图层,神经元,学习率,动量,时代等等。

    基于图表,这是BPNN粗略预期的那种学习表现,但有时需要反复试验来优化结果。

    我会尝试在上述选项(特别是数据的预处理)上工作,看看这是否有助于你的情况。

    +0

    1.我相信问题是非常复杂的,看到这个情节:[链接](https://www.wolframalpha.com/input/?i=plot+(3 *( 1-X)%5E2)*(E%5E(-X%5E2-(Y%2B1)%5E2)) - 10 *(X%2F5-X%5E3-Y%5E5)*(E%5E( - (%)5E2( - (X%2B1)%5E2-Y%5E2))%2F3 + from + -3 + to + 3 2.它的函数im试图复制,当然输入是相关的 3.是的,当然神经网络陷入了一个不太理想的解决方案 4.功能是高度不稳定的,我认为是使系统嘈杂 5.不知道是否有其他激活函数,这将有助于 数据正在使用最小最大值归一化进行预处理 –

    +0

    也许您可以从NN中绘制估计值的映射图,以了解它如何与抽样并查看哪些部分造成最大的悲伤。这可能有助于确定哪些优化可以帮助您解决问题。 –

    +0

    这里是一个时代的错误图片:[链接](http://i.imgur.com/LN2o1MF.jpg) 如果你看到最后一条评论的链接,你会看到在范围内我试图预测功能振荡,这是在网络中高误差,它当然也会刺激MSE。 我该如何处理? 重点是能够处理这种极端情况 –