深入浅出最优化(3) 最速下降法与牛顿法

1 下降算法中的搜索方向

1.1 下降方向的判定

根据泰勒展开f(x_k+\alpha_kd_k)=f(x_k)+\alpha_kg^T_kd_k+o(||\alpha_kd_k||^2),忽略极小项后,我们可以在x_k点处找到f(x)的一条切线s(\alpha)=f(x_k)+g_k^Td_k \alpha,这条切线的斜率是g_k^Td_k。我们不难得出结论,如果g_k^Td_k<0,则该方向为下降方向。

1.2 下降算法的收敛性

前面我们给出过下降算法的收敛性的定义:对于迭代序列x^{(k)},k趋近于无穷时一阶偏导向量的范数为0。之后我们在介绍精确搜索与非精确搜索时均强调了搜索方向必须是下降方向。事实上,如果步长由精确搜索或者Wolfe-Powell搜索产生,而每一步的搜索方向都是下降方向,则必定满足下降算法的收敛性。(证明见附录1)

因此接下来我们在研究计算搜索方向的算法时,最重要的前提就是计算出的搜索方向应当是下降方向。而步长计算则使用精确搜索、Wolfe-Powell搜索或强条件的Wolfe-Powell搜索

2 最速梯度下降法

2.1 最速梯度下降法步骤

既然我们要寻找下降方向,我们首先想到的就是梯度的反方向。函数沿着梯度方向数值上升最快,那么沿着梯度的反方向数值下降也就最快。所以,对于每一步,将负梯度方向作为下降方向的方法,又叫最速梯度下降法

在这里插入图片描述

步骤:

  1. 给定初始点x_0\in R^n,精度\epsilon>0,令k=0
  2. ||\nabla f(x_k)||\leq\epsilon,则得解x_k,算法终止
  3. 计算d_k=-\nabla f(x_k)
  4. 计算步长\alpha_k
  5. x_{k+1}=x_k+\alpha_kd_k,k=k+1,转步2

2.2 性能评估

  • 收敛性:因为每一步均产生下降方向,所以必定收敛
  • 收敛速度:用正定二次函数逼近点附近的函数。若该正定二次函数黑森矩阵的所有特征值相等,则超线性收敛;其余时候线性收敛。(证明见附录2)
  • 二次终止性:显然满足
  • 计算量:小,只需要计算梯度
  • 储存空间:小,只需要储存梯度

2.3 实战测试

对于本文集的第一篇文章深入浅出最优化(1) 最优化问题概念与基本知识中提出的最小二乘问题,x_1,x_2,x_3,x_4的初值均在[-2,2]的范围内随机生成,总共生成100组起点。统计迭代成功(在1000步内得到最优解且单次步长搜索迭代次数不超过1000次)的样本的平均迭代步数、平均迭代时间和得到的最优解及残差平方和最小值。

平均迭代步数 平均迭代时间 最优解 残差平方和最小值
234.68 3.31s x_1=0.1755~x_2=0.3717~x_3=0.0439~ x_4=0.2290 2.3065\times10^{-4}

3 阻尼牛顿法

3.1 阻尼牛顿法步骤

古典牛顿法的思想是用近似二次函数的极小点作为原问题的新的近似解。f(x)x_k处二阶泰勒展开式为f(x)=f(x_k)+\nabla f(x_k)^T(x-x_k)+\frac{1}{2}(x-x_k)^T\nabla^2f(x_k)(x-x_k)+o(||x-x_k||^2),二次近似函数Q(x)=f(x_k)+\nabla f(x_k)^T(x-x_k)+\frac{1}{2}(x-x_k)^T\nabla^2f(x_k)(x-x_k),且\nabla Q(x)=\nabla f(x_k)+\nabla^2f(x_k)(x-x_k)\nabla^2f(x_k)正定,则Q(x)的极小点为\nabla f(x_k)+\nabla^2f(x_k)(x-x_k)的解,把二次函数的极小点作为x_{k+1},则x_{k+1}=x_k-\nabla^2f(x_k)^{-1}\nabla f(x_k),称该迭代公式为古典牛顿法的迭代公式,其中d_k=-\nabla^2f(x_k)^{-1}\nabla(x_k)x_k处的牛顿方向

在这里插入图片描述

如果目标函数就是二次函数,则向着牛顿方向步长为1的搜索可以直接搜索到局部最优解。但如果二次函数仅仅是目标函数的近似,则步长需要使用Wolfe-Powell搜索来求取,这时候算法被称为阻尼牛顿法

步骤:

  1. 定初始点x_0\in R^n,精度\epsilon>0,令k=0
  2. ||\nabla f(x_k)||\leq\epsilon,则得解x_k,算法终止
  3. d_k=-\nabla^2f(x_k)^{-1}\nabla(x_k)
  4. 计算步长\alpha_k
  5. x_{k+1}=x_k+\alpha_kd_k,k=k+1,转步2

3.2 性能评估

  • 收敛性:当且仅当每一步都有目标函数的黑森矩阵,也就是近似二次函数的黑森矩阵正定时,牛顿方向才是下降方向,所以收敛性不能保证
  • 收敛速度:若在最优解附近二阶连续可微且最优解处梯度为0、黑森矩阵正定,则算法超线性收敛。特别地,若目标函数在最优解处二阶李普希兹连续,则算法二阶收敛。(证明见附录3)
  • 二次终止性:显然满足
  • 计算量:大,需要计算黑森矩阵,在变量数目多时计算量大
  • 储存空间:大,需要储存黑森矩阵,在变量数目多时需要储存空间大

4 牛顿-梯度下降混合法

4.1 牛顿-梯度下降混合法步骤

由于我们不能保证牛顿法产生下降方向,但又希望能够借助牛顿法的二阶收敛性提高最速梯度下降法的收敛速度,我们可以将两者进行融合。对于牛顿法无法产生下降方向的时刻,使用最速梯度下降法来产生下降方向。

步骤:

  1. 定初始点x_0\in R^n,精度\epsilon>0,令k=0
  2. ||\nabla f(x_k)||\leq\epsilon,则得解x_k,算法终止
  3. d_k=-\nabla^2f(x_k)^{-1}\nabla(x_k)
  4. \nabla f(x_k)^Td_k\geq0,取d_k=-\nabla f(x_k)
  5. 计算步长\alpha_k
  6. x_{k+1}=x_k+\alpha_kd_k,k=k+1,转步2

4.2 实战测试

对于本文集的第一篇文章深入浅出最优化(1) 最优化问题概念与基本知识中提出的最小二乘问题,x_1,x_2,x_3,x_4的初值均在[-2,2]的范围内随机生成,总共生成100组起点。统计迭代成功率(在1000步内得到最优解且单次步长搜索迭代次数不超过1000次)、平均迭代步数、平均迭代时间和得到的最优解及残差平方和最小值。

平均迭代步数 平均迭代时间 最优解 残差平方和最小值
56.0 1.02s x_1=0.1926~x_2=0.1816~x_3=0.1158~ x_4=0.1321 1.5397\times10^{-4}

代码实现

本博客所有代码在https://github.com/HarmoniaLeo/optimization-in-a-nutshell开源,如果帮助到你,请点个star,谢谢这对我真的很重要!

你可以在上面的GitHub链接或本文集的第一篇文章深入浅出最优化(1) 最优化问题概念与基本知识中找到Function.py和lagb.py

最速下降法:

import numpy as np
from Function import Function   #定义法求导工具
from lagb import *  #线性代数工具库

n=2 #x的长度

def myFunc(x):  #x是一个包含所有参数的列表
    return x[0]**2 + 2*x[1]**2 + 2*x[0] - 6*x[1] +1 #目标方程

x=np.zeros(n)   #初值点
rho=0.6
beta=1
sigma=0.4
e=0.001
k=0
tar=Function(myFunc)
while tar.norm(x)>e:
    d=-tar.grad(x)
    a=1
    if not (tar.value(x+a*d)<=tar.value(x)+rho*a*dot(turn(tar.grad(x)),d) and dot(turn(tar.grad(x+a*d)),d)>=sigma*dot(turn(tar.grad(x)),d)):
        a=beta
        while tar.value(x+a*d)>tar.value(x)+rho*a*dot(turn(tar.grad(x)),d):
            a*=rho
        while dot(turn(tar.grad(x+a*d)),d)<sigma*dot(turn(tar.grad(x)),d):
            a1=a/rho
            da=a1-a
            while tar.value(x+(a+da)*d)>tar.value(x)+rho*(a+da)*dot(turn(tar.grad(x)),d):
                da*=rho
            a+=da
    x+=a*d
    k+=1
    print(k)
print(x)

牛顿-梯度下降混合法:

import numpy as np
from Function import Function   #定义法求导工具
from lagb import *  #线性代数工具库
from scipy import linalg

n=2 #x的长度

def myFunc(x):  #x是一个包含所有参数的列表
    return x[0]**2 + 2*x[1]**2 + 2*x[0] - 6*x[1] +1 #目标方程

x=np.zeros(n)   #初值点
rho=0.6
beta=1
e=0.001
sigma=0.4
k=0
tar=Function(myFunc)
while tar.norm(x)>e:
    try:
        d=linalg.solve(tar.hesse(x),-tar.grad(x))
        if tar.value(x)-tar.value(x+d)<0:
            d=-tar.grad(x)
    except Exception:
        d=-tar.grad(x)
    a=1
    if not (tar.value(x+a*d)<=tar.value(x)+rho*a*dot(turn(tar.grad(x)),d) and dot(turn(tar.grad(x+a*d)),d)>=sigma*dot(turn(tar.grad(x)),d)):
        a=beta
        while tar.value(x+a*d)>tar.value(x)+rho*a*dot(turn(tar.grad(x)),d):
            a*=rho
        while dot(turn(tar.grad(x+a*d)),d)<sigma*dot(turn(tar.grad(x)),d):
            a1=a/rho
            da=a1-a
            while tar.value(x+(a+da)*d)>tar.value(x)+rho*(a+da)*dot(turn(tar.grad(x)),d):
                da*=rho
            a+=da
    x+=a*d
    k+=1
    print(k)
print(x)

附录

  1. 记向量d_k-\nabla f(x_k)的夹角为\theta_k,则有cos=\frac{-\nabla f(x_k)^Td_k}{||\nabla f(x_k)||~||d_k||}

给出下面的基本假设:f(x)连续可微且有下界,且\nabla f(x)李普希兹连续,即存在常数L>0,使得||\nabla f(x)-\nabla f(y)||\leq L||x-y||

则有定理,若序列\{x_k\}由下降算法产生,其中步长\alpha_k由精确搜索或Wolfe-Powell搜索产生,则\displaystyle\sum_{k=0}^∞||\nabla f(x_k)||^2cos^2\theta_k<+∞。特别地,若存在常数\delta>0使得cos\theta_k\geq\delta,则\displaystyle\lim_{k→∞}||\nabla f(x_k)||=0。这个定理说明了产生的方向与负梯度方向夹角小于\frac{\pi}{2}时,可以保证算法收敛性。

下面根据假设证明该定理:由Wolfe-Powell搜索条件及假设,我们有-(1-\sigma)\nabla f(x_k)^Td_k\leq[\nabla f(x_k+\alpha_kd_k)-\nabla f(x_k)]^Td_k\leq\alpha_kL||d_k||^2,即可得\alpha_k\geq-\frac{1-\sigma}{L}\frac{\nabla f(x_k)^Td_k}{||d_k||^2}=-c_1\frac{\nabla f(x_k)^Td_k}{||d_k||^2}。这里c_1=\frac{1-\sigma}{L},进一步由Wolfe-Powell搜索第一个条件,得f(x_k+\alpha_kd_k)-f(x_k)\leq-\rho c_1\frac{[\nabla f(x_k)^Td_k]^2}{||d_k||^2}=-\rho c_1||\nabla f(x_k)||^2cos^2\theta_k

将上面的不等式左右两边从k=0∞相加,并注意到f(x)有下界,可以得到定理第一条成立,由无穷级数收敛的必要条件可以得到第二条定理成立。

  1. 最速梯度下降法收敛速度证明:https://blog.csdn.net/weixin_43010548/article/details/97619095

  2. 牛顿法收敛速度证明:

    提出定理:设fx^*\in R^n的某个邻域内二次连续可微且x^*满足\nabla f(x^*)=0\nabla^2 f(x^*)正定,则存在常数\delta>0,使得当x_0\in U_\delta(x^*)=\{x|||x-x^*||<\delta\}时,由单位步长牛顿法x_{k+1}=x_k-\nabla^2 f(x_k)^{-1}\nabla f(x_k),k=0,1,2,...产生的序列超线性收敛于x^*,此外,若\nabla^2fx^*李普希兹连续,则序列\{x_k\}二次收敛于x^*

在这里插入图片描述

在这里插入图片描述
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348