2019-04-10

作者: sea_monster | 来源:发表于2019-04-10 21:15 被阅读2次

    共轭梯度

    参考

    主要参考这篇文章,非常推荐查看,文章最后还有个关于共轭梯度的图
    Conjugate gradient method wiki
    Gram-Schmidt方法 wiki
    在介绍共轭梯度之前,我们先介绍一下Gram-Schmidt过程(革兰氏-施密特方法),看它如何对向量组进行正交归一化。

    首先定义投影操作:{\displaystyle proj_u(v)=\frac{\langle u,v\rangle}{\langle u,u \rangle}u}
    其中\langle u,v\rangle表示向量u,v的在R^n上的内积。该运算符将向量v正交投影到向量u所跨越的线上。如果u=0,我们定义proj_u(v)=0

    Gram-Schmidt过程的工作原理如下:
    u_1=v_1
    u_2=v_2-proj_{u_1}(v_2)
    u_3=v_3-proj_{u_1}(v_3)-proj_{u_2}(v_3)
    \cdots
    u_k=v_k-\sum\limits^{k-1}_{j=1}proj_{u_j}(v_k)

    该方法进行如下运算:为了计算u_i,它首先将v_i正交投影到u_1,\cdots,u_{i-1}上,然后从向量u_i中减去为v_i与每个投影之间的差,从而保证与空间中的所有向量(u_1,\cdots,u_{i-1})正交。

    图来源wiki
    最终原理图如下所示:

    optimization图23.gif

    什么是共轭?
    对矩阵A\in R^{n\times n}对称正定,而p_1,p_2,\cdots, p_mR^n中任意一组非零向量,若 p_i^TAp_j=0(i\ne j),则称向量组p_1,p_2,\cdots, p_m是相对于A共轭的。

    由于矩阵是A是对称(A^T=A)且正定的,则关于其的共轭内积可定义为:
    {\displaystyle \langle u,v\rangle_A:=\langle Au,v\rangle}=\langle u,A^Tv\rangle=\langle u,Av\rangle=u^TAv
    (由于我们将要处理的是共轭而不是正交(A=I时为正交),所以在要运用Gram-Schmidt方法时需要运用共轭形式的内积。)

    进入正题:

    模型建立
    假定待优化的函数:{\displaystyle \underset{x}{min}f(x)=\frac{1}{2}x^TAx-b^Tx}

    (其中x为待优化变量,A为正定矩阵,b为已知变量。)

    下标k表示优化步数,负梯度为:r_k=b-Ax_k

    假设最优变量为x^*,则优化问题可变为求方程Ax^*=b的解。梯度r也可以称作为每一步的残差。
    算法推导
    优化方向确定:

    假定第一次优化方向为初始负梯度方向:p_1=r_0

    每一次优化方向与之前的优化方向正交,采用Gram-Schmidt方法进行向量正交化,每次优化方向根据当前步的梯度得出:
    {\displaystyle p_k=r_k-\sum\limits^{k-1}_{i=1} \frac{p_i^TAr_k}{p^T_iAp_i}p_i}

    再令{\displaystyle \beta_{ik}=\frac{p^T_iAr_k}{p^T_iAp_i}}(这个\beta计算出来是个实数),则有:{\displaystyle p_k=r_k-\sum\limits^{k-1}_{i=1}\beta_{ik} p_i}

    优化步长确定:

    假定第k步的优化步长为\alpha_k
    f(x_{k+1})=f(x_k+\alpha_kp_k)求导令导数为零有:{\displaystyle \alpha_k= \frac{p_k^Tr_k}{p^T_kAp_k}}(行搜索)。

    共轭梯度其实到这里已经证明结束了,但一般选择其化简式。所以接下来对等式进行化简:
    误差e_k定义为x_k与最优变量x^*的差值:
    {\displaystyle e_k=x^*-x_k=\sum\limits^n_{i=1}\alpha_ip_i-\sum\limits^k_{i=1}\alpha_ip_i=\sum\limits^n_{i=k+1}\alpha_ip_i}
    对残差r_k有:
    r_k=b-Ax_k=Ax^*-Ax_k=Ae_k

    在得到最终的等式前,证明下面两个性质:

    1.残差与之前的所有的方向正交

    证明:
    任取一个方向p_j,并且j\le k

    {\displaystyle p_j^Tr_k=p_j^TAe_k=\sum\limits^n_{i=k+1}\alpha_i p_j^TAp_i}=0

    2.残差与之前的所有的残差正交
    如果残差与搜索方向形成向量基正交,那么残差也会形成向量基。这意味着任何残差都与它先前的残差正交。
    证明如下:
    k+1\le j时:
    {\displaystyle p_{k+1}=r_k-\sum\limits_{i\le k}\beta_{ik}p_i}
    右乘r_j有
    {\displaystyle p_{k+1}^Tr_j=r_k^Tr_j-\sum\limits_{i\le k}\beta_{ik}p_i^Tr_j}
    0=r_k^Tr_j+0

    基于残差的梯度步长:(求简化的\alpha)
    由之前可得:r_{k+1}^Tr_k=0
    又由于:r_{k+1}=b-Ax_{k+1}则:
    (b-Ax_{k+1})^Tr_k=0
    (b-A(x_k+\alpha_{k+1}p_{k+1}))^Tr_k=0
    (b-Ax_k)^Tr_k-\alpha_{k+1}(Ap_{k+1}^T)r_k=0
    r_k^Tr_k-\alpha_{k+1}(Ap_{k+1})^Tr_k=0
    {\displaystyle \alpha_{k+1}=\frac{r_k^Tr_k}{p_{k+1}^TAr_k}} (A=A^T)
    又因为:{\displaystyle p_{k+1}=r_k-\sum\limits_{i\le k}\beta_i p_i}
    {\displaystyle \alpha_{k+1}=\frac{r_k^Tr_k}{p_{k+1}^TAp_{k+1}}}

    正交化步骤仅取决于先前的搜索方向::(求简化的\beta)
    x_{k+1}=x_k+\alpha_{k+1}p_{k+1}(更新x_k的值)
    b-Ax_{k+1}=b-Ax_k-\alpha_{k+1}Ap_{k+1}
    (\alpha_{k+1}的值为实数)
    r_{k+1}=r_k-\alpha_{k+1}Ap_{k+1}
    前乘r_j^T值,求新的\beta值:
    r_j^Tr_{k+1}=r_j^Tr_k-\alpha_{k+1}r_j^TAp_{k+1}
    \alpha_{k+1}r_j^TAp_{k+1}=-r_j^Tr_{k+1}+r_j^Tr_k
    又因为:{\displaystyle \beta_{ik}=\frac{r_k^TAp_i}{p_i^TAp_i}}
    \alpha_{k+1}\beta_{k+1,j}p_{k+1}^TAp_{k+1}=-r_j^Tr_{k+1}+r_j^Tr_k
    \beta_{k+1,j}r_k^Tr_k=-r_j^Tr_{k+1}+r_j^Tr_k
    {\displaystyle \alpha_{k+1}=\frac{r_k^Tr_k}{p^T_{k+1}Ap_{k+1}}}代替\alpha_{k+1}p_{k+1}^TAp_{k+1}有:

    得到{\displaystyle \beta_{k+1,j}=\frac{-r_j^Tr_{k+1}+r_j^Tr_k}{r_k^Tr_k}}
    变化一下得:{\displaystyle \beta_{k,j}=\frac{-r_j^Tr_{k}+r_j^Tr_{k-1}}{r_{k-1}^Tr_{k-1}}}
    又因为:{\displaystyle p_{k+1}=r_k-\sum\limits_{i\le k}\beta_{ik}p_i=r_k-\sum\limits_{j\le k}\beta_{k,j}p_i}
    可简化为:{\displaystyle p_{k+1}=r_k-\beta_{k,k}p_k}
    其中:{\displaystyle \beta_{k,k}=\frac{-r_k^Tr_k}{r_{k-1}^Tr_{k-1}}}

    伪代码:
    在简化后:
    r_0=b-Ax_0
    p_1=r_0
    k=1
    repeat
    {\displaystyle \alpha_k=\frac{r_{k-1}^Tr_{k-1}}{p_k^TAp_k}}
    x_k=x_{k-1}+\alpha_kp_k
    r_k=r_{k-1}-\alpha_kAp_k
    {\displaystyle \beta_k=\frac{r_k^Tr_k}{r_{k-1}^Tr_{k-1}}}
    p_{k+1}=r_k+\beta_kp_k
    k=k+1
    until r_{k-1}<\epsilon
    (残差小于某个值便可以跳出来了。)
    return x_{k-1}

    相关文章

      网友评论

        本文标题:2019-04-10

        本文链接:https://www.haomeiwen.com/subject/umcaiqtx.html