2 * Introduction to lbfgs::
3 * Functions and Variables for lbfgs::
6 @node Introduction to lbfgs, Functions and Variables for lbfgs, Top, Top
7 @section Introduction to lbfgs
9 @code{lbfgs}はL-BFGS algorithm [1]の実装であり、
10 限定メモリ準ニュートン(BFGS)アルゴリズムによって無制約な最小化問題を解きます。
11 Hessian行列の逆元全体の代わりに低ランク近似が保存されるので、限定メモリと呼ばれます。
14 Jorge J. Mor@'{e}とDavid J. Thuenteが最初に書いたいくつかの関数を組み入れて
16 プログラム@code{f2cl}によってLispに自動翻訳されました。
18 Maximaパッケージ@code{lbfgs}は翻訳されたコードと
19 いくつかの詳細を扱うインターフェース関数からなります。
23 [1] D. Liu and J. Nocedal. "On the limited memory BFGS method for large
24 scale optimization". @i{Mathematical Programming B} 45:503--528 (1989)
26 [2] @url{http://netlib.org/opt/lbfgs_um.shar}
29 @category{Numerical methods}
30 @category{Optimization}
31 @category{Share packages}
32 @category{Package lbfgs}
35 @node Functions and Variables for lbfgs, , Introduction to lbfgs, Top
36 @section Functions and Variables for lbfgs
38 @deffn {関数} lbfgs (@var{FOM}, @var{X}, @var{X0}, @var{epsilon}, @var{iprint})
39 @deffnx {関数} lbfgs ([@var{FOM}, @var{grad}], @var{X}, @var{X0}, @var{epsilon}, @var{iprint})
44 @math{norm(grad(FOM)) < epsilon*max(1, norm(X))}のような
47 もし与えられたなら、@var{grad}は@var{FOM}の多変数@var{X}に関する勾配です。
48 @var{grad}は@var{X}の要素それぞれに対して1つの要素を持つリストです。
49 もし与えられなかったら、勾配は記号微分で自動的に計算されます。
51 適用されるアルゴリズムは限定メモリ準Newton(BFGS)アルゴリズム [1]です。
52 Hessian行列の逆元全体の代わりに低ランク近似が保存されるので、限定メモリと呼ばれます。
53 アルゴリズムのそれぞれの繰り返しは直線探索です。
54 すなわち、変数@var{X}に関して、近似Hessian逆元から計算される探索方向の線(ray)に沿っての探索です。
56 普通(しかしいつもではありません)FOMの勾配のノルムも減少します。
58 @var{iprint}は@code{lbfgs}が印字する進捗メッセージを制御します。
62 @code{@var{iprint}[1]} controls the frequency of progress messages.
69 毎@code{@var{iprint}[1]}回の繰り返してメッセージを印字する。
72 @code{@var{iprint}[2]}は進捗メッセージの量を制御します。
75 繰り返し回数、@var{FOM}の評価回数、@var{FOM}の値、@var{FOM}の勾配のノルム、ステップ長
78 @code{@var{iprint}[2] = 0}に加えて、
79 @var{X0}と@var{X0}で評価された@var{FOM}の勾配を印字します。
81 @code{@var{iprint}[2] = 1}に加えて、
82 繰り返しそれぞれで@var{X}の値を印字します。
84 @code{@var{iprint}[2] = 2}に加えて、
85 繰り返しそれぞれで@var{FOM}の勾配を印字します。
89 @code{lbfgs}が印字する列は以下の通りです。
93 繰り返し関数。それぞれの直線探索で増えます。
99 最も最近の直線探索の最後での性能指標の勾配のノルム。
104 アルゴリズムの詳細に関係する付加情報は、元々のFortranコード[2]のコメントに見つけられます。
106 @code{lbfgs_nfeval_max}と@code{lbfgs_ncorrections}も参照してください。
110 [1] D. Liu and J. Nocedal. "On the limited memory BFGS method for large
111 scale optimization". @i{Mathematical Programming B} 45:503--528 (1989)
113 [2] @url{http://netlib.org/opt/lbfgs_um.shar}
117 NetlibからのLBFGSパッケージの中で、プログラムsdrive.f中、
118 FGCOMPUTEが計算したのと同じFOM。
119 問題の変数が添字付き変数であることに注意してください。
120 FOMは@math{u[k] = 1}(@math{k = 1, ..., 8})で0に等しい厳密な最小を持ちます。
123 @c t1[j] := 1 - u[j];
124 @c t2[j] := 10*(u[j + 1] - u[j]^2);
126 @c FOM : sum (t1[2*j - 1]^2 + t2[2*j - 1]^2, j, 1, n/2);
127 @c lbfgs (FOM, '[u[1], u[2], u[3], u[4], u[5], u[6], u[7], u[8]],
128 @c [-1.2, 1, -1.2, 1, -1.2, 1, -1.2, 1], 1e-3, [1, 0]);
132 (%i1) load ("lbfgs");
133 (%o1) /usr/share/maxima/5.10.0cvs/share/lbfgs/lbfgs.mac
134 (%i2) t1[j] := 1 - u[j];
137 (%i3) t2[j] := 10*(u[j + 1] - u[j]^2);
139 (%o3) t2 := 10 (u - u )
143 (%i5) FOM : sum (t1[2*j - 1]^2 + t2[2*j - 1]^2, j, 1, n/2);
145 (%o5) 100 (u - u ) + (1 - u ) + 100 (u - u ) + (1 - u )
148 + 100 (u - u ) + (1 - u ) + 100 (u - u ) + (1 - u )
150 (%i6) lbfgs (FOM, '[u[1],u[2],u[3],u[4],u[5],u[6],u[7],u[8]],
151 [-1.2, 1, -1.2, 1, -1.2, 1, -1.2, 1], 1e-3, [1, 0]);
152 *************************************************
153 N= 8 NUMBER OF CORRECTIONS=25
155 F= 9.680000000000000D+01 GNORM= 4.657353755084532D+02
156 *************************************************
160 I NFN FUNC GNORM STEPLENGTH
162 1 3 1.651479526340304D+01 4.324359291335977D+00 7.926153934390631D-04
163 2 4 1.650209316638371D+01 3.575788161060007D+00 1.000000000000000D+00
164 3 5 1.645461701312851D+01 6.230869903601577D+00 1.000000000000000D+00
165 4 6 1.636867301275588D+01 1.177589920974980D+01 1.000000000000000D+00
166 5 7 1.612153014409201D+01 2.292797147151288D+01 1.000000000000000D+00
167 6 8 1.569118407390628D+01 3.687447158775571D+01 1.000000000000000D+00
168 7 9 1.510361958398942D+01 4.501931728123680D+01 1.000000000000000D+00
169 8 10 1.391077875774294D+01 4.526061463810632D+01 1.000000000000000D+00
170 9 11 1.165625686278198D+01 2.748348965356917D+01 1.000000000000000D+00
171 10 12 9.859422687859137D+00 2.111494974231644D+01 1.000000000000000D+00
172 11 13 7.815442521732281D+00 6.110762325766556D+00 1.000000000000000D+00
173 12 15 7.346380905773160D+00 2.165281166714631D+01 1.285316401779533D-01
174 13 16 6.330460634066370D+00 1.401220851762050D+01 1.000000000000000D+00
175 14 17 5.238763939851439D+00 1.702473787613255D+01 1.000000000000000D+00
176 15 18 3.754016790406701D+00 7.981845727704576D+00 1.000000000000000D+00
177 16 20 3.001238402309352D+00 3.925482944716691D+00 2.333129631296807D-01
178 17 22 2.794390709718290D+00 8.243329982546473D+00 2.503577283782332D-01
179 18 23 2.563783562918759D+00 1.035413426521790D+01 1.000000000000000D+00
180 19 24 2.019429976377856D+00 1.065187312346769D+01 1.000000000000000D+00
181 20 25 1.428003167670903D+00 2.475962450826961D+00 1.000000000000000D+00
182 21 27 1.197874264861340D+00 8.441707983493810D+00 4.303451060808756D-01
183 22 28 9.023848941942773D-01 1.113189216635162D+01 1.000000000000000D+00
184 23 29 5.508226405863770D-01 2.380830600326308D+00 1.000000000000000D+00
185 24 31 3.902893258815567D-01 5.625595816584421D+00 4.834988416524465D-01
186 25 32 3.207542206990315D-01 1.149444645416472D+01 1.000000000000000D+00
187 26 33 1.874468266362791D-01 3.632482152880997D+00 1.000000000000000D+00
188 27 34 9.575763380706598D-02 4.816497446154354D+00 1.000000000000000D+00
189 28 35 4.085145107543406D-02 2.087009350166495D+00 1.000000000000000D+00
190 29 36 1.931106001379290D-02 3.886818608498966D+00 1.000000000000000D+00
191 30 37 6.894000721499670D-03 3.198505796342214D+00 1.000000000000000D+00
192 31 38 1.443296033051864D-03 1.590265471025043D+00 1.000000000000000D+00
193 32 39 1.571766603154336D-04 3.098257063980634D-01 1.000000000000000D+00
194 33 40 1.288011776581970D-05 1.207784183577257D-02 1.000000000000000D+00
195 34 41 1.806140173752971D-06 4.587890233385193D-02 1.000000000000000D+00
196 35 42 1.769004645459358D-07 1.790537375052208D-02 1.000000000000000D+00
197 36 43 3.312164100763217D-10 6.782068426119681D-04 1.000000000000000D+00
201 \halign{\hfil\tt#&\quad\hfil\tt#\quad&\tt#\hfil\quad&\tt#\hfil\quad&\tt#\hfil\cr
202 I& NFN& FUNC& GNORM& STEPLENGTH\cr
204 1& 3& 1.651479526340304D+01& 4.324359291335977D+00& 7.926153934390631D-04\cr
205 2& 4& 1.650209316638371D+01& 3.575788161060007D+00& 1.000000000000000D+00\cr
206 3& 5& 1.645461701312851D+01& 6.230869903601577D+00& 1.000000000000000D+00\cr
207 4& 6& 1.636867301275588D+01& 1.177589920974980D+01& 1.000000000000000D+00\cr
208 5& 7& 1.612153014409201D+01& 2.292797147151288D+01& 1.000000000000000D+00\cr
209 6& 8& 1.569118407390628D+01& 3.687447158775571D+01& 1.000000000000000D+00\cr
210 7& 9& 1.510361958398942D+01& 4.501931728123680D+01& 1.000000000000000D+00\cr
211 8&10& 1.391077875774294D+01& 4.526061463810632D+01& 1.000000000000000D+00\cr
212 9&11& 1.165625686278198D+01& 2.748348965356917D+01& 1.000000000000000D+00\cr
213 10&12& 9.859422687859137D+00& 2.111494974231644D+01& 1.000000000000000D+00\cr
214 11&13& 7.815442521732281D+00& 6.110762325766556D+00& 1.000000000000000D+00\cr
215 12&15& 7.346380905773160D+00& 2.165281166714631D+01& 1.285316401779533D-01\cr
216 13&16& 6.330460634066370D+00& 1.401220851762050D+01& 1.000000000000000D+00\cr
217 14&17& 5.238763939851439D+00& 1.702473787613255D+01& 1.000000000000000D+00\cr
218 15&18& 3.754016790406701D+00& 7.981845727704576D+00& 1.000000000000000D+00\cr
219 16&20& 3.001238402309352D+00& 3.925482944716691D+00& 2.333129631296807D-01\cr
220 17&22& 2.794390709718290D+00& 8.243329982546473D+00& 2.503577283782332D-01\cr
221 18&23& 2.563783562918759D+00& 1.035413426521790D+01& 1.000000000000000D+00\cr
222 19&24& 2.019429976377856D+00& 1.065187312346769D+01& 1.000000000000000D+00\cr
223 20&25& 1.428003167670903D+00& 2.475962450826961D+00& 1.000000000000000D+00\cr
224 21&27& 1.197874264861340D+00& 8.441707983493810D+00& 4.303451060808756D-01\cr
225 22&28& 9.023848941942773D-01& 1.113189216635162D+01& 1.000000000000000D+00\cr
226 23&29& 5.508226405863770D-01& 2.380830600326308D+00& 1.000000000000000D+00\cr
227 24&31& 3.902893258815567D-01& 5.625595816584421D+00& 4.834988416524465D-01\cr
228 25&32& 3.207542206990315D-01& 1.149444645416472D+01& 1.000000000000000D+00\cr
229 26&33& 1.874468266362791D-01& 3.632482152880997D+00& 1.000000000000000D+00\cr
230 27&34& 9.575763380706598D-02& 4.816497446154354D+00& 1.000000000000000D+00\cr
231 28&35& 4.085145107543406D-02& 2.087009350166495D+00& 1.000000000000000D+00\cr
232 29&36& 1.931106001379290D-02& 3.886818608498966D+00& 1.000000000000000D+00\cr
233 30&37& 6.894000721499670D-03& 3.198505796342214D+00& 1.000000000000000D+00\cr
234 31&38& 1.443296033051864D-03& 1.590265471025043D+00& 1.000000000000000D+00\cr
235 32&39& 1.571766603154336D-04& 3.098257063980634D-01& 1.000000000000000D+00\cr
236 33&40& 1.288011776581970D-05& 1.207784183577257D-02& 1.000000000000000D+00\cr
237 34&41& 1.806140173752971D-06& 4.587890233385193D-02& 1.000000000000000D+00\cr
238 35&42& 1.769004645459358D-07& 1.790537375052208D-02& 1.000000000000000D+00\cr
239 36&43& 3.312164100763217D-10& 6.782068426119681D-04& 1.000000000000000D+00\cr
244 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
246 (%o6) [u = 1.000005339815974, u = 1.000009942839805,
248 u = 1.000005339815974, u = 1.000009942839805,
250 u = 1.000005339815974, u = 1.000009942839805,
252 u = 1.000005339815974, u = 1.000009942839805]
257 FOMは、予言値@math{F(X[i])}と観測値@math{Y[i]}の二乗平均差です。
258 関数@math{F}は有界な単調関数(いわゆる「シグモイド」函数)です。
259 この例では、@math{F}のパラメータに関して@code{lbfgs}は近似値を計算し、
260 @code{plot2d}は@math{F}の観測データとの比較を表示します。
263 @c FOM : '((1/length(X))*sum((F(X[i]) - Y[i])^2, i, 1,
265 @c X : [1, 2, 3, 4, 5];
266 @c Y : [0, 0.5, 1, 1.25, 1.5];
267 @c F(x) := A/(1 + exp(-B*(x - C)));
269 @c estimates : lbfgs (FOM, '[A, B, C], [1, 1, 1], 1e-4, [1, 0]);
270 @c plot2d ([F(x), [discrete, X, Y]], [x, -1, 6]), ''estimates;
274 (%i1) load ("lbfgs");
275 (%o1) /usr/share/maxima/5.10.0cvs/share/lbfgs/lbfgs.mac
276 (%i2) FOM : '((1/length(X))*sum((F(X[i]) - Y[i])^2, i, 1,
279 sum((F(X ) - Y ) , i, 1, length(X))
281 (%o2) -----------------------------------
283 (%i3) X : [1, 2, 3, 4, 5];
284 (%o3) [1, 2, 3, 4, 5]
285 (%i4) Y : [0, 0.5, 1, 1.25, 1.5];
286 (%o4) [0, 0.5, 1, 1.25, 1.5]
287 (%i5) F(x) := A/(1 + exp(-B*(x - C)));
289 (%o5) F(x) := ----------------------
290 1 + exp((- B) (x - C))
293 (%o6) ((----------------- - 1.5) + (----------------- - 1.25)
294 - B (5 - C) - B (4 - C)
297 + (----------------- - 1) + (----------------- - 0.5)
298 - B (3 - C) - B (2 - C)
302 + --------------------)/5
305 (%i7) estimates : lbfgs (FOM, '[A, B, C], [1, 1, 1], 1e-4, [1, 0]);
306 *************************************************
307 N= 3 NUMBER OF CORRECTIONS=25
309 F= 1.348738534246918D-01 GNORM= 2.000215531936760D-01
310 *************************************************
315 I NFN FUNC GNORM STEPLENGTH
316 1 3 1.177820636622582D-01 9.893138394953992D-02 8.554435968992371D-01
317 2 6 2.302653892214013D-02 1.180098521565904D-01 2.100000000000000D+01
318 3 8 1.496348495303005D-02 9.611201567691633D-02 5.257340567840707D-01
319 4 9 7.900460841091139D-03 1.325041647391314D-02 1.000000000000000D+00
320 5 10 7.314495451266917D-03 1.510670810312237D-02 1.000000000000000D+00
321 6 11 6.750147275936680D-03 1.914964958023047D-02 1.000000000000000D+00
322 7 12 5.850716021108205D-03 1.028089194579363D-02 1.000000000000000D+00
323 8 13 5.778664230657791D-03 3.676866074530332D-04 1.000000000000000D+00
324 9 14 5.777818823650782D-03 3.010740179797255D-04 1.000000000000000D+00
328 \halign{\hfil\tt#&\quad\hfil\tt#\quad&\tt#\hfil\quad&\tt#\hfil\quad&\tt#\hfil\cr
329 I& NFN& FUNC& GNORM& STEPLENGTH\cr
331 1& 3&1.177820636622582D-01& 9.893138394953992D-02& 8.554435968992371D-01\cr
332 2& 6&2.302653892214013D-02& 1.180098521565904D-01& 2.100000000000000D+01\cr
333 3& 8&1.496348495303005D-02& 9.611201567691633D-02& 5.257340567840707D-01\cr
334 4& 9&7.900460841091139D-03& 1.325041647391314D-02& 1.000000000000000D+00\cr
335 5& 10&7.314495451266917D-03& 1.510670810312237D-02& 1.000000000000000D+00\cr
336 6& 11&6.750147275936680D-03& 1.914964958023047D-02& 1.000000000000000D+00\cr
337 7& 12&5.850716021108205D-03& 1.028089194579363D-02& 1.000000000000000D+00\cr
338 8& 13&5.778664230657791D-03& 3.676866074530332D-04& 1.000000000000000D+00\cr
339 9& 14&5.777818823650782D-03& 3.010740179797255D-04& 1.000000000000000D+00\cr
344 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
346 (%o7) [A = 1.461933911464101, B = 1.601593973254802,
347 C = 2.528933072164854]
348 (%i8) plot2d ([F(x), [discrete, X, Y]], [x, -1, 6]), ''estimates;
352 FOMの勾配が(自動的に計算される代わりに)指定されます。
356 @c F(a, b, c) := (a - 5)^2 + (b - 3)^4 + (c - 2)^6;
357 @c F_grad : map (lambda ([x], diff (F(a, b, c), x)), [a, b, c]);
358 @c estimates : lbfgs ([F(a, b, c), F_grad],
359 @c [a, b, c], [0, 0, 0], 1e-4, [1, 0]);
362 (%i1) load ("lbfgs")$
363 (%i2) F(a, b, c) := (a - 5)^2 + (b - 3)^4 + (c - 2)^6;
365 (%o2) F(a, b, c) := (a - 5) + (b - 3) + (c - 2)
366 (%i3) F_grad : map (lambda ([x], diff (F(a, b, c), x)), [a, b, c]);
368 (%o3) [2 (a - 5), 4 (b - 3) , 6 (c - 2) ]
369 (%i4) estimates : lbfgs ([F(a, b, c), F_grad],
370 [a, b, c], [0, 0, 0], 1e-4, [1, 0]);
371 *************************************************
372 N= 3 NUMBER OF CORRECTIONS=25
374 F= 1.700000000000000D+02 GNORM= 2.205175729958953D+02
375 *************************************************
380 I NFN FUNC GNORM STEPLENGTH
382 1 2 6.632967565917638D+01 6.498411132518770D+01 4.534785987412505D-03
383 2 3 4.368890936228036D+01 3.784147651974131D+01 1.000000000000000D+00
384 3 4 2.685298972775190D+01 1.640262125898521D+01 1.000000000000000D+00
385 4 5 1.909064767659852D+01 9.733664001790506D+00 1.000000000000000D+00
386 5 6 1.006493272061515D+01 6.344808151880209D+00 1.000000000000000D+00
387 6 7 1.215263596054294D+00 2.204727876126879D+00 1.000000000000000D+00
388 7 8 1.080252896385334D-02 1.431637116951849D-01 1.000000000000000D+00
389 8 9 8.407195124830908D-03 1.126344579730013D-01 1.000000000000000D+00
390 9 10 5.022091686198527D-03 7.750731829225274D-02 1.000000000000000D+00
391 10 11 2.277152808939775D-03 5.032810859286795D-02 1.000000000000000D+00
392 11 12 6.489384688303218D-04 1.932007150271008D-02 1.000000000000000D+00
393 12 13 2.075791943844548D-04 6.964319310814364D-03 1.000000000000000D+00
394 13 14 7.349472666162257D-05 4.017449067849554D-03 1.000000000000000D+00
395 14 15 2.293617477985237D-05 1.334590390856715D-03 1.000000000000000D+00
396 15 16 7.683645404048675D-06 6.011057038099201D-04 1.000000000000000D+00
400 \halign{\hfil\tt#&\quad\hfil\tt#\quad&\tt#\hfil\quad&\tt#\hfil\quad&\tt#\hfil\cr
401 I& NFN& FUNC& GNORM& STEPLENGTH\cr
403 1& 2& 6.632967565917638D+01& 6.498411132518770D+01& 4.534785987412505D-03\cr
404 2& 3& 4.368890936228036D+01& 3.784147651974131D+01& 1.000000000000000D+00\cr
405 3& 4& 2.685298972775190D+01& 1.640262125898521D+01& 1.000000000000000D+00\cr
406 4& 5& 1.909064767659852D+01& 9.733664001790506D+00& 1.000000000000000D+00\cr
407 5& 6& 1.006493272061515D+01& 6.344808151880209D+00& 1.000000000000000D+00\cr
408 6& 7& 1.215263596054294D+00& 2.204727876126879D+00& 1.000000000000000D+00\cr
409 7& 8& 1.080252896385334D-02& 1.431637116951849D-01& 1.000000000000000D+00\cr
410 8& 9& 8.407195124830908D-03& 1.126344579730013D-01& 1.000000000000000D+00\cr
411 9& 10& 5.022091686198527D-03& 7.750731829225274D-02& 1.000000000000000D+00\cr
412 10& 11& 2.277152808939775D-03& 5.032810859286795D-02& 1.000000000000000D+00\cr
413 11& 12& 6.489384688303218D-04& 1.932007150271008D-02& 1.000000000000000D+00\cr
414 12& 13& 2.075791943844548D-04& 6.964319310814364D-03& 1.000000000000000D+00\cr
415 13& 14& 7.349472666162257D-05& 4.017449067849554D-03& 1.000000000000000D+00\cr
416 14& 15& 2.293617477985237D-05& 1.334590390856715D-03& 1.000000000000000D+00\cr
417 15& 16& 7.683645404048675D-06& 6.011057038099201D-04& 1.000000000000000D+00\cr
422 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
424 (%o4) [a = 5.000086823042934, b = 3.05239542970518,
425 c = 1.927980629919583]
429 @category{Package lbfgs}
434 @defvr {変数} lbfgs_nfeval_max
437 @code{lbfgs_nfeval_max}は、@code{lbfgs}がする性能指標(FOM)の評価の最大回数です。
438 @code{lbfgs_nfeval_max}に届いた時、
439 @code{lbfgs}は最後に成功した直線探索の結果を返します。
442 @category{Package lbfgs}
447 @defvr {変数} lbfgs_ncorrections
450 @code{lbfgs_ncorrections}は@code{lbfgs}が保つ近似逆Hessian行列に適用された修正回数です。
453 @category{Package lbfgs}