优化函数的基本理解

基本概念

导数

设函数 y = f ( x ) y=f(x) y=f(x)在点 x 0 x_0 x0的某个领域内有定义,当自变量 x x x x 0 x_0 x0有增量 Δ x Δx Δx ( x + Δ x ) (x+Δx) (x+Δx)也在该邻域内时,相应的函数取得增量 Δ y = f ( x 0 + Δ x ) − f ( x 0 ) Δy=f(x_0+Δx) - f(x_0) Δy=f(x0+Δx)f(x0);当 Δ x → 0 \Delta{x}\to0 Δx0时, Δ y \Delta{y} Δy Δ x \Delta{x} Δx之比存在,则称函数 y = f ( x ) y=f(x) y=f(x)在点 x 0 {x}_0 x0处可导,并称这个极限为函数 y = f ( x ) y=f(x) y=f(x)在点 x 0 {x}_0 x0处的导数记为 f ′ ( x 0 ) {f}'({x}_0) f(x0)
f ′ ( x 0 ) = lim ⁡ x 0 → 0 Δ y Δ x = lim ⁡ x 0 → 0 f ( x + Δ x − f ( x ) Δ x f'({x}_0)=\lim_{x_0\to0}\frac{\Delta{y}}{\Delta{x}}=\lim_{x_0\to0}\frac{f(x+\Delta{x}-f(x)}{\Delta{x}} f(x0)=limx00ΔxΔy=limx00Δxf(x+Δxf(x)

偏导数

多元函数下,导数与偏导数本质是一致的,都是当自变量的变化趋近于0时,函数值的变化量自变量变化量比值的极限。
简单来说,导数,指的是一元函数中,函数 y = f ( x ) y=f(x) y=f(x)在某点处沿x轴正方向的变化率;偏导数,指的是多元函数中,函数 y = f ( x 0 , x 1 , . . . x n ) y=f({x}_0, {x}_1,...{x}_n) y=f(x0,x1,...xn)在某点处沿着 ( x 0 , x 1 , . . . x n ) ({x}_0, {x}_1,...{x}_n) (x0,x1,...xn)中某一坐标轴正方向上的变化率
α α x j f ( x 0 , x 1 , . . . x n ) = lim ⁡ Δ x → 0 Δ y Δ x = lim ⁡ Δ x → 0 f ( x 0 , . . . , x j + Δ x j , . . . , x n ) − f ( x 0 , . . . x j , . . . , x n ) Δ x \frac{\alpha}{\alpha{x_j}}{f({x}_0, {x}_1,...{x}_n)} = \lim_{\Delta{x\to0}}\frac{\Delta{y}}{\Delta{x}} = \lim_{\Delta{x\to0}}{\frac{f(x_0,...,{x}_j + \Delta{x_j},...,x_n ) - f(x_0, ...x_j, ..., x_n)}{\Delta{x}}} αxjαf(x0,x1,...xn)=limΔx0ΔxΔy=limΔx0Δxf(x0,...,xj+Δxj,...,xn)f(x0,...xj,...,xn)

方向导数

导数和偏导数,都是沿着坐标轴正方向讨论函数的变化率。当我们沿着函数在某点处的任意方向上考虑变化率时,便引出了方向导数的定义。
在多元函数中,偏导数针对的是某个坐标轴上自变量发生了变化,方向导数则针对的是某个方向,多个坐标轴上自变量发生了变化。偏导数本质属于方向导数的一种特殊情况
α α l f ( x 0 , x 1 , . . . x n ) = lim ⁡ ρ → 0 Δ y Δ x = lim ⁡ ρ → 0 f ( x 0 + Δ x 0 , . . . , x j + Δ x j , . . . , x n + Δ x n ) − f ( x 0 , . . . x j , . . . , x n ) ρ \frac{\alpha}{\alpha{l}}{f({x}_0, {x}_1,...{x}_n)} = \lim_{ {\rho\to0}}\frac{\Delta{y}}{\Delta{x}} = \lim_{ {\rho\to0}}{\frac{f(x_0+\Delta{x_0},...,{x}_j + \Delta{x_j},...,x_n + \Delta{x_n})- f(x_0, ...x_j, ..., x_n)}{\rho}} αlαf(x0,x1,...xn)=limρ0ΔxΔy=limρ0ρf(x0+Δx0,...,xj+Δxj,...,xn+Δxn)f(x0,...xj,...,xn)
其中 ρ = ( Δ x 0 2 ) + . . . + ( Δ x j 2 ) + . . . + ( Δ x n 2 ) \rho = \sqrt{(\Delta{x_0}^2)+ ... +(\Delta{x_j}^2)+...+(\Delta{x_n}^2)} ρ=(Δx02)+...+(Δxj2)+...+(Δxn2)

梯度

梯度,本意是一个向量,表示函数在该点处的方向导数沿着该方向取得最大值,即在某点处所有方向导数最大对应的方向,函数在该点处沿着该方向变化最快,变化率最大。
image.png
g r a d f ( x 0 , . . . , x j , . . . x n ) = ( α f α x 0 , . . . α f α x j , . . . , α f α x n ) gradf(x_0, ..., x_j,... x_n)=(\frac{\alpha{f}}{\alpha{x_0}}, ...\frac{\alpha{f}}{\alpha{x_j}}, ..., \frac{\alpha{f}}{\alpha{x_n}}) gradf(x0,...,xj,...xn)=(αx0αf,...αxjαf,...,αxnαf)

方向导数与梯度的关系

在二元函数下,方向导数可以表示如下:
α f α l = α f α x ∗ c o s θ + α f α y ∗ s i n θ \frac{\alpha{f}}{\alpha{l}} = \frac{\alpha{f}}{\alpha{x}}*cos\theta + \frac{\alpha{f}}{\alpha{y}}*sin\theta αlαf=αxαfcosθ+αyαfsinθ
其中 θ \theta θ表示为方向向量与x轴之间的夹角。我们可以将上式子转换为两个向量的内积,表示如下:
α f α l = [ α f α x , α f α y ] ∗ [ c o s θ , s i n θ ] \frac{\alpha{f}}{\alpha{l}} = [\frac{\alpha{f}}{\alpha{x}}, \frac{\alpha{f}}{\alpha{y}}] * [cos\theta, sin\theta] αlαf=[αxαf,αyαf][cosθ,sinθ]
两个向量的内积可以表示为两个向量的模相乘,再乘以它们之间的夹角,表示如下:
α f α l = α f α x 2 + α f α y 2 ∗ c o s θ 2 + s i n θ 2 ∗ c o s φ = α f α x 2 + α f α y 2 ∗ 1 ∗ c o s φ \frac{\alpha{f}}{\alpha{l}} = \sqrt{\frac{\alpha{f}}{\alpha{x}}^2 + \frac{\alpha{f}}{\alpha{y}}^2} *\sqrt{ {cos\theta}^2 + {sin\theta}^2} * cos\varphi = \sqrt{\frac{\alpha{f}}{\alpha{x}}^2 + \frac{\alpha{f}}{\alpha{y}}^2} * 1 * cos\varphi αlαf=αxαf2+αyαf2 cosθ2+sinθ2 cosφ=αxαf2+αyαf2 1cosφ
根据向量内积的几何意义,可知 φ \varphi φ为两个向量之间的夹角,即梯度与某个方向之间的夹角。当且仅当,该方向与梯度之间的夹角为0时,方向导数取得最大值。也即函数中某点方向导数最大对应的方向,也就是梯度的方向

如何理解梯度下降法

简单来说,在神经网络中,梯度下降法是一种寻找损失函数最小化的方法。

直观版本

梯度下降法

以最简单的一元凸函数 f ( x ) = x 2 f(x)=x^2 f(x)=x2为例,演示梯度下降法是如何找到函数最小值的。
假设起点 x 0 = 10 x_0=10 x0=10,类比神经网络权重初始化后的初值,如下图所示:
image.png
f ( x 0 ) f(x_0) f(x0)对应的梯度为:
g r a d ( f ( x 0 ) ) = α f α x i = f ′ ( x 0 ) = ( 2 x ∣ x 0 = 10 ) = 20 grad(f(x_0))=\frac{\alpha{f}}{\alpha{x}}i=f'(x_0)=(2x{|}_{x_0=10})=20 grad(f(x0))=αxαfi=f(x0)=(2xx0=10)=20
对应的 x x x轴上的向量, Δ f ( x ) \Delta{f(x)} Δf(x)是函数增长最快的方向,则 − Δ f ( x ) -\Delta{f(x)} Δf(x)是函数衰减最快的方向:
image.png
按照梯度下降法,移动一段距离,可得下一个位置:
x 1 = x 0 − η Δ f ( x 0 ) x_1 = x_0 - \eta{\Delta{f(x_0)}} x1=x0ηΔf(x0)
其中, η \eta η为步长,通过其可以控制移动的距离,假设 η = 0.1 \eta=0.1 η=0.1,则下一个点的位置为:
x 1 = x 0 − η Δ f ( x 0 ) = 10 − 0.1 ∗ 20 = 8 x_1 = x_0 - \eta{\Delta{f(x_0)}} = 10 - 0.1 * 20 = 8 x1=x0ηΔf(x0)=100.120=8
image.png
使用梯度下降法不断迭代,可以得到如下更新过程:
image.png
不断重复梯度下降过程,可以看到梯度值 Δ ( f ( x ) \Delta(f(x) Δ(f(x)是不断减少的,最终趋近于0,此时 Δ f ( x ) = f ′ ( x ) = 0 \Delta{f(x)} = f'(x)=0 Δf(x)=f(x)=0,函数取得最小值。

学习步长

在上述的计算过程中,使用学习步长 η \eta η来控制移动距离,现在来观察不同 η \eta η对最终结果的影响。

  1. η \eta η过小

η \eta η为0.01,迭代10次,可以看到距离底部还有很大一段距离。
0.01.png

  1. η \eta η合适

η \eta η为0.2,迭代10次,可以看到正好抵达底部。
0.2.png

  1. η \eta η较大

η \eta η为0.5,迭代10次,可以看到函数值在两个点之间摆荡。
0.5.png

  1. η \eta η过大

η \eta η为1.1,迭代10次,此时函数值越过底部,不断上升。
1.1.png
综上,可以在不同学习步长 η \eta η下,随着迭代次数增加,函数值的变化规律不同。

数学版本

梯度下降法是一种常用的一阶优化方法,用于求解无约束问题最简单、经典方法之一。对于一个无约束优化问题 m i n f ( x ) minf(x) minf(x),其中 f ( x ) f(x) f(x)是一个连续可微函数,对于一个集合 x 0 , x 1 , . . . x n {x_0, x_1,...x_n} x0,x1,...xn,满足:
f ( x t + 1 ) < f ( x t ) , t = 0 , 1 , . . . n f(x_{t+1}) < f(x_t), t=0,1,...n f(xt+1)<f(xt),t=0,1,...n
那么就可以收敛到局部极小值点,如下图所示:
image.png
那么 m i n f ( x ) minf(x) minf(x)就变成了如何找到下一个点 x t + 1 x_{t+1} xt+1,并且保证 f ( x t + 1 ) < f ( x t ) f(x_{t+1}) < f(x_t) f(xt+1)<f(xt)。对于一元函数,函数值只会随着 x x x值变化而变化,因此下一个 x t + 1 x_{t+1} xt+1是上一个 x t x_t xt沿着某个方向走了一小步 Δ x \Delta{x} Δx得到的。
由泰勒展开式:
f ( x + Δ x ) ≃ f ( x ) + Δ x f ′ ( x ) f(x+\Delta{x})\simeq{f(x)+\Delta{x}f'(x)} f(x+Δx)f(x)+Δxf(x)
式子坐标是当前的 x x x移动一小步 Δ x \Delta{x} Δx得到的,近似等于右边。由于需要保证 f ( x t + 1 ) < f ( x t ) f(x_{t+1}) < f(x_t) f(xt+1)<f(xt),即 f ( x + Δ x ) < f ( x ) f(x+\Delta{x})<f(x) f(x+Δx)<f(x),则 Δ x f ′ ( x ) < 0 \Delta{x}f'(x) <0 Δxf(x)<0.
假设 Δ x = − α f ′ ( x ) , ( α > 0 ) \Delta{x} = -\alpha{f'(x)}, (\alpha>0) Δx=αf(x),(α>0),其中 α \alpha α是学习步长,从而 Δ x f ′ ( x ) = − α f ′ ( x ) 2 \Delta{x}f'(x)=-\alpha{ {f'(x)}^2} Δxf(x)=αf(x)2。由于任何不为0的数的平方均大于0,因此可以保证 Δ x f ′ ( x ) < 0 \Delta{x}f'(x)<0 Δxf(x)<0
从而,设定
f ( x + Δ x ) = f ( x − α f ′ ( x ) ) f(x+\Delta{x}) = f(x -\alpha{f'(x)}) f(x+Δx)=f(xαf(x))
即可保证 f ( x + Δ x ) < f ( x ) f(x+\Delta{x})<f(x) f(x+Δx)<f(x)也即 x t + 1 = x t − α f ′ ( x ) x_{t+1}=x_t-\alpha{f'(x)} xt+1=xtαf(x),移动方向为负梯度方向
梯度下降法的整体流程如下图所示:

优化函数

随机梯度下降法

随机梯度下降法,每次通过选择单个样本数据,对权重参数进行更新。
优点:

  • 训练速度快,避免了批量梯度更新过程中的计算冗余问题;
  • 当训练数据量比较大,也能以较快的速度收敛;

缺点:

  • 由于每次样本都是随机抽样,导致模型训练完,可能只用到样本中的小部分,使得得到的梯度存在偏差;
  • 此外,具有较高的方差,波动较大

批量梯度下降法

批量随机梯度下降法,每次需要遍历全部样本数据,来更新权重参数。
优点:

  • 由于遍历了完整数据集,使得结果为全局最小值;

缺点:

  • 模型训练速度慢,当数据量较大时,无法全部加载到内存中,且梯度计算复杂度较大;

mini-batch梯度下降法

每次迭代时考虑一小部分样本数据,来对权值参数进行更新。
优点:

  • 降低SGD中高方差的问题,使得模型收敛更加稳定;
  • 矩阵相乘,能加快计算速度;

缺点:

  • 同样存在样本选择的随机性,并不能保证模型有好的收敛性;

指数加权平均法

在介绍后续多个优化函数之前,需要理解指数加权平均法,其本质是一个类似求平均数的方法。指数加权平均法可以用于估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关,其中各观察值分别给予不同的权数,其加权系数随着时间呈指数式递减
指数加权平均法与平均法相比,不需要保存过去所有的数值,计算量显著减少。
指数加权平均法的公式如下:
v t + 1 = β v t + ( 1 − β ) θ t + 1 v_{t+1} = \beta{v_t} + (1-\beta)\theta_{t+1} vt+1=βvt+(1β)θt+1
其中 v t + 1 v_{t+1} vt+1代表到第 t + 1 t+1 t+1的平均值, θ t + 1 \theta_{t+1} θt+1表示第 t + 1 t+1 t+1天的温度值, β \beta β是可调节的超参数。下面分别验证指数加权平均法的三个重要属性:

  • 局部平均
  • 加权系数
  • 系数随着时间指数递减

假设 β = 0.9 \beta=0.9 β=0.9,那么可以得到指数加权平均法求平均值的过程如下:
v 100 = 0.9 v 99 + 0.1 θ 100 ; v_{100} = 0.9v_{99} + 0.1\theta_{100}; v100=0.9v99+0.1θ100;
v 99 = 0.9 v 98 + 0.1 θ 99 ; v_{99} = 0.9v_{98} + 0.1\theta_{99}; v99=0.9v98+0.1θ99;
v 98 = 0.9 v 97 + 0.1 θ 98 ; v_{98} = 0.9v_{97} + 0.1\theta_{98}; v98=0.9v97+0.1θ98;
对上述公式化简得到如下表达式:
v 100 = 0.1 θ 100 + 0.9 v 99 v_{100} = 0.1\theta_{100} + 0.9v_{99} v100=0.1θ100+0.9v99
= 0.1 θ 100 + 0.9 ∗ ( 0.1 θ 99 + 0.9 v 98 ) = 0.1 θ 100 + 0.1 ∗ 0.9 θ 99 + 0.9 2 ∗ ( 0.1 θ 98 + 0.9 v 97 ) = 0.1\theta_{100} + 0.9*(0.1\theta_{99} + 0.9v_{98}) = 0.1\theta_{100} + 0.1 * 0.9 \theta_{99} + {0.9}^2* (0.1\theta_{98} + 0.9v_{97} ) =0.1θ100+0.9(0.1θ99+0.9v98)=0.1θ100+0.10.9θ99+0.92(0.1θ98+0.9v97)
= 0.1 θ 100 + 0.1 ∗ 0.9 θ 99 + 0.1 ∗ 0.9 2 θ 98 + 0.9 3 v 97 = 0.1\theta_{100} + 0.1 * 0.9 \theta_{99} + 0.1 * {0.9}^2 \theta_{98} + {0.9}^3 v_{97} =0.1θ100+0.10.9θ99+0.10.92θ98+0.93v97

通过上述表达式,可以看到, v 100 v_{100} v100等于每个观察值再乘以一个权值,同时权值随着时间呈指数式递减。还有一点就是指数加权平均法求得的平均数是一个局部平均值,那到底平均了多少个观察值,大致是 1 1 − β \frac{1}{1-\beta} 1β1个,本例中 β = 0.9 \beta=0.9 β=0.9,则参考了10个观察值。
为了让平均数运算更加准确,需要对指数加权平均进行偏差修正。下面通过一个例子介绍为什么需要进行偏差修公正,假设 β = 0.98 \beta=0.98 β=0.98,初始化 v 0 = 0 v_0=0 v0=0 θ 1 = 40 \theta_1=40 θ1=40。那么
v 1 = β v 0 + ( 1 − β ) θ t = 0.98 ∗ v 0 + 0.02 θ t = 0.02 θ t = 8 v_1=\beta{v_0}+(1-\beta)\theta_t=0.98*v_0+0.02\theta_t=0.02\theta_t=8 v1=βv0+(1β)θt=0.98v0+0.02θt=0.02θt=8
所以第一天的估测值不准, v 2 = 0.98 v 1 + 0.02 θ 2 = 0.02 ∗ 0.98 ∗ θ 1 + 0.02 θ 2 v_2=0.98v_1+0.02\theta_2 = 0.02*0.98*\theta_1 + 0.02\theta_2 v2=0.98v1+0.02θ2=0.020.98θ1+0.02θ2,由于 θ 1 \theta_1 θ1 θ 2 \theta_2 θ2都是整数,因此计算后的 v 2 v_2 v2要远小于 θ 1 \theta_1 θ1 θ 2 \theta_2 θ2
针对早期估测值不准的情况,使用 v t 1 − β t \frac{v_t}{1-\beta^t} 1βtvt表示当天的值,其中 t t t表示天数,因此第二天的估测值为:
v 2 0.0396 \frac{v_2}{0.0396} 0.0396v2
随着 t t t值增加, β t \beta_t βt接近于0,所以当 t t t很大时,偏差修正几乎没有作用。

Momentum梯度下降法

动量梯度下降法的基本想法是计算梯度的指数加权平均数,并利用该梯度来更新权重。
对于mini-batch梯度下降法由于采样的随机性,使得每次下降并不都是严格朝最小方向下降,但是总体下降趋势是朝着最小方向的。
image.png
动量梯度下降法则是为了减少摆动的幅度,提高学习速度。
image.png
动量梯度下降法的表达式如下:
v d w = β v d w + ( 1 − β ) d W v_{dw} = \beta{v_{dw}} + (1-\beta)dW vdw=βvdw+(1β)dW
v d b = β v d b + ( 1 − β ) d b v_{db} = \beta{v_{db}} + (1-\beta)db vdb=βvdb+(1β)db
W = W − α v d w ; b = b − α v d b W= W-\alpha{v_{dw}};b = b-\alpha{v_{db}} W=Wαvdw;b=bαvdb
使用指数加权平均法求得局部的梯度平均值,代替原来单iteration的梯度值进行参数更新。其借用了物理中动量的概念,把参数优化想象成将球从山上推下来的任务,梯度值类似球的加速度,当前后梯度方向一致时,能加速学习,前后梯度方向不一致时,会抑制波动

RMSprop

动量优化算法,虽然初步解决了参数优化过程中摆动幅度大的问题,所谓摆动幅度指的是优化后更新之后参数的变化范围,如下图所示,蓝色的为Momentum优化算法所走的路线,绿色为RMSprop优化算法所走的路线。
image.png
RMSprop的表达式如下:
S d w = β S d w + ( 1 − β ) ( d W ) 2 S_{dw} = \beta{S_{dw}} + (1-\beta)(dW)^2 Sdw=βSdw+(1β)(dW)2
S d b = β S d b + ( 1 − β ) ( d b ) 2 S_{db} = \beta{S_{db}} + (1-\beta)(db)^2 Sdb=βSdb+(1β)(db)2
W = W − α d W S d w ; b = b − α d b S d b W=W-\alpha{\frac{dW}{\sqrt{S_{dw}}}};b=b-\alpha{\frac{db}{\sqrt{S_{db}}}} W=WαSdw dW;b=bαSdb db
RMSprop梯度下降法首先使用指数加权平均法求得梯度平方的加权平均数,然后使用梯度比上加权平均数的平方根来更新权重参数
RMSprop算法对梯度计算了微分平方加权平均数。这种做法有利于消除摆动幅度大的方向(当dW和db中有一个值比较大的时候,那么在更新权重或者偏置的时候除以它之前累积的梯度的平方根,更新幅值就会变小),用来修正摆动幅度,使得各个维度的摆动幅度都较小,另一方面使得网络的收敛更快。

Adam

Adam优化算法基本上就是将RMSprop和Momentum结合再一起,具体计算过程如下:

  1. 计算梯度 d W , d b dW,db dW,db;
  2. 计算动量的指数加权平均数 v d w = β 1 v d w + ( 1 − β 1 ) d W v_{dw} = \beta_1{v_{dw}} + (1-\beta_1)dW vdw=β1vdw+(1β1)dW v d b = β v d b + ( 1 − β ) d b v_{db} = \beta{v_{db}} + (1-\beta)db vdb=βvdb+(1β)db;
  3. 使用RMSprop进行更新, S d w = β 2 3 S d w + ( 1 − β 2 ) ( d W ) 2 S_{dw} = \beta_23{S_{dw}} + (1-\beta_2)(dW)^2 Sdw=β23Sdw+(1β2)(dW)2 S d b = β S d b + ( 1 − β ) ( d b ) 2 S_{db} = \beta{S_{db}} + (1-\beta)(db)^2 Sdb=βSdb+(1β)(db)2
  4. 进行偏差修正, v d W c o r r e c t e d = v d W 1 − β 1 t , v d b c o r r e c t e d = v d b 1 − β 1 t , S d W c o r r e c t e d = S d W 1 − β 2 t , S d b c o r r e c t e d = S d b 1 − β 2 t v_{dW}^{corrected} = \frac{v_{dW}}{1-\beta_1^t},v_{db}^{corrected} = \frac{v_{db}}{1-\beta_1^t},S_{dW}^{corrected}=\frac{S_{dW}}{1-\beta_2^t},S_{db}^{corrected}=\frac{S_{db}}{1-\beta_2^t} vdWcorrected=1β1tvdW,vdbcorrected=1β1tvdb,SdWcorrected=1β2tSdW,Sdbcorrected=1β2tSdb;
  5. 进行权值更新, W = W − α v d W c o r r e c t e d S d W c o r r e c t e d + ϵ , b = b − α v d b c o r r e c t e d S d b c o r r e c t e d + ϵ W=W-\alpha{\frac{v_{dW}^{corrected}}{\sqrt{S_{dW}^{corrected}}+\epsilon}},b=b-\alpha{\frac{v_{db}^{corrected}}{\sqrt{S_{db}^{corrected}}+\epsilon}} W=WαSdWcorrected +ϵvdWcorrected,b=bαSdbcorrected +ϵvdbcorrected

Adam算法结合了RMSprop和Momentum,是一种极其常用的学习算法,适用于不同神经网络。

参考链接:

https://blog.csdn.net/wo164683812/article/details/90382330
https://www.zhihu.com/question/36301367
https://blog.csdn.net/weixin_44492824/article/details/122270260
https://www.zhihu.com/question/305638940/answer/1639782992
https://www.zhihu.com/question/305638940/answer/606831354
https://zhuanlan.zhihu.com/p/36564434

猜你喜欢

转载自blog.csdn.net/hello_dear_you/article/details/128992906
今日推荐