nonlinear programming輪講スライド with 最適化法
TRANSCRIPT
Nonlinear Optimization 2008/06/26
1.7 Quasi-Newton Method (準ニュートン法)
1.8 :gradientも使えない時の話 1.7でL-BFGSが出てくるので,1.7の方が重要だと思うので,1.7中心に
やります. 江原 遥
Newton Method復習:何でヘシアンの逆行列が必要だったんだっけ?
12
12
2
22
))((
)())((
0))(()(
0d)(
)||(||))(('2
1)'()()(
)(
xf
xfxfd
dxfxf
dxf
dodxfddxfxfdxf
xf
ヘシアンの逆行列:
ニュートン方向:
.で微分しての二次近似が最小
を二次で近似.
ヘシアンの逆行列が必要
ヘシアンは正定値がいい
ヘシアンが正定値⇒進めば必ず減尐
0)(';0
0)(';0
0)(';0
12
12
2
zxfzz
zxfzz
zxfzz
k
k
k
0)('
0)()()'(
)(
12
k
k
kkk
k
xfd
xfxfxf
xfz とおいて,
特に書いていませんが,次の事実も,一応,再確認: fが凸関数⇔ヘシアンは半正定値 (最適化法p.99) 行列Mが正定値⇔M^(-1)も正定値
)0)'(( k
k dxf
Newton Method →Quasi Newton Method
Newton
Quasi-Newton
1)Dkが常に正定値だと嬉しい 2)Naïveに実装するとメモリがたくさん必要 →実は,メモリは省メモリで済むよ=L-BFGS
どうやってヘシアンを近似するか: セカント条件
が成り立つ.
だから,
のとき,
))(()()(
)(,)(,)(
''2
1)(
121
112
kkkkk
kkkkk
xxxfxfxf
AxxfAxxfAxf
xbAxxxf
1.181のDを近似したい.
ここには書いてありませんが,1.182式はセカント条件というものです.
セカント条件:この辺で文字をまとめる
1.181のDを近似したい.
この本の記法はちょっと特殊 普通は,右のように表記する:
kkkkkk
kkk
kkk
k
k
syHysB
xfxfy
xxs
B
H
11
1
1
1
1
,
)()(
ヘシアンの近似:
似:ヘシアンの逆行列の近
セカント条件はこう考えれば当たり前
))(()()(
)(
)(
111 kkkkk
k
xxxdx
df
dx
dx
dx
dfx
dx
df
xdx
df
xf
るだけ.の一次近似をやってい数一次元で考えると,関
書いただけ.の一次近似をまとめて各成分ごとに見れば,
どうやって近似するか
))(()()( 121 kkkkk xxxfxfxf
q,pを次のように定義: kkk
kkk
xxp
xfxfq
1
1 )()(
より,すると, kkk pxfq )(2
で,BFGSに入るわけですが・・・
この本の書き方は,次のようになっています.
• いきなりBFGS公式が出現する
• 後から,その妥当性を説明する
Prop. 1.7.1 ヘシアン逆行列の近似行列が,必ず正定値になるように設計されている
Prop. 1.7.2, 1.7.3 共役勾配法との関係(目的関数がQuadraticなら最初のn個の結果は共役勾配法と一致) ただし,nは入力xの次元数.
に注意してDFPとBFGS を導入
.が最適),両者は一致線形探索が最適なら(
.の時,
.の時,
k
k
k
k
k
BFGS1;
DFP0;
)(
1
kkk
kkkk
xfDd
dxx
この本には書いていないこと:1
Hyy
HHyy
ys
ssHH
DFPybvyau
syH
yHvsu
bvvauuHH
vu
qxfxfy
pxxs
B
DH
kk
kk
kkk
kkkkk
kk
kkkk
kkkk
k
kk
'
'
'
'
1',1'
,
''
,
)(:)()(
)(:
)(:
1
1
1
1
1
1
11
公式が出てくる.として正規化すると,
を満たすようにして,セカント条件
とおいて,ここで,
ようにする.を用いて更新式を次のとりあえず,ベクトル
この本の
この本の
ヘシアンの近似:
この本の似:ヘシアンの逆行列の近
だから,DFP公式,BFGS公式がセカント条件を満たすのは,ある意味当たり前.
この本には書いていないこと:2 DFP公式→BFGS公式
).公式が出てくる(はずとに関する更新式に直す
列をとってに関する更新式の逆行できた
,に関して更新式を作りとして,セカント条件
の更新式でやって同じことを,ヘシアン
を課した式.セカント条件
として
行列の更新式をこれは,ヘシアンの逆
BFGS
''
''
'
'
'
'
1
1
1
1
1
k
k
kkk
kk
kkk
kk
kk
H
B
syB
bvvauuBB
syH
bvvauuHH
Hyy
HHyy
ys
ssHH
正定値性の証明
にしたいが正定値 1 kk DD
参考:Wolfの基準
を直線探索する.となるように
について,
k
kkkk dxfdxf
)'()'(
10
1
の意味 kkkk dxfdxf )'()'( 1
k
←この傾き<↓この傾き
kkkk dxfdxf )'()'( 1
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という(線形計画問題の単体法とは何の関係もない)
方針:「与えられた独立なベクトルの集合」の凸包を考えて,その頂点の中で最悪なコストを持つ頂点を,ましな頂点に変えていく.
終わり