Closed13

共役勾配法について

ピン留めされたアイテム
ksttrksttr

参考文献

  1. Wendland, H. (2017). Numerical Linear Algebra: An Introduction (Cambridge Texts in Applied Mathematics). Cambridge: Cambridge University Press. doi:10.1017/9781316544938
Hidden comment
ksttrksttr

線形連立方程式と最小化問題

線形連立方程式

Ax = b

を数値的に解く方法は,色々あるが,Aが対称正定値行列の場合は,共役勾配法という方法が使える.

共役勾配法とは,

f(x) = x^{\mathrm{T}} A x - x^{\mathrm{T}} b

の最小化問題を解く方法である.

どういうことかというと,

f(x) を微分してみると,

\begin{align*} \nabla f(x) &= Ax - b \\ H f(x) &= A \end{align*}

である.ただし,\nabla f = (\partial f/ \partial x_1, \dots, \partial f/ \partial x_N)^{\mathrm{T}}Hf = (\partial^2 f / \partial x_i \partial x_j)_{ij} のことである.つまり勾配とヘッセ行列.

これを使って,f(x)yの周りでテイラー展開してみると,

\begin{align*} f(x) &= f(y) + (x-y)^{\mathrm{T}}\nabla f(y) + \frac{1}{2} (x-y)^{\mathrm{T}} Hf(y) (x-y) \\ &= f(y) + (x-y)^{\mathrm{T}}(Ax-b) + \frac{1}{2} (x-y)^{\mathrm{T}} A (x-y) \\ & \geq f(y) + (x-y)^{\mathrm{T}}(Ax-b) \end{align*}

となって,yAx=b の解x^*の時にfが最小となることがわかる.
ここで,最後の不等式は,Aが正定値だからである.

つまり,最小化問題

\min_{x \in \mathbb{R}^N} f(x)

の解x^*と,線形連立方程式

Ax=b

の解x^* は同じであるということである.

ksttrksttr

共役勾配法とは

ということで,タイトルに戻って,

共役勾配法とは,

\min_{x \in \mathbb{R}^N} f(x), \quad \mathrm{where} \quad f(x) = x^{\mathrm{T}} A x - x^{\mathrm{T}} b

を解く方法であって,求まった解xは,線形連立方程式

Ax = b

の解でもある.

具体的には,反復法を用いる.

つまり,

f(x_{j+1}) \leq f(x_j), \quad j = 1,2,\dots

を満たす点列 x_1, x_2, \dots を構成する.

そして,f(x_{M+1}) = f(x_M) となるMがあったとき,x_Mが求めたかった x となる.

ksttrksttr

共役勾配法の詳細

具体的に点列 \{x_j\}_{j=1,2,\dots} を構成していく.

x_{j+1} = x_j + \alpha_j p_j

と表しておいて,\alpha_jp_j を決める.

さて,f(x)の形を思いだすと,f(x)は,下に凸であるから,

\phi(\alpha) \equiv f(x_j + \alpha p_j)

と表しておくと,

\phi^\prime (\alpha) = 0

を満たす \alpha\alpha_jとすれば,x_jp_jが与えられているときに,もっとも小さい f(x_{j+1}) を得ることができる.

したがって,

0 = \phi^\prime(\alpha) = p_j^{\mathrm{T}} \nabla f(x_j + \alpha p_j) = p_j^{\mathrm{T}} \left[A(x_j + \alpha p_j)- b\right]

すなわち,

\alpha_j = \frac{p_j^{\mathrm{T}} (b-Ax_j)}{p_j^{\mathrm{T}} A p_j}

となる.

ここで,いくつか記号を導入しておく.

r_j \equiv b - Ax_j

は,解x^* との誤差を表すベクトルである.

また,任意のx, y \in \mathbb{R}^N に対して,Aに関する内積を,

\langle x, y \rangle_A \equiv y^{\mathrm{T}} A x

とくに,Aが単位行列Iのときの内積は,\langle x, y \rangle_I = \langle x,y\rangle_2 と表す.
これは,いつもの2乗して足していく内積である.
また,

\langle x,y \rangle_A = \langle Ax, y \rangle_2 = \langle x, A^{\mathrm{T}} y \rangle_2

が成り立つ.

これらの記号をつかうと,\alpha_jは,

\alpha_j = \frac{\langle r_j, p_j\rangle_2}{\langle p_j, p_j \rangle_A}

と表せる.

ksttrksttr

探索方向 p_j

残るは,探索方向を決めるベクトル p_j を決定することである.

これは,A共役であるベクトルの組 p_0, \dots, p_{N-1} が選ばれる.
ここで,p_0, \dots, p_{N-1}A共役であるとは,0 \leq i \not= j \leq N-1に対して,

\langle p_j, p_k \rangle_A = 0

であることを言う.

つまり,Aに関する内積による直交基底を選べ,と言うことである.

なぜ,A共役を選ぶかと言うと,上で選んだ \alpha_jに対して,解 x^* が,

x^* = x_0 + \sum_{j=0}^{N-1} \alpha_j p_j

と表すことができるからである.
すなわち,このように\alpha_j, p_j を選んでおくと,最悪でも,N 回で解に辿り着くことができる.

ksttrksttr

p_j の具体的な構成方法

では,p_j は具体的にはどのように選べば良いか.

A共役に選べば,最大で N 回の探索で十分であったが,できる限り探索回数は少なくしたい.
また,A 共役なベクトルの組 p_0, \dots, p_{N-1} は,最初にすべて計算しておくのではなく,反復するごとに,その都度計算した方が,計算効率がよい.

そこで,ここでは,p_0, \dots, p_i から p_{j+1} を構成する方法を述べる.
つまり,x_{j}が終了条件を満たさなかった時に,次の探索方向p_{j}を決める方法を述べる.
この場合,使用できるのは,

  • これまでの探索方向,p_0,\dots, p_{j-1}
  • これまでの解の候補 x_0, \dots, x_j
  • 誤差 r_0, \dots, r_{j}

である.

少し天下り的であるが,以下のように表してみる.

p_{j} = r_j + \sum_{k=0}^{j-1} \beta_j^{(k)} p_k

p_0, \dots, p_{N-1}A共役であるので,0 \leq l \leq j-1 に対して,

0 = \langle p_l, p_{j} \rangle_A = \langle p_l, r_j \rangle_A + \sum_{k=0}^{j-1} \beta_j^{(k)} \langle p_l, p_k \rangle_A = \langle p_l, r_j \rangle_A + \beta_j^{(l)} \langle p_l, p_l \rangle_A

であるから,

\beta_j^{(l)} = -\frac{\langle p_l, r_j \rangle_A}{\langle p_l, p_l \rangle_A} \quad \mathrm{for} \quad l = 0,\dots, j-1

このように,p_j を構成するメリットは,実は,\beta_j^{(0)} = \cdots = \beta_j^{(j-2)} = 0 となることである. つまり,\beta_j = \beta_j^{(j-1)} とすると,

p_j = r_j + \beta_j p_{j-1}

となって,これはメモリー使用量的にもとても良い形である.

さらに,この形は,他の探索方向の候補よりも効率がよい.次はこれをより正確に述べよう.

ksttrksttr

Krylov空間

より正確に述べるために,いくつか記号を定義する.

Krylov空間とは,ある行列A \in M_n(\mathbb{R})とベクトルp \in \mathbb{R}^Nに対して,i 個のベクトルの組 p, Ap, \dots, A^{i-1}pが生成する部分空間

\mathcal{K}_i(A,p) \equiv \mathrm{span}\{p, Ap, \dots, A^{i-1} p\}

のことである.

上記で構成した,r_0, \dots, r_{N-1}p_0, \dots, p_{N-1} に関して,

\mathcal{K}_i(A, r_0) = \mathrm{span} \{r_0, Ar_0, \dots, A^{i-1} r_0\} = \mathrm{span}\{r_0, \dots, r_{i-1}\}= \mathrm{span}\{p_0, \dots, p_{i-1}\}

が成り立ち,\dim \mathcal{K}_i(A, r_0) = i である.

また,x-y \in \mathcal{K}_i(A, p) のことを,x \in y + \mathcal{K}_i(A, p)と書く.

これらの記号を使うと,j番目の解候補 x_j は,x_0 + \mathcal{K}_j(A,r_0)の元であると言える.
この中の一つが,上で構成した共役勾配法による x_jということになる.

ksttrksttr

解との距離

2つのベクトル x, y の距離を先ほど導入したAによる内積によって作られるノルム|| \cdot ||_Aによって定める.つまり,

|| x ||_A \equiv \langle x,x \rangle_A

として,xy の距離を,||x-y||_A,と定める.

共役勾配法によって得られる,j回目の反復のときの解の候補 x_j は,他の解の候補 x \in x_0 + \mathcal{K}_j(A, r_0) よりも,真の解 x^* に近い.つまり,

|| x^* - x_j ||_A \leq || x^* - x ||_A

である.

ksttrksttr

最大の反復回数

共役勾配法の最大の反復回数は,行列 A の相異なる固有値の個数dである.

ksttrksttr

若干の変形

数値計算しやすいように,表示を少し変えておく.

ここで,数値計算しやすい形とは,

  • 行列とベクトルの積を含む内積,\langle \cdot \rangle_A よりも \langle \cdot \rangle_2 が現れるような形
  • 内積よりもノルムで計算できるような形

という感じである.

今,

\begin{align*} \alpha_j &= \frac{\langle r_j, p_j \rangle_2}{\langle p_j, p_j \rangle_A} \\ \beta_{j+1} &= -\frac{\langle r_{j+1}, p_j \rangle_A }{\langle p_j, p_j \rangle_A} \end{align*}

であって,これらを変形しておく.

\langle r_j, p_j \rangle_2 = \langle r_j, r_j + \beta_j p_{j-1} \rangle_2 = || r_j ||_2^2 + \beta_j \langle r_j, p_{j-1} \rangle_2 = || r_j ||_2^2

最後の等号は\alpha_jを決めるときの等式(\phi^\prime(\alpha) = 0)による.

また,

Ap_j = \frac{1}{\alpha_j} (x_{j+1} - x_{j}) = \frac{1}{\alpha_j}(r_j - r_{j+1})

より,

\begin{align*} \alpha_j &= \frac{||r_j||_2}{\langle Ap_j, p_j \rangle_2} \\ \beta_{j+1} &= \frac{||r_{j+1}||_2^2}{||r_j||_2^2} \end{align*}

となる.

ksttrksttr

共役勾配法のアルゴリズム

ここまでの話をアルゴリズムにすると以下のようになる.

Choose x[0] and epsilon
Set p[0] = r[0] = b - Ax[0]
for j=0 to j=N-1 do
    t[j] = Ap[j]
    alpha[j] = ||r[j]||^2/<t[j],p[j]>
    x[j+1] = x[j] + alpha[j] * p[j]
    r[j+1] = r[j] - alpha[j] * t[j]
    beta[j+1] = ||r[j+1]||^2/||r[j]||^2
    p[j+1] = r[j+1] + beta[j+1] * p[j]
    if ||r[j+1|| < epsilon then
        break
    j++

見にくいな.良い書き方はないか.

ksttrksttr

この後の展開

この後の展開としては,以下がある.

一般の行列に対する反復解法

行列 A は対称正定値行列に限られていたので,これを一般の行列Aにまで拡張させようというもの

CGNR法

Ax = b の両辺に転置A^\mathrm{T}をかけて

A^{\mathrm{T}} A x = A^{\mathrm{T}}b

をとすれば,CG法が使えるぞっという方法.

|| x^* - x_j ||_{A^{\mathrm{T}} A} = || b- Ax_j||_2

であるから,結局 r_j を最小化させていることとなる.
これより,Conjugate Gradient on th Normal equation to minimise the Residual と呼ばれる.

GMRES and MINRES

上の発想から,はじめから

\min\{||b-Ax||_2 \, | \, x \in x_0 + \mathcal{K}_j(A,r_0)\}

を考えようというものが,GMRESとMINRES
まだよくわかっていない.スクラップを改めて書いていく予定.

制約付きの最小化問題

制約がついている場合にも対応可能.

リーマン多様体上の共役勾配法

制約を\mathbb{R}^Nに埋め込まれた多様体として表現しておいて,この多様体上で共役勾配法をすれば,無制約の最小化問題に帰着できるというもの.

これがやりたくてこのスクラップを書いている.

このスクラップは2022/01/31にクローズされました