L-BFGS法

記憶制限BFGS法（きおくせいげんBFGSほう）またはL-BFGS法（英: Limited-memory BFGS method）とは、準ニュートン法に分類される最適化アルゴリズムであり、BFGS法をより小さな記憶容量を用いて近似的に実行する。機械学習におけるパラメーター推定に広く用いられる。L-BFGS法が解く対象は、実数ベクトルxの関数f(x)の非制約最適化問題である。 元になったBFGS法と同様、L-BFGS法は逆ヘッセ行列の推定値を使用して変数空間を探索するが、BFGS法では逆ヘッセ行列の近似値をn×n密行列（nは対象問題の変数の数）として記憶するのに対し、L-BFGS法では少数のベクトルのみを記憶し逆ヘッセ行列の近似値はこれらにより暗黙的に表現される。結果としてメモリ使用量のスケーリングは問題サイズの2乗から1乗ヘ低下するため、多くの変数が関わる最適化問題に特に適する。L-BFGS法では逆ヘッセ行列Hkの代わりに、位置xと勾配∇f(x)の過去m回の更新の履歴を記憶する（多くの場合m < 10）。これらの情報から、Hkとのベクトル積を必要とする操作を暗黙的に実行する。 L-BFGS法は、所与の初期推定x0から、反復的により良い推定値x1, x2, …を算出する。目的関数の微分値gk := ∇f(xk)を降下の方向の算出だけでなく、ヘッセ行列（2次微分）の推定値の更新にも用いる。 L-BFGS法は他の準ニュートン法アルゴリズムと多くの部分は共通だが、行列とベクトルの乗算dk = −Hkgkの実行方法が大きく異なる。ここで、dkはニュートン方向の近似値、gkは現在の勾配であり、Hkはヘッセ行列の逆行列である。これまでの履歴を使用してこの方向ベクトルを算出する複数のアプローチが発表されているが、ここでは、「2ループ再帰」と呼ばれる一般的なアプローチを示す。 k回目の反復における位置xkおよび勾配gk ≡ ∇f(xk)を所与とする。また、すべてのベクトルは列ベクトルとし、直近m回の更新履歴を次の形式で記憶していることを仮定する。 s k = x k + 1 − x k {\displaystyle s_{k}=x_{k+1}-x_{k}} y k = g k + 1 − g k {\displaystyle y_{k}=g_{k+1}-g_{k}} ここで、 ρ k = 1 y k ⊤ s k {\displaystyle \rho _{k}={\frac {1}{y_{k}^{\top }s_{k}}}} とし、H0 kをk回目の反復での逆ヘッセ行列の初期推定値とする。 L-BFGS法の基となるBFGS法では、逆ヘッセ行列は以下のような漸化式で推定される。 H k + 1 = ( I − ρ k s k y k ⊤ ) H k ( I − ρ k y k s k ⊤ ) + ρ k s k s k ⊤ {\displaystyle H_{k+1}=(I-\rho _{k}s_{k}y_{k}^{\top })H_{k}(I-\rho _{k}y_{k}s_{k}^{\top })+\rho _{k}s_{k}s_{k}^{\top }} kを一定として、ベクトル列qk−m, …, qkをqk := gkおよびqi := (I − ρiyisi⊤)qi+1により定義する。αi :=ρisi⊤qi+1と定義すると、qi = qi+1 − αiyiによりqiをqi+1から再帰的に計算することができる。別のベクトル列zk−m, …, zkをzi := Hiziにより定義する。このベクトル列はzk−m = H0 kqk−m、βi :=ρisi⊤zi+1と定義することによりzi+1 = (αi − βi)siのように再帰的に計算でき、zkにより上昇方向を推定できる。 したがって、下降方向は次の疑似コードのようにして計算できる。 q = g k F o r   i = k − 1 , k − 2 , … , k − m α i = ρ i s i ⊤ q q = q − α i y i γ k = s k − 1 ⊤ y k − 1 y k − 1 ⊤ y k − 1 H k 0 = γ k I z = H k 0 q F o r   i = k − m , k − m + 1 , … , k − 1 β i = ρ i y i ⊤ z z = z + s i ( α i − β i ) z = − z {\displaystyle {\begin{array}{l}q=g_{k}\\{\mathtt {For}}\ i=k-1,k-2,\ldots ,k-m\\\qquad \alpha _{i}=\rho _{i}s_{i}^{\top }q\\\qquad q=q-\alpha _{i}y_{i}\\\gamma _{k}={\frac {s_{k-1}^{\top }y_{k-1}}{y_{k-1}^{\top }y_{k-1}}}\\H_{k}^{0}=\gamma _{k}I\\z=H_{k}^{0}q\\{\mathtt {For}}\ i=k-m,k-m+1,\ldots ,k-1\\\qquad \beta _{i}=\rho _{i}y_{i}^{\top }z\\\qquad z=z+s_{i}(\alpha _{i}-\beta _{i})\\z=-z\end{array}}} 上の疑似コードは、最小化問題の探索方向、z = −Hkgkを推定する。最大化問題を解く際は代わりに−zを使えばよい。逆ヘッセ行列の初期推定値H0 kは、数値的効率性のために、対角行列または単位行列の実数倍とされる。 逆ヘッセ行列の初期推定値をγkにより適切にスケールすることにより、探索方向がwell scaled[訳語疑問点]であることが保証されるため、ほとんどの反復でステップ長は1としてよい。曲率条件が満たされておりBFGS更新が安定であることを保証するためには、ウルフの直線探索（英語版）が用いられる。一部のソフトウェア実装では、Armijoバックトラッキング直線探索（英語版）が用いられるが、曲率条件yk⊤sk > 0が満たされるためのステップ長が1以上となる場合があるため曲率条件が保証されないことに注意が必要である。yk⊤skが負かゼロに近すぎる場合はBFGS更新を行わない実装もあるが、更新が頻繁にスキップされてヘッセ行列の近似が重要な曲率情報を捉えられない可能性があるため、一般的には推奨されない。 この2ループ更新法は、逆ヘッセ行列の推定にのみ対応できる。逆ヘッセ行列を近似する他のアプローチも開発されている他、ヘッセ行列Bkを直接近似するアプローチも開発されている。 L-BFGS法は、多項ロジスティック回帰（英語版）やℓ2正則化つき条件付き確率場のフィッティング向けに"the algorithm of choice"[訳語疑問点]とされる BFGS法は（したがってL-BFGSも）、滑らかな関数の非制約最小化問題のために設計されているため、微分不可能な成分が含まれる場合や制約を含む関数を扱うためには、アルゴリズムを一部変更する必要がある。よく用いられる変更として有効制約法（英語版）と呼ばれる種のものがあり、これらは現ステップの小さな近傍に制約すれば関数や制約を単純化することができるという考えに基く。 L-BFGS-B法は、li ≤ xi ≤ uiの不等式で表わせる制約、いわゆるsimple box constraints (aka bound constraints)[訳語疑問点]を変数に課すことができるようL-BFGS法を拡張したものである。ここで、liおよびuiは各xiごとの下限と上限を表わす定数である（変数によっては片方、もしくは両方がない場合もある）。このアルゴリズムは、（単純な勾配法を用いて）すべてのステップで固定変数と自由変数を分け、自由変数に対してのみ L-BFGS法を適用し、これを繰り返すことで問題を解く。 Orthant-wise limited-memory quasi-Newton (OWL-QN) 法[訳語疑問点]は、ℓ1正則化モデルのフィッティング向けの亜種L-BFGS法であり、ℓ1正則化モデル固有のスパース性を利用する手法である。このアルゴリズムは以下の形式で表わされる関数を最小化する。 f ( x → ) = g ( x → ) + C ‖ x → ‖ 1 {\displaystyle f({\vec {x}})=g({\vec {x}})+C\|{\vec {x}}\|_{1}} ここで、gは微分可能かつ上に凸な損失関数である。このアルゴリズムは有効制約法の一種であり、各反復において変数の各成分の符号を推定し、次のステップでも同一の符号が保たれるような制約を課す。微分不可能な ‖ x → ‖ 1 {\displaystyle \|{\vec {x}}\|_{1}} 項が符号を固定することにより、L-BFGS 法で扱える滑らかな線形項に置き換わる。L-BFGSステップの実行後、いくつかの変数の符号を変更した上で、反復を続行する。 シュラウドルフらによりBFGS法とL-BFGS法それぞれをオンライン（英語版）近似した手法が提示されている。これらの手法は、確率的勾配降下法と同様に、各反復ごとにデータセット全体を評価することなく、ランダム抽出された部分データセットを用いてエラー関数と勾配を評価することにより、計算複雑度を軽減できる。 BFGS法のオンライン近似（O-BFGS)は必ずしも収束しないのに対し、O-LBFGS法はほぼ確実に大域的に収束することが示されている 。 L-BFGS法の亜種を実装した注目すべきオープンソースソフトウェアとしては、次のものが挙げられる。 ALGLIB: C++およびC#でL-BFGS法を実装しており、ボックス/線形制約バージョンであるBLEICも実装されている。 R言語: optim汎用オプティマイザ ルーチンは、L-BFGS-B法を利用している。 Scipy: scipy.optimize モジュールにはL-BFGS-B法も実装されている。 非オープンソースの実装としては、次のものが挙げられる。 L-BFGS-B法は、ACM TOMS アルゴリズム 778として実装されている。2011年2月、L-BFGS-Bコードの原著者の一部によりメジャー アップデート（バージョン 3.0）が投稿された。 Fortran 77による参照実装（Fortran 90インターフェイスもある）。このバージョンもより古いバージョンも、他の多くの言語で再実装されている。 OWL-QN法の設計者自信によるC++実装