机器学习1 -- 梯度下降(Gradient Descent)

1 什么叫梯度下降

我们训练模型的目标,就是找到一个拟合函数和一组参数,使得loss函数最小。如下
在这里插入图片描述
那么这组参数怎么找呢?大家肯定就想到了耳熟能详的梯度下降。
假设θ 有两个参数,即 {θ1, θ2}。初始时刻
在这里插入图片描述
第一次迭代后, 在这里插入图片描述
第二次迭代后,在这里插入图片描述
其中梯度即为在这里插入图片描述
学习率为η。这种沿着梯度反方向更新参数的方式,即为梯度下降。迭代步骤如如下所示 在这里插入图片描述

2 为什么要使用梯度下降

那为什么采用梯度下降更新参数,就可以使得loss函数逐渐变小呢(不代表每次更新参数,Loss一定能减小)。我们可以采用一种方法来减小loss函数。先在loss函数中随机找一个初始点,然后以它为中心画一个圆圈,找到这个圆圈上loss最小的点。然后以这个点为中心继续画圆圈,找到loss最小的点。一直找下去即可找到令人满意的一组参数。

这里就要用到泰勒定理了。对于中心点x0周围的x,泰勒展开如下在这里插入图片描述
当x与x0很接近时,我们可以只保留一阶导数,也就是在这里插入图片描述
对于多个变量,也是类似的在这里插入图片描述
我们令其中的常数如下: 在这里插入图片描述
在这里插入图片描述

上式可以改写为
在这里插入图片描述
要使得L(θ)最小,即u(θ1 - a)+ v(θ2 - b) 即可。即为求两向量(u, v)和(θ1 - a, θ2 - b)内积最小。显然两向量夹角180度时内积最小。如下图所示 在这里插入图片描述
这就是为什么我们要沿着梯度的反方向更新参数了,如下在这里插入图片描述

3 如何优化梯度下降

3.1 随机梯度下降 SGD

更新模型参数来迭代计算loss函数的时候,我们可以一次性计算所有的样本数据,但会带来一些问题

  1. 模型一次需要看所有的样本,可能会有内存溢出问题
  2. 看完所有样本才能更新一次模型,导致参数更新太慢,最终模型收敛比较慢

所以提出了随机梯度下降。它每次随机选取一部分样本,称为mini_batch,而不是全部所有样本。利用这部分样本来更新参数。然后再随机选取另一批样本,继续更新模型参数。虽然每一步不一定和整体梯度方向一致,但所有样本训练完后,基本可以和整体梯度方向保持一致。

随机梯度下降利用每次随机只选取一批mini_batch的方法,很好的解决了内存溢出问题,并大大增加了参数更新频率,加快了模型收敛速度。

3.2 特征归一化

两个参数θ1 、θ2的loss函数如下
在这里插入图片描述
如果两个参数大小差别太大,则参数较小的那个的更新,不会对loss有太大作用,导致参数无法学习和更新。所以需要对参数进行归一化,将二者拉到一个水平线上。

常用的方法为,每个特征减去其平均值,再除以方差。如下
在这里插入图片描述

3.3 自适应学习率

梯度下降中的学习率很关键。学习率过大则容易越过最优点,过小则导致学习过慢。所以选取一个合适的学习率十分关键。如下图所示
在这里插入图片描述
针对不同的迭代轮次,不同的参数,我们可以使用不同的学习率,因材施教。简单来说就是,刚开始的时候loss比较大,可以使用大一点的学习率,加快模型收敛。当loss下降到比较小,接近最优点时,降低学习率,精调参数使得靠近最优点。

3.3.1 学习率随迭代次数进行衰减

如下,其中t为迭代次数。
在这里插入图片描述

3.3.2 学习率随梯度的累积进行衰减

如下
在这里插入图片描述
其中衰减值为之前的梯度的均方根
在这里插入图片描述

3.3.3 warmUp

刚开始训练时模型参数比较坑,比如随机初始化的参数。此时如果使用比较大的学习率,很容易导致模型不稳定,甚至直接跑飞,以后比较难拉回来了。故刚开始选择一个较小的学习率,训练一些iteration后,等模型较为稳定后,再逐步调整到预设的值。然后再从这个预设值开始逐步衰减和迭代。这个方法称为warmUp。
在这里插入图片描述

3.4 加入动量

梯度下降还有一个比较严重的问题,就是容易卡在梯度很小的地方。由梯度下降公式
在这里插入图片描述

可知,当梯度很小,甚至接近0时,在这里插入图片描述
,导致参数无法更新,或者更新很慢。这是一个很致命的问题。

常见的梯度很小的地方有

  1. 局部最小值,也就是经常说的局部最优解
  2. 鞍点
  3. 平坦的高原上。
    在这里插入图片描述

那怎么解决这个问题呢,我们可以使用动量,momentum。将前面迭代的梯度累积起来,使得保持朝某个方向下降的趋势。在SGDM和ADAM优化器中均有应用,我们下节再讲。

3.5 其他

其他方法也很多,主要有

  1. mini_batch shuffle,打乱每次迭代样本
  2. 加入dropout,增加随机性,从而增加模型学习的可能性
  3. 加入梯度噪声,从而增加模型学习的可能性
  4. fine-tune,站在巨人肩膀上,比如NLP和CV的各种预训练模型。
  5. curriculum learning。刚开始在简单样本上训练,然后在比较难的样本上训练。
  6. 归一化,比如batch-norm和layer-norm。使得样本以及每一层参数都拉到同一个范围内
  7. 正则化,尽量让模型比较简单,提升模型泛化能力


这儿就不一一赘述了。

猜你喜欢

转载自blog.csdn.net/u013510838/article/details/108267463