@[toc]
1. 牛顿法
1.1 求解f' = 0的点,牛顿法推导
NR法是寻找函数一阶导数为0(驻点)位置的方法。
这次为了求解f'=0的根,把f(x)的泰勒展开,展开到2阶形式:
这个式子是成立的,当且仅当 Δx 无线趋近于0。此时上式等价与:
1.2 Hessian矩阵
二阶偏导组成的矩阵, 如果有n个变量,一阶偏导为, Hessian矩阵为。
缺点
- 需要计算二阶导数
- 如果Hessian矩阵不是正定的话就会失效
多元函数判断是否为函数值下降方向的直观理解
1.3 阻尼牛顿法
从上面的推导中看出,牛顿方向 能使得更新后函数处于极值点,但是它不一定是极小点,也就是说牛顿方向可能是下降方向,也可能是上升方向,以至于当初始点远离极小点时,牛顿法有可能不收敛。因此提出阻尼牛顿法,在牛顿法的基础上,每次迭代除了计算更新方向(牛顿方向),还要对最优步长做一维搜索。
算法步骤
(1)给定给初始点 x(0),允许误差 ϵ
(2)计算点 x(t)处梯度gt和Hesse矩阵H,若|gt|<ϵ则停止迭代
(3)计算点 x(t)处的牛顿方向作为搜索方向:
(4)从点 x(t) 出发,沿着牛顿方向 d(t) 做一维搜索,获得最优步长:
这个是在方向找使函数最小的值。
(5)更新参数:
阻尼牛顿法代码描述
属于(0, 1), 属于(0, 0.5)
step4: 记是满足下列不等式的最小非负整数m.
step 5: 令, 转step2
step4解释 移项 即两点之间的梯度小于的梯度,证明梯度是在下降
def damp_newton(fun, gfun, hess, x0):
# 用阻尼牛顿法求解无约束问题
# x0是初始点,fun,gfun和hess分别是目标函数值,梯度,海森矩阵的函数
maxk = 500 # 最大迭代次数
sigma = 0.55 # 非线性搜索中的B因子
delta = 0.4 # 非线性搜索中的δ因子
k = 0 # 初始化迭代次数
epsilon = 1e-5 # 设定迭代终止得的阈值
x_store = [x0.copy()]
while k < maxk:
gk = gfun(x0) # 计算梯度
Gk = hess(x0) # 计算海森矩阵
dk = -1.0 * np.linalg.solve(Gk, gk) # 相当于dk=-1.0*(Gk^-1)gk
if np.linalg.norm(dk) < epsilon:
break
m = 0 # 初始化非线性搜索中的次数
mk = 0 # 用于存放非线性搜索得到的最小非负整数
while m < 20:
if fun(x0 + sigma ** m * dk) < fun(x0) + delta * sigma ** m * np.dot(gk, dk):
mk = m
break
m += 1
x0 += sigma ** mk * dk # 更新x的值
k += 1 # 进入下一次循环
x_store.append(x0.copy())
x_store = np.array(x_store)
return x0, x_store, k
2. 拟牛顿法
: 一阶偏导向量
: Hessian矩阵
: 牛顿方向
: X的改变量
: 一阶梯度的改变量
2.1 提出的初衷
牛顿法的优点是具有二阶收敛速度,缺点是:
- 但当海森矩阵 不正定时,不能保证所产生的方向是目标函数在处的下降方向。
- 特别地,当奇异时,算法就无法继续进行下去。尽管修正牛顿法可以克服这一缺陷,但修正参数的取值很难把握,过大或过小都会影响到收敛速度。
- 牛顿法的每一步迭代都需要目标函数的海森矩阵,对于大规模问题其计算量是惊人的。
拟牛顿法提出,用不含二阶导数的矩阵 替代牛顿法中的 ,然后沿搜索方向 做一维搜索。根据不同的 Ut 构造方法有不同的拟牛顿法。
注意拟牛顿法的 关键词:
- 不用算二阶导数
- 不用求逆
2.2 拟牛顿条件
牛顿法的搜索方向是
为了不算二阶导及其逆矩阵,设法构造一个矩阵 U,用它来逼近
两点 x(t) 和 x(t+1) 之差是:
因此要求近似矩阵U满足:
即
以上就是拟牛顿条件,不同的拟牛顿法,区别就在于如何确定 U。
2.3 DFP 法
为了方便区分,下面把U称作D(表示DFP)。
2.3.1 DFP推导
现在已知拟牛顿条件
假设已知Dt,希望使用叠加的方法计算, 即,带入得到:
现在我们来求,这个说起来比较tricky,主要运用了的对称性来分析,设参数。
从形式上看,这种公式保证了的对称性:
首先,对照可以发现:
其次,要保证 ΔDt 是对称的,参照 ΔDt 的表达式,最简单就是令
第二个条件带入第一个可以得到
带回的表达式:
2.3.2 算法步骤
(1)给定初始点 x^(0),允许误差 ϵ,令 (n是x的维数),t=0
(2)计算搜索方向
(3)从点 x(t) 出发,沿着 d(t) 做一维搜索,获得最优步长并更新参数:
(4)判断精度,若则停止迭代,否则转(5)
(5)计算,更新D
(6)t = t+1 转(2)
代码描述
step 1: 给定参数, 终点误差,初始正定矩阵(通常取或者),最大迭代次数maxk,令k=0.
step 2: Calculate . if , break.
step 3: Calculate the search direction:
step4: is the smallest nonnegative integer m that satisfies the following inequality formula.
令.
step 5: Get the value of with this formula:
参考链接
拟牛顿法(DFP、BFGS、L-BFGS)
牛顿法与拟牛顿法学习笔记
牛顿法,拟牛顿法,DFP,BFGS,L-BFGS 原理及代码详解(2)