2019-09-05 14:55:05 sunflower_sara 阅读数 515
  • C++开发环境搭建-第1部分第2课

    《跟朱老师从C高级到征服C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言完全学习。本课程可以看做是嵌入式linux核心课程中《C语言高级专题》课程的延续,在学好了C语言前提下继续深度学习C++语言。整个课程共分为5部分。涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制完成,总时长预计150-200小时。 朱老师C++第1部分-从C到C++ 朱老师C++第2部分-C++和面向对象 朱老师C++第3部分-STL等高阶话题 朱老师C++第4部分-Boost库和设计模式 朱老师C++第5部分-C++编程优化 课程特色 *完全零基础,降低学习门槛。 *深入浅出,通俗易懂。不怕学不会,就怕你不学习。 *思路清晰、语言风趣,对着视频看也不会想睡觉······ *视频 + 文档 + 练习题 + 答疑,全方位保证学习质量。 *基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。 *系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。

    46 人正在学习 去看看 朱有鹏

深度学习优化学习方法总结 (一阶为主)https://blog.csdn.net/sunflower_sara/article/details/81321886

常用的优化算法:梯度下降法,牛顿法,拟牛顿法,共轭梯度法 (二阶为主) https://blog.csdn.net/sunflower_sara/article/details/81215135

 

一阶方法:

随机梯度下降(Stochastic Gradient Descent,SGD)

动量(SGD with Momentum,SGDM)

牛顿动量法(Nesterov Acceleration Gradient,NAG)

AdaGrad(自适应梯度)

RMSProp(均方差传播)

Adam

Nadam

 

二阶方法:

牛顿法

拟牛顿法

共轭梯度法 CG

BFGS

L-BFGS

2017-04-05 18:05:36 Gavin__Zhou 阅读数 1726
  • C++开发环境搭建-第1部分第2课

    《跟朱老师从C高级到征服C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言完全学习。本课程可以看做是嵌入式linux核心课程中《C语言高级专题》课程的延续,在学好了C语言前提下继续深度学习C++语言。整个课程共分为5部分。涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制完成,总时长预计150-200小时。 朱老师C++第1部分-从C到C++ 朱老师C++第2部分-C++和面向对象 朱老师C++第3部分-STL等高阶话题 朱老师C++第4部分-Boost库和设计模式 朱老师C++第5部分-C++编程优化 课程特色 *完全零基础,降低学习门槛。 *深入浅出,通俗易懂。不怕学不会,就怕你不学习。 *思路清晰、语言风趣,对着视频看也不会想睡觉······ *视频 + 文档 + 练习题 + 答疑,全方位保证学习质量。 *基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。 *系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。

    46 人正在学习 去看看 朱有鹏

一般来说,深度学习通过仔细的设计Objective function和constraints来确保优化问题是convex的,从而避开一下通用优化算法的难题。
优化(optimization)说的有点大,因为存在一阶优化(first-order)和二阶(second-order)优化算法。我们常用的优化算法,比如Adam,SGD等其实都是一阶优化算法(基于gradient),这篇写的也是一阶优化算法.

现今的一阶优化算法都是基于batch或者是minibatch的,所以从minibatch开始说起吧


batch and minibatch

假设做最大似然估计,需要优化下面的式子:

等价于需要在经验分布上最大化期望:

优化上式自然想到梯度:

求这个期望需要计算每个example的梯度,对于大数据集(比如100W)来说计算成本过高,一个常用的解决方法就是:random sampling

In practice, we can compute these expectations by randomly sampling a small number of examples from the dataset, then taking the average over only those examples.

这样做就是使用近似的梯度估计来代替精确的梯度,毫无疑问计算代价很小,计算的代价是不随training set的增加而增加的.

batch gradient descent

Optimization algorithms that use the entire training set are called batch or deterministic gradient methods, because they process all of the training examples simultaneously in a large batch.

使用所有的训练数据来计算梯度

SGD(stochastic gradient descent)

Optimization algorithms that use only a single example at a time are sometimes called stochastic or sometimes online methods.

minibatch SGD

SGD和batch GD是两个极端,一个每次只使用一个训练数据来计算梯度,一个是使用所有的训练数据;batch GD计算成本太高,SGD太具有随机性,所以需要综合下。

using more than one but less than all of the training examples. These were traditionally called minibatch or minibatch stochastic methods and it is now common to simply call them stochastic methods.

重要的一点是:选择minibatch的数据时一定要随机

It is also crucial that the minibatches be selected randomly. Computing an unbiased estimate of the expected gradient from a set of samples requires that those samples be independent. We also wish for two subsequent gradient estimates to be independent from each other, so two subsequent minibatches of examples should also be independent from each other.

这里只是为了区分batch和minibatch的概念,现在所说的stochastic其实都是minibatch的.

SGD

SGD和它的变种是最常用的一阶优化算法,具体描述:

SGD

momentum

SGD的问题就是它可能会很慢,所以使用momentum来加速学习过程.

The method of momentum (Polyak, 1964) is designed to accelerate learning, especially in the face of high curvature, small but consistent gradients, or noisy gradients.

momentum的原理:

The momentum algorithm accumulates an exponentially decaying moving average of past gradients and continues to move in their direction.

引入一个参数α ∈ [0 ,1),作用是:

determines how quickly the contributions of previous gradients exponentially decay.

更新公式:

其中L是损失函数,v代表速度
使用了momentum之前,step_size = ||g||*lr(梯度乘以学习率),使用了momentum之后的step_size,取决于两个因素:

  • how large a sequence of gradients are.
  • how aligned a sequence of gradients are.

这个对齐(align)怎么理解,可以放到物理上想,当所有的物体的运动方向是一致的时候,这个整体的动量是最大的.

step_size_with_momentum=lr/(1-α)*||g||,通常典型的α值是0.9

CS231n上有比较形象的解释: 地址在这
中文翻译过来就是:

损失值可能理解为山峰的高度, 用随机数字初始化参数等同于在某个位置给质点设定初始速度为0. 这样最优化过程可以看做是模拟参数向量(即质点)在地形上滚动的过程, 质点所受的力就是损失函数的负梯度. 在普通的更新(比如SGD)中,梯度直接影响位置,momentum上是梯度影响速度,速度影响位置.

SGD with momentum

Nesterov momentum

跟momentum非常像,只是计算梯度的位置(x+a*v)不一样,所以可以把nesterov momentum看成是对标准的momentum的一个correction factor.

对于上式更新来说:theta <- theta + v == theta + alpha * v -step_size
此时的theta+alpha*v看做是未来的近似位置,所以算梯度时我们直接在未来的位置(前向位置)处计算就可以了. 所以Nesterov的核心就是在前向位置而不是原始的位置计算梯度.

更新公式:

直观上的理解就是:

Nesterov

Nesterov直接在前向位置(绿色箭头指向的位置)处更新梯度.

SGD with nesterov momentum

AdaGrad

是个学习率自适应的优化算法

individually adapts the learning rates of all model parameters by scaling them inversely proportional to the square root of the sum of all of their historical squared values.

对loss有很大贡献的parameter的学习率会下降的比较快:

The parameters with the largest partial derivative of the loss have a correspondingly rapid decrease in their learning rate, while parameters with small partial derivatives have a relatively small decrease in their learning rate.

经验表明:

the accumulation of squared gradients from the beginning of training can result in a premature and excessive decrease in the effective learning rate.

所以其实AdaGrad使用的也不是很多

RMSprop

RMSProp是从AdaGrad上修改来的,也是个自适应的算法,就是把gradient accumulation换成exponentially weighted moving average.

两者之间的区别:

  1. AdaGrad shrinks the learning rate according to the entire history of the squared gradient and may have made the learning rate too small before arriving at such a convex structure.
  2. RMSProp uses an exponentially decaying average to discard history from the extreme past so that it can converge rapidly after finding a convex bowl.

RMSProp with nesterov momentum

可以将nesterov momentum和RMSProp结合:

Adam

同样的也是个自适应学习率的优化算法,基本和SGD各占半边天.
可以把Adam看成是RMsProp+momentum的变体(存在几个主要的区别)
区别在于:

  1. First, in Adam, momentum is incorporated directly as an estimate of the first order moment (with exponential weighting) of the gradient.
  2. Second, Adam includes bias corrections to the estimates of both the first-order moments (the momentum term) and the (uncentered) second-order moments to account for their initialization at the origin.

算法如下所示:

总结

  1. 优化算法有一阶和二阶算法
  2. 常见优化算法的几乎都是一阶算法比如SGD ,Adam, AdaGrad, RMSProp等
  3. 二阶算法由于计算的代价等问题不常用,比如牛顿法, BFGS, L-BFGS等
  4. 最常用的一阶优化算法是SGD和Adam
2018-02-03 19:46:47 JNingWei 阅读数 815
  • C++开发环境搭建-第1部分第2课

    《跟朱老师从C高级到征服C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言完全学习。本课程可以看做是嵌入式linux核心课程中《C语言高级专题》课程的延续,在学好了C语言前提下继续深度学习C++语言。整个课程共分为5部分。涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制完成,总时长预计150-200小时。 朱老师C++第1部分-从C到C++ 朱老师C++第2部分-C++和面向对象 朱老师C++第3部分-STL等高阶话题 朱老师C++第4部分-Boost库和设计模式 朱老师C++第5部分-C++编程优化 课程特色 *完全零基础,降低学习门槛。 *深入浅出,通俗易懂。不怕学不会,就怕你不学习。 *思路清晰、语言风趣,对着视频看也不会想睡觉······ *视频 + 文档 + 练习题 + 答疑,全方位保证学习质量。 *基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。 *系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。

    46 人正在学习 去看看 朱有鹏

优化算法 类型

优化算法 类型 包括 一阶优化法 和 二阶优化法:

一阶优化法 二阶优化法
具体算法 随机梯度下降法、基于动量的随机梯度下降法、Nesterov型动量随机下降法、Adagrad法、Adadelta法、RMSProp法、Adam法 牛顿法
计算难度 较易
运用程度 主流 少有人用

一阶优化法 对比

随机梯度下降法 基于动量的随机梯度下降法 Nesterov型动量随机下降法 Adagrad法 Adadelta法 RMSProp法 Adam法
运用程度 最广
训练速度
模型结果 可靠 可靠

随机梯度下降法、基于动量的随机梯度下降法 和 Nesterov型动量随机下降法 彼此性能相近
Adagrad法、Adadelta法、RMSProp法 和 Adam法 彼此性能相近

一阶优化法

ω :待学习参数;
η :学习率;
g :一阶梯度值;
t :第t轮训练。

随机梯度下降法

随机梯度下降算法,Stochastic Gradient Descent,简称 SGD

ωtωt1ηg

基于动量的随机梯度下降法

由于SGD更新时可能出现 振荡 ,遂通过 累积前几轮的动量 (momentum) 信息辅助参数更新

vtμvt1ηg

ωtωt1+vt

μ :动量因子,控制动量信息对整体梯度更新的影响程度。设置方法分为 静态 (始终为 0.9) 和 动态 (初始为 0.5,逐渐增长为 0.9 或 0.99) 。

Nesterov型动量随机下降法

较罕见,遂略过。

Adagrad法

根据训练轮数的不同,对学习率进行动态调整:

ηtηglobalt=1tgt2+ϵgt

ηglobal :全局学习率 (必须提前指定) ;
ϵ :防止分母为0。

初始时,ηt 接近于 ηglobal ,随着 t=1tgt2 的不断增大,ηt 渐渐趋近于 0 。

Adadelta法

Adadelta法 在 Adagrad法 的 基础上,通过引入衰减因子 ρ ,使得 g 也和 ηglobal 一起来对 ηt 施加影响,防止 ηglobal 垄断:

rtρrt1+(1ρ)g2

ηtst1+ϵrt+ϵ

stρst1+(1ρ)(ηtg)2

ρ :衰减因子,取值范围 [0, 1] ,值越大越促进网络更新,推荐为 0.95
ϵ :防止为 0,推荐为 106

RMSProp法

较罕见,遂略过。

Adam法

在 RMSProp法 基础上 加上了 动量项

利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

优点:
经过偏置校正后,每一次迭代学习率都有一个确定范围,这样可以使得参数更新比较平稳。


[1] 解析卷积神经网络—深度学习实践手册

2020-03-05 09:09:14 weixin_42555985 阅读数 66
  • C++开发环境搭建-第1部分第2课

    《跟朱老师从C高级到征服C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言完全学习。本课程可以看做是嵌入式linux核心课程中《C语言高级专题》课程的延续,在学好了C语言前提下继续深度学习C++语言。整个课程共分为5部分。涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制完成,总时长预计150-200小时。 朱老师C++第1部分-从C到C++ 朱老师C++第2部分-C++和面向对象 朱老师C++第3部分-STL等高阶话题 朱老师C++第4部分-Boost库和设计模式 朱老师C++第5部分-C++编程优化 课程特色 *完全零基础,降低学习门槛。 *深入浅出,通俗易懂。不怕学不会,就怕你不学习。 *思路清晰、语言风趣,对着视频看也不会想睡觉······ *视频 + 文档 + 练习题 + 答疑,全方位保证学习质量。 *基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。 *系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。

    46 人正在学习 去看看 朱有鹏

第八章 深度学习中的优化

官网
python实现代码

2020-2-15 深度学习笔记8 - 深度学习中的优化1(与纯优化区别-基于梯度下降,神经网络优化-下降到足够小即可)
2020-2-16 深度学习笔记8 - 深度学习中的优化2(基本算法-梯度下降/动量,参数初始化策略)

自适应学习率算法(AdaGrad / RMSProp / Adam)

python实现参见https://blog.csdn.net/u012756814/article/details/79995133

目前最流行并且使用很高的优化算法包括SGD、具动量的SGD、RMSProp、具动量的RMSProp、AdaDelta和Adam。 此时,选择哪一个算法似乎主要取决于使用者对算法的熟悉程度(以便调节超参数)。

神经网络研究员早就意识到学习率肯定是难以设置的超参数【在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据】之一,因为它对模型的性能有显著的影响。

损失通常高度敏感于参数空间中的某些方向,而不敏感于其他。 动量算法可以在一定程度缓解这些问题,但这样做的代价是引入了另一个超参数。

如果我们相信方向敏感度在某种程度是轴对齐的,那么每个参数设置不同的学习率,在整个学习过程中自动适应这些学习率是有道理的。

更好的学习率参数一方面可以加速收敛,一方面可以减小训练误差,本文主要介绍:AdaGrad 、RMSProp、Adam。它们都是增量(或者基于小批量)的算法,自适应模型参数的学习率。

  • AdaGrad --梯度累加
    Wt+1=Wtηt+11t+1i=0t(gi)2dWt=Wtηi=0t(gi)2dWtW^{t+1}=W^t−\frac{\fracη{\sqrt{t+1}}}{\sqrt{\frac1{t+1}\sum^t_{i=0}(g^i)^2}}dW^t=W^t−\fracη{\sqrt{\sum^t_{i=0}(g^i)^2}}dW^t
    求和和开根号都是元素级别的

AdaGrad 为每个参数提供自适应的权重,如果某个梯度历史积累具有较大的梯度(调整已经比较大),那么给一个小的学习率(除以一个更大的值)。相反,如果某个梯度历史积累相对较小(调整不是很大),则给比较大的学习率,净效果是在较为平缓的方向取得比较大的进步,有助于逃离高原平台。但是从训练开始积累平方和可能会导致有效学习率过早和过量的减小。
在这里插入图片描述

  • RMSProp–指数加权移动平均(丢弃时间过久的历史)

RMSProp 修改了AdaGrad梯度累加的方式,采用指数加权移动平均(丢弃时间过久的历史),多了一个超参数β,用以控制移动平均的长度范围。

on iteration t:
​compute dW,db on the current mini-batch

Sdw=βSdw+(1β)(dWt)2S_{dw}=βS_{dw}+(1−β)(dW^t)^2

Sdb=βSdb+(1β)(dbt)2S_{db}=βS_{db}+(1−β)(db^t)^2

Wt+1=WtαdWtSdw+ϵW^{t+1}=W^t−α\frac{dW^t}{\sqrt{S_{dw}+ϵ}}

bt+1=WtαdbtSdb+ϵb^{t+1}=W^t−α\frac{db^t}{S_{db}+ϵ}
在这里插入图片描述

  • Adam-超参数β1(momentum) β2(RMSProp)

Adam可以认为是将动量算法和RMSProp结合起来使用,将动量替换RMSProp中的梯度,同时Adam对动量和指数加权均分都做了偏差修正,因此更加鲁棒,超参数β1(momentum) β2(RMSProp)。

on iteration t:
compute dW,db on the current mini-batch

vdw=β1vdw+(1β1)dWtv_{dw}=β_1v_{dw}+(1−β_1)dW^t

vdb=β1vdb+(1β1)dbtv_{db}=β_1v_{db}+(1−β_1)db^t

vdwcorrect=vdw1β1tv^{correct}_{dw}=\frac{v_{dw}}{1−β^t_1}

vdbcorrect=vdb1β1tv^{correct}_{db}=\frac{v_{db}}{1−β^t_1}

Sdw=β2Sdw+(1β2)(dWt)2S_{dw}=β_2S_{dw}+(1−β_2)(dW^t)^2

Sdb=β2Sdb+(1β2)(dbt)2S_{db}=β_2S_{db}+(1−β_2)(db^t)^2

Sdwcorrect=Sdw1β2tS^{correct}_{dw}=\frac {S_{dw}}{1−β^t_2}

Sdbcorrect=Sdb1β2tS^{correct}_{db}=\frac {S_{db}}{1−β^t_2}

Wt+1=WtαvdwcorrectSdwcorrect+ϵW^{t+1}=W^t−α\frac {v^{correct}_{dw}}{\sqrt{S^{correct}_{dw}+ϵ}}

bt+1=WtαvdbcorrectSdbcorrect+ϵb^{t+1}=W^t−α\frac {v^{correct}_{db}}{\sqrt{S^{correct}_{db}+ϵ}}
在这里插入图片描述

二阶近似方法(牛顿法 / 共轭梯度 / BFGS)

为表述简单起见,我们只考察目标函数为经验风险【机器学习模型关于训练数据集的平均损失称为经验风险】:J(θ)=Ex,yp^data(x,y)[L(f(x;θ),y)]=1mi=1mL(f(x(i);θ),y(i))J(\theta) = E_{x, y \sim \hat{p}{\text{data}}(x,y) } [ L(f(x; \theta), y) ] = \frac{1}{m} \sum_{i=1}^m L(f(x^{(i)}; \theta), y^{(i)})

与一阶方法相比,二阶方法使用二阶导数改进了优化。

  • 牛顿法–应用于神经网络的训练

牛顿法是基于二阶泰勒级数展开在某点θ0\theta_0附近来近似J(θ)J(\theta)的优化方法,其忽略了高阶导数:
J(θ)J(θ0)+(θθ0)θJ(θ0)+12(θθ0)H(θθ0)J(θ)≈J(θ_0)+(θ−θ_0)^⊤∇_θJ(θ_0)+\frac12(θ−θ_0)^⊤H(θ−θ_0)
其中HHJJ相对于θ\theta的Hessian矩阵在θ0\theta_0处的估计。
如果我们再求解这个函数的临界点,我们将得到牛顿参数更新规则:
θ=θ0H1θJ(θ0)θ^∗=θ_0−H^{−1}∇_θJ(θ_0)
牛顿法只适用于 Hessian 矩阵是正定的情况。在深度学习中,目标函数的表面通常非凸(有很多特征),如鞍点。因此使用牛顿法是有问题的。如果 Hessian 矩阵的特征值并不都是正的,例如,靠近鞍点处,牛顿法实际上会导致更新朝错误的方向移动。这种情况可以通过正则化 Hessian 矩阵来避免。
常用的正则化策略包括在 Hessian 矩阵对角线上增加常数α。正则化更新变为
θ=θ0[H(f(θ0))+αI]1θf(θ0)θ^∗=θ_0−[H(f(θ_0))+αI]−1∇_θf(θ_0)
在曲率方向更极端的情况下,α的值必须足够大,以抵消负特征值。然而,如果α持续增加,Hessian 矩阵会变得由对角矩阵αI主导,通过牛顿法所选择的方向会收敛到普通梯度除以α。当很强的负曲率存在时,α可能需要特别大,以致于牛顿法比选择合适学习率的梯度下降的步长更小。

除了目标函数的某些特征带来的挑战,如鞍点,牛顿法用于训练大型神经网络还受限于其显著的计算负担。Hessian 矩阵中元素数目是参数数量的平方,因此,如果参数数目为k(甚至是在非常小的神经网络中k也可能是百万级别),牛顿法需要计算k × k矩阵的逆,计算复杂度为O(k3)O(k^3)。另外,由于参数将每次更新都会改变,每次训练迭代都需要计算 Hessian 矩阵的逆。其结果是,只有参数很少的网络才能在实际中用牛顿法训练。

  • 共轭梯度–避免 Hessian 矩阵求逆(牛顿法的缺陷)

共轭梯度是一种通过迭代下降的共轭方向(conjugate directions)以有效避免 Hessian 矩阵求逆计算的方法。

这种方法的灵感来自于对最速下降方法弱点的仔细研究,其中线搜索迭代地用于与梯度相关的方向上(根据几个ϵ计算f(x − ϵ∇x f (x)),并选择其中能产生最小目标函数值的ϵ。这种策略被称为线搜索)。实际上,每一个由梯度给定的线搜索方向,都保证正交于上一个线搜索方向(假设上一个搜索方向是dt1d_{t−1}。在极小值处,线搜索终止,方向d_{t−1}处的方向导数为零:θJ(θ)dt1=0\nabla_{\boldsymbol{\theta}} J(\boldsymbol{\theta}) \cdot \boldsymbol{d}_{t-1}=0。因为该点的梯度定义了当前的搜索方向,dt=θJ(θ)d_t =∇_θ J(θ)将不会贡献于方向dt1d_{t−1}。因此方向dtd_t正交于dt1d_{t−1})。这产生了锯齿形的过程:
在这里插入图片描述
通过遵循每次线搜索结束时的梯度,我们在某种程度上撤销了在之前线搜索的方向上取得的进展。在共轭梯度法中,我们寻求一个和先前线搜索方向共轭(conjugate)的搜索方向,即它不会撤销该方向上的进展。在训练迭代t时,下一步的搜索方向d_t的形式如下:

dt=θJ(θ)+βtdt1\boldsymbol{d}_{t}=\nabla_{\boldsymbol{\theta}} J(\boldsymbol{\theta})+\beta_{t} \boldsymbol{d}_{t-1}

系数βtβ_t的大小控制我们应沿方向dt1d_{t−1}加回多少到当前搜索方向上。

如果dtTHdt1=0d_t^T H d_{t-1} = 0,其中HH是Hessian矩阵,则两个方向dtd_tdt1d_{t-1}被称为共轭的。

两种用于计算βtβ_t的流行方法是:
【Fletcher-Reeves】βt=θJ(θt)θJ(θt)θJ(θt1)θJ(θt1)β_t=\frac{∇_θJ(θ_t)^⊤∇_θJ(θ_t)}{∇_θJ(θ_{t−1})^⊤∇_θJ(θ_{t−1})}
【Polak-Ribi`{e}re】βt=(θJ(θt)θJ(θt1))θJ(θt)θJ(θt1)θJ(θt1)β_t=\frac{(∇_θJ(θ_t)−∇_θJ(θ_{t−1}))^⊤∇_θJ(θ_t)}{∇_θJ(θ_{t−1})^⊤∇_θJ(θ_{t−1})}
在这里插入图片描述

  • BFGS–拟牛顿法(使用矩阵MtM_t近似逆)

Broyden-Fletcher-Goldfarb-Shanno(BFGS)算法具有牛顿法的一些优点,但没有牛顿法的计算负担。拟牛顿法所采用的方法(BFGS 是其中最突出的)是使用矩阵MtM_t近似逆,迭代地低秩更新精度以更好地近似H1H^{-1}

当Hessian逆近似MtM_t更新时,下降方向ρt\rho_tρt=Mtgt\rho_t = M_t g_t。 该方向上的线搜索用于决定该方向上的步长ϵ\epsilon^*。 参数的最后更新为: θt+1=θt+ϵρt\theta_{t+1} = \theta_t + \epsilon^* \rho_t
和共轭梯度法相似,BFGS算法迭代一系列线搜索,其方向含二阶信息。

然而和共轭梯度不同的是,该方法的成功并不严重依赖于线搜索寻找该方向上和真正极小值很近的一点。因此,相比于共轭梯度,BFGS的优点是其花费较少的时间改进每个线搜索。在另一方面,BFGS算法必须存储Hessian逆矩阵M,需要O(n2)O(n^2)的存储空间,使BFGS不适用于大多数具有百万级参数的现代深度学习模型。

2019-07-08 16:26:58 m0_38097757 阅读数 317
  • C++开发环境搭建-第1部分第2课

    《跟朱老师从C高级到征服C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言完全学习。本课程可以看做是嵌入式linux核心课程中《C语言高级专题》课程的延续,在学好了C语言前提下继续深度学习C++语言。整个课程共分为5部分。涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制完成,总时长预计150-200小时。 朱老师C++第1部分-从C到C++ 朱老师C++第2部分-C++和面向对象 朱老师C++第3部分-STL等高阶话题 朱老师C++第4部分-Boost库和设计模式 朱老师C++第5部分-C++编程优化 课程特色 *完全零基础,降低学习门槛。 *深入浅出,通俗易懂。不怕学不会,就怕你不学习。 *思路清晰、语言风趣,对着视频看也不会想睡觉······ *视频 + 文档 + 练习题 + 答疑,全方位保证学习质量。 *基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。 *系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。

    46 人正在学习 去看看 朱有鹏

a. 牛顿法使用的是目标函数的二阶导数,在高维情况下这个矩阵非常大,计算和存储都是问题。

b. 在小批量的情况下,牛顿法对于二阶导数的估计噪声太大。

c.目标函数非凸的时候,牛顿法容易受到鞍点或者最大值点的吸引。

最大的问题就是计算复杂度。二阶一次迭代更新的复杂度是n*n,这在高维的时候是不可行的
稳定性。越简单的东西往往越robust,对于优化算法也是这样。
二阶求导不易
二阶方法能够更快地求得更高精度的解,但是在神经网络这类深层模型中,不高的精度对模型还有益处,能够提高模型的泛化能力。
 

没有更多推荐了,返回首页