优化算法详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42150936/article/details/88298481

矩阵求导之向量求导

  • 对向量求导

Amn=[a11a12a1na21a22a2nam1am2amn]A_{m*n}=\left[ \begin{matrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \cdots & \cdots& \vdots & \cdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{matrix}\right]

x=[x1x2xn]x=\left[ \begin{matrix} x_1 \\ x_2 \\ \cdots \\ x_n \end{matrix}\right]

Ax=[a11x1+a12x2++a1nxna21x1+a22x2++a2nxnam1x1+am2x2++amnxn]Ax = \left[ \begin{matrix} a_{11}x_1+a_{12}x_2+\cdots+a_{1n}x_n \\ a_{21}x_1+a_{22}x_2+\cdots+a_{2n}x_n \\ \cdots\\ a_{m1}x_1+a_{m2}x_2+\cdots+a_{mn}x_n \end{matrix} \right]

Axx=[a11a21am1a12a22am2a1na2namn]=AT\frac{\partial Ax}{\partial x}=\left[ \begin{matrix} a_{11} & a_{21} & \cdots & a_{m1} \\ a_{12} & a_{22} & \cdots & a_{m2} \\ \cdots \\ a_{1n} & a_{2n} & \cdots & a_{mn} \end{matrix}\right] = A^T

对谁求导数,就以谁作为主序,得出结果。比如这里x是列向量,求Ax关于x求导数,那么对x的每个分量分别求导(写成一行),然后整理排成列(对x一样是列向量)

牛顿迭代法

  • 多元函数的泰勒展开

f(x1+Δx1,x2+Δx2+, ,xn+Δxn)f(x_1+\Delta x_1,x_2+\Delta x_2+,\cdots ,x_n+\Delta x_n)

=i=01i!(Δx1x1+Δx2x2, ,Δxnxn)if(x1,x2, ,xn)=\sum_{i=0}^{\infin}\frac{1}{i!}\big(\Delta x_1\frac{\partial}{\partial x_1}+ \Delta x_2\frac{\partial}{\partial x_2},\cdots,\Delta x_n\frac{\partial}{\partial x_n} \big)^if(x_1,x_2,\cdots,x_n)

  • 牛顿法求解零点

xn+1=xnf(xn)/f(xn)x_{n+1}=x_n - f(x_n)/f^\prime(x_n)

即此方法将f(x)f(x)展开:
f(x)=f(x0)+f(x0)(xx0)=>x=x0f(x0)/f(x0)f(x)=f(x_0)+f^\prime(x_0)(x-x_0)=>x=x_0-f(x_0)/f^\prime(x_0)
进而推出:
xn+1=xnf(xn)/f(xn)x_{n+1}=x_n - f(x_n)/f^\prime(x_n)

  • 牛顿法求极值点(一元)

需要求得f(x)=0f^\prime(x)=0,因此将f(x)f(x)展开到二阶可得:

f(x)=f(x0)+f(x0)(xx0)+12f(x0)(xx0)2f(x)=f(x_0)+f^ \prime(x_0)(x-x_0)+\frac{1}{2}f^{\prime\prime}(x_0)(x-x_0)^2
进而可以得到:
x=x0f(x0)/f(x0)x=x_0 - f^ \prime(x_0)/f^{\prime\prime}(x_0)

  • 牛顿法求极值点(多元)

使用多元函数的展开形式:

f(X)=f(X0)+JT(X0)(XX0)+12(XX0)THT(X0)(XX0)f(X)=f(X^0)+J^T(X^0)(X-X^0)+\frac{1}{2}(X-X^0)^TH^T(X^0)(X-X^0)

其中J(X0)J(X^0)如下:

(3)[fx00fx10fx20fxn0] \left[ \begin{matrix} \frac{\partial f}{\partial x^0_0} \\ \frac{\partial f}{\partial x^0_1} \\ \frac{\partial f}{\partial x^0_2}\\ \vdots\\ \frac{\partial f}{\partial x^0_n} \end{matrix} \right] \tag{3}

其中H(X0)H(X^0)如下:

(3)[2f2x002fx00x102fx00xn02fx10x002f2x102fx10xn02fx20x002fxn0x002f2xn0] \left[ \begin{matrix} \frac{\partial^2 f}{\partial^2 x^0_0}&\frac{\partial^2 f}{\partial x^0_0 \partial x^0_1}&\cdots&\frac{\partial^2 f}{\partial x^0_0\partial x^0_n}\\ \frac{\partial^2 f}{\partial x^0_1\partial x^0_0}&\frac{\partial^2 f}{\partial^2 x^0_1}&\cdots&\frac{\partial^2 f}{\partial x^0_1\partial x^0_n}\\ \frac{\partial^2 f}{\partial x^0_2 \partial x^0_0}&\ddots&&\vdots\\ \vdots&\cdots&\ddots&\vdots\\ \frac{\partial^2 f}{\partial x^0_n \partial x^0_0}&\cdots&\cdots& \frac{\partial^2 f}{\partial^2 x^0_n }& \end{matrix} \right] \tag{3}

两边求导并梳理可得

X=X0H1(X0)J(X0)X = X^0 - H^{-1}(X^0)J(X^0)

推导出:

Xk+1=XkH1(Xk)J(Xk)X^{k+1}=X^{k}-H^{-1}(X^k)J(X^k)

总结:

  1. 优点:二阶收敛,收敛速度较快
  2. 缺点:牛顿法是一种迭代算法,每一步都需要求目标函数的Hessian矩阵的逆矩阵,计算较为复杂

分析:

原始牛顿迭代法公式中没有步长因子,而是定步长迭代,对于非二次型目标函数,有时会使函数值上升,即出现f(Xk+1)>f(Xk)f(X^{k+1})>f(X^k)的情况,这表明原始牛顿迭代法不能保证函数稳定下降

  • 阻尼牛顿迭代法
  1. 牛顿迭代法变形

Xk+1=XkH1(Xk)J(Xk)X^{k+1}=X^{k}-H^{-1}(X^k)J(X^k)
Xk+1=Xk+dkX^{k+1}=X^k+d^k

  1. 增加阻尼

Xk+1=Xk+λkdkX^{k+1}=X^{k}+\lambda^k d^k
λk=argminλRf(Xk+λdk)\lambda^k = arg\min_{\lambda \in R}f(X^k +\lambda d^k)

  • 拟牛顿迭代法条件
  1. 泰勒展开

f(X)=f(Xk+1)+JT(Xk+1)(XXk+1)+12(XXk+1)TH(Xk+1)(XXk+1)f(X) = f(X^{k+1})+J^T(X^{k+1})(X-X^{k+1})+\frac{1}{2}(X-X^{k+1})^TH(X^{k+1})(X-X^{k+1})

  1. 求偏导

J(X)=J(Xk+1)+H(Xk+1)(XXk+1)J(X)=J(X^{k+1})+H(X^{k+1})(X-X^{k+1})

J(Xk)=J(Xk+1)+H(Xk+1)(XkXk+1)J(X^k)=J(X^{k+1})+H(X^{k+1})(X^k-X^{k+1})

  1. 参数设计

a.sk=Xk+1Xks^k= X^{k+1}-X^{k}
b. yk=J(Xk+1)J(Xk)y^k=J(X^{k+1})-J(X^k)
c. Dk+1=(Hk+1)1D^{k+1}=(H^{k+1})^{-1}

综上有:

yk=Hk+1sky^k=H^{k+1}s^k
sk=(Hk+1)1yks^k=(H^{k+1})^{-1}y_k
sk=Dk+1yks^k=D^{k+1}y^k

  • DFP算法
  1. 该算法核心为:

Dk+1=Dk+ΔDkD^{k+1}=D^{k}+\Delta D^k

  1. 假设变化量

ΔDk=αuuT+βvvT\Delta D^k = \alpha uu^T +\beta vv^T

  1. 代入方程

sk=Dk+1yk=(Dk+ΔDk)yk=(Dk+αuuT+βvvT)yks^k=D^{k+1}y^k=(D^k+\Delta D^k)y^k=(D^k+ \alpha uu^T +\beta vv^T)y^k
sk=Dkyk+αuuTyk+βvvTyk=Dkyk+αuTyku+βvTykvs^k=D^ky_k+\alpha uu^Ty^k +\beta vv^Ty^k = D^ky^k +\alpha u^Ty^ku+\beta v^Ty^k v

  1. 简化方程

auTyk=1au^Ty^k=1
βvTyk=1\beta v^Ty^k=-1

上式转化为

sk=Dkyk+uvs^k=D^ky^k +u-v

skDkyk=uvs^k-D^ky^k =u-v

于是有:
u=sk,v=Dkyku=s^k,v=D^ky^k
代入原方程有:

α=1uTyk=1skTyk\alpha = \frac{1}{u^Ty^k}=\frac{1}{s_k^Ty^k}
KaTeX parse error: Double superscript at position 65: …}=-\frac{1}{y^k^̲TD^ky_k}

  1. 整合

ΔDk=αuuT+βvvT=sk(sk)T(sk)TykDkyk(yk)T(Dk)T(yk)TDkyk\Delta D_k = \alpha uu^T + \beta vv^T = \frac{s^k(s^k)^T}{(s^k)^Ty^k}-\frac{D^ky^k(y^k)^T(D^k)^T}{(y^k)^TD^ky^k}

  1. 计算流程

    计算流程与牛顿法相同

    gk<δg_{k}<\delta

  • 共轭梯度法
  1. 二次函数解释

    设有二次函数f(x)=12(xx^)TA(xx^)f(x)=\frac{1}{2}(x-\hat x)^TA(x-\hat x)
    其中A是n*n对称正定矩阵,x^\hat x是一个定点
    则函数f(x)f(x)的等值面12(xx^)TA(xx^)=c\frac{1}{2}(x-\hat x)^TA(x-\hat x)=c是以x^\hat x为中心的椭球面

    示例:


    在这里插入图片描述

  • 由于Δf(x^)=A(x^x^)=0\Delta f(\hat x)=A(\hat x - \hat x)=0
    Δ2f(x^)=A\Delta^2f(\hat x)=A
    因为A正定,所以Δ2f(x^)=A>0\Delta^2f(\hat x)=A >0
    因此x^\hat xf(x)f(x)的极小点

  • x0x^0是在某个等值面上的一点,d1d^1RnR^n中的一个方向,x0x^0沿d1d^1以最优步长搜索到点x1x^1,则d1d^1是点x1x^1所在等值面的切向量,该等值面在点x1x^1处的法向量为Δf(x1)\Delta f(x^1)

  • 示例:


    在这里插入图片描述

  • Δf(x1)=A(x1x^)\Delta f(x^1)=A(x^1-\hat x)
    d1d^1Δf(x1)\Delta f(x^1)正交,即
    (d1)TΔf(x1)=0(d^1)^T\Delta f(x^1)=0

  1. 共轭方向

    设A是n*n的对称正定矩阵,对于RnR^n中的两个非零向量d1d^1d2d^2,若有(d1)TAd2=0(d^1)^TAd^2=0,则称d1d^1d2d^2关于A共轭

    定理一:

    设A是n阶对称正定矩阵,d1,d2, ,dkd^1,d^2,\cdots,d^k是k个A共轭的非零向量,则这个向量组线性相关

  • 定理二:

    设有函数f(x)=12xTAx+bTx+cf(x)=\frac{1}{2}x^TAx+b^Tx+c,其中A是n阶对称正定矩阵。d1,d2, ,dkd^1,d^2,\cdots,d^k是一组A共轭向量。以任意的x1Rnx^1\in R^n为初始点,依次沿d1,d2, ,dkd^1,d^2,\cdots,d^k进行搜索,得到x1,x2, ,xk+1x^1,x^2,\cdots,x^{k+1},则xk+1x^{k+1}是函数f(x)f(x)x1+Bkx^1+B_k上的极小点,其中

    Bk={xx=i=1kλidi,λiR}B_k=\{x|x=\sum_{i=1}^k \lambda_i d^i,\lambda_i \in R\}

  • 是由d1,d2, ,dkd^1,d^2,\cdots,d^k生成的子空间。特别地,当k=n时,xn+1x^{n+1}f(x)f(x)RnR^n上的唯一极小点。

  1. 将给定的一组向量r1,r2, ,rnr^1,r^2,\cdots,r^n正交化

    d1=r1d^1=r^1
    dn=rnk1d1k2d2kn1dn1d^n = r^n - k_1d^1-k_2d^2\cdots-k_{n-1}d^{n-1}
    因为 d之间关于A共轭,因此可得:
    kn1=dn1Arndn1Adn1k_{n-1}=\frac{d^{n-1}Ar^n}{d^{n-1}Ad^{n-1}}
    带入公式即可正则化为:d1,d2, ,dnd^1,d^2,\cdots,d^n

  2. 求各点以及步长:

    v1=x1v_1=x_1
    v2=x1+k1d1, ,vl+1=x1+k1d1++kldlv_2=x_1+k_1d^1,\cdots,v_{l+1}=x_1+k_1d_1+\cdots+k_ld_l
    因为有:(令r=x1x^r=x_1 - \hat x)
    (d1)TA(v2x^)=0(d^1)^TA(v_2-\hat x) =0
    =>k1=(d1)TAr(d1)TAd1=>k_1=-\frac{(d^1)^TAr}{(d^1)^TAd^1}
    同理
    kl=(dl)TAr(dl)TAdlk_l = -\frac{(d^l)^TAr}{(d^l)^TAd^l}
    通过递推可以得到各个步长及其对应的点

动量法

yy表示动力项
vt=ηvt1+γΔJ(W)v_t = \eta v_{t-1}+\gamma\Delta J(W)
W=WvtW=W-v_t

理解为权值的改变受上一次权值改变的影响,类似于小球向下滚动的时候带上惯性,这样可以加快小球下降

NAG

vt=ηvt1+γΔJ(Wηvt1)v_t = \eta v_{t-1}+\gamma \Delta J(W-\eta v_{t-1})
W=WvtW = W -v_t

NAG在TF中跟Momentum合并在同一个函数中tf.train.MomentumOptimizer中,可以通过参数配置启用。在Momentum中小球会盲目地跟从下坡的梯度,容易发生错误,所以我们需要一个更聪明的小球,这个小球提前知到要去哪里,它还要知道走到坡底的时候速度慢下来而不是冲上另一个坡,ηvt1\eta v_{t-1}会用来修改W的值,计算Wηvt1W-\eta v_{t-1}可以表示小球下一个位置大概在哪里,从而我们可以提前计算下一个位置的梯度,然后使用到当前位置。

Adagrad

  • 基本定义

Δθi(f(xi;θ),yi)\Delta_\theta \sum_i (f(x^i;\theta),y^i)

  • 步骤:
  1. 计算梯度

g=1mΔθiL(f(xi;θ),yi)g = \frac{1}{m}\Delta_\theta \sum_i L(f(x^i;\theta),y^i)

  1. 累计平方梯度

r=r+ggr = r+ g*g

  1. 计算更新梯度

Δθt=ϵδ+rg\Delta \theta_t = -\frac{\epsilon}{\delta + \sqrt r}*g

  1. 应用更新

θt+1=θt+Δθt\theta_{t+1} = \theta_t + \Delta \theta_{t}

其基于SGD的一种算法,它的核心思想是比较常见的数据给予它比较小的学习率去调整参数,对于比较罕见的数据给予比较大的学习率去调整参数,它比较适用于数据稀疏的数据集。
Adagrad主要的优势在于不需要认为的调节学习率,可以自动调整。它的缺点在于,随着迭代次数的增多,学习率也会越来越低,最终会趋向于0.

RMSprop(Root Mean Square)

  • 基本定义

Δθi(f(xi;θ),yi)\Delta_\theta \sum_i (f(x^i;\theta),y^i)

  • 步骤:
  1. 计算梯度

g=1mΔθiL(f(xi;θ),yi)g = \frac{1}{m}\Delta_\theta \sum_i L(f(x^i;\theta),y^i)

  1. 累计平方梯度

r=ρr+(1ρ)ggr = \rho r+ (1-\rho)g*g

  1. 计算更新梯度

Δθt=ϵδ+rg\Delta \theta_t = -\frac{\epsilon}{ \sqrt{\delta +r} }*g

  1. 应用更新

θt+1=θt+Δθt\theta_{t+1} = \theta_t + \Delta \theta_t

其基于SGD的一种算法,它的核心思想是比较常见的数据给予它比较小的学习率去调整参数,对于比较罕见的数据给予比较大的学习率去调整参数,它比较适用于数据稀疏的数据集。
Adagrad主要的优势在于不需要认为的调节学习率,可以自动调整。它的缺点在于,随着迭代次数的增多,学习率也会越来越低,最终会趋向于0.

Adadelta

  1. 计算梯度

g=1mΔθiL(f(xi;θ),yi)g = \frac{1}{m}\Delta_\theta \sum_i L(f(x^i;\theta),y^i)

  1. 累计梯度

r=βr+(1β)ggr = \beta r + (1-\beta) g*g

  1. 计算参数更新方向

Δθt=ηr+δg\Delta \theta_t = -\frac{\eta}{\sqrt{r+\delta}}g

  1. 累计更新方向的值

k=ak+(1a)Δθt1Δθt1k = a k +(1-a)\Delta \theta_{t-1} *\Delta \theta_{t-1}

  1. 使用累计更新方向代替η\eta

Δθt=k+τr+δg\Delta \theta_t = -\frac{\sqrt{k+\tau}}{\sqrt{r+\delta}}g

  1. 应用

θt+1=θt+Δθt\theta_{t+1}=\theta_{t}+\Delta \theta_t

Adam

  1. 当前速度

vt=β1vt1+(1β1)gtv_t = \beta_1 v_{t-1} + (1- \beta_1)g_t

  1. 更新速度

rt=β2rt1+(1β2)gt2r_t = \beta_2 r_{t-1} +(1-\beta_2)g^2_t

  1. 修正

vt=vt1β1tv^{\prime}_t = \frac{v_t}{1-\beta^t_1}
rt=rt1β2tr^{\prime}_t = \frac{r_t}{1-\beta^t_2}

  1. 参数更新

θt+1=θtart+δvt\theta_{t+1}=\theta_t - \frac{a}{\sqrt{r^{\prime}_t+\delta}}v_t

展开阅读全文

没有更多推荐了,返回首页