关于BP神经网络正则化(人工控制参数干扰训练)
根据长时间的学习
定期总结下心得
分享给大家
之前,发布过遗传算法优化BP神经网络
后面还学习了模拟退火算法优化BP神经网络
准备分享的,但感觉没啥新颖就没有写
后来还和小伙伴讨论过智能优化算法优化BP神经网络
我的感想是
只要各种智能优化算法都能够优化BP神经网络
即优化神经网络结构初始权值和偏重
那么,改进该智能优化算法真的是徒劳的
智能优化算法都有各自的优势和缺点
只要能够达到优化BP神经网络的效果
那么用哪一种智能算法都是可以的
为什么呢???
↓↓↓
那就讨论下BP神经网络吧
巴科斯-普拉特(BP)神经网络的技术
它基于深度学习
并且具有很强的随机性
意思就是,虽然通过智能算法优化过
但是主导权还在于ta神经网络本身
ta仍然会根据数据特征不断学习
随机更新网络结构中的参数
然后BP神经网络也是一种算法
简单点的拟合数据
复杂点的就是预测能力、自然语言处理、图像处理、信号处理等
神经网络具有学习的能力
ta对数据非常敏感
(可以说成对数学问题非常敏感,而生活中的大多问题都可以转化成数学问题)
能够从数据中找出前因后果
所以智能算法优化BP神经网络
侧重点还是在于BP神经网络
智能算法的优化只是帮网络缩小了一定的范围
让BP神经网络学习和训练的效率得以提高
而BP神经网络还得靠改进自身能力——“正则化”网络
作用是降低网络复杂度、防止网络过拟合
才能达到更好的效果
↓↓↓↓
修改BP神经网络训练参数
最直接简单的操作就是修改BP神经网络的训练参数:
net.trainParam.lr=0.006; %学习率
net.trainParam.goal=0.000001; %目标误差
net.trainParam.epochs=1000; %最大训练次数
net.divideParam.trainRatio=0.7; %用于训练的数据比例
net.divideParam.valRatio=0.3; %用于验证过拟合的数据比例
net.divideParam.testRatio=0; %注意要关掉测试数据占比
net.performParam.regularization=0.01; %L2正则化
通过设置这些参数指导网络进行训练,当然这种方法很呆板,只能靠个人能力经验去不断修改参数数值调试网络,直到神经网络模型达到尽可能好为止。
学习率:一般设置在0.005~1之间的一个数值,设置太大会导致模型过拟合,而设置太小则会导致模型收敛速度减慢。因此,需要确定一个合适的学习率来确保模型能够正确地拟合数据。
目标误差:该误差是均方误差mse的设置,建议设置的尽可能的小,设置的不够小的话一旦达到目标误差便会终止训练,设置足够的小的话即使达不到设置的值,网络还会参考其他参数进行训练。
最大训练次数:很多人以为该值的设置是让ta训练设置的那个值,其实不是的。该值只是神经网络在还有发挥空间的前提下到此为止,若没有发挥空间,神经网络训练几次就会停止的。
数据划分比例:在数据不足够多的情况(几千个样本)下,建议将测试集比例关掉设置为0。其次,在数据缺失严重的情况下(即还有很多明显的能够作为输入特征的数据,但是没有考虑),建议将训练集占比设置的更大、测试集占比设置的更小。
L2正则化:神经网络的正则化参数,它可以防止模型过拟合,从而提高模型的泛化能力。
人工干扰训练
不管怎么看、怎么设置
都感觉上面的操作非常呆
效率低,而且不一定有用
所以还是在网络训练过程中进行干扰来达到正则化
因此要将最大训练次数设置为1
net.trainParam.epochs=1; %最大训练次数
即每训练一次干扰(指导)一次
①
每训练完一次,网络结构的初始权值和偏重会跟新
于是,可以调取权值W和偏重B
用让其衰减的方法指导网络训练
即若权重没有减小,则网络继上一次重新开始训练
% 输入
a=[]
% 输出
b=[]
% 初始化权重下降值和正则化系数
weight=inf;
λ=0.01;
% 最大训练次数
num=50;
for i=1:num
% 训练神经网络
net=train(net,a,b);
% 调取BP神经网络权重
w1=net.iw{1,1};
w2=net.lw{2,1};
% 添加惩罚
weights=λ*(sum(sum(abs(w1))+sum(abs(w2))));
% 判断权重是否下降
if weights<weight
% 更新网络
best_net=net;
else
% 用权重最小的网络模型继续循环
net=best_net;
continue;
end
end
②
每训练完一次,用一开始划分的测试样本预测一次
用均方误差(性能)指导训练
这里测试样本循环训练一次测试一侧
训练的时候网络还会将划分的训练样本进行数据集划分
训练集、验证集和测试集
因此,该干扰操作对训练样本训练进行了误差计算
也直接利用了每一次训练的模型进行测试样本的预测
并计算了误差
而非在实验完选择误差最小的模型
再代入测试样本的输入进行仿真预测并计算误差
整个干扰操作会持续代入测试样本的输入进行仿真预测
%% 初始化人为操作参数
num_iterations=50; %设置最大循环次数
best_error=Inf; %初始化最小均方误差
max_count=6; %最大均方误差增大次数
count=0; %初始化均方误差增大次数
best_net=[]; %初始化最优网络模型
mse_list_train=[]; %初始化训练集均方误差数组
mse_list_test=[]; %初始化验证集均方误差数组
%% 调用神经网络工具箱辅助训练
for ii=1:num_iterations
%调用trainlm算法训练网络
[net,tr]=train(net,inputdata_train_regular,outputdata_train_regular);
%预测并计算均方误差
GA_BP_train_regular=sim(net,inputdata_train_regular); %训练样本的预测
GA_BP_test_regular=sim(net,inputdata_test_regular); %测试样本的预测
mse_error_train=mse(GA_BP_train_regular,outputdata_train_regular);
mse_error_test=mse(GA_BP_test_regular,outputdata_test_regular);
% 判断均方误差是否增大
if mse_error_test>best_error
count=count+1;
else
count=1;
end
% 更新最优网络模型
if mse_error_test<best_error
best_error=mse_error_test;
best_net=net;
end
% 将均方误差加入数组
mse_list_train=[mse_list_train mse_error_train];
mse_list_test=[mse_list_test best_error];
% 判断是否终止循环
if count>=max_count
break;
end
end
%% 观察训练样本和测试样本的输出均方误差曲线(性能)
for ss=1
o=figure(2);
set(o,'Position',[1180 510 560 420])
plot(mse_list_train,'r',linewidth=1.5);
hold on
plot(mse_list_test,'b',linewidth=1.5);
hold off
xlabel('训练次数')
ylabel('均方误差')
legend('训练样本','测试样本')
titlestr=['BP神经网络训练性能图 终止次数:',num2str(ii),'次'];
title(titlestr);
drawnow update;
end

还有很多方法
总之,就是设置神经网络本身的训练次数为1
然后人为控制循环训练
循环中训练的要求自行设置
或者设计一些函数模型限制模型的更新
让神经网络训练更“听话”
找出最优模型
从而达到更好的仿真预测效果
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)