训练神经网络的常用方法之梯度下降法

训练神经网络的方法如下所示:

(1) traingd:基本梯度下降法,收敛速度比较慢。
(2) traingda:自适应学习率的梯度下降法
(3) traingdm:带有动量项的梯度下降法, 通常要比traingd 速度快。
(4) traingdx: 带有动量项的自适应学习算法, 速度要比traingdm 快。
(5) trainrp: 弹性BP 算法, 具有收敛速度快和占用内存小的优点。
(6) trainscg: 归一化共轭梯度法
(7) trainbfg: BFGS- 拟牛顿法
(8) traino ss: 一步分割法,为共轭梯度法和拟牛顿法的一种折衷方法。
(9) trainlm: Levenberg-Marquardt算法,对中等规模的网络来说, 是速度最快的一种训练算法, 其缺点是占用内存较大。 (10) trainbr: 贝叶斯规则法,对Levenberg-Marquardt算法进行修改, 以使网络的泛化能力更好,同时降低了确定最优网络结构的难度。

其中常用的包括梯度下降法、牛顿法、拟牛顿法以及共轭梯度法
一、 梯度下降法(Gradient descent)
1、梯度下降方法简介:它是最简单的训练算法。它仅需要用到梯度向量的信息,因此属于一阶算法。 梯度下降方法有一个严重的弊端,该方法需要进行很多次迭代运算。当神经网络模型非常庞大、包含上千个参数时,梯度下降方法是我们推荐的算法。
训练神经网络的常用方法之梯度下降法_第1张图片
2、梯度下降的算法推导:
训练神经网络的常用方法之梯度下降法_第2张图片
3、梯度下降的算法调优
(1)算法的步长选择。
实际取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。
(2)算法参数的初始值选择。
初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。
(3)归一化。
由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的期望。

训练神经网络的常用方法之梯度下降法_第3张图片
下面给出梯度下降法matlab代码的思路

clc                   % 清屏
clear                     % 清除内存以便加快运算速度
close all                % 关闭当前所有figure图像
%% 初始化神经网络

%设置训练与测试样本数


%% 设置神经网络输入数据
%给输入变量进行赋值

%归一化
%使用mapminmax该函数
%% 设置神经网络训练集和测试集
%设置训练集数据输入输出矩阵,p代表输入,T代表输出,将给出的数据前90个作为训练集
 P_train =;  
 T_train =;
 % 设置测试集数据输入输出矩阵,将给出数据的后10个作为测试集
 P_test =     %%测试集输出矩阵  
%% 设置训练参数
MaxEpochs=5000;                % 最多训练次数为50000
lr=0.01;                       % 学习速率为0.01
E0=0.001;                      % 目标误差为0.001
% e1=0.01;                     %梯度法最优值收敛精度
                     
%% 给定初始权值及偏置
W1=rand(HiddenUnitNum,Network_InNum);   % 初始化输入层与隐含层之间的权值
B1=rand(HiddenUnitNum,1);               % 初始化输入层与隐含层之间的偏置
W2=rand(Network_outNum,HiddenUnitNum);  % 初始化输出层与隐含层之间的权值
B2=rand(Network_outNum,1);              % 初始化输出层与隐含层之间的偏置
%% 训练神经网络
 %这里i是当训练的模型最终不满足精度时,训练到最大训练次数就截止
for i=1:MaxEpochs          
HiddenOut=tansig(W1*P_train+repmat(B1,1,TrainSamNum));              % 隐含层网络输出 ,双曲正切S型传输函数;另外一种是对数s型logsig=1/1+e^(-x)
NetworkOut=W2*HiddenOut+repmat(B2,1,TrainSamNum);           %输出层网络输出  tansig=1/arctan(x)+1
Error=T_train-NetworkOut;    % 实际输出与网络输出之差
f=sumsqr(Error);             % 能量函数(误差平方和)   1/2*sum(Error)^2

%% 用测试集测试已经训练好的神经网络
%% 求解网络输出的均方误差以及平均误差
%%绘图

你可能感兴趣的:(算法,网络,神经网络,深度学习,机器学习)