【问题标题】:Multilayer Perceptron - Error plateau多层感知器 - 误差高原
【发布时间】:2017-11-03 07:27:27
【问题描述】:

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

我遇到的问题是,错误随着每个时期开始减少,但它只是达到了一个平台,并且似乎没有改善,如下所示:

这是单个 Epoch 期间所有错误的图像:

如您所见,有些极端情况没有得到正确处理

我正在使用:

  • 权重从 -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

fxy=@(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

fh=@(x) tanh(x); %hidden layer activation function
dfh= @(x) 1-tanh(x).^2; %derivative

fo=@(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.1 到 0.00001 的错误率,对我来说最好的错误率是 0.001,动量因子为 0.01,更高的错误率会在 MSE 上产生更多的振荡,实际上会使性能更差。
  • 当我尝试学习具有一个隐藏层的神经网络时,当我一开始只提供具有错误预期结果的数据时,它没有学习。当预期的结果是“混合的”(有些是假的,有些是真的,有些是假的,......)时,它解决了问题。
  • 我不明白你在说什么卢克

标签: machine-learning neural-network


【解决方案1】:

对于您要解决的特定问题,有许多因素可以发挥作用:

  • 问题的复杂性:神经网络是否容易解决问题(如果使用标准数据集,您是否将结果与其他研究进行了比较?)
  • 输入:输入是否与输出密切相关?是否有更多输入可以添加到 NN?它们的预处理是否正确?
  • 局部最小值 vs 全局最小值:您确定问题已经停止在局部最小值(神经网络陷入学习状态,从而阻止神经网络达到更优解的地方)?
  • 输出:输出样本是否存在某种偏差?这是二进制输出类型的问题吗,两边的样本是否足够?
  • 激活函数:是否有其他适合该问题的激活函数?

然后是您似乎已经尝试过的隐藏层、神经元、学习率、动量、时期等。

根据图表,这是 BPNN 大致预期的学习性能,但有时需要反复试验来优化结果。

我会尝试处理上述选项(尤其是数据预处理),看看这对您的情况是否有帮助。

【讨论】:

  • 1.我相信这个问题非常复杂,请看这个图:link 2. 它是我试图复制的一个函数,当然输入是相关的 3. 是的,当然 NN 陷入了一个非最优解 4.函数非常不稳定,我相信这会使系统变得嘈杂 5. 不知道是否有其他激活函数可以帮助使用最小最大标准化对数据进行预处理
  • 也许你可以从 NN 中画出估计的地图,看看它如何与样本对齐,看看哪些部分造成了最大的痛苦。这可能有助于确定哪些优化可以帮助您解决问题。
  • 这是一个时期的错误图片:link 如果您看到最后一条评论上的链接,您会看到在我试图预测函数振荡的范围内,这是导致网络中的高错误,当然也会使 MSE 飙升。我该如何处理?重点是能够处理这种极端情况
  • 这张图片不清楚,也没有告诉我任何信息。是否可以使用估计来构建等高线图?通过这种方式,您将能够比较两者并查看它正在挣扎的领域。
  • 这只是 2000 个 epoch 之后所有训练案例的所有错误的图像,我的意思是有一些“极端”案例没有被考虑在内。导致以下surface 这是real surface 的 2000 个 epoch 在计算表面的情况下考虑到一些插值能够计算它
猜你喜欢
  • 2015-08-14
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2021-06-28
  • 2013-12-17
  • 2011-07-01
  • 2011-11-15
相关资源
最近更新 更多