深入浅出最优化(4) 拟牛顿法

1 拟牛顿法的数学基础

对于牛顿法,我们保留其快速收敛性,同时克服牛顿法黑森矩阵需要正定的问题以及避免计算黑森矩阵以减少计算量,我们提出了拟牛顿法。

假定当前点为x_{k+1},若我们用已得到的x_k,x_{k+1}及其一阶导数信息g_k,g_{k+1}构造一个正定矩阵B_{k+1}作为G_{k+1}的近似。这样根据牛顿法下降方向的产生公式\nabla^2f(x_{k+1})d_{k+1}=-\nabla f(x_{k+1}),近似可以得到B_{k+1}d_{k+1}=-g_{k+1}。设H_{k+1}=B_{k+1}^{-1},则可以得到d_{k+1}=-H_{k+1}g_{k+1}

B_{k+1}的得出是很理想的,我们希望它能根据已得到的x_k,x_{k+1}及其一阶导数信息g_k,g_{k+1}纯迭代的方法得到,而避免黑森矩阵的计算。但想要求得这样的B_{k+1},首先要知道什么样的B_{k+1}可以作为G_{k+1}的近似矩阵。这个限制条件是保证x_kx_{k+1}满足梯度的割线方程。我们知道目标函数梯度函数上两点间的割线方程为\nabla f(x_k)-\nabla f(x_{k+1})=G_{k+1}(x_k-x_{k+1}),那么作为近似的B_{k+1}也必须使得这个方程成立,即\nabla f(x_k)-\nabla f(x_{k+1})=B_{k+1}(x_k-x_{k+1})

y_k=\nabla f(x_k)-\nabla f(x_{k+1})s_k=x_k-x_{k+1},则有拟牛顿方程B_{k+1}s_k=y_k第二拟牛顿方程s_k=H_{k+1}y_k

2 B_{k+1}的计算方法

2.1 BFGS修正公式

给定初始正定矩阵B_0,之后有B_{k+1}=B_k+\Delta_k,假设\Delta_k是秩为2的矩阵,则根据矩阵分解有\Delta_k=a_ku_ku_k^T+b_kv_kv_k^T,其中a_k,b_k是任意常数,u_k,v_k是任意向量,则B_{k+1}=B_k+a_ku_ku_k^T+b_ku_ku_k^T,代入拟牛顿方程得到a_ku_ku_k^Ts_k+b_ku_ku_k^Ts_k=y_k-B_ks_k。不妨设u_k=y_k,v_k=B_ks_k,则a_k=\frac{1}{u_k^Ts_k}=\frac{1}{y_k^Ts_k},b_k=\frac{1}{v_k^Ts_k}=-\frac{1}{s_k^TB_ks_k}。得到BFGS修正公式:

B_{k+1}=B_k-\frac{B_ks_ks_k^TB_k}{s_k^TB_ks_k}+\frac{y_ky_k^T}{y_k^Ts_k}

这个公式可以保证每步产生的B_k的正定。(证明见附录1)

2.2 DFP修正公式

H_k=B_k^{-1},又根据第二拟牛顿方程s_k=H_{k+1}y_k,和BFGS公式使用同样方法推导可得:H_{k+1}=H_k-\frac{H_ky_ky_k^TH_k}{y_k^TH_ky_k}+\frac{s_ks_k^T}{s_k^Ty_k}

3 拟牛顿法的步骤

  1. 给定初始点x_0\in R^nB_0H_0,精度\epsilon>0,令k=0
  2. 若满足终止准则,则得解x_k,算法终止
  3. 解线性方程组B_k d_k+\nabla f(x_k)=0,得解d_k,或计算d_k=-H_kg_k
  4. 由线性搜索计算步长\alpha_k,令x_{k+1}=x_k+\alpha_kd_k
  5. 用修正公式得到B_{k+1}H_{k+1},使其满足拟牛顿方程,k=k+1,转2

4 性能评估

  • 收敛性:因为保证了B_k正定,则根据古典牛顿法的条件,每一步均会产生下降方向,所以满足收敛性
  • 收敛速度:若在最优解处梯度为0、黑森矩阵正定,则当且仅当\displaystyle\lim_{k→∞}\frac{||(B_k-\nabla^2f(x^*))||}{||d_k||}=0时,算法超线性收敛。(证明见附录2)
  • 二次终止性:显然满足,而且因为无需步长搜索,每步步长为1,对于二次函数可以一次取到最优解
  • 计算量:小,只需计算两点梯度即可
  • 储存空间:大,对于n元目标函数,需要储存一个大小为n*n的矩阵

5 实战测试

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

BFGS:

平均迭代步数 平均迭代时间 最优解 残差平方和最小值
18.1 0.28s x_1=0.1891~x_2=0.2820~x_3=0.1463~ x_4=0.1744 1.5939\times10^{-4}

DFP:

平均迭代步数 平均迭代时间 最优解 残差平方和最小值
102.05 1.86s x_1=0.1689~x_2=1.0273~x_3=0.3685~ x_4=0.4585 2.6031\times10^{-4}

代码实现

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

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

BFGS:

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 #目标方程

k=0
x=np.zeros(n)   #初始值点
e=0.001
sigma=0.4
rho=0.55
beta=1
tar=Function(myFunc)
B=np.array(np.eye(n))
while tar.norm(x)>e:
    a=1
    d=-np.linalg.solve(B,tar.grad(x))
    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
    x1=x+a*d
    if tar.norm(x1)<e:
        print(k+1)
        x=x1
        break
    s=x-x1
    y=tar.grad(x)-tar.grad(x1)
    B=B-muldot(B,s,turn(s),B)/muldot(turn(s),B,s)+dot(y,turn(y))/dot(turn(y),s)
    x=x1
    k+=1
    print(k)
print(x)

DFP:

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 #目标方程

k=0
x=np.zeros(n)   #初始值点
e=0.001
sigma=0.4
rho=0.55
beta=1
tar=Function(myFunc)
H=np.array(np.eye(n))
while tar.norm(x)>e:
    a=1
    d=-dot(H,tar.grad(x))
    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
    x1=x+a*d
    if tar.norm(x1)<e:
        print(k+1)
        x=x1
        break
    s=x-x1
    y=tar.grad(x)-tar.grad(x1)
    H=H-muldot(H,y,turn(y),H)/muldot(turn(y),H,y)+dot(s,turn(s))/dot(turn(s),y)
    x=x1
    k+=1
    print(k)
print(x)

附录

  1. 在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
  2. 拟牛顿法收敛速度证明:


    在这里插入图片描述

    在这里插入图片描述
在这里插入图片描述

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