前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详述深度学习中优化算法的演变

详述深度学习中优化算法的演变

作者头像
用户7506105
发布2021-08-06 15:23:36
7960
发布2021-08-06 15:23:36
举报
文章被收录于专栏:碎片学习录碎片学习录

深度学习典型代表是以神经网络为主的联结式算法,在深度学习问题中,通常会预先定义一个损失函数,并通过相应手段(即一些优化算法)使其损失最小化,以不断更新权值和偏移量,最后训练出一个泛化能力良好的模型。

一般来说,深度学习的损失目标函数都较为复杂,并不存在解析解(从严格数学定理推导的解),因此只能采用基于数值方法的优化算法找到近似解(即数值解),一般来说这样的优化算法需要进行有限次迭代模型参数来降低损失函数的值,这也即是优化算法的作用所在。

前提准备

  • 局部最小值与全局最小值

对于目标函数,如果存在某一个点使得在邻域上都有则称为局部最小值,但它不一定是全局最小值,因为它的邻域不代表整个定义域本身,而在定义域全集上如果满足,则为全局最小值

深度学习模型的目标函数可能有若干局部最优值

  • 鞍点和海森矩阵

区别于驻点,驻点是导数为0且能取到极值的解,而鞍点是一阶二阶导数都为0的点,比如,它在上不是极值点,但它在0上的一阶导为0,这样的点成为鞍点,鞍点一般在二维函数来说比较有意义,如图

这样目标函数在x轴方向上是局部最小值,但在y轴方向上是局部最大值,但是它的对x的偏导(梯度)和对y的偏导都为0,那怎么判断是鞍点还是极值点呢,即如何求出并判断出二维函数的极值呢,可由二阶泰勒公式进行推导,这里是数学分析学科的重要内容,需要引入海森矩阵的定义,海森矩阵其实就是多元函数二阶导数构成的矩阵H,这里以二元函数f(x,y)为例子

H = \begin{bmatrix} \frac{\partial^2 f}{\partial x^2} & \frac{\partial^2 f}{\partial x \partial y}\\ \frac{\partial^2 f}{\partial y \partial x} & \frac{\partial^2 f}{\partial y^2} \end{bmatrix}

一般来说,海森矩阵是对称阵,因为深度学习中的目标函数的二阶导数一般是连续的,满足混合偏导数相等

它的结论很重要,结论是

\begin{cases} 1、函数的海森矩阵在梯度为零的位置上的特征值全为正时,该函数得到局部最小值 \\ \\ 2、函数的海森矩阵在梯度为零的位置上的特征值全为负时,该函数得到局部最大值 \\ \\ 3、函数的海森矩阵在梯度为零的位置上的特征值有正有负时,该函数得到鞍点 \end{cases}

由随机过程中的一些理论可以知道,当一个高维的随机矩阵中,特征值为正和为负的概率都是均等的,所以全为正和全为负的概率其实很小,尤其是目标函数参数很多的情况,所以深度学习中的损失函数一般是鞍点比极值点更常见,所以需要引入数值优化算法进行近似求解

梯度下降算法

虽然梯度下降在深度学习中很少被直接使用,但其思想是后续优化算法的基础

以一维函数为例,由拉格朗日中值定理,一定可以有

f(x + \varepsilon ) - f(x) = \varepsilon f'(\theta)

一般来说,中值,而这里的很小,极限为0,所以由夹逼定理可以知道,所以

f(x + \varepsilon ) =f(x) + \varepsilon f'(x)

这里为在x处的梯度

梯度与导数的区别是,梯度是对每一维度求导数,是向量,而导数是标量,所以一维函数的导数就是梯度

因为是梯度下降,顾名思义是沿着梯度下降的方向下降(函数值变小),故在对x进行变化时需要和它本身的梯度相关,所以引入一个正常数(学习率),使得

x \rightarrow x - \eta f'(x)

且这个常数需要保证足够小,以便可以代入上面的式子,即

f(x - \eta f'(x) ) =f(x) - \eta f'(x)^2

因为为正的,所以一定有

f(x - \eta f'(x) ) <= f(x)

这样就达到了在沿着梯度方向函数值变小的目的,然后不断迭代更新这个x,直到收敛即能找到极小值的数值解

自然而然,多维梯度下降就是,x的变化情况为

\vec{x} \rightarrow \vec{x} - \eta \nabla f(\vec{x})

其中

\nabla f(\vec{x}) = [\frac{\partial \vec{x}}{\partial x_1},\frac{\partial \vec{x}}{\partial x_2},...,\frac{\partial \vec{x}}{\partial x_d}]^T

深度学习中,目标函数通常是训练数据集中有关各个样本的损失函数的平均,所以这里的损失目标函数为

f(\vec{x}) = \frac{1}{n} \sum_{i=1}^n f_i(\vec{x})

自然在进行梯度下降法的时候就需要计算

\nabla f(\vec{x}) = \frac{1}{n}\sum_{i=1}^n \nabla f_i(\vec{x})

这里就会有一个问题,这里是代入所以训练样本进行计算梯度,如果数据样本量很大,那计算开销不容忽视,所以引入了随机梯度下降算法和小批量随机梯度下降算法

随机梯度下降

随机体现在样本选择随机

随机在n个样本中均匀采样一个样本i,然后

\vec{x} \rightarrow \vec{x} - \eta \nabla f_i(\vec{x})

这样就将n个样本的计算复杂度降低到一个样本了,毫无疑问应该是的无偏估计,即

E_i \nabla f_i(\vec{x}) = \frac{1}{n}\sum_{i=1}^n \nabla f_i(\vec{x}) = \nabla f(\vec{x})

一般来说随机梯度下降的自变量选择轨迹会比梯度下降来的曲折,因为数据一般是会含有噪声的,噪声对n个样本不敏感,但对单个样本很敏感

小批量随机梯度下降

这又是一个折中的方案,它是在每轮迭代中随机均匀采样多个样本来组成一个小批量,然后使用这个小批量来计算梯度,假设当前迭代次数为k,则有

g_k = \nabla f_{B_k}(x_{k-1}) = \frac{1}{B_k} \sum_{x \in B_k} \nabla f_i(x_{k-1})
x_k \rightarrow x_{k-1} - \eta_kg_k

以下都用代替,表明是向量

这里也是的无偏估计,每次迭代时选的批量样本不一样,每次迭代的时候的学习率不一样,严格来说这学习率是需要在迭代过程中自我衰减的,一般有公式

\eta_k = \eta k^{\alpha}

\eta_t = \eta \alpha^k

这里的为超参数

当批量较小时,每次迭代中使用的样本少,这会导致并行处理和内存使用效率变低。当批量较大时,每个小批量梯度里可能含有更多的冗余信息

动量法

梯度下降算法有个问题,仅仅是利用了损失目标函数叜在当前自变量下减少最快的方向,如果一个函数有两个自变量,在某一个自变量方向上的导数大而在另一个自变量方向上的导数相对很小,因为是共享同一个学习率,则自变量变化轨迹一定是导数大的那个自变量方向变化幅度大,就很有可能超过全局的极值解并逐渐发散,即有些维度的分量衰减的非常缓慢,为了解决这个问题,引入动量法。

动量法在一定程度上能解决梯度下降的问题,如果考虑历史梯度,将会引导参数朝着最优值更快收敛,这就是动量算法的基本思想。即

v_k \rightarrow \gamma v_{k-1} + \eta_{k}g_k
x_k \rightarrow x_{k-1} - v_k

超参数,通常设定为0.9, 当=0时,动量法等价于小批量随机梯度下降

对于第一个式子转化成

v_k = \gamma v_{k-1} + (1-\gamma)\frac{\eta_k}{1-\gamma} g_k

所以实际上是对序列的加权平均(后面有详细推导说明),所以动量法在每个迭代时间步k的自变量更新量近似于将最近1/(1−γ)个时间步的普通更新量(即学习率乘以梯度)做了指数加权移动平均后再除以1−γ,即在动量法中,自变量在各个方向上的移动幅度不仅取决当前梯度,还取决于过去的各个梯度在各个方向上是否一致,然后依赖指数加权移动平均使得自变量的更新方向更加一致,从而降低发散的可能

指数加权移动平均

假设则

...

当=0.9时,

当最原始的=0时

可以看出数值的加权系数随时间呈现指数下降 由于

\lim_{n \rightarrow \infty}(1 - \frac{1}{n})^n = \frac{1}{e}

所以将1/e作为系数临界值,当系数小于1/e时不考虑 当=0.9时,此时可以认为是近10个数的加权平均

偏差修正,初始如果等于0会造成初始的数值都偏小,此时可以用一个惩罚分母,即,当t趋近0时,分母离1最远,此时相当于放大,当t很大时,分母项趋近1和之前式子近似

所以在实际中,对于该式子,常常将看成是对最近个时间步的的加权平均

AdaGrad算法

如上所述,因为梯度下降始终只能是对每一个自变量维度用同一个学习率,会因为不同维度的变量衰减速度不一致导致震荡的可能,而动量法的出现即依赖指数加权平均使得自变量更新方向也基于了历史的的更新对方向,从而使得更新方向更加一致以此来降低发散,那有没有可能让每个自变量维度适用不同的学习率呢?这就是AdaGrad算法初衷

AdaGrad算法引入一个变量,这个的含义是小批量随机梯度每个元素平方的累加变量,即矩阵的F范数的平方,当第一次迭代即k=0时,每个元素初始值为0,然后

s_k \rightarrow s_{k-1} + g_k\odot g_k

这里的为矩阵对应位置的元素相乘,然后将目标函数自变量中的每一个元素按照公式

x_k \rightarrow x_{k-1} - \frac{\eta}{\sqrt{s_k+\epsilon}} \odot g_k

进行调整,其中是防止分母为0的项,这里的开方、除法和乘法的运算都是按元素运算的,这些按元素运算使得目标函数自变量中每个元素或者每个维度都分别拥有自己的学习率。

因为的存在,且一直在累加平方,所以学习率一直在降低,只不过是之前梯度大的下降的严重,梯度小的下降的缓慢,所以当学习率在早期迭代时如果下降的较快但依然不是最佳解时,后期由于学习率的过小,可能较难再找到一个有用的解,为了解决这个问题,引入了RMSProp算法和AdaDelta算法

RMSProp算法

它的思想其实就是AdaGrad算法中的的元素平方做指数加权移动平均而已,可以看成是AdaGrad算法与动量法的结合,即

s_k \rightarrow \gamma s_{k-1} + (1-\gamma)g_k \odot g_k
x_k \rightarrow x_{k-1} - \frac{\eta}{\sqrt{s_k+\epsilon}} \odot g_k

可以看作是最近个时间步的小批量随机梯度平方项的加权平均。如此一来,自变量每个元素的学习率在迭代过程中因为考虑了历史更新值就不再一直降低或不变,使用了小批量随机梯度按元素平方的指数加权移动平均来调整学习率的方法

AdaDelta算法

它也是针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进的一种方法,且AdaDelta算法没有学习率这一超参数。

和RMSProp算法一样,也是基于做指数加权移动平均,给定超参数使得

s_k \rightarrow \rho s_{k-1} + (1-\rho)g_k \odot g_k

与RMSProp算法不同的是,该算法需要维护一个状态变量,该算法的核心变化式子为

s_k \rightarrow \rho s_{k-1} + (1-\rho)g_k \odot g_k
g_k' \rightarrow \sqrt{\frac{\Delta x_{k-1} + \epsilon}{s_k + \epsilon}} \odot g_k

是防止分母不为0的参数,一般取

使用记录按元素平方的指数加权平均

x_k \rightarrow x_{k-1} - g_t'
\Delta x_k \rightarrow \rho \Delta x_{k-1} + (1-\rho)g_k' \odot g_k'

对比RMSProp算法和AdaDelta算法中的变化式子,可以看出AdaDelta算法是采用的来作为的学习率的的

Adam算法

其实它是在RMSProp算法基础上对变量做了指数加权移动平均而已,可以看成是RMSProp算法与动量法的结合,具体核心变化式子为:

对做指数加权移动平均,

v_k \rightarrow \beta_1 v_{k-1} + (1-\beta_1)g_k
s_k \rightarrow \beta_2 s_{k-1} + (1-\beta_2)g_k \odot g_k

因为过去各时间步小批量随机梯度权值之和会较小,所以这里对做了偏差修正

\hat{v_k} \rightarrow \frac{v_k}{1-\beta_1^k}
\hat{s_k} \rightarrow \frac{s_k}{1-\beta_2^k}
g_k' \rightarrow \frac{\eta \hat{v_k}}{\sqrt{\hat{s_k} + \epsilon}}
x_k \rightarrow x_{k-1} - g_k'

和AdaGrad算法、RMSProp算法以及AdaDelta算法一样,目标函数自变量中每个元素都分别拥有自己的学习率,因为在RMSProp算法基础上又对做了指数加权移动平均并且还做了偏差修正,使得其在寻优过程中能体现更高的搜索效果,也是深度学习在科研论文或工作中最常用的优化算法。

总结

纵观这些优化算法,核心都是为了解决某个基础算法在某一方面的痛点而迭代式产生的,所以这里面的梯度下降和指数加权移动平均的思想异常重要,虽然这些优化算法都在一些深度学习框架都有封装,但是了解其原理还是很重要的,知其然知其所以然才是最关键的嘛,比如之前就有大佬改进了Adam算法获得了学术上的极高荣誉呢,所以加油吧,争取可以见微知著!!

参考文献

《深度学习花树》

《动手学深度学习》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 碎片学习录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提准备
  • 梯度下降算法
    • 随机梯度下降
      • 小批量随机梯度下降
        • 指数加权移动平均
    • 动量法
    • AdaGrad算法
    • RMSProp算法
    • AdaDelta算法
    • Adam算法
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档