BFGS対L-BFGS —実際にはどのように違うのですか?


7

PythonでBFGSとL-BFGSを使用してPythonで最適化手順を実装しようとしていますが、2つのケースで驚くほど異なる結果が得られます。L-BFGSは適切な最小値に超高速で収束しますが、BFGSは非常にゆっくりと収束し、それも無意味な最小値に収束します。

質問:私の測定値から、BFGSとL-BFGSは基本的にアルゴリズム(準ニュートン法)であるように見えますが、後者はメモリ使用量が少ないため高速です。本当?そうでなければ、それらがより異なっている場合、どのようにしてそうでしょうか?

最終的に、パフォーマンスの違いが実際のアルゴリズムの違いによるものなのか、それともPython SciPyモジュールでの実装によるものなのかを把握したいと思います。

編集: 2つのアルゴリズムからの逸脱した動作の私の主張をサポートするためにいくつかのデータを追加しています。

 RUNNING THE L-BFGS-B CODE

       * * *

Machine precision = 2.220D-16
N =          147     M =           10
This problem is unconstrained.

At X0         0 variables are exactly at the bounds
At iterate    0    f=  2.56421D+04    |proj g|=  1.19078D+03
At iterate    1    f=  2.12904D+04    |proj g|=  1.04402D+03
At iterate    2    f=  1.49651D+03    |proj g|=  2.13394D+02
At iterate    3    f=  6.08288D+02    |proj g|=  9.85720D+01
At iterate    4    f=  2.91810D+02    |proj g|=  6.23062D+01
...
At iterate  142    f=  3.27609D+00    |proj g|=  8.80170D-04
Time taken for minimisation: 36.3749790192


*** BFGS code ***

At iterate    1,  f= 21249.561722 
At iterate    2,  f= 15710.435098 
At iterate    3,  f= 15443.836262 
At iterate    4,  f= 15386.035398 
At iterate    5,  f= 15311.242917 
At iterate    6,  f= 15211.986938 
At iterate    7,  f= 15022.632266
...
At iterate  524,  f= 67.898495
...
Warning: Desired error not necessarily achieved due to precision loss.
Iterations: 1239
Time taken: 340.728140116

L-BFGSは文字通りかなり少ないメモリを使用するBFGSの近似であるため、収束が遅くなることが予想されます。ただし、どちらもある意味では近似であるため、特定の入力に対してL-BFGSが「ラッキー」である可能性があります。もう1つのオプションは、BFGSの実行時にマシンに重大なメモリボトルネックが発生することですが、L-BFGSにはそうではありません。したがって、互いに独立した奇妙な動作をするアルゴリズムがない場合は、特定の実装が他の実装よりもパフォーマンスが悪いと主張するためのデータが欠けているだけです。
離散トカゲ

@Discretelizard、私はいくつかのデータを共有しました。いくつかの初期条件から開始して、BFGSとLBFGSが関数に対してどのように進行するかを示しています。LBFGSの場合、数回の反復で関数値が1桁減少しますが、BFGSの場合はわずかに低下していることに注意してください。私の質問は基本的に、なぜ検索行動にそのような大きな不一致があり得る/すべきであるかについてです。
ap21 2017

まあ、どちらも「最適パス」を近似して最適を見つけるため、大量のデータセットではパフォーマンスが異なる可能性があります。正確な答えを得るには、L-BFGSのメソッドがこの特定の関数に対してはるかに優れた勾配降下ステップを生成するかどうか、またはその理由を確認できます。両方の方法からの「パス」を示すソリューションスペースの視覚化は、何が起こっているのかを理解するのに役立ちます。
離散トカゲ

1
低次元の解空間の使用を検討してください。特定の関数でこれらのアルゴリズムの動作に本当に関心がある場合は、関数の詳細(たとえば、関数の凸、多項式、線形、不連続など)と解空間(それはRn、凸集合、多面体など)、任意の関数に対するこれらのメソッドの相対的な品質に関する一般的な条件が存在するかどうかは疑問です。
離散トカゲ

2
いいえ、それは私が言っていることの反対です。BFGSとLBFGSは、関数と解空間の選択方法に応じて、理論的には収束速度が異なる完全に異なる解(複数の極小値がある場合)に収束できます。したがって、実装に制限があると主張したい場合は、さまざまな関数とソリューションスペースを大量にテストする必要があります。
離散トカゲ

回答:


2

いいえ、同じではありません。ある意味で、L-BFGSはBFGSの近似であり、必要なメモリが大幅に少なくなります。BFGSとL-BFGSは、多くの標準リソースで非常に詳細に説明されています。

大雑把に言えば、このような違いを考えることができます。BFGSは完全なヘッセ行列を計算して保存しますH各ステップで; これにはΘ(n2) スペース、場所 n最適化している変数(次元)の数をカウントします。L-BFGSは、近似を次のように格納できるように選択されたヘッセ行列の近似を計算して格納します。Θ(n)スペース。効果的に、L-BFGSは近似を使用しますHMM いくつかのための k×n マトリックス M (おもう)。

L-BFGSの各ステップは、BFGSの対応するステップが何を行うかを概算/推測する試みです。ただし、L-BFGSの1つのステップは、BFGSの1つのステップよりもはるかに少ないスペースと時間で済みます。その結果、BFGSよりも特定の時間範囲内でより多くのL-BFGSステップを実行できます。したがって、L-BFGSはBFGSよりも多くの反復を特定の時間内に実行できるため、L-BFGSはより速く収束することがわかります。

無意味な最小値が何を意味するのか、また、両方を無制限に実行することが許可されているのに、なぜBFGSがL-BFGSよりも悪いものに収束するのかはわかりません。


以下のリンクをご覧ください。BFGSによって与えられる無意味な最小値-plot.ly/~apal90/162-およびLBFGSによって与えられる適切な最小値(シリンダー)-plot.ly/~apal90/160
ap21

あなたが言っているのは、BFGSとLBFGSは理論的には同じ解決策に収束すべきであり、時間は障壁にならないということです。それでは、SciPyでのアルゴリズムの実装の限界を実際に調べています。
ap21、2017

L-BFGSは、同じ回数の反復でも、このインスタンスでより適切に機能します。したがって、より高速な反復を行うL-BFGSは、ここでの違いを説明しません。
離散トカゲ

1
@Discretelizard、あなたはまったく正しい。2つの実行に関する詳細情報は回答を書いたときに入手できなかったため、推測していたのですが、推測が正しくなかったようです。なぜap21が質問にリストされている動作を見ているのかわかりません。うまくいけば、他の誰かがより良い答えを提供できるでしょう。
DW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.