《Convex Optimization》

最速下降方法

\(f(x+v)\)在\(v=0\)处的一阶泰勒展开为:

\[f(x+v)\approx \hat{f}(x+v) = f(x) + \nabla f(x)^{T}v
\]

\(\nabla f(x)^{T}v\)是\(f\)在\(x\)处沿\(v\)的方向导数。它近似给出了\(f\)沿小的步径\(v\)会发生的变化。

在\(v\)的大小固定的前提下,讨论如何选择\(v\)使得方向导数最小是有意义的,即:

\[\Delta x_{nsd}= argmin\{\nabla f(x)^{T}v \:|\: \|v\|=1\}
\]

最速下降方向就是一个使\(f\)的线性近似下降最多的具有单位范数的步径。注意,这里的单位范数,并不局限于Euclid范数。

我们先给出最速下降方法的算法,再介绍几种范数约束。

Euclid范数和二次范数

Euclid范数

显然,这时的方向就是负梯度方向。

二次范数

我们考虑二次范数

\[\|z\|_P=(z^TPz)^{1/2}=\|P^{1/2}z\|
\]

其中P为n阶对称正定矩阵。

这时的最优解为:

\[\Delta x_{nsd}=-(\nabla f(x)^{T}P^{-1}\nabla f(x))^{-1/2}P^{-1}\nabla f(x)
\]

这个最优解,可以通过引入拉格朗日乘子,求解对偶函数KKT条件获得,并不难,就不写了。

基于坐标变换的解释

二次范数,可以从坐标变换的角度给出一个解释。

我们定义线性变换:

\[\bar{u}=P^{1/2}u
\]

那么:

\[g(\bar{u})=f(P^{-1/2}\bar{u})=f(u)
\]

\(g\)在\(\bar{x}\)出的负梯度方向为:

\[\Delta \bar{x}=-\nabla \bar{f}(\bar{x})=-P^{-1/2}\nabla f(P^{-1/2}\bar{x})=-P^{-1/2}\nabla f(x)
\]

注意,并没有归一化。

又,我们已经知道\(\Delta x = -P^{-1} \nabla f(x)\)(只是方向而已),所以:

\[\Delta \bar{x}=P^{1/2}\Delta x
\]

同样的线性变换。换言之,二次范数\(\|\cdot\|_P\)下的最速下降方向可以理解为对原问题进行坐标变换\(\bar{x}=P^{1/2}x\)后的梯度方向。辅以下图便于理解。

采用\(\ell_1\)-范数的最速下降方向

这个问题的刻画如下:

\[\Delta x_{nsd}=argmin\{\nabla f(x)^Tv \: | \: \|v\|_1=1\}
\]

\(\ell_1\)即各分量绝对值之和,所以,只需把\(\nabla f(x)\)绝对值分量最大的那个部分找出来即可。不妨设,第\(i\)个分量就是我们要找的,那么:

\[\Delta x_{nsd}=-sign(\frac{\partial f(x)}{\partial x_i})e_i
\]

其中,\(e_i\)表示第\(i\)个基向量。

所以,在每次下降过程中,都只是改变一个分量,所以\(\ell_1\)-范数的下降,也称为坐标下降算法。

辅以下图以便理解:

至于收敛性分析,与先前的相反,我们不在这里给出(打起来太麻烦了实际上,有需求直接翻书就好了)。

数值试验

我们依然选择\(f(x)=e^{x_1+3x_2-0.1}+e^{x_1-3x_2-0.1}+e^{-x_1-0.1}\),\(\alpha=0.2,\beta=0.7\),初始点为\((7, 3)\),下图为我们展示了一种较为极端的坐标下降的方式。

代码只需要改变gradient2的几行而已。

def gradient2(x):
x0 = x[0]
x1 = x[1]
grad1 = np.exp(x0+3*x1-0.1) \
+ np.exp(x0-3*x1-0.3) \
- np.exp(-x0-0.1)
grad2 = 3 * np.exp(x0+3*x1-0.1) \
-3 * np.exp(x0-3*x1-0.3)
if abs(grad1) > abs(grad2):
return np.array([grad1/abs(grad1),0])
else:
return np.array([0, grad2/abs(grad2)])

Newton 方法

最开始看的时候,还很疑惑,后来才发现,原来这个方法在很多地方都出现过。除了《凸优化》(《Convex Optimization》),数学分析(华师大)和托马斯微积分都讲到过。虽然,或者将的一元的特殊情况,而且,后者的问题是寻找函数的零值点。起初,还不知道怎么把俩者联系起来,仔细一想,导函数的零值点不就是我们所要的吗?当然,得要求函数是凸的。

实际上,Newton方法是一种特殊的二次范数方法。特殊在,\(P\)的选取为Hessian矩阵\(\nabla^2 f(x)。\)我们还没有分析,二次范数的\(P\)应该如何选择。在下降方法的收敛性分析中,我们强调了条件数的重要性。加上刚刚分析过的坐标变换,坐标变换后,新的Hessian矩阵变为:

\[P^{-1/2}\nabla^2 f(x)P^{-1/2}
\]

所以,如果我们取\(P =\nabla^2f(x^*)\),那么新的Hessian矩阵在最有点附近就近似为\(I\),这样就能保证快速收敛。如果,每次都能选择\(P=\nabla^2 f(x)\),这就是Newton方法了。下图反映了为什么这么选择会加速收敛:

Newton 步径

Newton步径:

\[\Delta x_{nt}=-\nabla^2 f(x)^{-1}\nabla f(x)
\]

则:

\[\nabla f(x)^T\Delta x_{nt}=-\nabla f(x)^T\nabla^2f(x)^{-1}\nabla f(x)<0
\]

因为我们假设Hessian矩阵正定,所以上述不等式在\(\nabla f(x) \ne 0\)时都成立。

二阶近似的最优解

\(f(x+v)\)在\(v=0\)处的二阶近似为:

\[\hat{f}(x+v)=f(x)+\nabla f(x)^Tv+\frac{1}{2}v^T \nabla^2f(x)v
\]

这是\(v\)的二次凸函数,在\(v=\Delta x_{nt}\)处到达最小值。下图即是该性质的一种形象地刻画:

线性化最优性条件的解

如果我们在\(x\)附近对最优性条件\(\nabla f(x^*)=0\)处进行线性化,可以得到:

\[\nabla f(x+v) \approx \nabla f(x) + \nabla^2 f(x) v=0
\]

这个实际上就是我在最开始对Newton方法的一个解释。不多赘述。

Newton 步径的仿射不变性

这个在代数里面是不是叫做同构?

Newton 减量

我们将

\[\lambda (x)=(\nabla f(x)^T \nabla^2 f(x)^{-1}\nabla f(x))^{1/2}
\]

称为Newton减量。

有如下的性质:

\[f(x) = \mathop{inf} \limits_{y} \hat{f}(y)=f(x)-\hat{f}(x+\Delta x_{nt})=\frac{1}{2}\lambda (x)^2
\]

\[\lambda (x) = (\Delta x_{nt}^T \nabla^2f(x) \Delta x_{nt})^{1/2}
\]

\[\nabla f(x)^T \Delta x_{nt}=-\lambda (x)^2
\]

Newton步径同样是仿射不变的。

Newton步径常常用作停止准则的设计。

Newton 方法

算法如下:

收敛性分析

收敛性分为俩个阶段,证明比较多,这里只给出结果。



第一阶段为阻尼Newton阶段,第二阶段为二次收敛阶段。

数值实验

我们依然选择\(f(x)=e^{x_1+3x_2-0.1}+e^{x_1-3x_2-0.1}+e^{-x_1-0.1}\),\(\alpha=0.2,\beta=0.7\),初始点为\((7, 3)\),下图采用牛顿方法的图(代码应该没写错吧)。



下图初始点为\((-5, 3)\)

代码

def hessian(x):
x0 = x[0]
x1 = x[1]
hessian = np.zeros((2, 2), dtype=float)
element1 = np.exp(x0 + 3 * x1 - 0.1)
element2 = np.exp(x0 - 3 * x1 - 0.1)
element3 = np.exp(-x0 - 0.1)
hessian[0, 0] = element1 + element2 + element3
hessian[0, 1] = 3 * element1 - 3 * element2
hessian[1, 0] = 3 * element1 - 3 * element2
hessian[1, 1] = 9 * element1 + 9 * element2 return np.linalg.inv(hessian)

下降方法也修改了一下:

    def grad3(self, gradient, alpha, beta, error=1e-5):
"""回溯直线收缩算法 Newton步径
gradient: 梯度需要给出
alpha: 下降的期望值 (0, 0.5)
beta:每次更新的倍率 (0, 1)
error: 梯度的误差限,默认为1e-5
"""
assert hasattr(gradient, "__call__"), \
"Invalid gradient"
assert 0 < alpha < 0.5, \
"alpha should between (0, 0.5), but receive {0}".format(alpha)
assert 0 < beta < 1, \
"beta should between (0, 1), but receive {0}".format(beta)
error = error if error > 0 else 1e-5 def search_t(alpha, beta, grad, hessian_inv):
"""回溯"""
t = 2
t_old = 2
step = grad @ hessian_inv
grad_module = grad @ step
assert grad_module >= 0, "wrong in grad_module"
while True:
newx = self.x + t * step
newy = self.__f(newx)
if newy < self.y - alpha * t * grad_module:
return t_old
else:
t_old = t
t = t_old * beta
while True:
grad = -gradient(self.x)
hessian_inv = hessian(self.x)
t = search_t(alpha, beta, grad, hessian_inv)
x = self.x + t * grad @ hessian_inv
lam = grad @ hessian_inv @ grad
if lam / 2 < error: #判别准则变了
break
else:
self.x = x
self.y = self.__f(self.x)
self.__process.append((self.x, self.y))

最速下降方法和Newton方法的更多相关文章

  1. ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法

    原文 Examining the Details and Delete methods 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).姚阿勇(Mr.Yao) 打 ...

  2. ThinkPHP的D方法和M方法的区别

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

  3. Hibernate中evict方法和clear方法说明

    Hibernate中evict方法和clear方法说明 先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务.结果报错: Exception i ...

  4. Android HTTP实例 使用GET方法和POST方法发送请求

    Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...

  5. virtual方法和abstract方法

    在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...

  6. JavaScript indexOf() 方法和 lastIndexOf() 方法

    一,定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索 ...

  7. wait方法和sleep方法的区别

    一.概念.原理.区别 Java中的多线程是一种抢占式的机制而不是分时机制.线程主要有以下几种状态:可运行,运行,阻塞,死亡.抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行.      ...

  8. M方法和D方法的区别

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

  9. ThinkPHP 中M方法和D方法详解----转载

    转载的地址,http://blog.163.com/litianyichuanqi@126/blog/static/115979441201223043452383/ 自己学到这里的时候,不能清除的分 ...

随机推荐

  1. ssh转发代理:ssh-agent用法详解

    SSH系列文章: SSH基础:SSH和SSH服务 SSH转发代理:ssh-agent用法详解 SSH隧道:端口转发功能详解 使用ssh-agent之前 使用ssh公钥认证的方式可以免去ssh客户端(如 ...

  2. CAN总线学习记录之三:总线中主动错误和被动错误的通俗解释

    首先建议把广泛使用的"主动错误"和"被动错误"概念换成"主动报错"和"被动报错". 1. 主动报错站点 只要检查到错误, ...

  3. 杭电ACM2008--数值统计

    数值统计 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. jquery 实现省市二级联动,附带完整的省市json数据 (粘贴即用)

    1.可以单独定义一个js,保存省市json数据. citydata = { "安徽": [ "合肥", "芜湖", "蚌埠&quo ...

  5. iOS-----------计算两个时间的时间差

    UIButton * nameButton = [UIButton buttonWithType:UIButtonTypeCustom]; nameButton.frame = CGRectMake( ...

  6. Mac 终端 显示隐藏文件

    defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder //显示隐藏文件 defaults wr ...

  7. Visual Studio 无法记忆标签页、断点等的解决办法

    1.到工程目录删除*.suo文件 2.*.suo默认是隐藏的,需要打开查看隐藏文件的开关

  8. 坚定关于考研或者工作的决定:work

    转眼之间,我已经夸过了大二结束的节点,已经是一个准大三了: 在这个岔路口,首要的选择就是考研和工作的选择:我也有过犹豫要不要考研,最终还是放弃了考研的想法,从考研的利弊两个方面来谈:        首 ...

  9. SqlServer sa 用户登录失败的解决方法

    一.控制面板->服务->MS SQL SERVER->登录-->本地系统帐户-->重新启动MS SQL SERVER用windows验证登陆查询分析器-->执行 s ...

  10. 从0开始的Python学习001快速上手手册

    假设大家已经安装好python的环境了. Windows检查是否可以运行python脚本 Ctrl+R 输入 cmd 在命令行中输入python 如果出现下面结果,我们就可以开始python的学习了. ...