線型方程式と共役勾配法

線型方程式 $Ax=b$ への解法としての共役勾配法のメモ．

# 問題設定と最適化問題への変換
線型方程式

```math
\begin{equation}
Ax=b
\tag{1}
\end{equation}
```

を考える．ここで，$A\in\mathbb{R}^{n\times n}$ は正定値対称行列とする．
次の最小化問題の最適解は線型方程式 (1) の解となっている．

```math
\begin{equation}
\mathop{\text{minimize}}_{x\in\mathbb{R}^n} \quad f(x) := \frac12x^\top Ax - b^\top x
\tag{2}
\end{equation}
```

これは，$A$ が正定値対称行列であるため，$f(x)$ が狭義凸関数で $\nabla f(x) = Ax - b$ となることからわかる．
以降，最適化問題 (2) について考える．

# 最適化問題に対する反復法
$f(x)$ を反復法により最小化することを考える．つまり，点列 $\{x^0, x^1, \ldots\}$ を

```math
x^{k+1} = x^k + t_k d^k
```

により生成することを考える．ここで，$t_k \in \mathbb R$ はステップ幅，$d^k \in \mathbb R^n$ は探索方向である． 
$t_k$ を正確な直線探索により計算する，つまり

```math
t_k = \mathop{\text{arg min}}_{t \in \mathbb R} f\left(x^k + t d^k\right)
```

で計算するとすると，$\frac{\mathrm{d}}{\mathrm{d}t} f\left(x^k + t d^k\right) = 0$ より，

```math
t_k = -\frac{\nabla f\left(x^k\right)^\top d^k}{\left(d^k\right)^\top A d^k}
```

となる．

# Cholesky 分解を用いた問題の変形と探索方向の考察
##  問題の Cholesky 分解を用いた変形
正定値対称行列 $A$ が $A = LL^\top$ と下三角行列 $L\in\mathbb R^{n \times n}$ を用いて Cholesky 分解されるとする．新たに $y := L^\top x$ とすると，問題 (2) は

```math
\mathop{\text{minimize}}_{x \in \mathbb R^n} \quad \frac12 x^\top LL^\top x - b^\top L^{-\top} L^\top x = \frac12 y^\top y -\left(L^{-1} b\right)^\top y
```

と書き換えられる．$b' = L^{-1}b$ とすると，$g(y) := \frac12 y^\top y - \left(L^{-1} b\right)^\top y = \sum_{i=1}^n \left(\frac12y_i^2 - b'_iy_i\right)$ は成分ごとに最小化することができる．
言い換えれば，各単位ベクトル $e^1, e^2, \ldots, e^n$ を探索方向とすることで，$y^n$ を最適解とする数列 $\{y^0, y^1, \ldots, y^n\}$ を

```math
t_k = \mathop{\text{arg min}}_{t \in \mathbb R} g\left(y^k + t e^{k+1}\right),\quad y^{k+1} = y^k + t_k e^{k+1}
```

により生成することができる．

## 問題の直交変換を用いた変形
さらに，直交行列 $P$ による直交変換 $z = Py$ (つまり，$y = P^\top z$) を考える．

```math
\mathop{\text{minimize}}_{x \in \mathbb R^n} \quad \frac12 y^\top y -\left(L^{-1} b\right)^\top y = \frac12 z^\top z - \left(PL^{-1}b\right)^\top z
```

より，先ほどと同様に $z$ の各成分について最小化できることがわかる．
つまり，$s^k = P^\top e^{k+1}$ とすると，直交するベクトル列 $s^0,s^1,\ldots,s^{n-1}$ を探索方向とすることで，$y^n$ を最適解とする数列 $\{y^0, y^1, \ldots, y^n\}$ を

```math
t_k = \mathop{\text{arg min}}_{t \in \mathbb R} g\left(y^k + t s^k\right),\quad y^{k+1} = y^k + t_k s^k
```

により生成することができる．

## 元の問題への帰着
ここで，$y = L^\top x$ に注意して元の問題に適用することを考える．
$y^{k+1} = y^k + t_k d^k$ の両辺の左から $L^{-\top}$ をかけて整理すると，

```math
x^{k+1} = x^k + t_k L^{-\top} s^k
```

となる．新たに $d^k = L^{-\top} s^k$ とすると，$s^k$ の直交条件は，

```math
0 = \left(s^k\right)^\top s^k = \left(d^k\right)^\top LL^\top d^k = \left(d^k\right)^\top A d^k
```

とかける．内積 $\langle a, b\rangle_A := a^\top A b$ について直交することを $A$-共役という．
$A$-共役なベクトル列 $\{d^0, d^1, \ldots, d^{n-1}\}$ を探索方向とすることで，$x^n$ を最適解とする数列 $\{x^0, x^1, \ldots, x^n\}$ を

```math
t_k = \mathop{\text{arg min}}_{t \in \mathbb R} f\left(x^k + t d^k\right),\quad x^{k+1} = x^k + t_k d^k
```

により生成することができる．

# A-共役な探索方向の計算
最急降下法における探索方向 $-\nabla f\left(x^0\right), -\nabla f\left(x^1\right), \ldots, -\nabla f\left(x^{n-1}\right)$ を Gram-Schmidt の直交化法により A-共役にすることを考える．つまり，

```math
\begin{align}
d^0 &= -\nabla f\left(x^0\right)\\
d^1 &= -\nabla f\left(x^1\right) + \frac{\left\langle \nabla f\left(x^1\right), d^0 \right\rangle_A}{\left\langle d^0, d^0 \right\rangle_A} d^0\\
&\vdots\\
d^{n-1} &= -\nabla f\left(x^{n-1}\right) + \sum_{i=0}^{n-2} \frac{\left\langle \nabla f\left(x^{n-1}\right), d^i \right\rangle_A}{\left\langle d^i, d^i \right\rangle_A} d^i
\end{align}
```

を考える．$k = 0, 1, \ldots, n-1$ について $\nabla f\left(x^k\right) \neq 0$ を仮定すると，$d^k \neq 0$ であり，
$$\nabla f\left(x^k\right)^\top \nabla f\left(x^\ell\right) = \nabla f\left(x^k\right)^\top d^\ell = 0\quad (\ell = 0, 1, \ldots, k-1)$$ 
となることを示すことができる．これは，正確な直線探索より $\nabla f\left(x^{k+1}\right)^\top d^{k} = \left.\frac{\mathrm{d}}{\mathrm{d} t}f\left(x^{k} + td^{k}\right)\right|_{t=t_k} = 0$ となることを用いて，数学的帰納法より証明することができる．

また，

```math
\begin{align}
\left\langle \nabla f\left(x^k\right), d^\ell \right\rangle_A &= \frac1{t_\ell}\left\langle \nabla f\left(x^k\right), x^{\ell+1} - x^{\ell} \right\rangle_A\\
&= \frac1{t_\ell}\left\langle \nabla f\left(x^k\right), Ax^{\ell+1} - Ax^{\ell} \right\rangle\\
&= \frac1{t_\ell}\left\langle \nabla f\left(x^k\right), Ax^{\ell+1} - b - \left(Ax^{\ell} - b\right)\right\rangle\\
&= \frac1{t_\ell}\left(\nabla f\left(x^k\right)^\top \nabla f\left(x^{\ell+1}\right) - \nabla f\left(x^k\right)^\top \nabla f\left(x^\ell\right)\right)\\
&= \begin{cases}
\frac1{t_{k-1}} \nabla f\left(x^k\right)^\top \nabla f\left(x^k\right) & (\ell = k-1)\\
0 & (\ell \leq k-2)
\end{cases}\\
&= \begin{cases}
-\frac{\left\langle d^{k-1}, d^{k-1}\right\rangle_A}{\nabla f\left(x^{k-1}\right)^\top d^{k-1}}\nabla f\left(x^k\right)^\top \nabla f\left(x^k\right) & (\ell = k-1)\\
0 & (\ell \leq k-2)
\end{cases}
\end{align}
```

より，

$$d^{k+1} = -\nabla f\left(x^{k+1}\right) + \beta_k d^k \quad (k\geq0)$$

が成り立つ．ここで，

$$\beta_k = - \frac{\nabla f\left(x^{k+1}\right)^\top \nabla f\left(x^{k+1}\right)}{\nabla f\left(x^{k}\right)^\top d^{k}}$$

とした．また，$\beta_k$ の分母について

$$\nabla f\left(x^{k}\right)^\top d^{k} = \nabla f\left(x^{k}\right)^\top \left(-\nabla f\left(x^{k}\right) + \beta_{k-1} d^{k-1}\right) = -\nabla f\left(x^{k}\right)^\top \nabla f\left(x^{k}\right)$$

となるので，

$$\beta_k = \frac{\nabla f\left(x^{k+1}\right)^\top \nabla f\left(x^{k+1}\right)}{\nabla f\left(x^{k}\right)^\top \nabla f\left(x^{k}\right)}$$

が得られる．

# まとめ
線型方程式 $Ax = b$ の解は以下の手順で求められる．

1. $x^0$ を初期化する．
1. $d^0 = r^0 = -\nabla f\left(x^0\right) = b - Ax^0$ で探索方向と残差を初期化する．
1. for $k = 0, 1, \ldots, n-1$ do  
  * ステップ幅 $t_k = \frac{\left(r^k\right)^\top d^k}{\left(d^k\right)^\top A d^k}$ を計算する．
  * $x^{k+1} = x^k + t_k d^k$ で更新する．
  * $r^{k+1} = r^k - t_kAd^k$ で残差を更新する．
  * $\beta_k = \frac{\left(r^{k+1}\right)^\top r^{k+1}}{\left(r^{k}\right)^\top r^{k}}$ を計算する．
  * $d^{k+1} = r^{k+1} + \beta_k d^k$ で探索方向を更新する．  
1. end for

また，このアルゴリズムを一般の非線形関数 $f$ に拡張することができる．

1. $x^0$ を初期化する．
1. $d^0 = -\nabla f\left(x^0\right)$ で探索方向を初期化する．
1. for $k = 0, 1, \ldots, n-1$ do  
  * ステップ幅 $t_k$ を計算する．
  * $x^{k+1} = x^k + t_k d^k$ で更新する．
  * $\beta_k = \frac{\nabla f\left(x^{k+1}\right)^\top \nabla f\left(x^{k+1}\right)}{\nabla f\left(x^{k}\right)^\top \nabla f\left(x^{k}\right)}$ を計算する．
  * $d^{k+1} = -\nabla f\left(x^{k+1}\right) + \beta_k d^k$ で探索方向を更新する．  
1. end for

# おまけ
係数 $\beta_k$ は様々なバリエーションが提案されている．ここでは，主要な 6 種類を紹介する．
$y^k = \nabla f\left(x^{k+1}\right) - \nabla f\left(x^{k}\right)$ とする．

* $\beta_k^\text{FR} = \frac{\nabla f\left(x^{k+1}\right)^\top \nabla f\left(x^{k+1}\right)}{\nabla f\left(x^{k}\right)^\top \nabla f\left(x^{k}\right)}$
* $\beta_k^\text{HS} = \frac{\nabla f\left(x^{k+1}\right)^\top y^k}{\left(d^k\right)^\top y^k}$
* $\beta_k^\text{PR} = \frac{\nabla f\left(x^{k+1}\right)^\top y^k}{\nabla f\left(x^{k}\right)^\top \nabla f\left(x^{k}\right)}$
* $\beta_k^\text{CD} = \frac{\nabla f\left(x^{k+1}\right)^\top \nabla f\left(x^{k+1}\right)}{-\nabla f\left(x^{k+1}\right)^\top d^k}$
* $\beta_k^\text{LS} = \frac{\nabla f\left(x^{k+1}\right)^\top y^k}{-\nabla f\left(x^{k+1}\right)^\top d^k}$
* $\beta_k^\text{DY} = \frac{\nabla f\left(x^{k+1}\right)^\top \nabla f\left(x^{k+1}\right)}{\left(d^k\right)^\top y^k}$

これらは，$f(x) := \frac12x^\top Ax - b^\top x$ の場合には等価である．

# 参考文献
[Narushima, Y., & Yabe, H. (2014). A survey of sufficient descent conjugate gradient methods for unconstrained optimization. SUT journal of Mathematics, 50(2), 167-203.](https://core.ac.uk/download/pdf/229564225.pdf)