Task 1
1 )局部极小值和鞍点
Q:理解为什么优化会失败?
A:收敛在局部极限值与鞍点会导致优化失败
概念:
鞍点:梯度是零且区别于局部极小值和局部极大值(localmaximum)的点。
红色的点在 y 轴方向是比较高的,在 x 轴方向是比较低的,这就是一个鞍点。鞍点的叫法是因为其形状像马鞍。
鞍点的梯度为零。
临界点(critical point):梯度为0的点
走到临界点时:
1)如果损失收敛在局部极小值,我们所在的位置已经是损失最低的点
2)如果损失收敛在鞍点,逃离鞍点,就有可能让损失更低
由泰勒级数近似(Tayler series approximation)可知,给定某一组参数 θ′,在 θ′ 附近的损失函数L(θ‘) 可近似为
在 θ′ 附近的损失函数L(θ‘)跟梯度和海森矩阵有关
在临界点,梯度 g 为零,因此为零。所以在临界点的附近,损失函数可被近似为
可以根据 来判断在 θ′ 附近的误差表面(error surface)
关于正定矩阵和负定矩阵:
用向量 v 来表示,可改写为
有如下三种情况:
算出一个海森矩阵后,只要看 H的特征值即可:
若 H 的所有特征值都是正的,H 为正定矩阵,则 > 0,临界点是局部极小值。若 H 的所有特征值都是负的,H 为负定矩阵,则 < 0,临界点是局部极大值。若 H 的特征值有正有负,临界点是鞍点。
海森矩阵特征值:det(H−λI)=0
其中 I 是单位矩阵,λ 是特征值,解这个方程可以得到海森矩阵的特征值
H 不只可以帮助我们判断是不是在一个鞍点,还指出了参数可以更新的方向
沿着 u 的方向更新 θ,损失就会变小
只要 θ = θ′ + u,沿着特征向量 u 的方向去更新参数,损失就会变小,所以虽然临界点的梯度为零,如果我们是在一个鞍点,只要找出负的特征值,再找出这个特征值对应的特征向量。将其与 θ′ 相加,就可以找到一个损失更低的点。
逃离鞍点:
从高维的空间去看,低维度空间中的局部极小值点,在更高维的空间中,实际可能是鞍点。更高的维度难以进行可视化。当我们训练一个网络时,参数数量动辄达百万、千万级,而参数的数量代表了误差表面的维度,所以误差表面实际上具有非常高的维度。
既然维度如此之高,那么会不会有非常多的路径可以选择呢?如果有非常多的路径可走,会不会局部极小值就很少呢?
我们常常会遇到两种情况:损失仍然很高,却遇到了临界点而不再下降;或者损失降得很低,才遇到临界点
实际上,我们很难找到所有特征值都为正的临界点。以图 示的例子来说,最小值比例最大也仅处于 0.5 - 0.6 的范围,这意味着只有约一半的特征值为正,另一半为负。也就是说,在所有维度中,约一半的方向会使损失上升,约一半的方向会使损失下降。
在这个图上,越靠近右侧,临界点“看起来越像”局部极小值,但这些点都不是真正的局部极小值。所以从经验上看,局部极小值并没有那么常见。大多数时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。
Q:在深度学习中,为什么说高维空间中的局部极小值可能比鞍点更少见?
A:在高维空间中,由于参数数量巨大,局部极小值可能只是鞍点的一部分,因为存在更多的方向可以逃离当前点,从而找到更低的损失值。
扩展:梯度下降(一):批梯度下降、随机梯度下降、小批量梯度下降、动量梯度下降、Nesterov加速梯度下降法 Matlab 可视化实现_动量梯度下降算法公式-CSDN博客
深度学习各类优化器详解(动量、NAG、adam、Adagrad、adadelta、RMSprop、adaMax、Nadam、AMSGrad)_动量优化器-CSDN博客
2 ) 批量和动量
Q:在深度学习中,为什么大批量训练可能会遇到优化问题?
A:大批量训练虽然可以利用并行计算提高效率,但可能会导致模型陷入局部最小值或鞍点,因为大批量更新方向比较稳定,可能不足以跳出这些点。
概念:
使用全批量(fullbatch)的数据来更新参数的方法即批量梯度下降法(Batch Gradient Descent,BGD)。此时模型必须把所有笔训练数据都看完,才能够计算损失和梯度,参数才能够更新一次。
批量大小等于 n,此时使用的方法即随机梯度下降法(Stochastic Gra-dient Descent,SGD),也称为增量梯度下降法。批量大小等于 n 意味着只要取出n笔数据即可计算损失、更新一次参数。用n笔数据算出来的损失相对带有更多噪声,因此其更新的方向是曲曲折折的。
实际上,批量梯度下降并没有“划分批量”:要把所有的数据都看过一遍,才能够更新一次参数,因此其每次迭代的计算量大。但相比随机梯度下降,批量梯度下降每次更新更稳定、更准确。
随机梯度下降的梯度上引入了随机噪声,因此在非凸优化问题中,其相比批量梯度下降更容易逃离局部最小值。
实际上,考虑并行运算,批量梯度下降花费的时间不一定更长;对于比较大的批量,计算损失和梯度花费的时间不一定比使用小批量的计算时间长 。
下图为使用较小的梯度进行梯度下降可能导致:
批量大小决定计算时间:
GPU 可以做并行运算,这批量大小较小时笔数据是并行处理的,所以 1000笔数据所花的时间并不是一笔数据的 1000 倍。当然 GPU 并行计算的能力还是存在极限的,当批量大小很大的时候,时间还是会增加的。 当批量大小非常大的时候,GPU 在“跑”完一个批量,计算出梯度所花费的时间还是会随着批量大小的增加而逐渐增长 。当批量大小增加到10000,甚至增加到 60000 的时候,GPU 计算梯度并更新参数所耗费的时间确实随着批量大小的增加而逐渐增长。
Q:为什么在深度学习训练中使用批量大小为1的SGD可能会引入噪声?
A: 因为SGD每次只使用一个训练样本来计算梯度,这会导致梯度估计有较大的随机性,从而引入噪声。
在有考虑并行计算的时候,大的批量大小反而是较有效率的,一个回合大的批量花的时间反而是比较少的。
批量大串行时间少,但是并行时间长;且批量大小越大,验证集准确率越差。批量小有一定噪声,使用的损失函数是有差异的,每次更新参数使用的损失函数可以随机选择,选择空间大,卡住几率小,优化能力较强。
关于动量:
动量不是只看梯度,还看前一步的方向,这使得可能出现更好的局部最小值。
扩展: