反向传播算法仍然是当前深度神经网络最受欢迎的模型最优化方法。
反向传播
反向传播有前向和后向两个操作构成,前向操作利用当前的权重参数和输入数据,从下往上(即从输入层到输出层),求取预测结果,并利用预测结果与真实值求解出损失函数的值。反向操作则利用前向操作求解得到的损失函数,从上往下(从输出层到输入层),反向求取每一层对应的参数梯度,利用梯度下降法更新参数,求解网络的参数梯度。经过前向和反向两个操作后。完成了一次迭代过程。
损失函数
损失函数是机器学习中用于衡量模型一次预测结果好坏的函数,它是一个非负实数值函数,用L(Y,f(x))来表示,常用的损失函数包括4种。
(1)0-1损失函数。0-1损失函数比较的事预测值与真实值是否相同,0-1损失函数是一个非凸函数,在求解的过程中,存在很多的不足,而且它只关心预测值和真实值是否相同,没有考虑到预测值和真实值之间的距离,因此在实际应用中,它通常是作为一个衡量指标,而不是最优化的目标函数。
(2)平方损失函数。平方损失函数是线性回归模型最常用的最优化目标函数。
(3)对数损失函数。常用于分类模型的最优化目标函数。
(4)Hinge损失函数:有时也称为最大间隔目标函数。
深度学习训练的难点主要为欠拟合和过拟合:
欠拟合-梯度消失
梯度消失也称为梯度弥撒,仍然是深度神经网络训练过程中所面临的最大挑战之一。梯度消失产生的源头就在于激活函数。对预激活输出求导都牵扯到激活函数的导数,传统的激活函数及其导数,rusigmoid和tanh函数,它们的导数取值范围都小于1。以sigmoid函数为例,它的取值范围为[0,1/4],,也就是当激活函数求导后,它的取值都要比上一层减少1/4,梯度的计算是随着层数的增加而呈现出指数级的递减趋势,离输出层越远,梯度减少越明显。
目前几种常用防止深度神经网络梯度消失的技巧:
(1) 采用更合理的激活函数。
(2)Batch Normalization:有ZCA标准化层和重参数化层构成。ZCA标准化层是标准化预激活输出,是的输出的每一个维度都服从标准正态分布的形式,即均值为0,方差为1。重参数化层主要是对标准化后的预激活输出结果执行scale和shift操作,使得新的输出值有任意的均值和方差,这样梯度消失和非线性激活不再是一组矛盾关系,模型能够实时根据训练数据来动态决定激活层的非线性表达能力。
(3)深度残差网络。将深度残差网络与卷积神经网络相结合的网络模型也简称为ResNet。
过拟合
过拟合一般是指在模型选择中,选择的模型参数过多,导致对训练数据的预测很好,但对位置数据的预测很差的现象。神经网络,尤其是在深度神经网络领域,网络的层数更深,结构也更复杂,一般能达到数十层甚至上百层,而训练样本往往相对较少,过拟合问题会更加严重。
正则化是目前机器学习中常用来解决过拟合的技巧,较为常见的正则化方法包括:对单模型,比如当验证集的效果变化不明显的时候可以提前终止迭代,或者采用L1正则化和L2正则化等。对多模型,可以利用boosting来集成提升,但在深度学习中,这种方法是不现实的,因为单个模型的训练已经非常复杂耗时,并且即使训练处多个网络模型,也难以在实际环境中做到快速集成。
Dropout结合了单模型和多模型的有点,它是当前深度学习领域解决过拟合的强有力的武器。如果不考虑时间复杂度,可以通过训练多个不同的网络模型来集成提升效果,网络结构之间差别越大,提升效果也会越明显。Dropout的思想是每一迭代的过程中,会随机让网络某些节点(神经元)不参与训练,同时把与这些暂时丢弃的神经元相关的所有边全部去掉,相应的权重不会在这一次迭代中更新,每一次迭代训练都重复这个操作,这些丢弃的神经元只是暂时不做更新,下一次还是会重新参与随机化的Dropout。