Machine learning 多层感知器误差平台

Machine learning 多层感知器误差平台,machine-learning,neural-network,Machine Learning,Neural Network,我试图在Matlab上实现一个只有一个隐藏层的反向传播多层感知器。我们的目标是复制一个具有两层的函数,我正在尝试在Matlab上实现一个具有反向传播的多层感知器,其中只有一个隐藏层。目标是复制具有两个输入和一个输出的函数 我遇到的问题是,误差开始随着每个历元而减小,但它只是达到一个平台,似乎没有改善,如图所示: 这是单个历元中所有错误的图像: 正如您所看到的,有些极端情况没有得到正确处理 即时通讯使用: 权重从-1初始化为1 均方误差 隐藏神经元数量可变 动力 随机输入顺序 没有偏见 隐层

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

我遇到的问题是,误差开始随着每个历元而减小,但它只是达到一个平台,似乎没有改善,如图所示:

这是单个历元中所有错误的图像:

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

即时通讯使用:

  • 权重从-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
clc
清楚的
%%%%%%%定义%%%
i=0;
S=0;
X=兰特(1000,2)*6-3;%在-3和+3之间生成输入
Xval=兰特(200,2)*6-3;%验证输入
神经元数量=360;
Wh=rand(神经元数量,2)*2-1;%隐藏权重
Wo=兰德(神经元数量,1)*2-1;%输出权重
学习=.001;%学习因素
动量mWh=0;%动量
动量wo=0;
a=.01;%动量因子
韩元=Wo;%新重量
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;%要复制的功能
fh=@(x)tanh(x);%隐层激活函数
dfh=@(x)1-tanh(x)。^2;%派生词
fo=@(x)x;%输出层激活函数
dfo=@(x)1;%派生词
%%图函数
%[Xg,Yg]=meshgrid(X(:,1),X(:,2));
%Y=fxy(Xg,Yg);
%冲浪(Xg,Yg,Y)
%%%%%%%%%
Yr=fxy(X(:,1),X(:,2));%真实的
Yval=fxy(Xval(:,1),Xval(:,2));%验证Y
历元=1;
Xn=(X+3)/6;%%最小最大归一化
Xnval=(Xval+3)/6;
E=一(1,长度(年));%错误
Eval=一(1,长度(Yval));%验证错误
MSE=1;
%%%%%迭代%
而1
N=1;
perm=randperm(长度X(:,:);%%置换输入
年和=年(永久);%置换输出
Xrand=Xn(perm,:);

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

  • 问题的复杂性:神经网络是否认为该问题容易解决(如果使用标准数据集,您是否将结果与其他研究进行了比较?)
  • 输入:输入是否与输出密切相关?是否有更多的输入可以添加到NN?它们的预处理是否正确
  • 局部极小值与全局极小值:您确定问题已停止在局部极小值(神经网络陷入学习的地方,从而阻止神经网络达到更优的解决方案)中吗
  • 输出:输出样本是否以某种方式倾斜?这是一个二进制输出类型的问题,两边都有足够的样本吗
  • 激活功能:是否有其他适用于该问题的激活功能
然后是隐藏层,神经元,学习速度,动量,时代等等,你似乎已经试过了

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


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

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

  • 问题的复杂性:神经网络是否认为该问题容易解决(如果使用标准数据集,您是否将结果与其他研究进行了比较?)
  • 输入:输入是否与输出密切相关?是否有更多的输入可以添加到NN?它们的预处理是否正确
  • 局部极小值与全局极小值:您确定问题已停止在局部极小值(神经网络陷入学习的地方,从而阻止神经网络达到更优的解决方案)中吗
  • 输出:输出样本是否以某种方式倾斜?这是一个二进制输出类型的问题,两边都有足够的样本吗
  • 激活功能:是否有其他适用于该问题的激活功能
然后是隐藏层,神经元,学习速度,动量,时代等等,你似乎已经试过了

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


我将尝试以上选项(特别是数据预处理)看看这对你的情况是否有帮助。

你是否尝试过提高学习速度,看看错误是否会下降?我尝试过错误率从.1到.00001。对我来说,最好的错误率是.001,动量系数为.01。更高的错误率会在MSE上产生更多振荡,实际上会使性能更差。当我尝试用一个隐藏层,当我一开始只提供了错误预期结果的数据时,它没有学习。当预期的结果是“混合的”(一些错误,一些正确,一些错误,…)它解决了问题。我不明白你想说什么,卢克你有没有试过提高学习速度,看看错误是否下降?我试过从。