优化神经网络的方法
在许多情况下,利用深度学习算法搭建的神经网络模型都需要进行某种形式的优化。优化的最直接的目的就是使参数更加准确地更新。
一般神经网络的训练过程大致分为两个阶段:第一个阶段先通过前向传播算法计算得到预测值,并将预测值和真实值做对比,得出两者之间的差距;在第二个阶段,通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习率使用梯度下降算法更新每一个参数。
梯度下降随机梯度下降
使用梯度下降算法优化网络的大概思路就是寻找一个参数w,是的损失函数J(w)的值最小。换句话说,梯度下降算法会迭代式更新参数w,不断沿着梯度的反方向让参数朝着损失更小的方向更新。但是实际应用中,由于损失函数比较复杂,并不都是凸函数,所以会有局部极小点、局部极大点、鞍点的存在,使用梯度下降算法达到全局最优解被限制为只有当损失函数为凸函数时才可以;其次,梯度下降算法的计算时间太长,在实际训练时数据往往很多,并且损失函数J(w)是在所有训练数据上的损失和,这样计算出的所有训练数据的损失函数是非常耗时间的。
随机梯度下降算法可以加快每一轮参数更新的速度。相比于梯度下架算法,它的进步在于,这个算法并不会对全部训练数据上的损失函数进行优化,而是在每一轮迭代中随机选择某一个或多个训练数据上的损失函数进行梯度下降优化。这个算法是在大规模数据上训练大型线性模型必须要用到的方法,但是它也存在一些问题,即在某些训练数据上损失函数更小并不代表在全部训练数据上损失函数更小。
为了平衡上述两种算法的性能,在实际应用中一般会每次计算一小部分训练数据的总损失函数,这一小部分数据就是一个batch。
反向传播算法
反向传播算法在网络中的作用可以这样概括:如果说梯度下降算法优化了单个参数的取值,那么反向传播算法则给出了一种高效地在所有参数上使用梯度下降算法的方式。换个说法就是:反向传播算法通过一种简单而廉价的计算在所有参数上使用梯度下降算法,这样就能使神经网络模型能够得到在训练数据上尽可能小的损失函数。
自适应学习率算法
神经网络的学习率是难以设置的参数之一。如果学习率太小,则梯度很大的参数会有一个很慢的收敛速度;如果学习率太大,则已经优化得差不多的参数可能会出现不稳定的情况。为了更有效的训练模型,比较合理的一种做法是,对每个参与训练的参数设置不同的学习率,在整个学习的过程中通过一些算法自动适应这些参数的学习率。
TensorFlow提供的优化器
封装了很多自适应学习率的算法。
解决过拟合的方法——正则化
正则化是我们为了避免过拟合问题而常常采用的方法,其思想就是在损失函数中加入被称为正则化项的惩罚。假设模型在训练集上的损失函数为J(w),那么优化时不是直接优化J(w),而是优化J(w)+aR(w),这里的R(w)就是我们在损失函数中加入的正则化项,a是控制我们偏好范数权重的程度,是一个系数,可自行设置。
常用的刻画模型复杂度的R(w)有两种,一种是L1正则化(对权重参数w求解L1范数),一种是L2正则化(对权重参数w求解平方L2范数)。最小化J(w)+aR(w)意味着需要在偏好小范数权重和拟合训练数据之间找到一个平衡,其基本思想是通过限制权重的大小,降低模型拟合训练集中存在的噪音的概率,从而减轻过拟合。实际应用中大多选择L2正则化进行优化。
解决过拟合的方法——Dropout方法
它的大致意思是在训练时,将神经网络某一层的单元(不包括输出层的单元)数据随机丢弃一部分。具体而言,使用该方法需要训练的是从原始网络去掉一些不属于输出层的单元后行成的子网络。丢弃并不是指真的构建出这样的网络结构。为了能有效地删除一个单元,我们只需要将该单元的输出乘以0即可。
可以将每次的单元丢弃都理解为是对特征的一种重采样,这种做法实质上是等于创造出了很多新的随机样本,以增大样本量、减少特征量的方式来防止过拟合。这样做的结果就是不需要训练多个神经网络模型,只有一个模型就能达到bagging方法使用多个模型进行训练的效果。