《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 1357|回复: 6
收起左侧

[提问] 迭代之后,误差反而越来越大的问题

[复制链接]
发表于 2017-8-15 13:08:39 | 显示全部楼层 |阅读模式
题主目前正在做神经网络训练方面的学习,拿一份数据进行了练习,但是对数据进行处理之后,发现在训练过程中,误差随着迭代次数的增加也在增加,之后维持不变,请教各位大神,这可能是出于什么缘故?
具体代码如下:
    err = expectedOut'-out_out;
    sse = sumsqr(err);
    errRec(i) = sse;                    %记录每次的错误
    fprintf('第%d次迭代  误差: %f\n',i,sse);


其中,expectedOut是实际值,out_out是经过训练之后得到的结果
然后,结果是这样:
第1次迭代  误差: 2.124233
第2次迭代  误差: 8.216954
第3次迭代  误差: 6.639643
第4次迭代  误差: 27.220103
第5次迭代  误差: 27.222127
第6次迭代  误差: 27.222127
第7次迭代  误差: 27.222127
第8次迭代  误差: 27.222127

之后误差一直维持不变,想了解一下这是出于什么缘故?是正常情况吗?
发表于 2017-8-15 13:50:29 | 显示全部楼层
(1)判断条件是否有问题,不该迭代却迭代了;(2)迭代方向是否搞反了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-15 14:37:34 | 显示全部楼层
stream2011 发表于 2017-8-15 13:50
(1)判断条件是否有问题,不该迭代却迭代了;(2)迭代方向是否搞反了

题主刚开始学习神经网络,不太明白您说的迭代方向反了是什么意思?
回复 支持 反对

使用道具 举报

发表于 2017-8-15 15:23:51 | 显示全部楼层
如果方便给更多一点代码会更容易理解
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-15 15:31:36 | 显示全部楼层
安东尼先生 发表于 2017-8-15 15:23
如果方便给更多一点代码会更容易理解

%开始迭代
for i=1:maxiter
    hid_input = net.w1 * SampInEx;                %3X100
    hid_out = logsig(hid_input);                  %3X100  
    ou_input1 = [hid_out;ones(1,nTrainNum)];      %4X100
    ou_input2 = net.w2 * ou_input1;               %1X100
    out_out =logsig(ou_input2);                   %1X100
    out_Rec(:,i) = out_out;                       %记录每次的输出
    err = expectedOut'-out_out;
    sse = sumsqr(err);
    errRec(i) = sse;                    %记录每次的错误
    fprintf('第%d次迭代  误差: %f\n',i,sse);
    iteration = iteration+1;
   
    %判断是否收敛
    if sse<=eb
        break;
    end
   
    %误差反向传播
    %隐含层与输出层之间的局部梯度度
    DELTA = err.*dlogsig(ou_input2,out_out);
    %输入层与隐含层之间的局部梯度
    delta = net.w2(:,1:end-1)'*DELTA.*dlogsig(hid_input,hid_out);
    %权值修改量
    dWEX=DELTA*ou_input1';
    dwex=delta*SampInEx';
    %修改权值,如果不是第一次修改,则使用动量因子
    if i==1
        net.w2 = net.w2+eta*dWEX;
        net.w1 = net.w1+eta*dwex;
    else
        net.w2 = net.w2+(1-mc)*eta*dWEX+mc*dWEXOld;
        net.w1 = net.w1+(1-mc)*eta*dwex+mc*dwexOld;
    end
   
    %记录上一次的权值修改量
    dWEXOld = dWEX;
    dwexOld = dwex;
end
回复 支持 反对

使用道具 举报

发表于 2017-8-15 17:02:36 | 显示全部楼层
cdvftb 发表于 2017-8-15 14:37
题主刚开始学习神经网络,不太明白您说的迭代方向反了是什么意思?

你的每一次迭代是为了修正每个神经元的权重系数吗? 权重系数的变大减小是否设定正确
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-15 18:08:52 | 显示全部楼层
stream2011 发表于 2017-8-15 17:02
你的每一次迭代是为了修正每个神经元的权重系数吗? 权重系数的变大减小是否设定正确

我也是刚开始学习,对里边的权值调整过程并没有太了解,因为涉及的数学推导过程太多了,没想细看,现在计划好好看书了,好好学习数学原理
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-4-8 14:20 , Processed in 0.051412 second(s), 9 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表