梯度的方向
梯度:如果函数是一维的变量,则梯度就是导数的方向;如果是大于一维的,梯度就是在这个点的法向量,并指向数值更高的等值线。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)
梯度上升:如果我们需要求解损失函数的最大值,用梯度上升法来迭代求解。
梯度下降:在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值。梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解,但当目标函数是凸函数时,梯度下降法的解是全局解。$ heta_i = heta_i - alphafrac{partial}{partial heta_i}J( heta_0, heta_1..., heta_n)$
- 假设函数(hypothesis function):例如线性回归的拟合函数为$h_{ heta}(x) = heta_0+ heta_1x$
- 损失函数:$J( heta_0, heta_1..., heta_n) = frac{1}{2m}sumlimits_{j=0}^{m}(h_ heta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)^2$
- 算法调优:
- 步长(learning rate):步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度
- 参数的初始值选择:由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。
- 连续特征归一化
梯度下降法公式的推导:
一阶泰勒:$f(x+Delta x)=f(x)+f'(x)*Delta x$
目的是使得左边的值最小,那应该使得$f'(x)Delta x$为负数,
令$Delta x = -f'(x)$,这样上式就变为$f(x+Delta x)=f(x)-f'(x)*f'(x)$
但是上式只在局部成立,加上修正因子,就变为$Delta x=-lambda*f'(x)$,
最终得到:$x_{n+1}=x_n-lambda*f'(x_n)$
最速下降法过程:
输入:目标函数$f(x)$,梯度函数$g(x)=Delta f(x)$,计算精度$epsilon$
输出:$f(x)$的极小点$x^*$
- step 1:取初始值$x^{(0)}$属于$R^n$,置$k=0$
- step 2:计算$f(x^{(k)})$
- step 3:计算梯度$g_k=g(x^{(k)})$,当$||g_k||<epsilon$时,停止迭代,令$x^*=x^{(k)}$;否则,令$p_k=-g(x^{(k)})$,求$lambda_k$,使$f(x^{(k)}+lambda_kp_k)=min f(x^{(k)}+{lambda}p_k)$,$lambdageq0$
- step 4:置$x^{(k+1)}=x^{(k)}+lambda_k p_k$,计算$f(x^{(k+1)})$,当$||f(x^{(k+1)})-f(x^{(k)})||<epsilon$或$||x^{(k+1)}-x^{(k)}||<epsilon$,停止迭代,令$x^*=x^{(k+1)}$
- step 5:否则,置$k=k+1$,转step 3
梯度下降 梯度下降方向俯视图
梯度下降一阶优化
一、梯度下降家族
1.1 批量梯度下降法(Batch Gradient Descent,BGD)
$ heta_i = heta_i - alphasumlimits_{j=0}^{m}(h_ heta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}$
m个样本都用来更新参数
时间复杂度:O(mnT)
1.2 随机梯度下降法(Stochastic Gradient Descent,SGD)
$ heta_i = heta_i - alpha (h_ heta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}$
SGD每次更新参数时,仅使用一个样本j。
时间复杂度:O(nT)
1.3 小批量梯度下降法(Mini-batch Gradient Descent,MBGD)
$ heta_i = heta_i - alpha sumlimits_{j=t}^{t+x-1}(h_ heta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}$
BGD和SGD的折中,对于m个样本,采用x个子样本来更新参数,1<x<m
时间复杂度:O(xnT)
特点:
- 速度快
- 收敛慢
- 容易跳出鞍点:因为每次迭代使用一个样本,使用的梯度不是很准确,就降低了陷入局部极小与鞍点的几率。
二、牛顿家族
2.1 牛顿法
(1)用牛顿法求$f(x)=0$的根
牛顿法二阶优化
先随机选个初始点$x_0$,然后开始迭代,
$$x_{n+1}=x_n-frac{f(x_n)}{f'(x_{n})}$$
当$|x_{n+1}-x_n|<epsilon$,迭代结束,$x_{n+1}$就是$f(x)=0$的近似值解。此处牛顿法是一阶算法。
举例:用牛顿法近似求解根号2
# 牛顿法求零点 # f = x ** 2 - 2 # x_n+1 = x_n - f(x_n)/f'(x_n) # 收敛条件:f(x)接近于0 def func(x): return x ** 2 - 2 def f_func(x): return 2 * x x = 1.5 err = f_func(x) while abs(func(x)) > 0.000001: x = x - func(x) / f_func(x) print(x)
(2)用牛顿法用作优化算法时候,它是二阶的
假设有一个凸优化问题$min_{x} f(x)$,问题是找一个$x$来最小化$f(x)$
牛顿法公式的推导:
二阶泰勒:$f(x+Delta x)=f(x)+f'(x)Delta x +1/2*f''(x)*{Delta x}^2$
希望左式最小,将左式看作$Delta x$的函数,当取合适的$Delta x$值时,左边式子达到极小值,此时导数为0,得到$0=f'(x) +f''(x)*Delta x$
利用牛顿法求解,选取初始点$x_0$,然后进行如下迭代:
$$x_{n+1}=x_n-frac{f'(x_n)}{f''(x_n)}$$
直到$|x_{n+1}-x_n|<epsilon$
牛顿法过程:
输入:目标函数$f(x)$,梯度$g(x)=Delta f(x)$,海瑟矩阵$H(x)$,精度要求$epsilon$
输出:$f(x)$的极小点
- step 1:取初始点$x^{(0)}$,置$k=0$
- step 2:计算$g_k=g(x^{(k)})$
- step 3:若$||g_k||leqepsilon$,则停止计算,得近似解$x^*=x^{(k)}$
- step 4:计算$H_k=H(x^{(k)})$,并求$p_k$,$H_kp_k=-g_k$($p_k=-H_k^{-1}g_k$计算海瑟矩阵比较复杂)
- step 5:置$x^{(k+1)}=x^{(k)}+p_k$
- step 6:置$k=k+1$,转step 2
优点:
- 二阶收敛,收敛速度快;
- 如果$G^*$正定,且初始点合适,算法二阶收敛、对正定二次函数,迭代一次就可以得到极小点
缺点:
- 牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。
- 牛顿法需要Hessian矩阵正定,如果非正定,会陷入鞍点
- 当初始点远离极小点时,牛顿法可能不受理,原因可能是因为牛顿方向不一定是下降方向,经迭代,目标函数值可能上式,此外,即使目标函数值下降,得到的点$x^{(k+1)}$也不一定是沿牛顿方向的最好点或极小点。
2.2 阻尼牛顿法
牛顿法最突出的优点是收敛速度快,具有局部二阶收敛性,但是,基本牛顿法初始点需要足够“靠近”极小点,否则,有可能导致算法不收敛。这样就引入了阻尼牛顿法,阻尼牛顿法最核心的一点在于可以修改每次迭代的步长,通过沿着牛顿法确定的方向一维搜索最优的步长,最终选择使得函数值最小的步长。
阻尼牛顿法与牛顿法区别在于增加了沿牛顿方向的一维搜索,迭代公式为$x^{(k+1)}=x^{(k)}+lambda_kd^{(k)}$,其中,$d^{(k)}=-Delta ^2f(x^{(k)})^{-1}Delta ^2f(x^{(k)})$为牛顿方向,$lambda_k$是一维搜索得到的步长,满足$f(x^{(k)}+lambda_kd^{(k)})=min_{lambda}f(x^{(k)}+lambda d^{(k)})$
计算过程:
- step 1:取初始点$x^{(1)}$,允许误差$epsilon>0$,置$k=1$
- step 2:计算$Delta f(x^{(k)}),Delta ^2 f(x^{(k)})^{-1}$
- step 3:若$||Delta f(x^{(k)})||<epsilon$,则停止计算,否则,令$d^{(k)}=-Delta ^2 f(x^{(k)})^{-1}Delta f(x^{(k)})$
- step 4:从$x^{(k)}$出发,沿方向$d^{(k)}$作一维搜索,$f(x^{(k)}+lambda_kd^{(k)})=min f(x^{(k)}+{lambda}d^{(k)})$,令$x^{(k+1)}=x^{(k)}+lambda_kd^{(k)}$
- step 5:置$k=k+1$,转step 2
三、拟牛顿家族
前面介绍了牛顿法,它的突出优点是收敛很快,但是运用牛顿法需要计算二阶偏导数,而且目标函数的Hesse
矩阵可能非正定。为了克服牛顿法的缺点,人们提出了拟牛顿法,它的基本思想是用不包含二阶导数的矩阵近似牛顿法中的Hesse
矩阵的逆矩阵。 由于构造近似矩阵的方法不同,因而出现不同的拟牛顿法。
拟牛顿法公式推导:
设在第k次迭代后,得到点$x^{(k+1)}$,将目标函数$f(x)$在点$x^{(k+1)}$展开成二阶泰勒级数$f(x)approx f(x^{(k+1)})+Delta f(x^{(k+1)})^T(x-x^{(k+1)})+frac{1}{2}(x-x^{(k+1)})^TDelta^2f(x^{(k+1)}))(x-x^{(k+1)})$
令$x=x^{(k)}$,则$f(x^{(k)})approx f(x^{(k+1)})+Delta f(x^{(k+1)})^T(x-x^{(k+1)})+frac{1}{2}(x-x^{(k+1)})^TDelta^2f(x^{(k+1)}))(x^{(k)}-x^{(k+1)})$
记$p^{(k)}=x^{(k+1)}-x^{(k)} $,$q^{(k)}=Delta f(x^{(k+1)})-Delta f(x^{(k)})$则$q^{(k)} approx Delta^2 f(x^{(k+1)})p^{(k)}$
又设Hesse矩阵$Delta ^2f(x^{(k+1)})$可逆,则$p^{(k)} approx Delta^2 f(x^{(k+1)})^{-1}q^{(k)}$
计算出$p^{(k)}$和$q^{(k)}$后,可以根据上式估计在$x^{(k+1)}$处的Hesse矩阵的逆,所以拟牛顿的条件就是$p^{(k)}=H_{k+1}q^{(k)}$
wiki关于拟牛顿法的公式
Method | $B_{k+1}$ | $H_{k+1}$ |
DFP | $H_{k+1} = H_k+frac{p^{(k)}p^{(k)T}}{p^{(k)T}q^{(k)}}-frac{H_kq^{(k)}q^{(k)T}H_k}{q^{(k)T}H_kq^{(k)}} $ |
|
BFGS | $B_{k+1} = B_k+frac{q^{(k)}q^{(k)T}}{q^{(k)T}p^{(k)}}-frac{B_kp^{(k)}p^{(k)T}B_k}{p^{(k)T}B_kp^{(k)}}$ |
3.1 DFP
用不包含二阶导数的矩阵$H_k$近似代替牛顿法中的Hesse矩阵的逆矩阵$G_k^{-1}$。
秩1校正推导过程:当G为n阶对称正定矩阵时,满足拟牛顿条件的矩阵$H_k$也应该是n阶对称正定矩阵,构造策略为,$H_1$取为任意一个n阶对称正定矩阵,通常选择为n阶单位矩阵I,然后通过修正$H_k$给出$H_{k+1}$,
令$H_{k+1}=H_k+Delta H_k$,(1)
其中,$Delta H_k$称为校正矩阵。
令$Delta H_k=alpha_kz^{(k)}(z^{(k)T})$,(2)
$alpha_k$是一个常数,$z^{(k)}$是n维列向量,这样定义的$Delta H_k$是秩为1的对称矩阵,
令$p^{(k)}=H_kq^{(k)}+alpha_kz^{(k)}z^{(k)T}q^{(k)}$,(3)
由此得到$z^{(k)}=frac{p^{(k)}-H_kq^{(k)}}{alpha_kz^{(k)T}q^{(k)}}$,(4)
另一方面,(3)式等号两端左乘以$q^{(k)T}$,整理得到
$q^{(k)T}(p^{(k)}-H_kq^{(k)})=alpha_k(z^{(k)T}q^{(k)})^2$,(5)
利用 (2)(4)(5),把(1)式写成:
$H_{k+1} = H_k+frac{p^{(k)}-H_kq^{(k)}p^{(k)}-H_kq^{(k)T}}{q^{(k)T(p^{(k)}-H_kq^{(k)})}}$
后来,Davidon首先提出DFP,又被Fletcher和Powell改进,定义校正矩阵为 $frac{p^{(k)}p^{(k)T}}{p^{(k)T}q^{(k)}}-frac{H_kq^{(k)}q^{(k)T}H_k}{q^{(k)T}H_kq^{(k)}}$
这样得到的矩阵为$H_{k+1}=H_k+frac{p^{(k)}p^{(k)T}}{p^{(k)T}q^{(k)}}-frac{H_kq^{(k)}q^{(k)T}H_k}{q^{(k)T}H_kq^{(k)}}$
输入:目标函数$f(x)$,梯度$g(x)=Delta f(x)$,精度要求$epsilon$
输出:$f(x)$的极小点$x^*$
- step 1:取初始点$x^{(0)}$,取$H_0$为正定对称矩阵,置$k=0$
- step 2:计算$g_k=g(x^{(k)})$,若$||g_k||leqepsilon$,则停止计算,得近似解$x^*=x^{(k)}$;否则转step 3
- step 3:置$p_k=-H_kg_k$
- step 4:一维搜索:求$lambda_k$使得$f(x^{(k)}+lambda_kp_k)=min f(x^{(k)}+{lambda}p_k)$,$lambdageq0$
- step 5:置$x^{(k+1)}=x^{(k)}+lambda_kp_k$
- step 6:计算$g_{k+1}=g(x^{(k+1)})$,若$||g_{k+1}|| < epsilon$,则停止计算,得近似解$x^*=x^{(k+1)}$,否则,则计算出$H_{k+1}$
- step 7:置$k=k+1$,转step 3
疑问:怎么确定$H_0$? https://www.zhihu.com/question/269123324/answer/345679876
3.2 BFGS
用不包含二阶导数的矩阵$B_k$近似代替牛顿法中的Hesse矩阵$G_k$。
$H_{k+1}=B_{k+1}^{-1}$
关于矩阵$B$的BFGS公式:
$B_{k+1} = B_k+frac{q^{(k)}q^{(k)T}}{q^{(k)T}p^{(k)}}-frac{B_kp^{(k)}p^{(k)T}B_k}{p^{(k)T}B_kp^{(k)}}$
输入:目标函数$f(x)$,梯度$g(x)=Delta f(x)$,精度要求$epsilon$
输出:$f(x)$的极小点$x^*$
- step 1:取初始点$x^{(0)}$,取$B_0$为正定对称矩阵,置$k=0$
- step 2:计算$g_k=g(x^{(k)})$,若$||g_k||leqepsilon$,则停止计算,得近似解$x^*=x^{(k)}$;否则转step 3
- step 3:由$B_kp_k=-g_k$求出$p_k$
- step 4:一维搜索:求$lambda_k$使得$f(x^{(k)}+lambda_kp_k)=min f(x^{(k)}+{lambda}p_k)$,$lambdageq0$
- step 5:置$x^{(k+1)}=x^{(k)}+lambda_kp_k$
- step 6:计算$g_{k+1}=g(x^{(k+1)})$,若$||g_{k+1}|| < epsilon$,则停止计算,得近似解$x^*=x^{(k+1)}$,否则,则计算出$B_{k+1}$
- step 7:置$k=k+1$,转step 3
关于矩阵$H$的BFGS公式:
$H_{k+1}^{BFGS} = H_k+(1+frac{q^{(k)T}H_kq^{(k)}}{p^{(k)T}q^{(k)}})frac{p^{(k)}p^{(k)T}}{p^{(k)T}q^{(k)}}-frac{p^{(k)}q^{(k)T}H_k+H_kq^{(k)}p^{(k)T}}{p^{(k)T}q^{(k)}}$
这个重要公式是由Broyden,Fletcher,Goldfard和Shanno于1970年提出的,所以简称为BFGS
疑问:为什么BFGS会比DFP流行?https://www.zhihu.com/question/269123324/answer/345679876
BFGS有自动纠错功能
3.3 L-BFGS
在BFGS算法中,仍然有缺陷,比如当优化问题规模很大时,矩阵的存储和计算将变得不可行。为了解决这个问题,就有了L-BFGS算法。L-BFGS即Limited-memory BFGS。 L-BFGS的基本思想是只保存最近的m次迭代信息,从而大大减少数据的存储空间。对照BFGS,重新整理一下公式:
具体步骤参考:https://zhuanlan.zhihu.com/p/29672873
L-BFGS算法为什么快?https://www.zhihu.com/question/49418974/answer/155668749
四、共轭梯度法(Conjugate Gradient)
共轭:设$A$是对称正定矩阵,若$R^{n}$中的两个方向$d^{(1)}$和$d^{(2)}$满足$d^{(1)T}Ad^{(2)}=0$,则称这两个方向关于$A$共轭,或称它们关于$A$正交
定理:对于二次凸函数,若沿一组共轭方向(非零向量)搜索,经有限步迭代必达到极小点。
共轭梯度法基本思想:把共轭性与最速下降法结合,利用已知点处的梯度构成一组共轭方向,并沿这组方向进行搜索,求出目标函数的极小点,根据共轭方向的基本性质,这种方法具有二次终止性。
4.1 FR
$eta_j=frac{||g_{i+1}||^2}{||g_{i}||^2}$
二次函数计算步骤:
step 1:给定初始点$x^{(1)}$,置k=1
step 2:计算$g_k=Delta f(x^{(k)})$,若$||g_k||=0$,则停止计算,得点$ar x=x^{(k)}$;否则,进行下一步
step 3:构造搜索方向,令$d^{(k)}=-g_k+eta_{k-1}d^{(k-1)}$,其中,当$k=1$时,$eta_{k-1}=0$时,计算因子$eta_{k-1}$
step 4:令$x^{(k+1)}=x^{(k)}+lambda_kd^{(d)}$,计算步长$lambda_k=-frac{g_k^Td^{(k)}}{d^{(k)T}Ad^{(k)}}$
step 5:若$k=n$,则停止计算,得点$ar x=x^{(k+1)}$;否则,置$k:=k+1$,返回step 2
任意凸函数计算步骤:
step 1:给定初始点$x^{(1)}$,允许误差$epsilon>0$,置$y^{(1)}=x^{(1)},d^{(1)}=Delta f(y^{(1)}),k=j=1$
step 2:若$||Delta f(y^{(j)})||<epsilon$,则停止计算;否则,作一维搜索,求$lambda_j$,求满足$f(y^{(j)}+lambda_jd^{(j)})=min_{lambda >= 0}(y)$
step 3:如果$j<n$,则进行step 4;否则,进行step 5
step 4:令$d^{(j+1)}=-Delta f(y^{(j+1)})+eta_jd^{(j)}$,其中,$eta_j=frac{||Delta f(y^{(j+1)})||^2}{||Delta f(y^{(j)})||^2}$,置$j:=j+1$,转step 2
step 5:令$x^{(k+1)}=y^{(n+1)},y^{(1)}=x^{(k+1)},d^{(1)}=-Delta f(y^{(1)})$,置$j=1,k:=k+1$,转step 2
4.2 PRP
$eta_j=frac{g_{j+1}^T(g_{j+1}-g_j)}{g_j^Tg_j}$
任意凸函数计算步骤:
step 1:给定初始点$x^{(1)}$,允许误差$epsilon>0$,置$y^{(1)}=x^{(1)},d^{(1)}=Delta f(y^{(1)}),k=j=1$
step 2:若$||Delta f(y^{(j)})||<epsilon$,则停止计算;否则,作一维搜索,求$lambda_j$,求满足$f(y^{(j)}+lambda_jd^{(j)})=min_{lambda >= 0}(y)$
step 3:如果$j<n$,则进行step 4;否则,进行step 5
step 4:令$d^{(j+1)}=-Delta f(y^{(j+1)})+eta_jd^{(j)}$,其中,$eta_j=frac{g_{j+1}^T(g_{j+1}-g_j)}{g_j^Tg_j}$,置$j:=j+1$,转step 2
step 5:令$x^{(k+1)}=y^{(n+1)},y^{(1)}=x^{(k+1)},d^{(1)}=-Delta f(y^{(1)})$,置$j=1,k:=k+1$,转step 2
共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
五、比较
梯度下降法和牛顿法的比较:
从本质来说,梯度下降法是一阶收敛,牛顿法是二阶收敛,所以牛顿法的收敛速度更快。梯度下降法每次考虑的是当前位置的负梯度下降,而牛顿法不但考虑当前位置下降的是否够快,还会考虑下一步下降的是否够大,也就是说牛顿法目标更长远一点。牛顿法是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法使用一个平面去拟合当前的局部曲面,通常情况二次曲面拟合会比平面更好,所以牛顿法的下降路径会更符合真实的最优下降路径。
参考文献:
【1】常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)
【4】https://www.jianshu.com/p/e8b5a384a970
【5】https://blog.csdn.net/philosophyatmath/article/details/70153705