神经网络中的各种优化方法

神经网络中的各种优化方法

大家耳熟能详的优化方法有梯度下降法(Gradient Descent)、随机梯度下降法(Stochastic Gradient Descent)、Adam方法等等。虽然很多听过甚至用过这些方法,但是却未必能够说出他们的区别,已经什么时候改用什么样的优化算法。这篇文章将会从原理、区别和使用场景等角度详细介绍神经网络中的各种优化算法。

什么是优化算法

优化算法就是一种能够帮我们最小化或者最大化目标函数(有时候也叫损失函数)的一类算法。而目标函数往往是模型参数和数据的数学组合。例如给定数据 X X X和其对应的标签 Y Y Y,我们构建的模型是一个线性模型 f ( x ) = W x + b f(x)=Wx+b f(x)=Wx+b,有了模型后,根据输入 x x x就可以得到预测输出 f ( x ) f(x) f(x),并且可以计算出预测值和真实值之间的差距 ( f ( x ) − Y ) 2 \left (f(x)-Y\right)^2 (f(x)Y)2,这个就是损失函数。我们的目的是找到合适的 W , b W, b W,b时上述的损失函数的值达到最小,损失值越小,则说明我们的模型越接近于真实情况。

通过上面的描述可以知道,模型的内参( W , b W, b W,b) 在模型中扮演着非常重要的角色,而这些内参的更新和优化就用到我们所说的优化算法,所以优化算法也层出不穷,而一个好的优化算法往往能够更加高效、更加准确的训练模型的内参。

优化算法的种类

一般的,根据优化算法在优化过程中使用的导数阶数。可以将优化算法可以分为两大类,一阶优化算法和二阶优化算法。

1、 一阶优化算法

一阶优化算法是指使用参数梯度值来最小化或者最大化损失函数的优化算法。最为广泛应用的就是梯度下降法,参数的一阶导能够清晰的告诉我们损失函数在某个特定点上是增加的还是减少的。那什么是梯度呢?简而言之,梯度就是函数输出关于输的偏导数,只不过这里的输入和输出并不是简单的数值,而是向量。梯度与导数的区别就是导数是单个变量的,而梯度是多个变量的。梯度往往采用雅克比矩阵(Jacobian Matrix)进行表达。

2、二阶优化算法

顾名思义,二阶优化算法就是采用二阶导数进行优化算法。二阶导数,有时候也被成为海森矩阵(Hessian)。因为二阶导数要求两次导数,尤其是在矩阵中进行求导,运算量会非常的大,所以二阶优化算法被用的比较少。

各种梯度下降法

1、Gradient Descent

梯度下降法是最重要的一种方法,也是很多其他优化算法的基础。

θ = θ − η Δ J ( θ ) \theta = \theta-\eta\Delta J(\theta) θ=θηΔJ(θ)

上面的公式就是梯度下降法的基本形式,其中 η \eta η 是学习率 Δ J ( θ ) \Delta J(\theta) ΔJ(θ) 是损失函数 J ( θ ) J(\theta) J(θ) 关于模型参数 θ \theta θ 的梯度。

这里的损失函数 J ( θ ) J(\theta) J(θ) 是在整个数据集上进行计算得到的。

因为这里的损失函数是在整个数据集上进行计算得到的均值,所以每更新一次模型参数,就要对整个数据集进行一个计算,可想而知这样非常的慢,并且当数据集变得非常大的时候,如此多的数据没法都load到内存中。

特点:

对于凸目标函数,肯定可以找到全局最优,对于非凸目标函数,可以找到局部最优

每次更新都对整个数据集进行计算,计算量大

2、随机梯度下降法(Stochastic Gradient Descent)

θ = θ − η Δ J ( θ ; x i , y i ) \theta = \theta - \eta \Delta J(\theta; x_i, y_i) θ=θηΔJ(θ;xi,yi)

随机梯度下降法和梯度下降法其实是走的两个极端,梯度下降法是每次更新都计算整个数据集的loss,而随机梯度下降法每次更新都只用了一对样本,即上面公式中的一对样本 ( x i , y i ) (x_i, y_i) (xi,yi)。由于每个样本都会对模型进行更新,所以模型更新的特别频繁,参数就会变成高方差,损失函数的波动也会有很大强度的变化。有时候,这是好事,因为这样的可以帮助我们探索新的更新方向,找到更加好的局部极值点。但是,由于频繁的更新和波动,会导致模型的损失收敛的非常不稳定。

上图就是随机梯度下降法更新过程中loss值的变化,可以发现loss值的变化非常大,这就是模型超调了,整个模型比较不稳定。

特点:

每次只用一个样本进行更新,计算量小,更新频率高

容易导致模型超调不稳定,收敛也不稳定

3、Mini Batch Gradient Descent

mini batch 梯度下降法是梯度下降法和随机梯度下降法的折衷,即在计算loss的时候,既不是直接计算整个数据集的loss,也不是只计算一个样本的loss,而是计算一个batch的loss,batch的大小自己设定。

θ = θ − η ∗ 1 B ∑ i = 1 B J ( θ ; x i , y i ) \theta = \theta - \eta * \frac{1}{B}\sum_{i=1}^B J(\theta; x_i, y_i) θ=θηB1i=1BJ(θ;xi,yi)

其中B就是自己设定的batch size的大小。

特点:
每次更新模型时,采用一部分数据进行计算
现在几乎在所有的深度学习应用中,都使用的是mini batch梯度下降法
正是因为使用广泛,所以很多深度学习的库和框架都对这方面的矩阵操作进行了特别优化

梯度下降法面临的挑战:

Challenges:

1、很难选择一个合适学习率,需要我们大量的尝试。太小的学习率会导致模型收敛变

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值