数学的最適化アルゴリズム
与えられた線形システムに関連付けられた二次関数を最小化するための、最適なステップ サイズ (緑) と共役ベクトル (赤) を使用した 勾配降下法 の収束の比較。共役勾配は、正確な演算を前提とすると、最大で n ステップで収束します。ここで、 n はシステムの行列のサイズです (ここでは n = 2)。
数学 において 、 共役勾配法は 、行列が 半正定値 である特定 の線形方程式系の 数値解法 の アルゴリズム です 。共役勾配法は、多くの場合、 反復アルゴリズム として実装され、直接実装や コレスキー分解 などの他の直接的な方法で処理するには大きすぎる スパースシステムに適用できます。大規模なスパースシステムは、 偏微分方程式 や最適化問題を
数値的に解くときによく発生します。
共役勾配法は、エネルギー最小化 などの制約のない 最適化 問題を解くためにも使用できます 。この法則は、 マグナス ・ヘステネス と エドゥアルド・シュティーフェル [1] [2]が Z4 でプログラムし 、 [3] 広範囲に研究したことで広く知られています。 [4] [5]
二 重共役勾配法は、 非対称行列への一般化を提供します。さまざまな 非線形共役勾配法は、 非線形最適化問題の最小値を求めます。
共役勾配法で扱う問題の説明
線形方程式の連立方程式 を解きたいとします。
あ
x
=
b
{\displaystyle \mathbf {A} \mathbf {x} =\mathbf {b} }
ベクトル に対して 、既知の 行列 は 対称行列 (つまり、 A T = A )、 正定値行列 (つまり、 R n の すべての非ゼロベクトルに対して x T Ax > 0 )、 実数 であり、 既知です。このシステムの唯一の解を と表します 。
x
{\displaystyle \mathbf {x} }
ん
×
ん
{\displaystyle n\times n}
あ
{\displaystyle \mathbf {A} }
x
{\displaystyle \mathbf {x} }
b
{\displaystyle \mathbf {b} }
x
∗
{\displaystyle \mathbf {x} _{*}}
直接法としての導出
共役勾配法は、最適化のための共役方向法の特殊化や、 固有値 問題のための Arnoldi / Lanczos 反復法のバリエーションなど、いくつかの異なる観点から導出できます。アプローチは異なりますが、これらの導出には、残差の直交性と探索方向の共役性の証明という共通のトピックがあります。これら 2 つの特性は、この方法のよく知られた簡潔な定式化を開発する上で非常に重要です。
2つの非ゼロベクトル u と v が(に関して )共役であるとは、
あ
{\displaystyle \mathbf {A} }
あなた
T
あ
ヴ
=
0.
{\displaystyle \mathbf {u} ^{\mathsf {T}}\mathbf {A} \mathbf {v} =0.}
は対称かつ正定値なので 、左辺は 内積を定義する。
あ
{\displaystyle \mathbf {A} }
あなた
T
あ
ヴ
=
⟨
あなた
、
ヴ
⟩
あ
:=
⟨
あ
あなた
、
ヴ
⟩
=
⟨
あなた
、
あ
T
ヴ
⟩
=
⟨
あなた
、
あ
ヴ
⟩
。
{\displaystyle \mathbf {u} ^{\mathsf {T}}\mathbf {A} \mathbf {v} =\langle \mathbf {u} ,\mathbf {v} \rangle _{\mathbf {A} } :=\langle \mathbf {A} \mathbf {u} ,\mathbf {v} \rangle =\langle \mathbf {u} ,\mathbf {A} ^{\mathsf {T}}\mathbf {v} \rangle =\langle \mathbf {u} ,\mathbf {A} \mathbf {v} \rangle .}
2つのベクトルが共役であるのは、この内積に関して直交する場合に限ります。共役であることは対称的な関係です。つまり、が と共役であれば 、 は と共役です 。
あなた
{\displaystyle \mathbf {u} }
ヴ
{\displaystyle \mathbf {v} }
ヴ
{\displaystyle \mathbf {v} }
あなた
{\displaystyle \mathbf {u} }
ポ
=
{
p
1
、
…
、
p
ん
}
{\displaystyle P=\{\mathbf {p} _{1},\dots ,\mathbf {p} _{n}\}}
は、に関して相互に共役なベクトル の集合 、つまり すべての に対して です 。すると は の 基底 を形成し 、 この基底で
の解を次のように表すことができます。
ん
{\displaystyle n}
あ
{\displaystyle \mathbf {A} }
p
私
T
あ
p
じ
=
0
{\displaystyle \mathbf {p} _{i}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{j}=0}
私
≠
じ
{\displaystyle i\neq j}
ポ
{\displaystyle P}
R
ん
{\displaystyle \mathbb {R} ^{n}}
x
∗
{\displaystyle \mathbf {x} _{*}}
あ
x
=
b
{\displaystyle \mathbf {Ax} =\mathbf {b} }
x
∗
=
∑
私
=
1
ん
α
私
p
私
⇒
あ
x
∗
=
∑
私
=
1
ん
α
私
あ
p
私
。
{\displaystyle \mathbf {x} _{*}=\sum _{i=1}^{n}\alpha _{i}\mathbf {p} _{i}\Rightarrow \mathbf {A} \mathbf { x} _{*}=\sum _{i=1}^{n}\alpha _{i}\mathbf {A} \mathbf {p} _{i}.}
この問題 にベクトルを 左
掛けすると次のようになる。
あ
x
=
b
{\displaystyle \mathbf {Ax} =\mathbf {b} }
p
け
T
{\displaystyle \mathbf {p} _{k}^{\mathsf {T}}}
p
け
T
b
=
p
け
T
あ
x
∗
=
∑
私
=
1
ん
α
私
p
け
T
あ
p
私
=
∑
私
=
1
ん
α
私
⟨
p
け
、
p
私
⟩
あ
=
α
け
⟨
p
け
、
p
け
⟩
あ
{\displaystyle \mathbf {p} _{k}^{\mathsf {T}}\mathbf {b} =\mathbf {p} _{k}^{\mathsf {T}}\mathbf {A} \mathbf {x} _{*}=\sum _{i=1}^{n}\alpha _{i}\mathbf {p} _{k}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{i}=\sum _{i=1}^{n}\alpha _{i}\left\langle \ mathbf {p} _{k},\mathbf {p} _{i}\right\rangle _{\mathbf {A} }=\alpha _{k}\left\langle \mathbf {p} _{k},\mathbf {p} _{k}\right\rangle _{\mathbf {A} }}
など
α
け
=
⟨
p
け
、
b
⟩
⟨
p
け
、
p
け
⟩
あ
。
{\displaystyle \alpha _{k}={\frac {\langle \mathbf {p} _{k},\mathbf {b} \rangle }{\langle \mathbf {p} _{k},\mathbf { p} _{k}\rangle _{\mathbf {A} }}}.}
これにより、方程式 Ax = b を解くための次の方法 [4] が得られます。共役方向のシーケンスを見つけて 、係数を計算します 。
ん
{\displaystyle n}
α
け
{\displaystyle \alpha_{k}}
反復的な方法として
共役ベクトルを注意深く選択すれば 、解の近似値を得るためにすべての共役ベクトルが必要なくなるかもしれません。したがって、共役勾配法を反復法として考えます。これにより、 n が非常に大きく、直接法では時間がかかりすぎるような
システムも近似的に解くことができます。
p
け
{\displaystyle \mathbf {p} _{k}}
x
∗
{\displaystyle \mathbf {x} _{*}}
x ∗ の初期推定値を x 0 で表します (一般性を失うことなく x 0 = 0 と仮定できますが、そうでない場合は代わりにシステム Az = b − Ax 0 を検討します)。 x 0から始めて解を探しますが、各反復で、解 x ∗ (私たちには未知)に近づいているかどうかを示すメトリックが必要です。このメトリックは、解 x ∗ が次の2次関数 の唯一の最小値でもある という事実から来ています。
ふ
(
x
)
=
1
2
x
T
あ
x
−
x
T
b
、
x
∈
R
ん
。
{\displaystyle f(\mathbf {x} )={\tfrac {1}{2}}\mathbf {x} ^{\mathsf {T}}\mathbf {A} \mathbf {x} -\mathbf {x} ^{\mathsf {T}}\mathbf {b} ,\qquad \mathbf {x} \in \mathbf {R} ^{n}\,.}
2次導関数のヘッセ行列 が対称正定値である
ことから、一意の最小化子の存在は明らかである。
H
(
ふ
(
x
)
)
=
あ
、
{\displaystyle \mathbf {H} (f(\mathbf {x} ))=\mathbf {A} \,,}
そして、最小化器(D f ( x )=0を使用)が初期問題を解くことは、その一次導関数から導かれる。
∇
ふ
(
x
)
=
あ
x
−
b
。
{\displaystyle \nabla f(\mathbf {x} )=\mathbf {A} \mathbf {x} -\mathbf {b} \,.}
これは、最初の基底ベクトル p 0 を x = x 0 における f の勾配の負数とすることを示唆しています。 f の勾配は Ax − b に等しくなります 。初期推定値 x 0 から始めて、これは p 0 = b − Ax 0 とすることを意味します。基底の他のベクトルは勾配と共役になるため、 共役勾配法と呼ばれます。 p 0 は 、アルゴリズムのこの初期ステップによって提供される
残差 でもある ことに注意してください。
r k を k 番目のステップでの 残差 と します 。
r
け
=
b
−
あ
x
け
。
{\displaystyle \mathbf {r} _{k}=\mathbf {b} -\mathbf {Ax} _{k}.}
上で観察されたように、 は における の負の勾配である ため、 勾配降下法では r k の 方向に移動する必要があります 。ただし、ここでは方向が 互いに共役でなければならないことを主張します。これを実施する実用的な方法は、次の検索方向が現在の残差と以前のすべての検索方向から構築されるように要求することです。共役制約は正規直交型の制約であるため、アルゴリズムは グラム・シュミット正規直交化 の例として見ることができます。これにより、次の式が得られます。
r
け
{\displaystyle \mathbf {r} _{k}}
ふ
{\displaystyle f}
x
け
{\displaystyle \mathbf {x} _{k}}
p
け
{\displaystyle \mathbf {p} _{k}}
p
け
=
r
け
−
∑
私
<
け
p
私
T
あ
r
け
p
私
T
あ
p
私
p
私
{\displaystyle \mathbf {p} _{k}=\mathbf {r} _{k}-\sum _{i<k}{\frac {\mathbf {p} _{i}^{\mathsf {T }}\mathbf {A} \mathbf {r} _{k}}{\mathbf {p} _{i}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{i}}}\mathbf {p} _{i}}
(共役制約が収束に与える影響については、記事の冒頭の図を参照)。この方向に従うと、次の最適位置は次のように与えられる。
x
け
+
1
=
x
け
+
α
け
p
け
{\displaystyle \mathbf {x} _{k+1}=\mathbf {x} _{k}+\alpha _{k}\mathbf {p} _{k}}
と
α
け
=
p
け
T
(
b
−
あ
x
け
)
p
け
T
あ
p
け
=
p
け
T
r
け
p
け
T
あ
p
け
、
{\displaystyle \alpha _{k}={\frac {\mathbf {p} _{k}^{\mathsf {T}}(\mathbf {b} -\mathbf {Ax} _{k})}{ \mathbf {p} _{k}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{k}}}={\frac {\mathbf {p} _{k}^{\mathsf {T}}\mathbf {r} _{k}}{\mathbf {p} _{k}^{\mathsf {T}}\mathbf {A } \mathbf {p} _{k}}},}
ここで最後の等式は の定義から導かれる 。 の式は、 x k +1の式を f に代入し 、 について最小化する ことで得られる。
r
け
{\displaystyle \mathbf {r} _{k}}
α
け
{\displaystyle \alpha_{k}}
α
け
{\displaystyle \alpha_{k}}
ふ
(
x
け
+
1
)
=
ふ
(
x
け
+
α
け
p
け
)
=:
g
(
α
k
)
g
′
(
α
k
)
=
!
0
⇒
α
k
=
p
k
T
(
b
−
A
x
k
)
p
k
T
A
p
k
.
{\displaystyle {\begin{aligned}f(\mathbf {x} _{k+1})&=f(\mathbf {x} _{k}+\alpha _{k}\mathbf {p} _{k})=:g(\alpha _{k})\\g'(\alpha _{k})&{\overset {!}{=}}0\quad \Rightarrow \quad \alpha _{k}={\frac {\mathbf {p} _{k}^{\mathsf {T}}(\mathbf {b} -\mathbf {Ax} _{k})}{\mathbf {p} _{k}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{k}}}\,.\end{aligned}}}
結果として得られるアルゴリズム
上記のアルゴリズムは、共役勾配法を最も簡単に説明しています。 一見すると、このアルゴリズムは、以前のすべての検索方向と留数ベクトルの保存、および多くの行列とベクトルの乗算を必要とするため、計算コストが高くなる可能性があります。 ただし、アルゴリズムを詳しく分析すると、 は に直交していること 、 つまり、 i ≠ j の場合で あることがわかります。 また、 は に -直交していること 、つまり、 の場合で あることがわかります。 これは、アルゴリズムが進むにつれて、 と が 同じ クリロフ部分空間 に広がると見なすことができます。ここで、 は 標準の内積に関して直交基底を形成し、 は によって誘導される内積に関して直交基底を形成します 。 したがって、 はのクリロフ部分空間へ の射影と見なすことができます 。
r
i
{\displaystyle \mathbf {r} _{i}}
r
j
{\displaystyle \mathbf {r} _{j}}
r
i
T
r
j
=
0
{\displaystyle \mathbf {r} _{i}^{\mathsf {T}}\mathbf {r} _{j}=0}
p
i
{\displaystyle \mathbf {p} _{i}}
A
{\displaystyle \mathbf {A} }
p
j
{\displaystyle \mathbf {p} _{j}}
p
i
T
A
p
j
=
0
{\displaystyle \mathbf {p} _{i}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{j}=0}
i
≠
j
{\displaystyle i\neq j}
p
i
{\displaystyle \mathbf {p} _{i}}
r
i
{\displaystyle \mathbf {r} _{i}}
r
i
{\displaystyle \mathbf {r} _{i}}
p
i
{\displaystyle \mathbf {p} _{i}}
A
{\displaystyle \mathbf {A} }
x
k
{\displaystyle \mathbf {x} _{k}}
x
{\displaystyle \mathbf {x} }
つまり、CG法が から始まる場合 、 [6] を解くアルゴリズムは以下で詳しく説明されています。 ここで、 は実数、対称、正定値行列です。入力ベクトルは、近似初期解または 0 になります 。これは、上で説明した正確な手順の異なる定式化です。
x
0
=
0
{\displaystyle \mathbf {x} _{0}=0}
x
k
=
a
r
g
m
i
n
y
∈
R
n
{
(
x
−
y
)
⊤
A
(
x
−
y
)
:
y
∈
span
{
b
,
A
b
,
…
,
A
k
−
1
b
}
}
{\displaystyle x_{k}=\mathrm {argmin} _{y\in \mathbb {R} ^{n}}{\left\{(x-y)^{\top }A(x-y):y\in \operatorname {span} \left\{b,Ab,\ldots ,A^{k-1}b\right\}\right\}}}
A
x
=
b
{\displaystyle \mathbf {A} \mathbf {x} =\mathbf {b} }
A
{\displaystyle \mathbf {A} }
x
0
{\displaystyle \mathbf {x} _{0}}
r
0
:=
b
−
A
x
0
if
r
0
is sufficiently small, then return
x
0
as the result
p
0
:=
r
0
k
:=
0
repeat
α
k
:=
r
k
T
r
k
p
k
T
A
p
k
x
k
+
1
:=
x
k
+
α
k
p
k
r
k
+
1
:=
r
k
−
α
k
A
p
k
if
r
k
+
1
is sufficiently small, then exit loop
β
k
:=
r
k
+
1
T
r
k
+
1
r
k
T
r
k
p
k
+
1
:=
r
k
+
1
+
β
k
p
k
k
:=
k
+
1
end repeat
return
x
k
+
1
as the result
{\displaystyle {\begin{aligned}&\mathbf {r} _{0}:=\mathbf {b} -\mathbf {Ax} _{0}\\&{\hbox{if }}\mathbf {r} _{0}{\text{ is sufficiently small, then return }}\mathbf {x} _{0}{\text{ as the result}}\\&\mathbf {p} _{0}:=\mathbf {r} _{0}\\&k:=0\\&{\text{repeat}}\\&\qquad \alpha _{k}:={\frac {\mathbf {r} _{k}^{\mathsf {T}}\mathbf {r} _{k}}{\mathbf {p} _{k}^{\mathsf {T}}\mathbf {Ap} _{k}}}\\&\qquad \mathbf {x} _{k+1}:=\mathbf {x} _{k}+\alpha _{k}\mathbf {p} _{k}\\&\qquad \mathbf {r} _{k+1}:=\mathbf {r} _{k}-\alpha _{k}\mathbf {Ap} _{k}\\&\qquad {\hbox{if }}\mathbf {r} _{k+1}{\text{ is sufficiently small, then exit loop}}\\&\qquad \beta _{k}:={\frac {\mathbf {r} _{k+1}^{\mathsf {T}}\mathbf {r} _{k+1}}{\mathbf {r} _{k}^{\mathsf {T}}\mathbf {r} _{k}}}\\&\qquad \mathbf {p} _{k+1}:=\mathbf {r} _{k+1}+\beta _{k}\mathbf {p} _{k}\\&\qquad k:=k+1\\&{\text{end repeat}}\\&{\text{return }}\mathbf {x} _{k+1}{\text{ as the result}}\end{aligned}}}
これは最も一般的に使用さ れるアルゴリズムです。β k の同じ式は、フレッチャー・リーブスの 非線形共役勾配法 でも使用されます。
再起動
は、 に勾配降下 法を適用して 計算される ことに注意してください 。 を設定すると、 は 同様にから 勾配降下 法 によって計算されます 。つまり、 は共役勾配反復の再開の単純な実装として使用できます。 [4]再開により収束が遅くなる可能性がありますが、共役勾配法が 丸め誤差 など により誤動作した場合には、安定性が向上する可能性があります 。
x
1
{\displaystyle \mathbf {x} _{1}}
x
0
{\displaystyle \mathbf {x} _{0}}
β
k
=
0
{\displaystyle \beta _{k}=0}
x
k
+
1
{\displaystyle \mathbf {x} _{k+1}}
x
k
{\displaystyle \mathbf {x} _{k}}
明示的な残差計算
式 と は どちらも正確な算術で成り立つため、式 と は数学的に等価です。前者は、 を評価するために ベクトル がすでに計算されているため、 による余分な乗算を避けるためにアルゴリズムで使用されます。後者は、 丸め誤差の 蓄積を伴う再帰によって 暗黙的な計算を明示的な計算に置き換えるため、より正確である可能性があり 、そのため、時々評価することを推奨します。 [7]
x
k
+
1
:=
x
k
+
α
k
p
k
{\displaystyle \mathbf {x} _{k+1}:=\mathbf {x} _{k}+\alpha _{k}\mathbf {p} _{k}}
r
k
:=
b
−
A
x
k
{\displaystyle \mathbf {r} _{k}:=\mathbf {b} -\mathbf {Ax} _{k}}
r
k
+
1
:=
r
k
−
α
k
A
p
k
{\displaystyle \mathbf {r} _{k+1}:=\mathbf {r} _{k}-\alpha _{k}\mathbf {Ap} _{k}}
r
k
+
1
:=
b
−
A
x
k
+
1
{\displaystyle \mathbf {r} _{k+1}:=\mathbf {b} -\mathbf {Ax} _{k+1}}
A
{\displaystyle \mathbf {A} }
A
p
k
{\displaystyle \mathbf {Ap} _{k}}
α
k
{\displaystyle \alpha _{k}}
r
k
+
1
:=
b
−
A
x
k
+
1
{\displaystyle \mathbf {r} _{k+1}:=\mathbf {b} -\mathbf {Ax} _{k+1}}
残差のノルムは、通常、停止基準として使用されます。明示的残差のノルムは、正確な演算と、収束が自然に停滞する 丸め誤差が 存在する場合の両方で、保証されたレベルの精度を提供します 。対照的に、暗黙的残差は、 丸め誤差 のレベルをはるかに下回る振幅が小さくなり続けることが知られているため 、収束の停滞を判断するために使用することはできません。
r
k
+
1
:=
b
−
A
x
k
+
1
{\displaystyle \mathbf {r} _{k+1}:=\mathbf {b} -\mathbf {Ax} _{k+1}}
r
k
+
1
:=
r
k
−
α
k
A
p
k
{\displaystyle \mathbf {r} _{k+1}:=\mathbf {r} _{k}-\alpha _{k}\mathbf {Ap} _{k}}
アルファとベータの計算
このアルゴリズムでは、 α k は に直交する ように選択される 。分母は次のように簡略化される。
r
k
+
1
{\displaystyle \mathbf {r} _{k+1}}
r
k
{\displaystyle \mathbf {r} _{k}}
α
k
=
r
k
T
r
k
r
k
T
A
p
k
=
r
k
T
r
k
p
k
T
A
p
k
{\displaystyle \alpha _{k}={\frac {\mathbf {r} _{k}^{\mathsf {T}}\mathbf {r} _{k}}{\mathbf {r} _{k}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{k}}}={\frac {\mathbf {r} _{k}^{\mathsf {T}}\mathbf {r} _{k}}{\mathbf {p} _{k}^{\mathsf {T}}\mathbf {Ap} _{k}}}}
であるからである 。β k は と共役となる ように選ばれる 。まず、 β k は
r
k
+
1
=
p
k
+
1
−
β
k
p
k
{\displaystyle \mathbf {r} _{k+1}=\mathbf {p} _{k+1}-\mathbf {\beta } _{k}\mathbf {p} _{k}}
p
k
+
1
{\displaystyle \mathbf {p} _{k+1}}
p
k
{\displaystyle \mathbf {p} _{k}}
β
k
=
−
r
k
+
1
T
A
p
k
p
k
T
A
p
k
{\displaystyle \beta _{k}=-{\frac {\mathbf {r} _{k+1}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{k}}{\mathbf {p} _{k}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{k}}}}
使用して
r
k
+
1
=
r
k
−
α
k
A
p
k
{\displaystyle \mathbf {r} _{k+1}=\mathbf {r} _{k}-\alpha _{k}\mathbf {A} \mathbf {p} _{k}}
そして同様に
A
p
k
=
1
α
k
(
r
k
−
r
k
+
1
)
,
{\displaystyle \mathbf {A} \mathbf {p} _{k}={\frac {1}{\alpha _{k}}}(\mathbf {r} _{k}-\mathbf {r} _{k+1}),}
β k の分子は 次のように書き直される。
r
k
+
1
T
A
p
k
=
1
α
k
r
k
+
1
T
(
r
k
−
r
k
+
1
)
=
−
1
α
k
r
k
+
1
T
r
k
+
1
{\displaystyle \mathbf {r} _{k+1}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{k}={\frac {1}{\alpha _{k}}}\mathbf {r} _{k+1}^{\mathsf {T}}(\mathbf {r} _{k}-\mathbf {r} _{k+1})=-{\frac {1}{\alpha _{k}}}\mathbf {r} _{k+1}^{\mathsf {T}}\mathbf {r} _{k+1}}
とは設計上直交している ため 、分母は次のように書き直される。
r
k
+
1
{\displaystyle \mathbf {r} _{k+1}}
r
k
{\displaystyle \mathbf {r} _{k}}
p
k
T
A
p
k
=
(
r
k
+
β
k
−
1
p
k
−
1
)
T
A
p
k
=
1
α
k
r
k
T
(
r
k
−
r
k
+
1
)
=
1
α
k
r
k
T
r
k
{\displaystyle \mathbf {p} _{k}^{\mathsf {T}}\mathbf {A} \mathbf {p} _{k}=(\mathbf {r} _{k}+\beta _{k-1}\mathbf {p} _{k-1})^{\mathsf {T}}\mathbf {A} \mathbf {p} _{k}={\frac {1}{\alpha _{k}}}\mathbf {r} _{k}^{\mathsf {T}}(\mathbf {r} _{k}-\mathbf {r} _{k+1})={\frac {1}{\alpha _{k}}}\mathbf {r} _{k}^{\mathsf {T}}\mathbf {r} _{k}}
探索方向 p k が共役であり、残差が直交していることを前提とします。これにより、 α k を キャンセルした後のアルゴリズムの β が 得られます。
「」
共役勾配!(A, b, x)
共役勾配法を使用して、解を `A * x = b` に戻します。
「」
関数 共役勾配! (
A :: AbstractMatrix 、 b :: AbstractVector 、 x :: AbstractVector ; tol = eps ( eltype ( b ))
)
# 残差ベクトルを初期化する
残差 = b - A * x
# 検索方向ベクトルを初期化する
search_direction = コピー ( 残余 )
# 初期の二乗残差ノルムを計算する
ノルム ( x ) = sqrt ( 合計 ( x .^ 2 ))
old_resid_norm = ノルム ( 残差 )
# 収束するまで繰り返す
old_resid_norm > tol の場合
A_検索方向 = A * 検索方向
ステップサイズ = 古い残差ノルム ^ 2 / ( 検索方向 ' * A 検索方向 )
# ソリューションの更新
@. x = x + ステップサイズ * 検索方向
# 残差を更新
@. 残差 = 残差 - ステップサイズ * A_search_direction
new_resid_norm = ノルム ( 残差 )
# 検索方向ベクトルを更新
@ .search_direction = 残余 +
( 新しい残留ノルム / 古い残留ノルム ) ^ 2 * 検索方向
# 次の反復のために残差ノルムの二乗を更新します
古い残留ノルム = 新しい残留ノルム
終わり
xを 返す
終わり
数値例
次式で表される
線形システム Ax = bを考える。
A
x
=
[
4
1
1
3
]
[
x
1
x
2
]
=
[
1
2
]
,
{\displaystyle \mathbf {A} \mathbf {x} ={\begin{bmatrix}4&1\\1&3\end{bmatrix}}{\begin{bmatrix}x_{1}\\x_{2}\end{bmatrix}}={\begin{bmatrix}1\\2\end{bmatrix}},}
共役勾配法の2つのステップを初期推定から実行します。
x
0
=
[
2
1
]
{\displaystyle \mathbf {x} _{0}={\begin{bmatrix}2\\1\end{bmatrix}}}
システムのおおよその解を見つけるためです。
解決
参考までに、正確な解は
x
=
[
1
11
7
11
]
≈
[
0.0909
0.6364
]
{\displaystyle \mathbf {x} ={\begin{bmatrix}{\frac {1}{11}}\\\\{\frac {7}{11}}\end{bmatrix}}\approx {\begin{bmatrix}0.0909\\\\0.6364\end{bmatrix}}}
最初のステップは、 x 0 に関連付けられた 残差ベクトル r 0 を計算することです。この残差は、 r 0 = b - Ax 0 という式から計算され 、この場合は次の式に等しくなります。
r
0
=
[
1
2
]
−
[
4
1
1
3
]
[
2
1
]
=
[
−
8
−
3
]
=
p
0
.
{\displaystyle \mathbf {r} _{0}={\begin{bmatrix}1\\2\end{bmatrix}}-{\begin{bmatrix}4&1\\1&3\end{bmatrix}}{\begin{bmatrix}2\\1\end{bmatrix}}={\begin{bmatrix}-8\\-3\end{bmatrix}}=\mathbf {p} _{0}.}
これは最初の反復なので、残差ベクトルr 0 を 初期検索方向 p 0 として使用します。p k の 選択方法は、 以降の反復で変更されます。
ここで、スカラー α 0 を次の関係式を使って
計算する。
α
0
=
r
0
T
r
0
p
0
T
A
p
0
=
[
−
8
−
3
]
[
−
8
−
3
]
[
−
8
−
3
]
[
4
1
1
3
]
[
−
8
−
3
]
=
73
331
≈
0.2205
{\displaystyle \alpha _{0}={\frac {\mathbf {r} _{0}^{\mathsf {T}}\mathbf {r} _{0}}{\mathbf {p} _{0}^{\mathsf {T}}\mathbf {Ap} _{0}}}={\frac {{\begin{bmatrix}-8&-3\end{bmatrix}}{\begin{bmatrix}-8\\-3\end{bmatrix}}}{{\begin{bmatrix}-8&-3\end{bmatrix}}{\begin{bmatrix}4&1\\1&3\end{bmatrix}}{\begin{bmatrix}-8\\-3\end{bmatrix}}}}={\frac {73}{331}}\approx 0.2205}
式を使って
x 1を 計算することができます
x
1
=
x
0
+
α
0
p
0
=
[
2
1
]
+
73
331
[
−
8
−
3
]
≈
[
0.2356
0.3384
]
.
{\displaystyle \mathbf {x} _{1}=\mathbf {x} _{0}+\alpha _{0}\mathbf {p} _{0}={\begin{bmatrix}2\\1\end{bmatrix}}+{\frac {73}{331}}{\begin{bmatrix}-8\\-3\end{bmatrix}}\approx {\begin{bmatrix}0.2356\\0.3384\end{bmatrix}}.}
この結果で最初の反復が完了し、システムx 1 の「改善された」近似解が得られます 。次に、次の残差ベクトル r 1 を 次の式を使用して
計算します。
r
1
=
r
0
−
α
0
A
p
0
=
[
−
8
−
3
]
−
73
331
[
4
1
1
3
]
[
−
8
−
3
]
≈
[
−
0.2810
0.7492
]
.
{\displaystyle \mathbf {r} _{1}=\mathbf {r} _{0}-\alpha _{0}\mathbf {A} \mathbf {p} _{0}={\begin{bmatrix}-8\\-3\end{bmatrix}}-{\frac {73}{331}}{\begin{bmatrix}4&1\\1&3\end{bmatrix}}{\begin{bmatrix}-8\\-3\end{bmatrix}}\approx {\begin{bmatrix}-0.2810\\0.7492\end{bmatrix}}.}
プロセスの次のステップは、最終的に次の検索方向 p 1 を 決定するために使用されるスカラー β 0 を 計算することです。
β
0
=
r
1
T
r
1
r
0
T
r
0
≈
[
−
0.2810
0.7492
]
[
−
0.2810
0.7492
]
[
−
8
−
3
]
[
−
8
−
3
]
=
0.0088.
{\displaystyle \beta _{0}={\frac {\mathbf {r} _{1}^{\mathsf {T}}\mathbf {r} _{1}}{\mathbf {r} _{0}^{\mathsf {T}}\mathbf {r} _{0}}}\approx {\frac {{\begin{bmatrix}-0.2810&0.7492\end{bmatrix}}{\begin{bmatrix}-0.2810\\0.7492\end{bmatrix}}}{{\begin{bmatrix}-8&-3\end{bmatrix}}{\begin{bmatrix}-8\\-3\end{bmatrix}}}}=0.0088.}
さて、このスカラー β 0 を使って、次の探索方向 p 1 を 次の関係式を使って
計算することができます。
p
1
=
r
1
+
β
0
p
0
≈
[
−
0.2810
0.7492
]
+
0.0088
[
−
8
−
3
]
=
[
−
0.3511
0.7229
]
.
{\displaystyle \mathbf {p} _{1}=\mathbf {r} _{1}+\beta _{0}\mathbf {p} _{0}\approx {\begin{bmatrix}-0.2810\\0.7492\end{bmatrix}}+0.0088{\begin{bmatrix}-8\\-3\end{bmatrix}}={\begin{bmatrix}-0.3511\\0.7229\end{bmatrix}}.}
ここで、 α 0 に使用したのと同じ方法を使用して、 新たに取得した p 1 を 使用してスカラー α 1 を計算します。
α
1
=
r
1
T
r
1
p
1
T
A
p
1
≈
[
−
0.2810
0.7492
]
[
−
0.2810
0.7492
]
[
−
0.3511
0.7229
]
[
4
1
1
3
]
[
−
0.3511
0.7229
]
=
0.4122.
{\displaystyle \alpha _{1}={\frac {\mathbf {r} _{1}^{\mathsf {T}}\mathbf {r} _{1}}{\mathbf {p} _{1}^{\mathsf {T}}\mathbf {Ap} _{1}}}\approx {\frac {{\begin{bmatrix}-0.2810&0.7492\end{bmatrix}}{\begin{bmatrix}-0.2810\\0.7492\end{bmatrix}}}{{\begin{bmatrix}-0.3511&0.7229\end{bmatrix}}{\begin{bmatrix}4&1\\1&3\end{bmatrix}}{\begin{bmatrix}-0.3511\\0.7229\end{bmatrix}}}}=0.4122.}
最後に、 x 1 を 見つけるのと同じ方法を使用して x 2 を見つけます 。
x
2
=
x
1
+
α
1
p
1
≈
[
0.2356
0.3384
]
+
0.4122
[
−
0.3511
0.7229
]
=
[
0.0909
0.6364
]
.
{\displaystyle \mathbf {x} _{2}=\mathbf {x} _{1}+\alpha _{1}\mathbf {p} _{1}\approx {\begin{bmatrix}0.2356\\0.3384\end{bmatrix}}+0.4122{\begin{bmatrix}-0.3511\\0.7229\end{bmatrix}}={\begin{bmatrix}0.0909\\0.6364\end{bmatrix}}.}
結果 x 2は、 x 1 や x 0 よりもシステムの解の「より良い」近似値です。この例で限定精度ではなく正確な演算を使用した場合、理論的には n = 2 回の反復 ( n はシステムの次数)
の後で正確な解に到達します。
収束特性
共役勾配法は理論的には直接法とみなすことができます。丸め誤差 がない場合、 行列のサイズを超えない有限回数の反復後に正確な解が得られるからです。実際には、共役勾配法は小さな摂動に対しても不安定であるため、正確な解は決して得られません。たとえば、クリロフ部分空間を生成する際の退化の性質により、ほとんどの方向は実際には共役ではありません。
反復法 として 、共役勾配法は、 正確な解への近似値を単調に(エネルギーノルムで)改善し、比較的少ない(問題のサイズに比べて)反復回数で必要な許容値に達する可能性があります。改善は通常線形であり、その速度は システム行列の 条件数 によって決まります。条件数が大きいほど 、改善は遅くなります。 [8]
x
k
{\displaystyle \mathbf {x} _{k}}
κ
(
A
)
{\displaystyle \kappa (A)}
A
{\displaystyle A}
κ
(
A
)
{\displaystyle \kappa (A)}
が大きい場合 、 通常は、元のシステムを より小さくなる よう に置き換える 前処理 が使用されます(以下を参照)。
κ
(
A
)
{\displaystyle \kappa (A)}
A
x
−
b
=
0
{\displaystyle \mathbf {Ax} -\mathbf {b} =0}
M
−
1
(
A
x
−
b
)
=
0
{\displaystyle \mathbf {M} ^{-1}(\mathbf {Ax} -\mathbf {b} )=0}
κ
(
M
−
1
A
)
{\displaystyle \kappa (\mathbf {M} ^{-1}\mathbf {A} )}
κ
(
A
)
{\displaystyle \kappa (\mathbf {A} )}
収束定理
多項式のサブセットを次のように定義する。
Π
k
∗
:=
{
p
∈
Π
k
:
p
(
0
)
=
1
}
,
{\displaystyle \Pi _{k}^{*}:=\left\lbrace \ p\in \Pi _{k}\ :\ p(0)=1\ \right\rbrace \,,}
ここで、 最大次数の 多項式 の集合です 。
Π
k
{\displaystyle \Pi _{k}}
k
{\displaystyle k}
を厳密解の反復近似とし 、 誤差を と定義する 。ここで、収束率は次のように近似できる [4] [9]
(
x
k
)
k
{\displaystyle \left(\mathbf {x} _{k}\right)_{k}}
x
∗
{\displaystyle \mathbf {x} _{*}}
e
k
:=
x
k
−
x
∗
{\displaystyle \mathbf {e} _{k}:=\mathbf {x} _{k}-\mathbf {x} _{*}}
‖
e
k
‖
A
=
min
p
∈
Π
k
∗
‖
p
(
A
)
e
0
‖
A
≤
min
p
∈
Π
k
∗
max
λ
∈
σ
(
A
)
|
p
(
λ
)
|
‖
e
0
‖
A
≤
2
(
κ
(
A
)
−
1
κ
(
A
)
+
1
)
k
‖
e
0
‖
A
≤
2
exp
(
−
2
k
κ
(
A
)
)
‖
e
0
‖
A
,
{\displaystyle {\begin{aligned}\left\|\mathbf {e} _{k}\right\|_{\mathbf {A} }&=\min _{p\in \Pi _{k}^{*}}\left\|p(\mathbf {A} )\mathbf {e} _{0}\right\|_{\mathbf {A} }\\&\leq \min _{p\in \Pi _{k}^{*}}\,\max _{\lambda \in \sigma (\mathbf {A} )}|p(\lambda )|\ \left\|\mathbf {e} _{0}\right\|_{\mathbf {A} }\\&\leq 2\left({\frac {{\sqrt {\kappa (\mathbf {A} )}}-1}{{\sqrt {\kappa (\mathbf {A} )}}+1}}\right)^{k}\ \left\|\mathbf {e} _{0}\right\|_{\mathbf {A} }\\&\leq 2\exp \left({\frac {-2k}{\sqrt {\kappa (\mathbf {A} )}}}\right)\ \left\|\mathbf {e} _{0}\right\|_{\mathbf {A} }\,,\end{aligned}}}
ここで は スペクトル を表し 、 は 条件数 を表します 。
σ
(
A
)
{\displaystyle \sigma (\mathbf {A} )}
κ
(
A
)
{\displaystyle \kappa (\mathbf {A} )}
これは、任意の に対して、反復が誤差 を まで減らすのに十分であることを示しています 。
k
=
1
2
κ
(
A
)
log
(
‖
e
0
‖
A
ε
−
1
)
{\displaystyle k={\tfrac {1}{2}}{\sqrt {\kappa (\mathbf {A} )}}\log \left(\left\|\mathbf {e} _{0}\right\|_{\mathbf {A} }\varepsilon ^{-1}\right)}
2
ε
{\displaystyle 2\varepsilon }
ε
>
0
{\displaystyle \varepsilon >0}
注意してください、重要な限界 は
κ
(
A
)
{\displaystyle \kappa (\mathbf {A} )}
∞
{\displaystyle \infty }
κ
(
A
)
−
1
κ
(
A
)
+
1
≈
1
−
2
κ
(
A
)
for
κ
(
A
)
≫
1
.
{\displaystyle {\frac {{\sqrt {\kappa (\mathbf {A} )}}-1}{{\sqrt {\kappa (\mathbf {A} )}}+1}}\approx 1-{\frac {2}{\sqrt {\kappa (\mathbf {A} )}}}\quad {\text{for}}\quad \kappa (\mathbf {A} )\gg 1\,.}
この極限は、 としてスケールする ヤコビ法 や ガウス・ザイデル法 の反復法と比較して、より速い収束率を示します 。
≈
1
−
2
κ
(
A
)
{\displaystyle \approx 1-{\frac {2}{\kappa (\mathbf {A} )}}}
収束定理では 丸め誤差 は想定されていないが、 アン・グリーンバウム [5] によって理論的に説明されているように、収束限界は実際には一般的に有効である 。
実践的な収束
ランダムに初期化された場合、誤差は最初はより小さい有効条件数を反映するクリロフ部分空間内で除去されるため、最初の段階の反復は多くの場合最も高速になります。収束の2番目の段階は、通常、 による理論的な収束境界によって明確に定義されます が、行列のスペクトルの分布 と誤差のスペクトル分布によっては、超線形になることがあります。 [5] 最後の段階では、達成可能な最小の精度に達し、収束が停止するか、または方法が発散し始めることもあります。大規模な行列の 倍精度浮動小数点形式 の一般的な科学計算アプリケーションでは、共役勾配法は、最初の段階または2番目の段階で反復を終了する許容値を持つ停止基準を使用します。
κ
(
A
)
{\textstyle {\sqrt {\kappa (\mathbf {A} )}}}
A
{\displaystyle A}
前処理共役勾配法
ほとんどの場合、共役勾配法の高速収束を確実にするために 前処理 が必要です。 が対称正定値で、 よりも条件数が良い場合は 、前処理付き共役勾配法を使用できます。 これは次の形式になります。 [10]
M
−
1
{\displaystyle \mathbf {M} ^{-1}}
M
−
1
A
{\displaystyle \mathbf {M} ^{-1}\mathbf {A} }
A
{\displaystyle \mathbf {A} }
r
0
:=
b
−
A
x
0
{\displaystyle \mathbf {r} _{0}:=\mathbf {b} -\mathbf {Ax} _{0}}
Solve:
M
z
0
:=
r
0
{\displaystyle {\textrm {Solve:}}\mathbf {M} \mathbf {z} _{0}:=\mathbf {r} _{0}}
p
0
:=
z
0
{\displaystyle \mathbf {p} _{0}:=\mathbf {z} _{0}}
k
:=
0
{\displaystyle k:=0\,}
繰り返す
α
k
:=
r
k
T
z
k
p
k
T
A
p
k
{\displaystyle \alpha _{k}:={\frac {\mathbf {r} _{k}^{\mathsf {T}}\mathbf {z} _{k}}{\mathbf {p} _{k}^{\mathsf {T}}\mathbf {Ap} _{k}}}}
x
k
+
1
:=
x
k
+
α
k
p
k
{\displaystyle \mathbf {x} _{k+1}:=\mathbf {x} _{k}+\alpha _{k}\mathbf {p} _{k}}
r
k
+
1
:=
r
k
−
α
k
A
p
k
{\displaystyle \mathbf {r} _{k+1}:=\mathbf {r} _{k}-\alpha _{k}\mathbf {Ap} _{k}}
r k +1 が十分に小さい 場合 は ループを終了し 、
S
o
l
v
e
M
z
k
+
1
:=
r
k
+
1
{\displaystyle \mathrm {Solve} \ \mathbf {M} \mathbf {z} _{k+1}:=\mathbf {r} _{k+1}}
β
k
:=
r
k
+
1
T
z
k
+
1
r
k
T
z
k
{\displaystyle \beta _{k}:={\frac {\mathbf {r} _{k+1}^{\mathsf {T}}\mathbf {z} _{k+1}}{\mathbf {r} _{k}^{\mathsf {T}}\mathbf {z} _{k}}}}
p
k
+
1
:=
z
k
+
1
+
β
k
p
k
{\displaystyle \mathbf {p} _{k+1}:=\mathbf {z} _{k+1}+\beta _{k}\mathbf {p} _{k}}
k
:=
k
+
1
{\displaystyle k:=k+1\,}
繰り返し終了
結果は x k +1
上記の定式化は、前処理されたシステムに通常の共役勾配法を適用することと同等である [11]
E
−
1
A
(
E
−
1
)
T
x
^
=
E
−
1
b
{\displaystyle \mathbf {E} ^{-1}\mathbf {A} (\mathbf {E} ^{-1})^{\mathsf {T}}\mathbf {\hat {x}} =\mathbf {E} ^{-1}\mathbf {b} }
どこ
E
E
T
=
M
,
x
^
=
E
T
x
.
{\displaystyle \mathbf {EE} ^{\mathsf {T}}=\mathbf {M} ,\qquad \mathbf {\hat {x}} =\mathbf {E} ^{\mathsf {T}}\mathbf {x} .}
システムの対称性(および正定値性)を保つには、前処理のコレスキー分解を使用する必要があります。ただし、この分解を計算する必要はなく、 を知っていれば十分です。 が と同じスペクトルを持つこと を示すことができます 。
M
−
1
{\displaystyle \mathbf {M} ^{-1}}
E
−
1
A
(
E
−
1
)
T
{\displaystyle \mathbf {E} ^{-1}\mathbf {A} (\mathbf {E} ^{-1})^{\mathsf {T}}}
M
−
1
A
{\displaystyle \mathbf {M} ^{-1}\mathbf {A} }
前処理行列 M は 対称正定値で固定されている必要があります。つまり、反復ごとに変更することはできません。前処理行列に関するこれらの仮定のいずれかが違反すると、前処理付き共役勾配法の動作が予測不可能になる可能性があります。
よく使われる前処理 の例としては 不完全コレスキー分解 がある 。 [12]
プリコンディショナーの実際の使用
プロセスで使用する ために 行列を明示的に反転することは望ましくないことに留意することが重要です。反転には 、共役勾配アルゴリズム自体を解くよりも多くの時間/計算リソースがかかるからです。例として、不完全コレスキー分解から得られる前処理行列を使用するとします。結果の行列は下三角行列であり 、前処理行列は次のようになります。
M
{\displaystyle \mathbf {M} }
M
−
1
{\displaystyle \mathbf {M} ^{-1}}
M
{\displaystyle \mathbf {M} }
L
{\displaystyle \mathbf {L} }
M
=
L
L
T
{\displaystyle \mathbf {M} =\mathbf {LL} ^{\mathsf {T}}}
次に解決しなければならないのは、次の点です。
M
z
=
r
{\displaystyle \mathbf {Mz} =\mathbf {r} }
z
=
M
−
1
r
{\displaystyle \mathbf {z} =\mathbf {M} ^{-1}\mathbf {r} }
しかし:
M
−
1
=
(
L
−
1
)
T
L
−
1
{\displaystyle \mathbf {M} ^{-1}=(\mathbf {L} ^{-1})^{\mathsf {T}}\mathbf {L} ^{-1}}
それから:
z
=
(
L
−
1
)
T
L
−
1
r
{\displaystyle \mathbf {z} =(\mathbf {L} ^{-1})^{\mathsf {T}}\mathbf {L} ^{-1}\mathbf {r} }
中間ベクトルを取りましょう :
a
{\displaystyle \mathbf {a} }
a
=
L
−
1
r
{\displaystyle \mathbf {a} =\mathbf {L} ^{-1}\mathbf {r} }
r
=
L
a
{\displaystyle \mathbf {r} =\mathbf {L} \mathbf {a} }
およびは既知 であり 、 は 下三角なので、 を解くのは 前方置換 を使用することで簡単かつ計算コストが低くなります。次に、 元の方程式に
を代入します。
r
{\displaystyle \mathbf {r} }
L
{\displaystyle \mathbf {L} }
L
{\displaystyle \mathbf {L} }
a
{\displaystyle \mathbf {a} }
a
{\displaystyle \mathbf {a} }
z
=
(
L
−
1
)
T
a
{\displaystyle \mathbf {z} =(\mathbf {L} ^{-1})^{\mathsf {T}}\mathbf {a} }
a
=
L
T
z
{\displaystyle \mathbf {a} =\mathbf {L} ^{\mathsf {T}}\mathbf {z} }
および は既知 であり 、 は 上三角なので、 を解くことは、 後方代入 を使用することで簡単かつ計算コストが低くなります 。
a
{\displaystyle \mathbf {a} }
L
T
{\displaystyle \mathbf {L} ^{\mathsf {T}}}
L
T
{\displaystyle \mathbf {L} ^{\mathsf {T}}}
z
{\displaystyle \mathbf {z} }
この方法を使用すると、または を明示的に 反転する必要はまったくなく 、 が得られます 。
M
{\displaystyle \mathbf {M} }
L
{\displaystyle \mathbf {L} }
z
{\displaystyle \mathbf {z} }
柔軟な前処理共役勾配法
数値的に難しいアプリケーションでは、洗練された前処理が使用され、反復ごとに変化する可変の前処理につながる可能性があります。前処理がすべての反復で対称正定値であっても、変化する可能性があるという事実は上記の議論を無効にし、実際のテストでは、上記のアルゴリズムの収束が大幅に遅くなる原因となります。 ポラック-リビエールの 公式
を使用すると、
β
k
:=
r
k
+
1
T
(
z
k
+
1
−
z
k
)
r
k
T
z
k
{\displaystyle \beta _{k}:={\frac {\mathbf {r} _{k+1}^{\mathsf {T}}\left(\mathbf {z} _{k+1}-\mathbf {z} _{k}\right)}{\mathbf {r} _{k}^{\mathsf {T}}\mathbf {z} _{k}}}}
フレッチャー・リーブス 式
の代わりに
β
k
:=
r
k
+
1
T
z
k
+
1
r
k
T
z
k
{\displaystyle \beta _{k}:={\frac {\mathbf {r} _{k+1}^{\mathsf {T}}\mathbf {z} _{k+1}}{\mathbf {r} _{k}^{\mathsf {T}}\mathbf {z} _{k}}}}
この場合、収束性が劇的に改善される可能性がある。 [13] このバージョンの前処理付き共役勾配法は、可変の前処理を可能にするため、 [14] 柔軟で あると言える。柔軟なバージョンは、前処理が対称正定値(SPD)でなくても堅牢であることも示されている [15] 。
柔軟なバージョンの実装では、追加のベクトルを保存する必要があります。固定された SPD プリコンディショナーの場合、 β k の両方の式は 正確な演算では同等であり、 丸め誤差 はありません。
r
k
+
1
T
z
k
=
0
,
{\displaystyle \mathbf {r} _{k+1}^{\mathsf {T}}\mathbf {z} _{k}=0,}
ポラック・リビエールの 公式を用いた方法の収束挙動が優れている理由を数学的に説明すると、この場合、 この方法は 局所的に最適 であり、特に、局所的に最適な最急降下法よりも収束が遅くならないということである。 [16]
局所最適最急降下法との比較
元の共役勾配法と前処理付き共役勾配法の両方において、 直線探索法 、 最急降下 法を 使用して局所的に最適にするには、 を設定することだけが必要です。この置換により、ベクトル p は常にベクトル z と同じになるため、ベクトル p を 格納する必要はありません。したがって、これらの 最急降下 法の各反復は、 共役勾配法に比べて少し安価になります。ただし、後者は、(高度に)可変および/または非 SPD 前処理 を使用しない限り、より速く収束します(上記を参照)。
β
k
:=
0
{\displaystyle \beta _{k}:=0}
二重積分器の最適フィードバック制御器としての共役勾配法
共役勾配法は最適制御理論 を用いて導くこともできる 。 [17] このアプローチでは、共役勾配法は 二重積分システム に対する 最適フィードバック制御器 として導かれ 、 量 およびは 可変フィードバックゲインである。 [17]
u
=
k
(
x
,
v
)
:=
−
γ
a
∇
f
(
x
)
−
γ
b
v
{\displaystyle u=k(x,v):=-\gamma _{a}\nabla f(x)-\gamma _{b}v}
x
˙
=
v
,
v
˙
=
u
{\displaystyle {\dot {x}}=v,\quad {\dot {v}}=u}
γ
a
{\displaystyle \gamma _{a}}
γ
b
{\displaystyle \gamma _{b}}
正規方程式の共役勾配
共役勾配法は、 正規方程式 A T A と右辺ベクトル A T b に適用することで、任意の n 行 m 列の行列に適用できます。これは、 A T Aが任意の A に対して対称な 半正定値 行列であるためです 。結果は、 正規方程式 ( CGN または CGNR ) 上の共役勾配です。
A T Ax = A T b
反復法であるため、 メモリ内で A T A を 明示的に形成する必要はなく、行列とベクトルの乗算と転置行列とベクトルの乗算を実行するだけで済みます。したがって、CGNR は、これらの演算が通常非常に効率的であるため、 Aが スパース行列 である場合に特に便利です 。ただし、正規方程式を形成することの欠点は、 条件数 κ( A T A ) が κ 2 ( A )に等しい ため、CGNR の収束速度が遅くなり、近似解の品質が丸め誤差の影響を受けやすくなる可能性があることです。適切な 前処理 を見つけることは、CGNR 法を使用する上で重要な部分であることがよくあります。
いくつかのアルゴリズムが提案されています (例: CGLS、LSQR)。LSQR アルゴリズムは、 A が悪条件の場合、つまり A の 条件数 が大きい場合に、数値安定性が最も優れていると言われています 。
複素エルミート行列の共役勾配法
共役勾配法は、簡単な修正を加えることで、複素数値行列 A とベクトル b が与えられた場合に、 複素数値ベクトル x の線形方程式系を解くことにまで拡張できます。ここで、A は エルミート (つまり、A' = A) かつ 正定値行列 であり、記号 ' は 共役転置 を表します。簡単な修正は、どこでも実 転置を 共役転置 に置き換えるだけです 。
A
x
=
b
{\displaystyle \mathbf {A} \mathbf {x} =\mathbf {b} }
利点と欠点
共役勾配法の利点と欠点は、NemirovskyとBenTalの講義ノートにまとめられている。 [18] :Sec.7.3
病的な例
この例は [19] からの抜粋です。
とし 、 を定義します。 は可逆なので、 には一意の解が存在します 。 これを共役勾配降下法で解くと、収束性がかなり悪くなります。 つまり、CG プロセス中に、誤差は指数関数的に増加し、一意の解が見つかると突然ゼロになります。
t
∈
(
0
,
1
)
{\textstyle t\in (0,1)}
W
=
[
t
t
t
1
+
t
t
t
1
+
t
t
t
⋱
⋱
⋱
t
t
1
+
t
]
,
b
=
[
1
0
⋮
0
]
{\displaystyle W={\begin{bmatrix}t&{\sqrt {t}}&&&&\\{\sqrt {t}}&1+t&{\sqrt {t}}&&&\\&{\sqrt {t}}&1+t&{\sqrt {t}}&&\\&&{\sqrt {t}}&\ddots &\ddots &\\&&&\ddots &&\\&&&&&{\sqrt {t}}\\&&&&{\sqrt {t}}&1+t\end{bmatrix}},\quad b={\begin{bmatrix}1\\0\\\vdots \\0\end{bmatrix}}}
W
{\displaystyle W}
W
x
=
b
{\textstyle Wx=b}
‖
b
−
W
x
k
‖
2
=
(
1
/
t
)
k
,
‖
b
−
W
x
n
‖
2
=
0
{\displaystyle \|b-Wx_{k}\|^{2}=(1/t)^{k},\quad \|b-Wx_{n}\|^{2}=0}
参照
参考文献
^ Hestenes, Magnus R. ; Stiefel, Eduard (1952 年 12 月). 「線形システムを解くための共役勾配法」 (PDF) . 米国国立標準局研究ジャーナル . 49 (6): 409. doi : 10.6028/jres.049.044 .
^ Straeter, TA (1971). 「ランク 1 の Davidon–Broyden クラスの準ニュートン最小化法の無限次元ヒルベルト空間への拡張と最適制御問題への応用について (博士論文)」ノースカロライナ州立大学。hdl : 2060/19710026200 – NASA Technical Reports Server 経由。
^ シュパイザー、アンブロス (2004)。 「Konrad Zuse und die ERMETH: Ein weltweiter Architektur-Vergleich」 [Konrad Zuse と ERMETH: 建築の世界的比較]。 『Hellige』、ハンス・ディーター編著。 情報収集。 Visionen、Paradigmen、Leitmotive (ドイツ語)。ベルリン:シュプリンガー。 p. 185.ISBN 3-540-00217-0 。
^ abcd Polyak, Boris (1987). 最適化入門.
^ abc Greenbaum, Anne (1997). 線形システムを解くための反復法 . doi :10.1137/1.9781611970937. ISBN 978-0-89871-396-1 。
^ Paquette, Elliot; Trogdon, Thomas (2023年3月). 「サンプル共分散行列の共役勾配法とMINRESアルゴリズムの普遍性」. Communications on Pure and Applied Mathematics . 76 (5): 1085–1136. arXiv : 2007.00640 . doi :10.1002/cpa.22081. ISSN 0010-3640.
^ Shewchuk, Jonathan R (1994). 苦痛のない共役勾配法の紹介 (PDF) 。
^ Saad, Yousef (2003). 疎線形システムの反復法(第2版). フィラデルフィア、ペンシルバニア州:産業応用数学協会。pp. 195. ISBN 978-0-89871-534-7 。
^ Hackbusch, W. (2016-06-21). 大規模スパース方程式系の反復解法 (第2版). スイス:Springer. ISBN 978-3-319-28483-5 . OCLC 952572240.
^ Barrett, Richard; Berry, Michael; Chan, Tony F.; Demmel, James; Donato, June; Dongarra, Jack; Eijkhout, Victor; Pozo, Roldan; Romine, Charles; van der Vorst, Henk. 「線形システムの解法テンプレート:反復法のビルディングブロック (PDF)」 (第2版)。フィラデルフィア、ペンシルバニア州:SIAM。p. 13。 2020年3月31日 閲覧 。
^ Golub, Gene H.; Van Loan, Charles F. (2013). Matrix Computations (第4版). Johns Hopkins University Press. sec. 11.5.2. ISBN 978-1-4214-0794-4 。
^ Concus, P.; Golub, GH; Meurant, G. (1985). 「共役勾配法のブロック前処理」. SIAM Journal on Scientific and Statistical Computing . 6 (1): 220–252. doi :10.1137/0906018.
^ Golub, Gene H.; Ye, Qiang (1999). 「Inexact Preconditioned Conjugate Gradient Method with Inner-Outer Iteration」. SIAM Journal on Scientific Computing . 21 (4): 1305. CiteSeerX 10.1.1.56.1755 . doi :10.1137/S1064827597323415.
^ Notay, Yvan (2000). 「柔軟な共役勾配」. SIAM Journal on Scientific Computing . 22 (4): 1444–1460. CiteSeerX 10.1.1.35.7473 . doi :10.1137/S1064827599362314.
^ Bouwmeester, Henricus; Dougherty, Andrew; Knyazev, Andrew V. (2015). 「共役勾配法と最急降下法 1 の非対称前処理」. Procedia Computer Science . 51 : 276–285. arXiv : 1212.6680 . doi : 10.1016/j.procs.2015.05.241 . S2CID 51978658.
^ Knyazev, Andrew V.; Lashuk, Ilya (2008). 「変数前処理による最急降下法と共役勾配法」. SIAM Journal on Matrix Analysis and Applications . 29 (4): 1267. arXiv : math/0605767 . doi :10.1137/060675290. S2CID 17614913.
^ ab Ross, IM 、「加速最適化のための最適制御理論」、 arXiv :1902.09004、2019年。
^ Nemirovsky と Ben-Tal (2023)。「最適化 III: 凸最適化」 (PDF) 。
^ Pennington、Fabian Pedregosa、Courtney Paquette、Tom Trogdon、Jeffrey。「ランダム行列理論と機械学習チュートリアル」。random -matrix -learning.github.io。 2023年12月5日 閲覧 。 {{cite web}}: CS1 maint: multiple names: authors list (link)
さらに読む
Atkinson, Kendell A. (1988)。「セクション 8.9」。 数値解析入門 (第 2 版)。John Wiley and Sons。ISBN 978-0-471-50023-0 。
アヴリエル、モルデカイ (2003)。 非線形計画法: 分析と方法 。ドーバー出版 。ISBN 978-0-486-43227-4 。
Golub, Gene H.; Van Loan, Charles F. (2013)。「第 11 章」。 マトリックス計算 (第 4 版)。ジョンズ ホプキンス大学出版局 。ISBN 978-1-4214-0794-4 。
Saad, Yousef (2003-04-01). 「第 6 章」 . 疎線形システムの反復法 (第 2 版). SIAM. ISBN 978-0-89871-534-7 。
Gérard Meurant: 「共役勾配アルゴリズムにおけるサイレントエラーの検出と修正」、Numerical Algorithms、vol.92 (2023)、pp.869-891。url=https://doi.org/10.1007/s11075-022-01380-1
Meurant, Gerard; Tichy, Petr (2024)。 共役 勾配アルゴリズムにおける誤差ノルム推定 。SIAM。ISBN 978-1-61197-785-1 。
外部リンク