3.6 优化算法

当损失函数衡量出预测值与真实值之间的误差大小后,需要对神经网络进行参数优化,进而得到最小损失函数输出,这一过程将由梯度下降算法作为优化算法实现。梯度下降算法可以这样理解:一个人从山上某一点出发,需要找到山上的最低点。他先找到最陡的坡,往前走一步,接着再寻找下一个最陡的坡,再走一步,重复这两个步骤,直到走到最低点。这个最陡的坡就对应着优化算法中的梯度方向。

本节将介绍3种梯度下降算法:批量梯度下降法(Batch Gradient Descent,BGD)、小批量梯度下降法(Mini-Batch Gradient Descent,MBGD)、随机梯度下降法(Stochastic Gradient Descent,SGD)。

在介绍这3种算法之前,需要先介绍几个常见名词:批(batch),批尺寸(batchsize),迭代(iteration),时期(epoch)。

·批:将训练集的全体样本分为若干批次,样本数目过大时,可考虑每次选取一批数据进行训练。

·批尺寸:每批样本的数量。

·迭代:对一批数据完成一次前向传播和一次反向传播。

·时期:对训练集的全体样本完成一次前向传播和一次反向传播。

1.批量梯度下降法

批量梯度下降法是梯度下降最原始的方法,针对整个数据集,其思路是在优化某个参数时使用所有的样本来更新,进而得到一个全局最优解。也正是因为每次都调用全体样本,使得该梯度下降法的迭代速度比较慢,尤其是当样本数目过大时。BGD的损失函数公式如下:

由该损失函数可进一步得到BGD算法的迭代式,公式如下:

2.随机梯度下降法

由于批量梯度下降法每次运算数据量过大,迭代速度较慢,所以针对这一弊端,提出了随机梯度下降法。SGD的思路是通过单个样本对神经网络参数进行优化更新,当样本数目过大时,可能只通过其中一部分的样本进行迭代就可达到最优值输出。也就是说,SGD运算速度快,但其所能达到的最优值是局部最优值。

3.小批量梯度下降法

BGD运算较慢,SGD容易陷入局部最优解,针对这两者的弊端,小批量梯度下降法采取了一种折中的思路:首先将样本随机打乱,分成若干批次,每个批次有若干样本,其样本数量一般为2的幂;每次训练时,选取一个批次进行迭代,进而加快了迭代的速度。

基于Keras搭建神经网络后,需要对该神经网络进行编译,即确定训练方式,包括损失函数的选择、优化算法的选择、评估标准的选择。损失函数有多种选择,如均方差(mse)、二分类交叉熵(binary_crossentropy)、多分类交叉熵(categorical_crossentropy)等;优化算法可选择随机梯度下降法(sgd)、小批量梯度下降法(mbgd),以及adam、rmsprop等;评估标准一般选取准确率。主要语句如下:


model.compile(
     #损失函数选择多分类交叉熵函数
     loss='categorical_crossentropy',
     #优化算法选择随机梯度下降法
     optimizer='sgd',
     #评估标准选择准确率
     metrics=['accuracy'],
)

编译完成之后,可以通过model.fit开始进行网络的训练。主要语句如下:


Training=model.fit(
#输入训练数据及训练标签
     X_train,Y_train,
    #设定批尺寸batch_size
     batch_size=BATCH_SIZE,
    #设定迭代次数
     epochs=N_EPOCHS,
    #设定验证集比例,评估模型训练准确度,只能反映训练集在模型上的准确度,不能反映算法对新数据的预测结果
     validation_split=VALIDATION_SPLIT, 
     verbose=2  #1为不显示训练过程,2为显示训练过程
)