Nonlinear Optimization
           2008/06/26
    1.7 Quasi-Newton Method
         (準ニュートン法)
 1.8 :gradientも使えない時の話
1.7でL-BFGSが出てくるので,1.7の
方が重要だと思うので,1.7中心に
            やります.
           江原 遥
Newton Method復習:何でヘシアンの
  逆行列が必要だったんだっけ?
 f ( x)を二次で近似.
                                    1
 f ( x  d )  f ( x)  f ( x)' d  d ' ( 2 f ( x))d  o(|| d || 2 )
                                    2
 f ( x  d )の二次近似が最小  dで微分して0.
 f ( x)  ( 2 f ( x))d  0
 ニュートン方向:d  ( 2 f ( x)) 1 f ( x)
 ヘシアンの逆行列: 2 f ( x)) 1
          (
                ヘシアンの逆行列が必要
ヘシアンは正定値がいい

 ヘシアンが正定値⇒進めば必ず減尐 (f ( x )' d k  0)
                         k


z  0; z '  2 f ( x k ) z  0       z  f ( x k )とおいて,
z  0; z '  2 f ( x k ) 1 z  0     f ( x k )'  2 f ( x k ) 1 f ( x k )  0
z  0; z '  2 f ( x k ) 1 z  0   d k ' f ( x k )  0

特に書いていませんが,次の事実も,一応,再確認:
fが凸関数⇔ヘシアンは半正定値
  (最適化法p.99)
行列Mが正定値⇔M^(-1)も正定値
Newton Method
          →Quasi Newton Method
Newton




Quasi-Newton




1)Dkが常に正定値だと嬉しい
2)Naïveに実装するとメモリがたくさん必要
→実は,メモリは省メモリで済むよ=L-BFGS
どうやってヘシアンを近似するか:
     セカント条件
                                           1.181のDを近似したい.

           1
f ( x)  x' Ax  b' xのとき,
           2
 2 f ( x k )  A, f ( x k 1 )  Ax k 1 , f ( x k )  Ax kだから,
f ( x k 1 )  f ( x k )   2 f ( x k )( x k 1  x k )が成り立つ.




   ここには書いてありませんが,1.182式はセカント条件
   というものです.
セカント条件:この辺で文字をまとめる

                              1.181のDを近似したい.




この本の記法はちょっと特殊 ヘシアンの逆行列の近似:H k 1
普通は,右のように表記する: ヘシアンの近似:B k 1
               s k  x k 1  x k
               y k  f ( x k 1 )  f ( x k )
               B k 1s k  y k , H k 1 y k  s k
セカント条件はこう考えれば当たり前




各成分ごとに見れば,f ( x k )の一次近似をまとめて書いただけ.
                         df
一次元で考えると,関数 ( x)の一次近似をやっているだけ.
                         dx
df k 1 df k      d  df  k 1 k 1 k
   ( x )  ( x )   ( x )( x  x )
dx        dx      dx  dx 
どうやって近似するか



    f ( x k 1 )  f ( x k )  2 f ( x k )( x k 1  x k )
                         q k  f ( x k 1 )  f ( x k )
 q,pを次のように定義:
                      p k  x k 1  x k
すると,q k  2 f ( x k ) p kより,
で,BFGSに入るわけですが・・・
この本の書き方は,次のようになっています.
• いきなりBFGS公式が出現する
• 後から,その妥当性を説明する
 Prop. 1.7.1 ヘシアン逆行列の近似行列が,必ず正
    定値になるように設計されている
 Prop. 1.7.2, 1.7.3 共役勾配法との関係(目的関数が
    Quadraticなら最初のn個の結果は共役勾配法と
    一致) ただし,nは入力xの次元数.
x k 1  x k   k d k   に注意してDFPとBFGS
d k   D k f ( x k )
                                 を導入




k ;  k  0の時,DFP.
k ;  k  1の時,BFGS.
 線形探索が最適なら( kが最適),両者は一致.
この本には書いていないこと:1
ヘシアンの逆行列の近似:H k 1 : (この本のD k 1 )
ヘシアンの近似:B k 1
s k  x k 1  x k : (この本のp k )
y k  f ( x k 1 )  f ( x k ) : (この本のq k )
とりあえず,ベクトルu , vを用いて更新式を次のようにする.
H k 1  H k  auu 'bvv'
ここで,u k  s k , v k  H k y kとおいて,
セカント条件H k 1 y k  s kを満たすようにして,
au ' y k  1, bv' y k  1
                         として正規化すると,DFP公式が出てくる.
    k 1        ss' Hyy ' H
H          H 
              k
                                    だから,DFP公式,BFGS公式がセカント条件
                s' y   y ' Hy        を満たすのは,ある意味当たり前.
この本には書いていないこと:2
        DFP公式→BFGS公式
    k 1        ss' Hyy' H
H          H 
              k
                     
                s' y   y ' Hy
これは,ヘシアンの逆行列の更新式を
H k 1  H k  auu 'bvv'として
セカント条件H k 1 y k  s kを課した式.
同じことを,ヘシアンの更新式でやって
B k 1  B k  auu 'bvv'
として,セカント条件B k 1 y k  s kに関して更新式を作り,
できたB kに関する更新式の逆行列をとって
H kに関する更新式に直すとBFGS公式が出てくる(はず).
正定値性の証明
                         k 1
D が正定値  D にしたい
 k




参考:Wolfの基準
     0   1について,
     f ( x k )' d k  f ( x k 1 )' d k
     となるように kを直線探索する.
k 1
f ( x )' d  f ( x
     k    k
                                )' d   k
                                           の意味


              f ( x k )' d k  f ( x k 1 )' d k
              ←この傾き<↓この傾き




                                                        k
BFGS公式の正定値性の証明
方針:正定値の定義そのまま
共役勾配法との関係
prop. 1.7.2の証明概要

1.195は次のようにしめす:




                  より,:
もうっちょっと言うと:
共役勾配法とBFGS
計算速度の観点
共役勾配法:
共役勾配が分かれば,共役方向の計算はO(n)
だけど,共役勾配の計算に時間がかかる

準ニュートン法:
ヘシアンの(逆行列の)計算にO(n^2)
L-BFGS




は,式を変形すると,こう書ける.:
(実際,共立出版最適化法には,こっちで書いてある.)
L-BFGS
最初のD0をスケーリングすると
    実際には重要な改善が見込める
  重要:理論的には,ニュートン法は,アフィン変換(スケーリング)に対して,
  不変.しかし,実際には,最初のD0をスケーリングすると性能が改善して,
  よくあるのは次のような選び方:



condition number:
は,行列の正則性を見るための指標.この値が大きいほど,特異性(正
則でない度合い)が強くなるので,これが,iterationの間に増加しないよう
にしたい.スケーリングすると,これができる(というか,むしろ,これを減
尐させられる)
L-BFGSの高速実装
結論:
自分の知る限り,辻井研の岡崎直観さんのlibbfgs
 が最速っぽい.岡崎さんは,これをオープンソー
 スにしているので,これを使うのがよさげ.

理由:
同じL-BFGSライブラリでも,直線探索はバラバラ.
 libbfgsは,直線探索も吟味してある.また,計算
 をSSE2命令を使って高速化するのも試されてい
 て,10%ほど早くなる.(ご本人は,これを大して
 早くならないと書いていますが・・・)
主なBFGSの実装
J. Nocedalコード 2000 :L-BFGSの原論文(1989)
    f2c(J. Nocedal) 上記をf2cでC言語に.
Tsuruoka 2007
libbfgs (Okazakiさん) 2008
CRFとBFGSの対応表
工藤さん:CRF++,mecab:f2c(J.Nocedal)
岡崎さん:CRFsuite: libbfgs
清水さん:機械学習テンプレートライブラ
 リ:Tsuruoka 2007
1.8 NONDERIVATIVE METHODS




central differenceはforward differenceの2倍の計算量だが,その分精度が
いい.central differenceだと,ついでにHessianも計算できてしまう:
hの選び方
• 小さいhを使ってgradientを近似している
→どういうhを選べばいいのか?
hを(丸め誤差に対して)固定すると,丸め誤差
  に対して近似誤差が分かりやすくなる:
forward -> centralの切り替え
              タイミング
普通は,計算の楽なforwardで初めて,ある時から
 centralで正確に計算し始める.その,切り替える
 タイミングは,適当なεを決めておいて,



が成り立たなくなった時に,centralに切り替える.
Hessian
• 次のようにして二回微分(Hessian)を計算してNewton法を
  するという手もある.このとき,経験的には,このHessianの
  計算の精度はそこまで収束の早さに影響しないので,普
  通は,forwardで十分.余力があればcentralで.
Coordinate Discent
• あらかじめ独立なベクトルの集合を決めてお
  いて,各ベクトルの方向に最適化していく.
並列化に使えます
steepest discentとの比較
Direct Search Methods
Coordinate Discentでは,あらかじめ,独立なベクトルの集合を決めて
  おいて,各ベクトルの方向に最適化していった.
→「独立なベクトルの集合」そのものも,改善していけるとうれしい.そ
  れが,Direct Search Methods.
残念ながら,ヒューリスティクスでしかないが,一応,やり方はあって,
  Simplex Methodという(線形計画問題の単体法とは何の関係もな
  い)

方針:「与えられた独立なベクトルの集合」の凸包を考えて,その頂点
 の中で最悪なコストを持つ頂点を,ましな頂点に変えていく.
終わり

Nonlinear programming輪講スライド with 最適化法