BFGS法

数理最適化において、ブロイデン・フレッチャー・ゴールドファーブ・シャンノ法 ()、略してBFGS法は、非制限非線形最適化問題に対する反復的解法の一つである。
BFGS法は山登り法の一種である、準ニュートン法に属しており、（2回微分可能であることが望ましい）関数の停留点を探索する。この種の問題の最適性の十分条件は勾配が零となることである。ニュートン法とBFGS法は、の近傍で関数が二次までテイラー展開可能でない場合、収束が保証されない。しかし、BFGS法は関数が滑らかでない場合でもよい性能を発揮することが示されている。
準ニュートン法では、二次微分のヘッセ行列は必ずしも直接計算しなければならないわけではなく、勾配を計算（あるいは近似計算）した結果を用いて近似することもできる。準ニュートン法は、一次微分の根を探索する割線法を多次元問題へ一般化したものである。多次元問題では、正割方程式は一意解を与えないため、準ニュートン法はどのように解を拘束するかによってことなる。BFGS法はこの種の手法の中で最も普及しているものの一つである。その他にも、BFGS法を限られたメモリで実行できるようにし、非常に多くの変数を扱えるように変更されたL-BFGS法も広く使われている。単純な矩形拘束を扱うBFGS-B法と呼ばれる変種も存在する。
このアルゴリズムの名前は、、、、に因む。
原理.
最適化問題では、formula_1を formula_2上のベクトル、 formula_3は微分可能なスカラー値関数とし、formula_1 の取り得る値に制限はないものとして、formula_3を最小化する。
このアルゴリズムでは、初期推定値 formula_6から初め、各ステージ毎に反復的により良い推定値へと更新していく。
ステージ "k" における探索方向 p"k"  はニュートン方程式に類似した次の方程式を解くことにより得られる。
ここで formula_8 はヘッセ行列の近似であり、各ステージ毎に反復的に更新する。formula_9 は x"k" で計算した勾配である。方向 p"k" を得たのち、この方向に向けて直線探索を行い、formula_10 を最小とするようなスカラー formula_11を求める。
formula_8の更新において課される準ニュートン条件は以下の通りである。
formula_14 および formula_15, formula_16 は formula_17曲率条件 formula_18 が満たされている必要がある。もし関数が強凸性を持たない場合、この条件を明示的に課す必要がある。
点 x"k"+1 における完全なヘッセ行列を計算して "B""k"+1 とする代わりに、二つの行列を次のように加算して近似ヘッセ行列を更新する。
"Uk" および "Vk" はどちらも階数1の対称行列であるが、これらの和を取ることにより階数2の行列を用いて更新することとなる。BFGS法とDFP法は、以前の行列更新法と階数2の行列を更新に用いる点が異なる。階数1行列を用いる、より単純な手法は法と呼ばれ、正定値性が保証されない。formula_16 formula_21正割条件 formula_22 formula_23 および formula_24
上の formula_27 および formula_28 を formula_21 に代入して書き下すと、次のようになる。
アルゴリズム.
初期推定値 formula_6 と初期近似ヘッセ行列 formula_32 から始め、次のステップを反復することにより、formula_33 は解に収束する。
formula_3 は最小化の対象となる関数である。勾配のノルム formula_42を監視することにより収束判定を行う。 formula_32 を formula_44 のように初期化した場合、最初のステップは最急降下法と同等となるが、それ以降のステップでは近似ヘッシアン formula_45の改善に伴って改善される。
このアルゴリズムのステップ1に用いられる formula_8の逆行列は、をステップ5に適用することにより次式のように計算することができる。
この計算は、formula_48 が対称行列であり、formula_49 および formula_50 がスカラーであることを用いると次のように展開でき、行列を一時記憶領域に記憶する必要なく効率的に計算できる。
最尤推定やベイズ推定などの統計推定問題においては、最終的なヘッセ行列の逆行列を用いて解の信頼区間もしくは確信区間を推定することができる。しかし、これらの量は正確には真のヘッセ行列により定義されるものであり、BFGS近似は真のヘッセ行列に収束しない場合がある。
実装.
GSL は gsl_multimin_fdfminimizer_vector_bfgs2 でBFGS法を実装している。Ceres Solver はBFGS法とL-BFGS法の両方を実装している。
SciPyでは、scipy.optimize.fmin_bfgs 関数がBFGS法を実装している。パラメータ L にとても大きな数を指定することにより、L-BFGS法を実行することもできる。
Octave は double-dogleg 近似を用いたBFGS法を  cubic line search に用いている。
R言語では、BFGS法（および矩形拘束を扱えるL-BFGS-B法）が基本関数 optim() のオプションとして実装されている。
MATLAB  では、fminunc 関数が問題サイズを「中程度」に指定した場合にBFGS法を利用する。
C++ で実装され、高精度算術パッケージ ARPREC に統合されている高精度算術版BFGS法 (pBFGS) は（丸め誤差などの）数値的不安定性に対して頑強である。
他にも、C++ によるBFGS（およびL-BFGS, L-BFGS-B, CG, ニュートン法）の実装としては、MIT License で公開されている ライブラリが存在する。
オープンソースの C 実装としては、Gnu Regression, Econometrics and Time-series Library (gretl) がBFGSおよび L-BFGS法を含んでいる。