[3]数值计算与基于梯度的优化算法

本文介绍了数值计算中的上溢下溢问题及其解决方案——softmax函数,探讨了病态条件和矩阵条件数的概念。接着,文章详细讲解了基于梯度的优化方法,包括梯度下降法、Jacobian和Hessian矩阵的性质,以及如何优化步长。此外,还介绍了牛顿法优化和KKT条件在约束优化问题中的应用。
摘要由CSDN通过智能技术生成

1 数值计算

1.1 上溢和下溢以及softmax函数

计算机在存储连续数学信息的时候,只能通过有限位数来近似逼近我们期望的“无限长度”的数字。
下溢指的是当数据过小导致计算机近似成0,极小的数和零是有区别的,零的出现往往会直接改变函数的某些性质。
上溢指的是当数据过大时,计算机将它处理成无穷大,也就是经常程序可能返回的NaN占位符,让数值计算失效。
解决上溢下溢的有效方法是使用softmax函数,其定义为:
s o f t m a x ( x ) i = e x p ( x i ) ∑ j = 1 n e x p ( x j ) softmax(x)_i=\frac{exp(x_i)}{\sum_{j=1}^nexp(x_j)} softmax(x)i=j=1nexp(xj)exp(xi)
式中x是输入向量,等式左边表示经softmax函数处理过后的向量的第i个分量。直观上看softmax将每个分量处理成了“分量在总量中的占比”的形式。
但是往往我们不会直接用softmax函数处理向量x,而是处理 z = x − m a x { x } z=x-max\{x\} z=xmax{ x}原因见下
如果用softmax函数直接处理向量x,我们假设x的每个分量都是一个常数c,那么理想状态下函数映射的结果应该是1/n。

  • 如果c是一个很小的量,以至于计算机近似成了0,那么分母会出现下溢,结果出错
  • 如果c是一个很大的量,仍然导致结果包含NaN的非数字占位符

如果使用 z = x − m a x { x } z=x-max\{x\} z=xmax{ x}将会解决这些问题

  • 由softmax函数的形式易知,输入向量加一个常量不会改变输出结果,也就是说用softmax函数处理z和x得到的结果相同
  • 由于每一项减去了最大项,导致exp的参数最大为0,于是排除了上溢的可能性
  • z必有一项是0,也就是分母一定是大于1的,排除了分母下溢的可能性

综上,使用softmax函数处理z向量的方法可以一定程度上有效解决数值计算上下溢的问题,但其实仍不够全面。如果要开发底层库,数值计算的上下溢应该是需要仔细考量的问题,但是好在已经有足够全面解决这些问题的软件包了,并且已经封装好的机器学习算法都在内部实现了对数值计算问题的处理。

1.2 病态条件

条件数指的是函数相对于输入的微小变化而变化的快慢程度。
通常考虑的是线性方程Ax=b,其中b是输入向量,产生x输出解向量,A的条件数很大就意味着输入的小偏差会导致输出的大偏差。
假设输入产生偏差导致了输出的偏差 A ( x + Δ x ) = b + Δ b A(x+\Delta x)=b+\Delta b A(x+Δx)=b+Δb,由于A是线性映射,可知 A Δ x = Δ b A\Delta x =\Delta b AΔx=Δb,这里假设A存在逆,那么 Δ x = A − 1 Δ b \Delta x=A^{-1}\Delta b Δx=A1Δb
对上面的两个式子两边取二范数,并利用范数定义的不等式性质:
∣ ∣ A x ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ x ∣ ∣ = ∣ ∣ b ∣ ∣ ∣ ∣ Δ x ∣ ∣ = ∣ ∣ A − 1 Δ b ∣ ∣ ≤ ∣ ∣ A − 1 ∣ ∣ ⋅ ∣ ∣ Δ b ∣ ∣ ||Ax|| \le||A||\cdot||x||=||b|| \\ ||\Delta x|| = ||A^{-1}\Delta b|| \le||A^{-1}||\cdot||\Delta b|| AxAx=bΔx=A1ΔbA1Δb
综合两式可得
∣ ∣ Δ x x ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ A − 1 ∣ ∣ ⋅ ∣ ∣ Δ b b ∣ ∣ ||\frac{\Delta x}{x}||\le ||A||\cdot||A^{-1}||\cdot||\frac{\Delta b}{b}|| xΔxAA1bΔb
其中A的条件数cond(A)就被定义为 ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ A − 1 ∣ ∣ ||A||\cdot||A^{-1}|| AA1,可以发现:

  • 当cond(A)很大时,同样的输入误差会导致输出误差的上限很大
  • 当cond(A)很小时,同样的输入误差会导致输出误差的上限很小

根据矩阵二范数的定义,可以求出不同性质的矩阵具体的条件度是多少,通常我们考虑简单的情况,也就是矩阵A具有特征值分解,那么其条件数就是
m a x i , j { λ i λ j } max_{i,j}\{\frac{\lambda_i}{\lambda_j}\} maxi,j{ λjλi}
即矩阵A最大特征值除以最小特征值。关于更详细的条件数计算方法可以参考百度百科条件数
由于在计算机计算的时候不可避免地会使用近似值代入计算,所以我们总希望矩阵运算具有较小的条件数。对于一个很大条件数的矩阵,使用计算机计算会累计产生很明显的偏差。具有很大条件数的矩阵就被成为病态矩阵

2 基于梯度的优化方法

2.1 基本概念

大多数深度学习算法都涉及某种形式的优化优化指的是改变x使得函数f(x)最大或者最小,通常我们只讨论使最小的情况即可,使最大可以通过使-f(x)最小来转换。

其中被优化函数f(x)被称为目标函数(objective function)、准则(criterion),当要把f(x)最小化的时候,也称为代价函数(cost function)、损失函数(loss function)、误差函数(error function)
使f(x)被优化的x值被记作 x ∗ = a r g   m i n f ( x ) x^*=arg\ minf(x) x=arg minf(x)

2.2 梯度下降

只有在多维情况下,梯度才有讨论的意义,但是一维情况可以帮助理解梯度下降的思想。
将函数f(x)做一阶展开
f ( x + ϵ ) ≈ f ( x ) + ϵ f ′ ( x ) f(x+\epsilon)\approx f(x)+\epsilon f'(x) f(x+ϵ)f(x)+ϵf(x)
导函数的符号可以说明函数在某一点是在下降还是上升,为了完成使f(x)最小的优化问题,完全可以让x向着导函数小于零的方向前进一个小步长 ϵ \epsilon ϵ来逼近最小点。
所以我们更新 x n e x t = x − ϵ s i g n ( f ′ ( x ) ) x_{next}=x-\epsilon sign(f'(x)) xnext=xϵsign(f(x))
可以想象到当步长很小的时候,函数会下降到一个局部最小点,但是局部最小点并不一定是全局最小点,如果这一个局部最小点还不够小,没有达到优化可接受的程度,或许需要设定一个大步长“迈出”这个低谷,往后寻找更小的局部最小点。
找到绝对的全局最小点具有难度,有时候一些局部最小点已经显著低于周边的函数值,与全局最小点差别已经没有很大了,我们完全可以接受它作为优化的近似结果。
局部最小和全局最小
这时我们将情况拓展到多维。向量函数f(x)进行一阶展开的结果为:
x n e c t = x − ϵ ∇ f ( x ) x_{nect}=x-\epsilon \nabla f(x) xnect=xϵf(x)
因为梯度指向函数增长最快的方向,所以取逆方向增长步长 ϵ \epsilon ϵ,这种方法被称为梯度下降法,步长 ϵ \epsilon ϵ被称为学习率

2.3 Jacobian和Hessian矩阵

Jacobian矩阵可以表达n维向量y对于m维向量x的偏导数情况,雅克比矩阵J定义为 J i , j = ∂ ∂ x j y i J_{i,j}=\frac{\partial}{\partial x_j}y_i Ji,j=xjyi

梯度下降的方法仅仅采用了一阶近似,但是二阶导数同样可以反应一些很有价值的信息,比如它能够说明一步梯度下降是否可以产生所预期的那么好的改善。同样是在x处一阶导数小于零的情况下,分析二阶导会有以下可能结论:

  • 当x处的二阶导数等于0,说明没有曲率,x前进步长 ϵ \epsilon ϵ会导致函数下降 ϵ \epsilon ϵ
  • 当x处的二阶导数大于0,说明斜率在增长,x前进步长太大有可能导致函数迈过最低点,跑到一阶导大于0的部分
  • 当x处的二阶导数小于0,说明斜率在变小,x前进步长
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值