準ニュートン法
準ニュートン法(じゅんニュートンほう、quasi-Newton method)とは、非線形連立方程式の解、あるいは連続最適化問題の関数の極大・極小解を見つけるためのアルゴリズムである。準ニュートン法はニュートン法を元にしており、非線形連立方程式の解を求めることが基本になるが、最適化問題においては、関数の停留点を見つけるために、関数の勾配=0の連立方程式を解くという立場から考えることができる。以下は、主に最適化問題の立場からの説明である。
通常のニュートン法は最適解の近傍が二次関数で近似できると仮定し、一階および二階の導関数を解の探索に用いる。高次元空間上で定義される関数に対しては、最小化(最大化)したい関数の勾配ベクトルおよびヘッセ行列を用いる。一方で、準ニュートン法ではヘッセ行列を陽に計算する必要がない。その代わりにヘッセ行列が最適化の繰り返し計算の過程で得られる勾配ベクトルにより近似される。準ニュートン法は多次元関数の零点 (関数の値が0となる場所) を探すアルゴリズムの一種であるセカント法(割線法)の一般化であると見ることも出来る。多次元の問題においてはセカント方程式は1次元の場合と違い一意に定まらず、劣決定問題となるが、準ニュートン法は近似の制約が異なっており、具体的には現在の推定ヘッセ行列を低ランク行列成分を用いて更新する。
最初の準ニュートン法のアルゴリズムは物理学者のW.C. Davidonがアルゴンヌ国立研究所で研究中に提案したものである。彼が1959年に提案した最初の準ニュートン法は、1963年にFletcherとPowellが世に広め、後にDFP (Davidon-Fletcher-Powell) 法とよばれるようになったが、1970年後半、より効率的なBFGS法の登場により、今日ではあまり用いられていない。現在最も用いられている準ニュートン法のアルゴリズムはSR1(対称ランクワン、symmetric rank-one)法、BHHH法、そしてBFGS法 (提案者であるBroyden, Fletcher, Goldfarb, Shannoの頭文字から) である。大規模問題に対応させる方法の一つとして記憶制限準ニュートン法が1980年に発表され、BFGS法を記憶制限準ニュートン法にした物としてL-BFGS法があり、良く用いられるアルゴリズムの1つである。
SR1法は行列の更新が行列の正定値性を保存しないため、不定値の行列のヘッセ行列に対しても用いることが出来る。またブロイデン法は行列が対称行列でなくとも良く、通常の連立方程式の解を求めるのにも使うことが出来る。
通常のニュートン法と比べたときの準ニュートン法の最大の利点はヘッセ行列の逆行列を計算する必要がない更新法があるという点である。ニュートン法や、それを部分的に用いる内点法のアルゴリズムはこのヘッセ行列の逆行列を計算する部分が計算のボトルネックとなることが多い。これに対して準ニュートン法はヘッセ行列の逆行列自体を直接近似できる。
ニュートン法と同様、関数f(\boldsymbol{x})の解を見つけるために二次の近似を用いる。f(\boldsymbol{x})の二階のテイラー展開は
f(\boldsymbol{x}_k + \Delta \boldsymbol{x}) \approx f(\boldsymbol{x}_k) + \nabla f(\boldsymbol{x}_k)^\intercal \Delta \boldsymbol{x} + \frac{1}{2} \Delta \boldsymbol{x}^\intercal \boldsymbol{B} \Delta \boldsymbol{x}
となる。この式で\nabla fは勾配を表し、\boldsymbol{B}はヘッセ行列の近似を表す。勾配\nabla fはさらに次のように近似される。
\nabla f(\boldsymbol{x}_k + \Delta \boldsymbol{x}) \approx \nabla f(\boldsymbol{x}_k) + \boldsymbol{B} \Delta \boldsymbol{x}
この勾配が0になると仮定するとニュートン・ステップが次の式で計算される。
\Delta \boldsymbol{x} = - \boldsymbol{B}^{-1} \nabla f(\boldsymbol{x}_k)
そこでヘッセ行列の近似\boldsymbol{B}は次の式を満たすように行われる。
\nabla f(\boldsymbol{x}_k + \Delta \boldsymbol{x}) = \nabla f(\boldsymbol{x}_k) + \boldsymbol{B} \Delta \boldsymbol{x}
この方程式はセカント方程式と呼ばれる。fが多次元空間上で定義される関数のとき、この式から\boldsymbol{B}を求める問題は劣決定問題になる(式の数よりも未知数の数が多い問題のこと)。このとき\boldsymbol{B}を求めて、ニュートン・ステップにより解を更新するという処理はセカント方程式を解くことに帰着される。多くの準ニュートン法はセカント方程式の解の選び方が異なっている。ほとんどの方法では\boldsymbol{B} = \boldsymbol{B}^\intercalという対称性を仮定して解を求める。加えて、以下のリストに示す方法では新たな近似\boldsymbol{B}_{k+1}を得るために、その前の近似\boldsymbol{B}_kと、あるノルムの意味において近い解を選ぼうとする。すなわち何らかの正定値行列\boldsymbol{V}に対して\boldsymbol{B}_{k+1} = \arg \min_\boldsymbol{B} \| \boldsymbol{B} - \boldsymbol{B}_k \|_{\boldsymbol{V}と成るように\boldsymbol{B}を更新する。近似ヘッセ行列の初期値としては単位行列などが用いられる。最適化の解\boldsymbol{x}_kは近似によって得られた\boldsymbol{B}_kを用いたニュートン・ステップにより更新される。
アルゴリズムをまとめると以下のようになる。
\Delta \boldsymbol{x}_k = -\alpha \boldsymbol{B}_k^{-1} \nabla f(\boldsymbol{x}_k)
\boldsymbol{x}_{k+1} = \boldsymbol{x}_k + \Delta \boldsymbol{x}_k
新しい点での勾配\nabla f(\boldsymbol{x}_{k+1})を計算し\boldsymbol{y}_k = \nabla f(\boldsymbol{x}_{k+1}) - \nabla f(\boldsymbol{x}_k)とする
\boldsymbol{y}_kを用いてヘッセ行列の逆行列\boldsymbol{B}_{k+1}^{-1}を直接近似する。近似の式は各手法ごとに以下のリストの通り。
準ニュートン法は現在、汎用的に用いられている最適化アルゴリズムの1つであり、多くのプログラミング言語による実装が存在する。
NAG数値計算ライブラリには準ニュートン法を用いた関数の最大化・最小化アルゴリズムが存在する。
PythonのライブラリであるSciPyでは scipy.optimize.minimize のデフォルトは BFGS である。
GNU Octaveは関数'funcmin'においてBFGS法を用いている。
MATLABのOptimization Toolboxにある関数fminuncでもBFGS法が実装されている。
MathematicaやRにも一般的な関数の最適化法としてBFGS法が実装されている。