共轭梯度(凸优化方法)

我们这里定义共轭梯度要解决的问题是一个**正定二次型**的最优化问题,
形式化为:

m i n x f ( X ) = 1 2 X T A X − b T X min_xf(X)=\frac{1}{2}X^TAX-b^TX minxf(X)=21XTAXbTX

X X X是我们优化的参数向量, A A A是正定系数矩阵。
上面这个正定二次型导数(梯度)为:

g = A X − b g=AX-b gAXb

因此此二次型取最小值时导数为0,即: A X ∗ = b AX^*=b AX=b
因此我们的目标就是通过共轭梯度求取 X ∗ X^* X
残差:在梯度下降法中,某一个更新方向会被更新多次,说明在一次更新中这个方向并没有被更新完,这个方向还存在残差,所以未来还会对这个方向进行更新。而在最速梯度下下降中就没有这个问题,因为它是更新一个方向就会直接更新到底。共轭梯度是一种类似于最速下降的方法,所以也分为两步:求步长,求更新方向。
定义第t次迭代时当前参数向量与最优参数向量之间的误差:

e t = X ∗ − X t e_t=X^*-X_t et=XXt

定义第t次迭代的残差为迭代解在方程中的偏差(梯度反方向): r t = b − A X t r_t=b-AX_t rt=bAXt,残差和误差之间的关系是: r t = b − A X t = b − A ( X ∗ − e t ) = A e t r_t=b-AX_t=b-A(X^*-e_t)=Ae_t rt=bAXt=bA(Xet)=Aet由于残差的方向就是梯度的反方向,所以,梯度更新公式为: X t + 1 = X t + α t r t X_{t+1}=X_t+\alpha_t r_t Xt+1=Xt+αtrt
在共轭梯度中为了更新的方向明确,我们希望每次优化方向与误差方向正交,然后我们再控制每次更新的步长是使一次将一个方向更新完。这样我们需要更新的次数理论上就是向量空间的维数。
第一步我们来求一下步长:

同最速梯度下下降中一样,步长 α \alpha α满足:
α t = a r g m i n α f ( X t + α k r t ) \alpha_t=argmin_\alpha f(X_t+\alpha_k r_t) αt=argminαf(Xt+αkrt)
也就是把 X t X_t Xt d t d_t dt看做长数,对 f ( X t + 1 ) f(X_{t+1}) f(Xt+1) α \alpha α的导数,也就是在当前 X t X_t Xt和更新方向 d t d_t dt下,找到函数极值,这样就可以把 d t d_t dt这个方向更新完全。 α \alpha α求导可得:
d f ( X t + α k r t ) d α t = [ A ( X t + α k r t ) − b ] T r t ] = α k r t T A r t − r t T r t = 0 \frac{df(X_t+\alpha_k r_t)}{d\alpha_t}=[A(X_t+\alpha_k r_t)-b]^Tr_t]=\alpha_kr_t^TAr_t-r_t^Tr_t=0 dαtdf(Xt+αkrt)=[A(Xt+αkrt)b]Trt]=αkrtTArtrtTrt=0注意 A A A是正定系数矩阵,其转置为其本身。所以可以得到步长为:
α t = r t T r t r t T A r t \alpha_t=\frac{r_t^Tr_t}{r^T_tAr_t} αt=rtTArtrtTrt
由此我们也可以使用迭代法来求下一个更新使用的残差项 r t + 1 r_{t+1} rt+1, r t + 1 = b − A X t + 1 = b − A X t − α A r t = r t − α A r t r_{t+1}=b-AX_{t+1}=b-AX_{t}-\alpha Ar_{t}=r_t-\alpha Ar_t rt+1=bAXt+1=bAXtαArt=rtαArt
上面是最速下降的步长的求法,也可以看最速下降法用于正定二次型。
在最速下降法中,相邻的更新方向是互相垂直,在共轭梯度中我们是希望找一组互相垂直的方向来更新,每一次更新,都是更新这组相互正交的方向中一个,这样就不会重复更新某一个方向。

一种很好的想法就是,我们让这些更新互相正交的方向和误差也正交,这样每一次更新,就可以在一个维度上消除该维度上的误差,这样只需要空间的维数次更新就可以达到目标值。也就是我们希望:
r t T e t + 1 = 0 r_t^Te_{t+1}=0 rtTet+1=0但是其中 e t + 1 e_{t+1} et+1是未知的,因为 X ∗ X^* X是未知的。
为了避免求 e t + 1 e_{t+1} et+1,实际上我们是使用矩阵 A A A将误差向量 e t + 1 e_{t+1} et+1,转化到A组成的列空间中,只要有优化方向与这个新向量正交就可以了,即: r t T A e t + 1 = 0 r_t^TAe_{t+1}=0 rtTAet+1=0此时 r t r_t rt e t + 1 e_{t+1} et+1属于共轭正交。A就是轭。
我们来求共轭梯度的步长:
               r t T e t + 1 = 0 r_t^Te_{t+1}=0 rtTet+1=0
               r t T e t + 1 = r t T A [ e t + X t − X t + 1 ] r_t^Te_{t+1}=r_t^TA[e_t+X_t-X_{t+1}] rtTet+1=rtTA[et+XtXt+1]
                  = r t T A [ e t + α t r t ] =r_t^TA[e_t+\alpha_t r_t] =rtTA[et+αtrt]
                  = r t T A e t + α t r t T A r t = 0 =r_t^TAe_t+\alpha_tr_t^TAr_t=0 =rtTAet+αtrtTArt=0
                 解得:
               α t = − r t T A e t r t T A r t \alpha_t=-\frac{r_t^TAe_t}{r_t^TAr_t} αt=rtTArtrtTAet
               α t = − r t T A ( X ∗ − X t ) r t T A r t \alpha_t=-\frac{r_t^TA(X^*-X_t)}{r_t^TAr_t} αt=rtTArtrtTA(XXt)
由于梯度等于 g t = A X t − b g_t=AX_t-b gtAXtb,且 A X ∗ = b AX^*=b AX=b,所以分子上的 A ( X ∗ − X t ) A(X^*-X_t) A(XXt)展开得到: b − ( g t + b ) = g t b-(g_t+b)=g_t b(gt+b)=gt所以最终步长为: α t = − r t T g t r t T A r t \alpha_t=-\frac{r_t^Tg_t}{r_t^TAr_t} αt=rtTArtrtTgt,这样我们就把 e t e_t et消除了。

求方向:

下面我们来求更新方向:寻找一组关于A的正交基(因为更新方向为了消除 e t e_t et,已经与 e t e_t et关于 A A A共轭正交,所这组正交基也是关于 A A A正交的),首先,假设我们有一组关于解空间的线性无关的基,记为 u 1 , u 2 , . . . u n u_1,u_2,...u_n u1,u2,...un,那么我们可以根据这一组基,通过Gram-Schmidt正交变化求得一组关于A的正交基 d 1 , d 2 . . . d n d_1,d_2...d_n d1,d2...dn。过程如下,首先,令 d 1 = u 1 d_1=u_1 d1=u1,然后对于 d 2 d_2 d2,我们去掉和第一个向量共线的部分,去掉的比例是 β 21 \beta_{21} β21 d 2 = u 2 + β 21 d 1 d_2=u_2+\beta_{21}d_1 d2=u2+β21d1,然后对于 d 3 d_3 d3,我们去掉和第一、第二个向量共线的部分,去掉的比例是 β 31 , β 32 \beta_{31},\beta_{32} β31β32 d 3 = u 3 + β 31 d 1 + β 32 d 2 d_3=u_3+\beta_{31}d_1+\beta_{32}d_2 d3=u3+β31d1+β32d2.对于 d n d_n dn,我们去掉和第一、第二 个向量共线的部分,去掉的比例是 β n 1 , β n 2 . . . . . . \beta_{n1},\beta_{n2}...... βn1βn2......所以有 d n = u n + β n 1 d 1 + β n 2 d 2 d_n=u_n+\beta_{n1}d_1+\beta_{n2}d_2 dn=un+βn1d1+βn2d2
d n = u n + ∑ k = 1 n − 1 β n , k d k d_n=u_n+\sum_{k=1}^{n-1}\beta_{n,k}d_k dn=un+k=1n1βn,kdk咋么求这些系数呢,由于关于正交,所以有: d n T A d j = u n T A d j + ∑ k = 1 n − 1 β n , k d k T A d j = u n T A d j + β n j d j T A d j = 0 ( 这 里 由 于 正 交 消 除 很 多 项 ) d_n^TAd_j=u^T_nAd_j+\sum_{k=1}^{n-1}\beta_{n,k}d_k^TAd_j=u^T_nAd_j+\beta_{nj}d_{j}^TAd_j=0(这里由于正交消除很多项) dnTAdj=unTAdj+k=1n1βn,kdkTAdj=unTAdj+βnjdjTAdj=0()解出 β n j = − u n T A d j d j T A d j \beta_{nj}=-\frac{u^T_nAd_j}{d^T_jAd_j} βnj=djTAdjunTAdj
注意这里只求出 d n d_n dn中对于 d j d_j dj的系数,还有n-3个系数。所以求系数要用很多计算资源。算法复杂度为 O ( N 2 ) O(N^2) O(N2)
在共轭梯度中我们将残差作为Gram-Schmidt正交变化的输入,也就是 d 1 = r 1 d_1=r_1 d1=r1,然后计算步长 α 1 \alpha_1 α1更新 X X X得到 X 2 X_2 X2,再计算 r 2 r_2 r2,和 d 2 d_2 d2, α 2 \alpha_2 α2…就这样不断进行下去,直至收敛,这就是整个共轭梯度算法。

1.https://blog.csdn.net/yucong96/article/details/82256392
2.强化学习精要 冯超

你可能感兴趣的:(深度学习,机器学习,强化学习)