BFGS法

数理最適化において、ブロイデン・フレッチャー・ゴールドファーブ・シャンノ法（ブロイデン・フレッチャー・ゴールドファーブ・シャンノほう、Broyden–Fletcher–Goldfarb–Shanno algorithm）、略してBFGS法とは、無制約非線形最適化問題に対する反復的解法の一つである。関連の深いDFP法と同様、BFGS法は勾配のプレコンディショニングdate=2024年8月を曲率の情報を用いて行うことにより降下方向を決定する。その際、損失関数のヘッセ行列の推定値を勾配（またはその推定値）のみを用いて（一般化）割線法により漸進的に改善する。
BFGS法における曲率行列の更新には逆行列の評価を要さないため、label=計算複雑度はに留まり、ニュートン法のよりも高速である。L-BFGS法もよく用いられ、メモリ使用量を限定できるため、多変数（e.g. >1000）問題に対する解法に適している。BFGS-B法はシンプルなボックス拘束を扱える。
このアルゴリズムの名前は、Charles_George_Broyden、ロジャー・フレッチャー、Donald_Goldfarb、David_Shannoに因む。

**理論的根拠**
を上のベクトル、を微分可能なスカラー値関数とし、の取り得る値に制限はないものとして、を最小化する最適化問題を考える。
BFGS法は初期推定値から始め、各ステージ毎に反復的により良い推定値へと更新していく。
ステージkにおけるDescent direction pkはニュートン方程式に類似した次の方程式を解くことにより得られる。
 
ここでBkはxkにおけるヘッセ行列の推定値であり、各ステージごとにxkにおける目的関数の勾配を用いて反復的に更新される。降下方向pkを得たのち、この方向に向けて直線探索を行い、を最小とするようなスカラーγ > 0を求め、次の点xk+1を決定する。
の更新においては、以下の式であらわされる準ニュートン条件が課せられる。
 
ここでおよびとおくと、Bk+1は以下の正割方程式を満たす。
 
が正定値行列であるためには曲率条件が満たされる必要がある。この条件は正割方程式に左からをかけることにより検証できる。目的関数が強凸関数でない場合、この条件は明示的に課す必要があり、これはたとえばxk+1を決定する際にウルフ条件を満たす点を選べばよい。
点xk+1におけるヘッセ行列を全て計算するかわりに、ステージkにおける推定値に次のように2つの行列を足すことによりBk+1を計算する。
 
およびVkはどちらも階数1の対称行列であるが、これらの和を取ることにより階数2の対称行列を用いて更新することとなる。対称ランクワン法と比べ、BFGS法とDFP法はどちらも階数2の行列を更新に用いる点が異なる。より単純な手法である対称ランクワン法は階数1の行列を用いて更新を行うが、正定値性が保証されない。Bkの対称性と正定値性を維持するため、更新式はのように選ぶ。正割条件を課すと、およびとして以下を得る。
 
 
最後に、αおよびβをに代入するとBk+1の更新式は以下のように書ける。
 

**アルゴリズム**
非線形関数を対象とした無制約最適化問題を考える。
初期推定解および初期推定ヘッセ行列から始め、次の各ステップを反復することによりxkは解に収束する。
# 降下方向pkをを解くことにより求める。
# 1次元最適化（直線探索）を行い、前ステップで求めた降下方向に向う許容しうるステップサイズαkを求める。厳密な直線探索が行われた場合、 となる。実用上はαkがウルフ条件を満たすことをもって許容する、非厳密な直線探索で十分なことが多い。
# とし、により推定解を更新する。
# を計算する。
# により推定ヘッセ行列を更新する。
何らかの基準値ε > 0のもと、勾配のノルムがを満たしたとき解が収束したものとみなしアルゴリズムを終了する。
のように選んだ場合、最初のステップは最急降下法と等価となるが、以降のステップはBkがヘッセ行列を推定することにより徐々に改善される。
このアルゴリズムのステップ1はBkの逆行列を用いて実行されるが、この逆行列はステップ5でSherman–Morrison formula を用いることにより次のように効率的に求めることができる。
 
この計算は が対称行列であり、 および がスカラーであることを用いて次のように展開でき、一時行列を要せず実行することができる。
 
したがって、逆行列を求めるための計算を一切することなく、ヘッセ行列の逆行列そのものを推定することが可能である。
初期推定解x0、ヘッセ行列の逆行列の推定値H0から始め、次の各ステップを反復することによりxkは解へと収束する。
# 降下方向pkをにより得る。
# 1次元最適化（直線探索）を行い、前ステップで求めた降下方向に向う許容しうるステップサイズαkを求める。厳密な直線探索が行われた場合、 となる。実用上はαkがウルフ条件を満たすことをもって許容する、非厳密な直線探索で十分なことが多い。
# とし、により推定解を更新する。
# を計算する。
# によりヘッセ行列の逆行列の推定値を計算する。
最尤推定やベイズ推定などの統計推定問題においては、最終的なヘッセ行列の逆行列を用いて解の信頼区間もしくは確信区間を推定することができる date=May 2021。しかし、これらの量は正確には真のヘッセ行列により定義されるものであり、BFGS近似は真のヘッセ行列に収束しない場合がある。

**発展**
BFGS更新公式は曲率が常に正であり、ゼロから離れた下界があることに強く依拠している。この条件は凸な対称関数においてウルフ条件を用いた直線探索を用いる場合は満たされるが、実際の問題（たとえば逐次二次計画法）では負やほぼゼロの曲率があらわれることがしばしば発生する。このようなことは非凸関数を対象とする場合や直線探索ではなく信頼領域アプローチをとった場合に生じるおそれがある。この場合、BFGS法は誤った値をあたえることがある。
このような場合には、減衰BFGS更新などと呼ばれる、skおよび/またはykを修正して頑健にした更新式が用いられることがある。

**実装**
オープンソースの実装として有名なものは以下のようなものがあげられる。- ALGLIBはC++およびC#用のBFGSおよびL-BFGS法を実装する。- GNU Octaveのfsolve関数は信頼領域を用いた一種のBFGS法を用いる。- GSLはgsl_multimin_fdfminimizer_vector_bfgs2関数としてBFGSを実装している。- R言語では、、BFGS法（および矩形拘束を扱えるL-BFGS-B法）が基本関数optim()のオプションとして実装されている。- SciPyでは、scipy.optimize.fmin_bfgs関数がBFGS法を実装している。パラメータLにとても大きな数を指定することにより、なんらかのL-BFGS法を実行することもできる。- Juliaでは、 Optim.jlパッケージにBFGSおよびL-BFGSが実装されている。
プロプライエタリな実装としては以下のようなものがあげられる。- 大規模非線形最適化ソフトウェアArtelys KnitroはBFGS法およびL-BFGS法の両方を実装する。- MATLAB Optimization Toolboxでは、fminunc関数がBFGS法を3次直線探索と組み合わせたアルゴリズムを「中規模スケール」の問題向けに実装している。- MathematicaにはBFGS法が含まれる。- LS-DYNAもBFGS法を用いて陰解を求めている。

**脚注**

**関連文献**
 isbn=978-0-486-43227-4- isbn=3-540-35445-X- Citation|title=Practical Methods of Optimization|last=Fletcher|first=Roger|year=1987|url=https://archive.org/details/practicalmethods0000flet|edition=2nd|publisher=John Wiley & Sons|location=New York|isbn=978-0-471-91547-8- mr=2423726- isbn=0-89871-433-8

**関連項目**
 BHHH法- DFP法- 最急降下法- L-BFGS- レーベンバーグ・マルカート法- ネルダー–ミード法- Pattern_search_(optimization)- 準ニュートン法- 対称ランクワン法

**外部リンク**
  Source code of high-precision BFGS