我们这里定义共轭梯度要解决的问题是一个**正定二次型**的最优化问题,
形式化为:
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)=21XTAX−bTX
X X X是我们优化的参数向量, A A A是正定系数矩阵。
上面这个正定二次型导数(梯度)为:
g = A X − b g=AX-b g=AX−b
因此此二次型取最小值时导数为0,即: A X ∗ = b AX^*=b AX∗=b
因此我们的目标就是通过共轭梯度求取 X ∗ X^* X∗
残差:在梯度下降法中,某一个更新方向会被更新多次,说明在一次更新中这个方向并没有被更新完,这个方向还存在残差,所以未来还会对这个方向进行更新。而在最速梯度下下降中就没有这个问题,因为它是更新一个方向就会直接更新到底。共轭梯度是一种类似于最速下降的方法,所以也分为两步:求步长,求更新方向。
定义第t次迭代时当前参数向量与最优参数向量之间的误差:
e t = X ∗ − X t e_t=X^*-X_t et=X∗−Xt
定义第t次迭代的残差为迭代解在方程中的偏差(梯度反方向): r t = b − A X t r_t=b-AX_t rt=b−AXt,残差和误差之间的关系是: 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=b−AXt=b−A(X∗−et)=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]=αkrtTArt−rtTrt=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=b−AXt+1=b−AXt−α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+Xt−Xt+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(X∗−Xt)
由于梯度等于
g
t
=
A
X
t
−
b
g_t=AX_t-b
gt=AXt−b,且
A
X
∗
=
b
AX^*=b
AX∗=b,所以分子上的
A
(
X
∗
−
X
t
)
A(X^*-X_t)
A(X∗−Xt)展开得到:
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=1∑n−1β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=1∑n−1β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.强化学习精要 冯超