cvim#11 3. 最小化のための数値計算

50
11CV勉強会 1バンドルアジャストメント 3. 最小化のための数値計算 (勉強会後修正版) 2011-04-16 Yoshihiko Suhara @sleepy_yoshi

Upload: sleepyyoshi

Post on 28-May-2015

7.783 views

Category:

Technology


3 download

DESCRIPTION

CVIM勉強会#11 1章バンドルアジャストメント 3. 最小化のための数値計算

TRANSCRIPT

Page 1: CVIM#11 3. 最小化のための数値計算

第11回CV勉強会 1章 バンドルアジャストメント 3. 最小化のための数値計算

(勉強会後修正版) 2011-04-16

Yoshihiko Suhara

@sleepy_yoshi

Page 2: CVIM#11 3. 最小化のための数値計算

目次

• 3. 最小化のための数値計算

– 3.1 最小二乗のためのニュートン法

– 3.2 ニュートン法以外の方法

– 3.3 実装方法

– 3.4 数値計算ライブラリの利用

2

Page 3: CVIM#11 3. 最小化のための数値計算

3. 最小化のための数値計算

3

Page 4: CVIM#11 3. 最小化のための数値計算

誤差の数値最小化

• 誤差関数の最小化 (最適化) – 観測データを用いて表現される誤差関数を最小化するパラメータを計算する

• 今回の範囲では

𝐸 𝒙 =1

2 𝑒𝑘

2

2𝑛𝑚

𝑘

– 誤差 • 二乗誤差

– パラメータ • カメラのパラメータ • 特徴点

4

Page 5: CVIM#11 3. 最小化のための数値計算

3.1. 最小二乗のためのニュートン法

5

Page 6: CVIM#11 3. 最小化のための数値計算

最小二乗法の計算

• 線形最小二乗法

–閉じた解で求まる (正規方程式)

• 非線形最小二乗法

–反復計算が必要

– 𝒙(𝑡+1) = 𝒙(𝑡) + 𝛿𝒙

6

Page 7: CVIM#11 3. 最小化のための数値計算

3.1.1 ガウス・ニュートン法

7

Page 8: CVIM#11 3. 最小化のための数値計算

最急降下法

• 一次微分 (一次近似) を利用する方法 𝑥(𝑡+1) = 𝑥 𝑡 − 𝜂𝛻𝐸(𝑥 𝑡 )

• 誤差関数のパラメータに関する微分がわかればよい

– ただし,進む方向しかわからないので,学習率が必要

– 学習率が大きいと最適解を飛び越えてしまう可能性

E(x)

x 𝑥(1) 𝑥(2)

8

Page 9: CVIM#11 3. 最小化のための数値計算

ニュートン法

• 二次微分 (二次近似) を利用する方法 𝑥(𝑡+1) = 𝑥 𝑡 −𝐇−1𝛻𝐸 𝑥 𝑡

– 解の周辺での収束が早い

• 二階微分の情報 (ヘッセ行列) が必要 – さらにヘッセ行列の逆行列計算も必要

E(x)

x 𝑥(1) 𝑥(2) 𝑥(3) 9

Page 10: CVIM#11 3. 最小化のための数値計算

ニュートン法 (一変数の場合)

• テイラー展開 (二次の項まで)

𝑓 𝑥 + 𝛿𝑥 = 𝑓 𝑥 + 𝑓′ 𝑥 𝛿𝑥 +1

2𝑓′′ 𝑥 𝛿𝑥 2

• 𝑓 𝑥 + 𝑓′ 𝑥 𝛿𝑥 +1

2𝑓′′ 𝑥 𝛿𝑥 2

• これを最小化する𝛿𝑥を求める

– 𝛿𝑥で微分して0とおく

𝑓′ 𝑥 + 𝑓′′ 𝑥 𝛿𝑥 = 0

𝛿𝑥 = −𝑓′ 𝑥

𝑓′′ 𝑥

10

Page 11: CVIM#11 3. 最小化のための数値計算

ニュートン法 (多変数の場合)

• 多変数の場合

• 𝐸 𝒙 + 𝛿𝒙 = 𝐸 𝒙 + 𝒈𝑇𝛿𝒙 +1

2𝛿𝒙𝑇H𝛿𝒙

• gはEの勾配ベクトル,Hはヘッセ行列

• 右辺を𝛿𝒙で微分して0とおくと以下を得る 𝛿𝒙 = −H−1𝒈

11

Page 12: CVIM#11 3. 最小化のための数値計算

ヘッセ行列が正定値である必要性

• ヘッセ行列が正定値=二次微分が正 – 二次近似が全てのxについて凸関数になっているという保証

– そうでなければ,どこかで凹となる次元が発生

E(x)

x 𝑥(𝑘) 𝑥(𝑘+1)

これはマズい

12

Page 13: CVIM#11 3. 最小化のための数値計算

ガウス・ニュートン法 ≠ ニュートン法

• ガウス・ニュートン法 ∈ ニュートン法

–ニュートン法の実現方法の一種

• ガウス・ニュートン法を利用する目的

–ヘッセ行列を計算するのは大変

–逆行列を計算してはいけない (数値計算の常識)

–ヤコビ行列の積によって表現

13

Page 14: CVIM#11 3. 最小化のための数値計算

ガウス・ニュートン法とは

• 𝐻 ≈ 𝐽𝑇𝐽という近似を用いたニュートン法

– 𝐽はヤコビ行列

• 𝐻 ≈ 𝐽𝑇𝐽の精度が高くなるのは最小解付近やeの二階微分が小さい場合など (後で証明)

14

Page 15: CVIM#11 3. 最小化のための数値計算

ヤコビ行列

• J =𝑑𝒆

𝑑𝒙=

𝜕𝑒1

𝜕𝑥1⋯𝜕𝑒1

𝜕𝑥𝑛

⋮ ⋱ ⋮𝜕𝑒𝑘

𝜕𝑥1⋯𝜕𝑒𝑘

𝜕𝑥𝑛

• 𝐻 ≈ J𝑇J

• J𝑇J =

𝜕𝑒𝑖

𝜕𝑥1

2𝑘𝑖=1 ⋯

𝜕𝑒𝑖

𝜕𝑥1

𝜕𝑒𝑖

𝜕𝑥𝑛

𝑘𝑖=1

⋮ ⋱ ⋮

𝜕𝑒𝑖

𝜕𝑥𝑛

𝜕𝑒𝑖

𝜕𝑥1

𝑘𝑖=1 ⋯

𝜕𝑒𝑖

𝜕𝑥𝑛

2𝑘𝑖=1

15

Page 16: CVIM#11 3. 最小化のための数値計算

ヤコビ行列を使った表現

• 𝑎 ≡ −𝒈 = −J𝑇𝒆 なぜ?

• 𝒈 =

𝜕𝐸

𝜕𝒙1

⋮𝜕𝐸

𝜕𝒙𝑛

𝜕𝐸

𝜕𝒙1=𝜕1

2 𝒆𝑘

2𝑘

𝜕𝒙1= 𝒆𝑘

𝜕𝒆𝑘

𝜕𝒙1𝑘

• JT =

𝜕𝑒1

𝜕𝑥1⋯𝜕𝑒𝑘

𝜕𝑥1

⋮ ⋱ ⋮𝜕𝑒1

𝜕𝑥𝑛⋯𝜕𝑒𝑘

𝜕𝑥𝑛

𝒆 =

𝒆1⋮𝒆𝑘

16

Page 17: CVIM#11 3. 最小化のための数値計算

ガウス・ニュートン近似の導出

• 誤差関数𝐸を𝑥𝑖で微分 𝜕𝐸

𝜕𝑥𝑖= 𝒆𝑘

𝜕𝒆𝑘𝜕𝑥𝑖

𝑘

• さらに𝑥𝑗で微分 𝜕𝐸

𝜕𝑥𝑖𝜕𝑥𝑗=

𝜕𝒆𝑘𝜕𝑥𝑖

𝜕𝒆𝑘𝜕𝑥𝑗+𝒆𝑘𝜕2𝒆𝑘𝜕𝑥𝑖𝜕𝑥𝑗

𝑘

• 𝒙が解に近いと 𝒆𝑘 ≈ 0 ∀𝑘 より

𝜕𝐸

𝜕𝑥𝑖𝜕𝑥𝑗≈

𝜕𝒆𝑘𝜕𝑥𝑖

𝜕𝒆𝑘𝜕𝑥𝑗

𝑘

17

Page 18: CVIM#11 3. 最小化のための数値計算

アルゴリズム

1. 適当な初期値𝒙を設定

2. パラメータ𝒙におけるJ𝑇Jおよび−J𝑇𝐞 を計算

3. JTJ 𝛿𝒙 = −J𝑇𝒆 を解いて 𝛿𝒙 を算出

4. 更新 𝒙 ← 𝒙 + 𝛿𝒙

5. 収束判定

– 変化量 𝛿𝐸 /|𝐸|あるいは 𝛿𝒙 / 𝒙 が十分小さいとき終了.そうでなければ2へ.

18

Page 19: CVIM#11 3. 最小化のための数値計算

おさらい

• 線形最小二乗法は閉じた解でパラメータが求まる

–そもそも反復計算がいらない

• ガウス・ニュートン法は誤差関数を二乗和の形で表現できないと利用できない

• よって,ガウス・ニュートン法はまさしく非線形最小二乗法のための方法

19

Page 20: CVIM#11 3. 最小化のための数値計算

3.1.2. レベンバーグ・マーカート法

20

Page 21: CVIM#11 3. 最小化のための数値計算

レベンバーグ・マーカート法

• ガウス・ニュートン法+最急降下法

–初期は最急降下法で進み,解の近くでガウス・ニュートン法に切り替える

–ダンピングファクタ𝜆を利用 (𝜆 ≥ 0) • 𝜆大: 最急降下法

• 𝜆 = 0: ガウス・ニュートン法

– J𝑇J + 𝜆I 𝛿𝒙 = −J𝑇𝒆

• 解釈

– 𝛿𝒙 = − J𝑇J + 𝜆I −1 J𝑇𝒆

21

Page 22: CVIM#11 3. 最小化のための数値計算

𝜆の設定方法

1. 適当な値から始める

2. (21)式を解いて𝛿𝒙を求める

3. E 𝒙 + 𝛿𝒙 ≥ 𝐸(𝒙)の場合,𝜆を10倍する.そうでなければ,𝜆を0.1倍する

4. 収束しなければ2.に戻る

E(x)

x

上ってしまったら最急降下法気味に 下がる限りはガウス・ニュートン法気味に

22

Page 23: CVIM#11 3. 最小化のための数値計算

3.2. ニュートン法以外の方法

23

Page 24: CVIM#11 3. 最小化のための数値計算

ニュートン法以外の方法

• ニュートン法の派生アルゴリズムは,標準的に使用すべし

–準ニュートン法

• ヘッセ行列の分解コストが大きい場合にのみ共役勾配法の使用を検討すればよい

• ニュートン法の計算を削減することは可能

–後述

24

Page 25: CVIM#11 3. 最小化のための数値計算

補足

• NLPや機械学習応用分野においては準ニュートン法であるBFGS (L-BFGS) 法がよく使われる

–基本的に誤差関数は凸関数であることが多い

–他には共役勾配法も有効な場合もある

25

Page 26: CVIM#11 3. 最小化のための数値計算

3.3. 実装方法

26

Page 27: CVIM#11 3. 最小化のための数値計算

3.3.1 更新量の計算

27

Page 28: CVIM#11 3. 最小化のための数値計算

線型方程式の計算

• ニュートン法における反復では,以下の線型方程式を効率よく計算することがカギとなる

A𝛿𝒙 = 𝒙

• 逆行列を使えば以下の式で求まるが,計算量,精度で問題あり

𝛿𝒙 = A−1𝒙

–数値計算の常識

28

Page 29: CVIM#11 3. 最小化のための数値計算

線型方程式の解法

• 一般の行列Aに対する選択肢

–ガウスの消去法

– LU分解

– コレスキー分解

• 行列Aが対称かつ正定値の場合

29

Page 30: CVIM#11 3. 最小化のための数値計算

LU分解とコレスキー分解

• LU分解 (A = LU)

A =⋯ 𝟎

⋮ ⋱ ⋮⋯

⋯⋮ ⋱ ⋮𝟎 ⋯

• コレスキー分解 (A = LLT)

A =⋯ 𝟎

⋮ ⋱ ⋮⋯

⋯⋮ ⋱ ⋮𝟎 ⋯

𝐿 𝑈

𝐿𝑇 𝐿

30

Page 31: CVIM#11 3. 最小化のための数値計算

コレスキー分解を用いた解法

• 準備 – 𝑦 ≡ L𝑇𝛿𝒙 とおく

– A𝛿𝒙 = LL𝑇𝛿𝒙 = L𝒚 = 𝒂

• 手順 1. Aをコレスキー分解し,Lを得る

2. L𝒚 = 𝒂 を𝒚について解く • Lが三角行列なので,Lの行を上から順番に処理すれば計算できる

3. LTδ𝒙 = 𝒚をδ𝒙について解く • 上記の逆

31

Page 32: CVIM#11 3. 最小化のための数値計算

補足: 前進代入と後退代入

= 𝑦1

𝑦2

𝑦𝑛

= 𝛿𝑥1

𝛿𝑥𝑛−1

𝛿𝑥𝑛

32

Page 33: CVIM#11 3. 最小化のための数値計算

コレスキー分解の処理

• 省略

–行列の数値計算の文献を参照

• 行列の行数分だけ平方根の計算が必要

–修正コレスキー分解

33

Page 34: CVIM#11 3. 最小化のための数値計算

その他の方法

• ガウスの消去法 –計算量が若干大きい

• 等価な線型最小二乗法を解く J𝛿𝒙 + 𝒆 2 → min.

–導出

• JTJ𝛿𝒙 = −JT𝒆

• J𝛿𝒙 + 𝒆 = 0

• 閉じた解で求めるために二乗

–その際のレベンバーグ・マーカート法は(23)となる • 優決定線型方程式の計算

34

Page 35: CVIM#11 3. 最小化のための数値計算

補足: 優決定,劣決定

• 優決定

–変数の数<方程式の数

–解が存在しない可能性

• 劣決定

–変数の数>方程式の数

–解は複数存在

35

Page 36: CVIM#11 3. 最小化のための数値計算

3.3.2 疎行列の扱い

36

Page 37: CVIM#11 3. 最小化のための数値計算

疎行列

• バンドル調整が対象とする多くの問題ではヤコビ行列やヘッセ行列は疎行列になる

– 𝑒𝑖が𝑥𝑗に依存していなければ𝜕𝑒𝑖/𝜕𝑥𝑗は常に0

• SFMの例

–はある画像上の像の誤差

– この画像に関連しないカメラの姿勢に依存しない

–図1.3

37

Page 38: CVIM#11 3. 最小化のための数値計算

疎行列の活用方法

• (1) 行列の実装方法 –非ゼロ成分だけを保存しておく

–例) Boost, Sparse BLAS

–図1.3(c) # y軸は対数スケール

• (2) 得られる行列を疎行列にする

–元の行列が疎でも,計算途中で非ゼロ成分が発生することがある (fill-in)

– Aを直接コレスキー分解するよりも,PAPTを分解する方が疎となるような置換Pを利用 • ただ,最適な置換Pを計算するのはNP

38

Page 39: CVIM#11 3. 最小化のための数値計算

3.3.4 パラメータの分割

39

Page 40: CVIM#11 3. 最小化のための数値計算

Resection-intersection

• SFMの未知パラメータ 𝒙 の分割 – カメラのパラメータ 𝒙1 – 点の空間座標 𝒙2

• 片方を固定して交互にパラメータ探索 (1) 𝒙1を固定して,𝜕𝐸/𝜕𝒙2 = 𝟎の解𝒙2を計算 (2) 𝒙2を固定して,𝜕𝐸/𝜕𝒙1 = 𝟎の解𝒙1を計算

• 利点 – (1), (2)いずれかが線形に行える場合,反復計算なしに解を求めれ,残ったパラメータを反復計算して求めることができる

40

Page 41: CVIM#11 3. 最小化のための数値計算

ブロック分割の利用

A11 A12A21 A22

𝛿𝒙1𝛿𝒙2=𝒂1𝒂2

… (24)

A11𝛿𝒙1 + A12𝛿𝒙2 = 𝒂1 A21𝛿𝒙1 + A22𝛿𝒙2 = 𝒂2

• 𝛿𝒙2 = 𝐴22−1(−𝐴21𝛿𝒙1 + 𝒂2) を代入し,以下を得る

A11 − A12A22−1A21 𝛿𝒙1 = 𝒂1 − A12A22

−1𝒂2 … (25a)

A22𝛿𝒙2 = 𝒂2 − A21𝛿𝒙1… (25b)

• これを順に計算すれば,(24)式を直接解いた𝛿𝒙が得られる 41

Page 42: CVIM#11 3. 最小化のための数値計算

補足: シューア補行列

• A11 − A12A22−1A21はA11のシューア補行列と

呼ばれる

A11 A12A21 A22

−1

≡𝐵11 𝐵12𝐵21 𝐵22

としたとき,

• 𝐵11 = A11 − A12A22−1A21 となる性質がある

42

Page 43: CVIM#11 3. 最小化のための数値計算

ブロック小行列を用いた逆行列の計算

• ブロック分解を用いると,効率よく計算可能

• A22 =A1 ⋯ 𝟎⋮ ⋱ ⋮𝟎 ⋯ A𝑛

• A22−1 =

A1−1 ⋯ 𝟎⋮ ⋱ ⋮𝟎 ⋯ 𝐴𝑛

−1

43

Page 44: CVIM#11 3. 最小化のための数値計算

3.4. 数値計算ライブラリの利用

44

Page 45: CVIM#11 3. 最小化のための数値計算

数値計算ライブラリ

• 最適化ライブラリ – MATLAB (Optimization Toolbox)

• lsqnonlin関数 – Trust-region法,レベンバーグ・マーカート法,ガウス・ニュートン法

– R • optim関数

– Nelder-Mead法,BFGS法, L-BFGS-B法, CG法,SANN法

• 線型代数演算ライブラリ – LAPACK

• 数値計算ライブラリ – BLAS

– BLAS亜種

45

Page 46: CVIM#11 3. 最小化のための数値計算

まとめ

46

Page 47: CVIM#11 3. 最小化のための数値計算

まとめ

• 非線形最小二乗法の最適化手法の紹介

–ガウス・ニュートン法

–レベンバーグ・マーカート法

• 実装方法の解説

– コレスキー分解を用いた線型方程式の計算

–疎行列の活用方法

–パラメータ分割

• 数値計算ライブラリの紹介

47

Page 48: CVIM#11 3. 最小化のための数値計算

感想

• フリーで利用可能な最適化ライブラリはかなり充実している –けど,何をどう選択すればよいのかわからない

• 解きたい問題をどう定式化するかによって利用可能な/得意なツールは異なってくる –その勘所をつけたいなぁ

• 数値計算の常識を身につけたい

48

Page 49: CVIM#11 3. 最小化のための数値計算

参考文献

• 金谷健一.これなら分かる最適化数学.共立出版 (2005).

–ガウス・ニュートン近似やレベンバーグ・マーカート法の導出もあり

• 伊理正夫・藤野和建.数値計算の常識.共立出版 (1985).

– 「逆行列よさようなら」

–数値計算のノウハウが詰まっている

49

Page 50: CVIM#11 3. 最小化のための数値計算

Thank you!

50