4.4.1. 原始的な共役勾配法

2020/1/8公開

アルゴリズム

1. 初期値x(0)Rnx _ {(0)} \in \mathbb{R} ^ nを定める(定め方は任意である)

2. 探索方向m(k)m _ {(k)}

m(k)=gradf(x(k))+β(k)r(k)m _ {(k)}= \operatorname{grad} f (x _ {(k)}) + \beta _ {(k)} r _ {(k)}

 により定める。ただし

β(k)={0ifk=0<r(k),Hx(k)gradf(x(k))><r(k),Hx(k)r(k)>otherwise\beta _ {(k)} = \begin{cases} \quad \quad \quad \,\, 0& \quad {\rm if} \,\, k =0 \\ - \frac{\left< r _ {(k)}, H _ {x _ {(k)}} \operatorname{grad}f(x _ {(k)}) \right> }{\left< r _ {(k)}, H _ {x _ {(k)}} r _ {(k)} \right>} &\quad otherwise \end{cases}
r(k)=m(k1)r _ {(k)} = m _ {(k-1)}

 である(r(0)r _ {(0)}は未定義だが係数のβ(0)\beta _ {(0)}が 0 なのでm(0)=gradf(x(0))m _ {(0)} = \operatorname{grad} f (x _ {(0)})となる)。

3. ステップサイズα(k)>0\alpha _ {(k)} > 0を定める。α(k)\alpha _ {(k)}は通常の直線探索で決定してもよいが、

α(k)=<m(k),gradf(x(k))><m(k),Hx(k)m(k)>\alpha _ {(k)} = - \frac{\left< m _ {(k)}, \operatorname{grad} f (x _ {(k)}) \right>}{\left< m _ {(k)}, H _ {x _ {(k)}} m _ {(k)} \right>}

 を用いてもよい。

4. 次の更新式を用いて現在の点を更新する

x(k+1)=x(k)+α(k)m(k)=x(k)+α(k)(gradf(x(k))+β(k)r(k))\begin{aligned} x _ {(k+1)} &= x _ {(k)} + \alpha _ {(k)} m _ {(k)} \\ &= x _ {(k)} + \alpha _ {(k)} \left( \operatorname{grad} f ( x _ {(k)} ) + \beta _ {(k)} r _ {(k)} \right) \end{aligned}

5. 収束していなければ手順 2 へ戻る

原理

ニュートン法と同様に、2次近似した関数

fII(x)=f(x)+<gradf(x),Δx>+<Hessf(x)Δx,Δx>(4.4.1)f _ {\rm II} (x) = f(\overline{x}) + \left< \operatorname{grad} f(\overline{x}), \Delta x \right> + \left< \operatorname{Hess} f(\overline{x}) \Delta x, \Delta x \right> \tag{4.4.1}

xxで微分して

fII(x)=gradf(x)+Hessf(x)Δx(4.4.2)\nabla f _ {\rm II} (x) = \operatorname{grad} f (\overline{x}) + \operatorname{Hess} f (\overline{x}) \Delta x \tag{4.4.2}

を得る。2次近似した関数の極値はfII(x)=0\nabla f _ {\rm II}(x) = 0を満たすので

gradf(x(k))+Hx(k)Δx=0(4.4.3)\operatorname{grad} f (x _ {(k)}) + H _ {x _ {(k)}} \Delta x = 0 \tag{4.4.3}

となる。ここでgradf(x(k))r(k)\operatorname{grad} f (x _ {(k)}) \perp r _ {(k)}を満たすr(k)r _ {(k)}を選んだとして、(4.4.3) 式の両辺でr(k)r _ {(k)}との内積をとると、左辺は

<r(k),gradf(x(k))+Hx(k)Δx>=<r(k),gradf(x(k))>+<r(k),Hx(k)Δx>=0+<r(k),Hx(k)Δx>=<r(k),Hx(k)Δx>\begin{aligned} \left< r _ {(k)}, \operatorname{grad} f (x _ {(k)}) + H _ {x _ {(k)}} \Delta x \right> &= \left< r _ {(k)}, \operatorname{grad} f (x _ {(k)}) \right> + \left< r _ {(k)}, H _ {x _ {(k)}} \Delta x \right> \\ &= 0 + \left< r _ {(k)}, H _ {x _ {(k)}} \Delta x \right> \\ &= \left< r _ {(k)}, H _ {x _ {(k)}} \Delta x \right> \end{aligned}

であるから、

<r(k),Hx(k)Δx>=0(4.4.4)\left< r _ {(k)}, H _ {x _ {(k)}} \Delta x \right> = 0 \tag{4.4.4}

となることがわかる。そこで

m(k)=gradf(x(k))+β(k)r(k)(4.4.5)m _ {(k)} = \operatorname{grad} f(x _ {(k)}) + \beta _ {(k)} r _ {(k)} \tag{4.4.5}

の方向に更新することを考える。

まずβ(k)\beta _ {(k)}を導出する。ステップサイズをα(k)\alpha _ {(k)}とすると

Δx=α(k)m(k)(4.4.6)\Delta x = \alpha _ {(k)} m _ {(k)} \tag{4.4.6}

とおける。これを (4.4.4) 式に代入すると

<r(k),Hx(k)(α(k)m(k))>=α(k)<r(k),Hx(k)m(k)>=0<r(k),Hx(k)m(k)>=0\begin{aligned} &\left< r _ {(k)}, H _ {x _ {(k)}} (\alpha _ {(k)} m _ {(k)}) \right> = \alpha _ {(k)} \left< r _ {(k)}, H _ {x _ {(k)}} m _ {(k)} \right> = 0 \\ &\therefore \left< r _ {(k)}, H _ {x _ {(k)}} m _ {(k)} \right> = 0 \end{aligned}

となるので

<r(k),Hx(k)m(k)>=<r(k),Hx(k)(gradf(x(k))+β(k)r(k))>=<r(k),Hx(k)gradf(x(k))>+β(k)<r(k),Hx(k)r(k)>=0\begin{aligned} \left< r _ {(k)}, H _ {x _ {(k)}} m _ {(k)} \right> &= \left< r _ {(k)}, H _ {x _ {(k)}} \left(\operatorname{grad} f (x _ {(k)}) + \beta _ {(k)} r _ {(k)} \right) \right> \\ &= \left< r _ {(k)}, H _ {x _ {(k)}} \operatorname{grad} f (x _ {(k)}) \right> + \beta _ {(k)} \left< r _ {(k)}, H _ {x _ {(k)}} r _ {(k)} \right> = 0 \end{aligned}

より

β(k)=<r(k),Hx(k)gradf(x(k))><r(k),Hx(k)r(k)>(4.4.7)\beta _ {(k)} = - \frac{\left< r _ {(k)}, H _ {x _ {(k)}} \operatorname{grad} f (x _ {(k)}) \right>}{\left< r _ {(k)}, H _ {x _ {(k)}} r _ {(k)} \right>} \tag{4.4.7}

と求まる。

次に共役勾配方向r(k)r _ {(k)}を求める。r(k)r _ {(k)}gradf(x(k))\operatorname{grad} f (x _ {(k)})と直交してさえいればよいので選び方には自由度があるが、ここでは古典的な

r(k)=m(k1)(4.4.8)r _ {(k)} = m _ {(k-1)} \tag{4.4.8}

を用いる。

厳密直線探索を用いるとgradf(x(k))r(k)\operatorname{grad} f (x _ {(k)}) \perp r _ {(k)}となることを示しておく。いま点x(k)x _ {(k)}を始点としてm(k)m _ {(k)}方向への直線探索を考えると、媒介変数ttによる関数

F(t)=f(x(k)+tm(k))(4.4.10)F(t) = f (x _ {(k)} + t m _ {(k)}) \tag{4.4.10}

の極値を与えるttを求めることになる。この関数の点x(k+1)=x(k)+tm(k)x _ {(k+1)} = x _ {(k)} + t m _ {(k)}における方向微分を考えると

dF(t)dt=<f(x(k+1)),dm(k)dt>(4.4.9)\frac{d F(t)}{dt} = \left< \nabla f (x _ {(k+1)}), \frac{d m _ {(k)}}{dt}\right> \tag{4.4.9}

である(方向微分を (4.4.10) 式の右辺の形に分解するには微分の連鎖律を用いる)。F(t)F(t)が極値をとるときのtttt ^ \astとおくと

dF(t)dtt=t=0(4.4.11)\left. \frac{d F(t)}{dt} \right| _ {t = t ^ \ast} = 0 \tag{4.4.11}

であるから、x(k+1)=x(k)+tm(k)x _ {(k+1)} = x _ {(k)} + t ^ \ast m _ {(k)}を選べば、(4.4.10), (4.4.11) 式より

<f(x(k+1)),dm(k)dt>=0(4.4.12)\left< \nabla f (x _ {(k+1)}), \frac{d m _ {(k)}}{dt}\right> = 0 \tag{4.4.12}

となる。また、直線探索なのでdm(k)dtm(k)\frac{d m _ {(k)}}{dt} \parallel m _ {(k)}だから、(4.4.12) 式と定数c0c \neq 0を用いて

<f(x(k+1)),dm(k)dt>=<f(x(k+1)),cm(k)>=c<f(x(k+1)),m(k)>=0(4.4.13) \left< \nabla f (x _ {(k+1)}), \frac{d m _ {(k)}}{dt}\right> = \left< \nabla f (x _ {(k+1)}), c m _ {(k)} \right> = c \left< \nabla f (x _ {(k+1)}), m _ {(k)} \right> = 0\tag{4.4.13}

となることがわかる。ゆえに

<f(x(k+1)),m(k)>=0f(x(k+1))m(k)(4.4.14)\begin{aligned} \left< \nabla f (x _ {(k+1)}), m _ {(k)} \right> = 0 \\ \Rightarrow \nabla f (x _ {(k+1)}) \perp m _ {(k)} \end{aligned} \tag{4.4.14}

となる。したがってr(k+1)=m(k)r _ {(k+1)} = m _ {(k)}とおけばf(x(k+1))r(k+1)\nabla f (x _ {(k+1)}) \perp r _ {(k+1)}となることがわかるので共役勾配方向r(k)r _ {(k)}が得られたことになる。

残る未知数はステップサイズα(k)\alpha _ {(k)}であるが、(4.4.8) 式、すなわちr(k)=m(k1)r _ {(k)} = m _ {(k-1)}の正当性を保証しているのは厳密直線探索を行っていることであるから、(4.4.10), (4.4.11) 式のあたりの議論からα(k)=t\alpha _ {(k)} = t ^ \astとすればよいことがわかる。

tt ^ \astを厳密に求めるのは難しいので、これをどう求めるかもアルゴリズムの構成の自由度となる。もっとも簡単な方法は目的関数を2次近似した極値へ到達するα(k)\alpha _ {(k)}を求める方法で、 (4.4.3) 式に (4.4.6) 式を代入して

gradf(x(k))+Hx(k)(α(k)m(k))=0α(k)Hx(k)m(k)=gradf(x(k))\begin{aligned} &\operatorname{grad} f (x _ {(k)}) + H _ {x _ {(k)}} (\alpha _ {(k)} m _ {(k)}) = 0 \\ &\therefore \,\, \alpha _ {(k)} \cdot H _ {x _ {(k)}} m _ {(k)} = - \operatorname{grad} f (x _ {(k)}) \end{aligned}

となることから、両辺でm(k)m _ {(k)}との内積をとって

α(k)<m(k),Hx(k)m(k)>=<m(k),gradf(x(k))>α(k)=<m(k),gradf(x(k))><m(k),Hx(k)m(k)>(4.4.15)\begin{aligned} &\alpha _ {(k)} \left< m _ {(k)}, H _ {x _ {(k)}} m _ {(k)} \right> = - \left< m _ {(k)}, \operatorname{grad} f (x _ {(k)}) \right> \\ &\therefore \alpha _ {(k)} = - \frac{\left< m _ {(k)}, \operatorname{grad} f (x _ {(k)}) \right>}{\left< m _ {(k)}, H _ {x _ {(k)}} m _ {(k)} \right>} \end{aligned} \tag{4.4.15}

が求まる。

収束性

共役勾配法は1次収束のアルゴリズムである。

特徴

共役勾配法の収束性は最急降下法と同じ1次収束であるが、経験的に最急降下法よりも早く収束することが知られている。

原始的な共役勾配法でも Hesse 行列の逆行列の計算は回避できるが、Hesse 行列自体はまだβk\beta ^ kを求める際の更新式に現れている。現代では Hesse 行列自体の計算も回避するようなバリエーションが提案されており、それが次に解説するような PRP 法や HS 法である。

Last updated