最优化问题

【最优化问题】

1 解析解
  • 对于一元函数,一阶导为0,二阶导不为0(即非鞍点)。对于多元函数,梯度为0,Hesse矩阵为正定/负定。
  • 验证一个对称矩阵是否正(负)定,只需要check其所有特征值是否大(小)于0。
2 数值解
1)原因

​ 求极值要通过求解梯度方程,那么变量一旦躲起来,求解方程组的难度也会迅速上升,并且还存在方程无法求解的问题(如超越方程),且现实生活中许多优化问题需要解决的都是超越方程,早已超越人力计算的范畴,而我们衍生的许多数值计算方法就是为了求出这类方程的近似解的。优化问题中一个最近点的求极值算法就是针对优化条件发明的 梯度下降法 ——通过迭代的方式找到一列梯度递减的点,当点的梯度下降的足够接近0时便可认为该点即是极值点的候选之一。

2)凸优化
①判断凸函数

​ 对于一元函数,二阶导总是非负;对于多元函数,其Hessian矩阵是半正定矩阵。

②凸优化

​ 凸优化问题的局部最优解是全局最优解,如果优化的目标函数是凸函数,则局部极小值就是全局最小值。而非凸函数优化可能会陷入局部极小值。

3)只考虑一阶导的原因
  • 理解1:之前求解析解的时候,要考虑二阶导是因为可能会存在鞍点的情况,但是如果使用小批量梯度下降的话,是可以解决这种情况的。(想法:好像是,但是好像也不能确保,使用的优化算法也不能完全保证不陷入鞍点,但由于二阶太复杂开销太大且相对而言梯度下降中陷入鞍点概率也不大,因此普遍上不太考虑二阶)
  • 理解2:求二阶导数的优化方法叫“牛顿法”。二阶导数的确能提高优化速度,但是这个是存在于理论上的,实际计算机运行的时候,你需要额外开辟一个数组存储每个样本的二阶导数,同时,你需要额外增加计算二阶导数的时间开销,这个消耗一加上去复杂度立刻上来了,所以在大数据的情况下,二阶导数的计算十分困难。同时,在深度学习的背景下,由于反向传播计算二阶导数太困难,开销太大,也是很难用到二阶导数。而且还有一种情况,牛顿法不一定收敛(牛顿法收敛有条件的,和初点有关),计算二阶导有时会不可行。(参考回答这个问题的大佬的一篇文章:https://zhuanlan.zhihu.com/p/165914126)
4)优化算法

​ (只要能把损失函数描述成凸函数,那么就一定可以用梯度下降法以最快的速度更新权值向量W,找到使损失函数达到最小值点的位置。)

​ 优化过程如下:
x(k+1)=x(k)−ηt(ηt为步长) x^{(k+1)}=x^{(k)}-\eta_t \quad (\eta_t为步长) x(k+1)=x(k)ηtηt
​ 其中 步长 与学习率(可以是超参数,也可以使用学习率策略如“指数衰减”、“分段常
数衰减”)和斜率(以及一阶动量、二阶动量等)有关。对于后者,则涉及了许多不同的优化算法(一阶优化算法就是指的梯度算法及其变种,而二阶优化一般使用二阶导数(Hessian矩阵)来计算,如牛顿法,由于需要计算Hessian矩阵及其逆矩阵,计算量较大,因此没有流行开,这里主要总结一阶优化的各种梯度下降方法)。

SGD -> SGDM -> NAG -> AdaGrad -> AdaDelta -> Adam ->Nadam

其基本包含以下几步:

  • 1 计算损失函数关于当前的梯度
    gt=▽f(wt)=∂f∂wt g_t=\bigtriangledown f(w_t)=\frac{\partial f}{\partial w_t} gt=f(wt)=wtf

  • 2 根据历史梯度计算一阶动量和二阶动量
    mt=ϕ(g1,g2,...,gt),Vt=ψ(g1,g2,...,gt) m_t=\phi(g_1,g_2,...,g_t), \quad V_t=\psi(g_1,g_2,...,g_t) mt=ϕ(g1,g2,...,gt),Vt=ψ(g1,g2,...,gt)

  • 3 计算当前时刻的下降梯度
    ηt=α∗mt/Vt \eta_t=\alpha*m_t/\sqrt{V_t} ηt=αmt/Vt

  • 4 根据下降梯度进行更新
    wt+1=wt−ηt w_{t+1}=w_{t}-\eta_t wt+1=wtηt

步骤3.4 对于各算法都是一致的主要差别体现在1.2上。

以下对几个优化算法进行简介:

①vanilla SGD

​ 最初版本的SGD没有动量的概念,
mt=gt,Vt=1 m_t=g_t ,\quad V_t=1 mt=gt,Vt=1
​ 故其学习步长为:
ηt=α∗gt \eta_t=\alpha*g_t ηt=αgt
​ 其最大的缺点是下降速度慢,而且可能会在沟壑两边持续震荡,停留在一个局部最优点。

②SGDM (SGD with Momentum)

​ 为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性,下坡的时候,如果发现是陡坡,就利用惯性跑的快一点,因此它在SGD的基础上引入了一阶动量:
mt=β1∗mt−1+(1−β1)gt m_t=\beta_1*m_{t-1}+(1-\beta_1)g_t mt=β1mt1+(1β1)gt
​ 一阶动量是各个时刻梯度方向的指数移动平均值,约等于最近 1/(1−β1)1/(1-\beta_1)1/(1β1) 个时刻梯度向量和的平均值。也就是说,t时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前积累的下降方向决定。β1\beta_1β1的经验值为0.9,这就意味着下降方向主要偏向此前积累的下降方向,并略微偏向当前时刻的下降方向。

③Adam

把一阶动量和二阶动量结合起来,再修正偏差,就是Adam。

SGDM的一阶动量:
mt=β1∗mt−1+(1−β1)gt m_t=\beta_1*m_{t-1}+(1-\beta_1)g_t mt=β1mt1+(1β1)gt
RMSprop的二阶动量:
Vt=β2∗Vt−1+(1−β2)gt2 V_t=\beta_2*V_{t-1}+(1-\beta_2)g_t^2 Vt=β2Vt1+(1β2)gt2
其中,参数经验值是β1=0.9,β2=0.999\beta_1=0.9,\beta_2=0.999β1=0.9,β2=0.999

一阶动量和二阶动量都是按照指数移动平均值进行计算的。初始化m0=0,V0=0,在初期,迭代得到的mt,Vt会接近于0,我们可以通过对其进行偏差修正来解决这一问题:
mt^=mt1−β1t,Vt^=Vt1−β2t \hat{m_t}=\frac{m_t}{1-\beta_1^t},\quad \hat{V_t}=\frac{V_t}{1-\beta_2^t} mt^=1β1tmtVt^=1β2tVt

(中间的一些其他优化算法,以及其原理中的二阶动量和偏差修正后续还需继续深入学习和理解。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值