第11回CV勉強会
1章 バンドルアジャストメント
3. 最小化のための数値計算
(勉強会後修正版)
2011-04-16
Yoshihiko Suhara
@sleepy_yoshi
目次
• 3. 最小化のための数値計算
– 3.1 最小二乗のためのニュートン法
– 3.2 ニュートン法以外の方法
– 3.3 実装方法
– 3.4 数値計算ライブラリの利用
2
3. 最小化のための数値計算
3
誤差の数値最小化
• 誤差関数の最小化 (最適化)
– 観測データを用いて表現される誤差関数を最小化するパ
ラメータを計算する
• 今回の範囲では
𝐸 𝒙 =
1
2
𝑒𝑘
2
2𝑛𝑚
𝑘
– 誤差
• 二乗誤差
– パラメータ
• カメラのパラメータ
• 特徴点
4
3.1. 最小二乗のためのニュートン法
5
最小二乗法の計算
• 線形最小二乗法
– 閉じた解で求まる (正規方程式)
• 非線形最小二乗法
– 反復計算が必要
– 𝒙(𝑡+1) = 𝒙(𝑡) + 𝛿𝒙
6
3.1.1 ガウス・ニュートン法
7
最急降下法
• 一次微分 (一次近似) を利用する方法
𝑥(𝑡+1) = 𝑥 𝑡 − 𝜂𝛻𝐸(𝑥 𝑡 )
• 誤差関数のパラメータに関する微分がわかればよい
– ただし,進む方向しかわからないので,学習率が必要
– 学習率が大きいと最適解を飛び越えてしまう可能性
E(x)
x
𝑥(1) 𝑥(2) 8
ニュートン法
• 二次微分 (二次近似) を利用する方法
𝑥(𝑡+1)
= 𝑥 𝑡
− 𝐇−1
𝛻𝐸 𝑥 𝑡
– 解の周辺での収束が早い
• 二階微分の情報 (ヘッセ行列) が必要
– さらにヘッセ行列の逆行列計算も必要
E(x)
x
𝑥(1) 𝑥(2) 𝑥(3)
9
ニュートン法 (一変数の場合)
• テイラー展開 (二次の項まで)
𝑓 𝑥 + 𝛿𝑥 = 𝑓 𝑥 + 𝑓′ 𝑥 𝛿𝑥 +
1
2
𝑓′′ 𝑥 𝛿𝑥 2
• 𝑓 𝑥 + 𝑓′
𝑥 𝛿𝑥 +
1
2
𝑓′′
𝑥 𝛿𝑥 2
• これを最小化する𝛿𝑥を求める
– 𝛿𝑥で微分して0とおく
𝑓′
𝑥 + 𝑓′′
𝑥 𝛿𝑥 = 0
𝛿𝑥 = −
𝑓′
𝑥
𝑓′′ 𝑥
10
ニュートン法 (多変数の場合)
• 多変数の場合
• 𝐸 𝒙 + 𝛿𝒙 = 𝐸 𝒙 + 𝒈𝑇
𝛿𝒙 +
1
2
𝛿𝒙𝑇
H𝛿𝒙
• gはEの勾配ベクトル,Hはヘッセ行列
• 右辺を𝛿𝒙で微分して0とおくと以下を得る
𝛿𝒙 = −H−1
𝒈
11
ヘッセ行列が正定値である必要性
• ヘッセ行列が正定値=二次微分が正
– 二次近似が全てのxについて凸関数になっていると
いう保証
– そうでなければ,どこかで凹となる次元が発生
E(x)
x
𝑥(𝑘) 𝑥(𝑘+1)
これはマズい
12
ガウス・ニュートン法 ≠ ニュートン法
• ガウス・ニュートン法 ∈ ニュートン法
– ニュートン法の実現方法の一種
• ガウス・ニュートン法を利用する目的
– ヘッセ行列を計算するのは大変
– 逆行列を計算してはいけない (数値計算の常識)
– ヤコビ行列の積によって表現
13
ガウス・ニュートン法とは
• 𝐻 ≈ 𝐽𝑇
𝐽という近似を用いたニュートン法
– 𝐽はヤコビ行列
• 𝐻 ≈ 𝐽𝑇
𝐽の精度が高くなるのは最小解付近や
eの二階微分が小さい場合など (後で証明)
14
ヤコビ行列
• J =
𝑑𝒆
𝑑𝒙
=
𝜕𝑒1
𝜕𝑥1
⋯
𝜕𝑒1
𝜕𝑥𝑛
⋮ ⋱ ⋮
𝜕𝑒𝑘
𝜕𝑥1
⋯
𝜕𝑒𝑘
𝜕𝑥𝑛
• 𝐻 ≈ J𝑇J
• J𝑇
J =
𝜕𝑒𝑖
𝜕𝑥1
2
𝑘
𝑖=1 ⋯
𝜕𝑒𝑖
𝜕𝑥1
𝜕𝑒𝑖
𝜕𝑥𝑛
𝑘
𝑖=1
⋮ ⋱ ⋮
𝜕𝑒𝑖
𝜕𝑥𝑛
𝜕𝑒𝑖
𝜕𝑥1
𝑘
𝑖=1 ⋯
𝜕𝑒𝑖
𝜕𝑥𝑛
2
𝑘
𝑖=1
15
ヤコビ行列を使った表現
• 𝑎 ≡ −𝒈 = −J𝑇
𝒆 なぜ?
• 𝒈 =
𝜕𝐸
𝜕𝒙1
⋮
𝜕𝐸
𝜕𝒙𝑛
𝜕𝐸
𝜕𝒙1
=
𝜕
1
2
𝒆𝑘
2
𝑘
𝜕𝒙1
= 𝒆𝑘
𝜕𝒆𝑘
𝜕𝒙1
𝑘
• JT
=
𝜕𝑒1
𝜕𝑥1
⋯
𝜕𝑒𝑘
𝜕𝑥1
⋮ ⋱ ⋮
𝜕𝑒1
𝜕𝑥𝑛
⋯
𝜕𝑒𝑘
𝜕𝑥𝑛
𝒆 =
𝒆1
⋮
𝒆𝑘
16
ガウス・ニュートン近似の導出
• 誤差関数𝐸を𝑥𝑖で微分
𝜕𝐸
𝜕𝑥𝑖
= 𝒆𝑘
𝜕𝒆𝑘
𝜕𝑥𝑖
𝑘
• さらに𝑥𝑗で微分
𝜕𝐸
𝜕𝑥𝑖𝜕𝑥𝑗
=
𝜕𝒆𝑘
𝜕𝑥𝑖
𝜕𝒆𝑘
𝜕𝑥𝑗
+𝒆𝑘
𝜕2
𝒆𝑘
𝜕𝑥𝑖𝜕𝑥𝑗
𝑘
• 𝒙が解に近いと 𝒆𝑘 ≈ 0 ∀𝑘 より
𝜕𝐸
𝜕𝑥𝑖𝜕𝑥𝑗
≈
𝜕𝒆𝑘
𝜕𝑥𝑖
𝜕𝒆𝑘
𝜕𝑥𝑗
𝑘
17
アルゴリズム
1. 適当な初期値𝒙を設定
2. パラメータ𝒙におけるJ𝑇
Jおよび−J𝑇
𝐞 を計算
3. JT
J 𝛿𝒙 = −J𝑇
𝒆 を解いて 𝛿𝒙 を算出
4. 更新 𝒙 ← 𝒙 + 𝛿𝒙
5. 収束判定
– 変化量 𝛿𝐸 /|𝐸|あるいは 𝛿𝒙 / 𝒙 が十分小さ
いとき終了.そうでなければ2へ.
18
おさらい
• 線形最小二乗法は閉じた解でパラメータが求
まる
– そもそも反復計算がいらない
• ガウス・ニュートン法は誤差関数を二乗和の
形で表現できないと利用できない
• よって,ガウス・ニュートン法はまさしく非線形
最小二乗法のための方法
19
3.1.2. レベンバーグ・マーカート法
20
レベンバーグ・マーカート法
• ガウス・ニュートン法+最急降下法
– 初期は最急降下法で進み,解の近くでガウス・
ニュートン法に切り替える
– ダンピングファクタ𝜆を利用 (𝜆 ≥ 0)
• 𝜆大: 最急降下法
• 𝜆 = 0: ガウス・ニュートン法
– J𝑇J + 𝜆I 𝛿𝒙 = −J𝑇𝒆
• 解釈
– 𝛿𝒙 = − J𝑇J + 𝜆I −1 J𝑇𝒆
21
𝜆の設定方法
1. 適当な値から始める
2. (21)式を解いて𝛿𝒙を求める
3. E 𝒙 + 𝛿𝒙 ≥ 𝐸(𝒙)の場合,𝜆を10倍する.そ
うでなければ,𝜆を0.1倍する
4. 収束しなければ2.に戻る
E(x)
x
上ってしまったら最急降下法気味に
下がる限りはガウス・ニュートン法気味に
22
3.2. ニュートン法以外の方法
23
ニュートン法以外の方法
• ニュートン法の派生アルゴリズムは,標準的
に使用すべし
– 準ニュートン法
• ヘッセ行列の分解コストが大きい場合にのみ
共役勾配法の使用を検討すればよい
• ニュートン法の計算を削減することは可能
– 後述
24
補足
• NLPや機械学習応用分野においては準
ニュートン法であるBFGS (L-BFGS) 法がよく使
われる
– 基本的に誤差関数は凸関数であることが多い
– 他には共役勾配法も有効な場合もある
25
3.3. 実装方法
26
3.3.1 更新量の計算
27
線型方程式の計算
• ニュートン法における反復では,以下の線型
方程式を効率よく計算することがカギとなる
A𝛿𝒙 = 𝒙
• 逆行列を使えば以下の式で求まるが,計算
量,精度で問題あり
𝛿𝒙 = A−1
𝒙
– 数値計算の常識
28
線型方程式の解法
• 一般の行列Aに対する選択肢
– ガウスの消去法
– LU分解
– コレスキー分解
• 行列Aが対称かつ正定値の場合
29
LU分解とコレスキー分解
• LU分解 (A = LU)
A =
⋯ 𝟎
⋮ ⋱ ⋮
⋯
⋯
⋮ ⋱ ⋮
𝟎 ⋯
• コレスキー分解 (A = LLT
)
A =
⋯ 𝟎
⋮ ⋱ ⋮
⋯
⋯
⋮ ⋱ ⋮
𝟎 ⋯
𝐿
𝑈
𝐿𝑇
𝐿
30
コレスキー分解を用いた解法
• 準備
– 𝑦 ≡ L𝑇𝛿𝒙 とおく
– A𝛿𝒙 = LL𝑇
𝛿𝒙 = L𝒚 = 𝒂
• 手順
1. Aをコレスキー分解し,Lを得る
2. L𝒚 = 𝒂 を𝒚について解く
• Lが三角行列なので,Lの行を上から順番に処理すれ
ば計算できる
3. LT
δ𝒙 = 𝒚をδ𝒙について解く
• 上記の逆
31
補足: 前進代入と後退代入
=
𝑦1
𝑦2
𝑦𝑛
=
𝛿𝑥1
𝛿𝑥𝑛−1
𝛿𝑥𝑛
32
コレスキー分解の処理
• 省略
– 行列の数値計算の文献を参照
• 行列の行数分だけ平方根の計算が必要
– 修正コレスキー分解
33
その他の方法
• ガウスの消去法
– 計算量が若干大きい
• 等価な線型最小二乗法を解く
J𝛿𝒙 + 𝒆 2 → min.
– 導出
• JTJ𝛿𝒙 = −JT𝒆
• J𝛿𝒙 + 𝒆 = 0
• 閉じた解で求めるために二乗
– その際のレベンバーグ・マーカート法は(23)となる
• 優決定線型方程式の計算
34
補足: 優決定,劣決定
• 優決定
– 変数の数<方程式の数
– 解が存在しない可能性
• 劣決定
– 変数の数>方程式の数
– 解は複数存在
35
3.3.2 疎行列の扱い
36
疎行列
• バンドル調整が対象とする多くの問題ではヤ
コビ行列やヘッセ行列は疎行列になる
– 𝑒𝑖が𝑥𝑗に依存していなければ𝜕𝑒𝑖/𝜕𝑥𝑗は常に0
• SFMの例
– はある画像上の像の誤差
– この画像に関連しないカメラの姿勢に依存しない
– 図1.3
37
疎行列の活用方法
• (1) 行列の実装方法
– 非ゼロ成分だけを保存しておく
– 例) Boost, Sparse BLAS
– 図1.3(c) # y軸は対数スケール
• (2) 得られる行列を疎行列にする
– 元の行列が疎でも,計算途中で非ゼロ成分が発
生することがある (fill-in)
– Aを直接コレスキー分解するよりも,PAPT
を分解
する方が疎となるような置換Pを利用
• ただ,最適な置換Pを計算するのはNP
38
3.3.4 パラメータの分割
39
Resection-intersection
• SFMの未知パラメータ 𝒙 の分割
– カメラのパラメータ 𝒙1
– 点の空間座標 𝒙2
• 片方を固定して交互にパラメータ探索
(1) 𝒙1を固定して,𝜕𝐸/𝜕𝒙2 = 𝟎の解𝒙2を計算
(2) 𝒙2を固定して,𝜕𝐸/𝜕𝒙1 = 𝟎の解𝒙1を計算
• 利点
– (1), (2)いずれかが線形に行える場合,反復計算なしに解
を求めれ,残ったパラメータを反復計算して求めることが
できる
40
ブロック分割の利用
A11 A12
A21 A22
𝛿𝒙1
𝛿𝒙2
=
𝒂1
𝒂2
… (24)
A11𝛿𝒙1 + A12𝛿𝒙2 = 𝒂1
A21𝛿𝒙1 + A22𝛿𝒙2 = 𝒂2
• 𝛿𝒙2 = 𝐴22
−1
(−𝐴21𝛿𝒙1 + 𝒂2) を代入し,以下を得る
A11 − A12A22
−1
A21 𝛿𝒙1 = 𝒂1 − A12A22
−1
𝒂2 … (25a)
A22𝛿𝒙2 = 𝒂2 − A21𝛿𝒙1… (25b)
• これを順に計算すれば,(24)式を直接解いた𝛿𝒙が得られる
41
補足: シューア補行列
• A11 − A12A22
−1
A21はA11のシューア補行列と
呼ばれる
A11 A12
A21 A22
−1
≡
𝐵11 𝐵12
𝐵21 𝐵22
としたとき,
• 𝐵11 = A11 − A12A22
−1
A21 となる性質がある
42
ブロック小行列を用いた逆行列の計算
• ブロック分解を用いると,効率よく計算可能
• A22 =
A1 ⋯ 𝟎
⋮ ⋱ ⋮
𝟎 ⋯ A𝑛
• A22
−1
=
A1
−1
⋯ 𝟎
⋮ ⋱ ⋮
𝟎 ⋯ 𝐴𝑛
−1
43
3.4. 数値計算ライブラリの利用
44
数値計算ライブラリ
• 最適化ライブラリ
– MATLAB (Optimization Toolbox)
• lsqnonlin関数
– Trust-region法,レベンバーグ・マーカート法,ガウス・ニュートン法
– R
• optim関数
– Nelder-Mead法,BFGS法, L-BFGS-B法, CG法,SANN法
• 線型代数演算ライブラリ
– LAPACK
• 数値計算ライブラリ
– BLAS
– BLAS亜種
45
まとめ
46
まとめ
• 非線形最小二乗法の最適化手法の紹介
– ガウス・ニュートン法
– レベンバーグ・マーカート法
• 実装方法の解説
– コレスキー分解を用いた線型方程式の計算
– 疎行列の活用方法
– パラメータ分割
• 数値計算ライブラリの紹介
47
感想
• フリーで利用可能な最適化ライブラリはかな
り充実している
– けど,何をどう選択すればよいのかわからない 
• 解きたい問題をどう定式化するかによって利
用可能な/得意なツールは異なってくる
– その勘所をつけたいなぁ
• 数値計算の常識を身につけたい
48
参考文献
• 金谷健一.これなら分かる最適化数学.共立
出版 (2005).
– ガウス・ニュートン近似やレベンバーグ・マーカー
ト法の導出もあり
• 伊理正夫・藤野和建.数値計算の常識.共立
出版 (1985).
– 「逆行列よさようなら」
– 数値計算のノウハウが詰まっている
49
Thank you!
50

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