Download - Icml yomikai 07_16
GoDec: Randomized Low-rank &
Sparse Matrix Decomposition in
Noisy Case
#41
Tianyi Zhou, Dacheng Tao
@niam
江原 遥
1
この論文を読もうと思った動機
• 2009 乱択化SVD (Halko+)
– Gaussian行列をかけて列を圧縮.SVDを高速近似.
– ノルムをバウンドして近似の良さを証明
• 2010/9 REDSVD (Okanohara+)
– 実用的には行と列の両方を圧縮してよい
• 2011/3 全部分文字列のクラスタリングとその応用 (岡野原, NLP2011)
– REDSVDを全部分文字列のクラスタリングに応用
2
この論文を読もうと思った動機
• 2009 乱択化SVD (Halko+)
– Gaussian行列をかけて列を圧縮.SVDを高速近似.
– ノルムをバウンドして近似の良さを証明
• 2010/9 REDSVD (Okanohara+)
– 実用的には行と列の両方を圧縮してよい
• 2011/3 全部分文字列のクラスタリングとその応用 (岡野原, NLP2011)
– REDSVDを全部分文字列のクラスタリングに応用
3
GoDec論文では
BilateralRandomProjection
と呼んでいる
Abstractには
The algorithm can be significantly accelerated by
bilateral random projections (BRP).
Theoretically, we analyze the influence of L, S and
G to the asymptotic/convergence speeds in order to
discover the robustness of GoDec.
と書いてあるので,いかにもBRPを適用した場合の証明が書いてありそうに見えるが…
どうやら証明されているのは近似なしのGoDeC
4
Fast GoDec
Nai:ve GoDec
特異値分解
(Singular Value Decomposition)
X: m x nデータ行列
r:自然数 が与えられたとき
minL ||X-L||F
s.t. rank(L)=r
をみたすLは,
5
1
(>0)T
r
i i i
i
X U V r
L
u v
の大きい方から 個の特異値 を用いて
と表せる.
時間計算量 mnr (たぶん)
SVDのイメージ
≒
X(元の行列)
1点だけ凄く違う外れ値に弱い
(上下左右に,にじむ)
T
1
r
i i i
i
L
u v
T
i iu v一枚一枚が i
r
で重み付けして
個足し込む
実際,SVDはどんな感じににじむか
7
180x200行列 (rank180) rank10で低ランク近似
解決策:外れ値に弱いなら
外れ値を抜けばいいじゃない
≒
X(元の行列)
T
1
r
i i i
i
L
u v
T
i iu v一枚一枚が
+
S
外れ値の
個数=
card(S)
i
r
で重み付けして
個足し込む
Nai:ve GoDec
9
今までの話を数式で書くと解きたい問題は:
LとSを同時に最適化するのは難しい.
次の様にLとSを交互に計算できれば簡単.
は
こう解けばOK:
こう解けばOK:
は
Robust PCAの論文から
取ってきた(汗
Nai:ve GoDec
10
今までの話を数式で書くと解きたい問題は:
LとSを同時に最適化するのは難しい.
次の様にLとSを交互に計算できれば簡単.
は
こう解けばOK:
こう解けばOK:
は
Nai:ve GoDec
11
今までの話を数式で書くと解きたい問題は:
LとSを同時に最適化するのは難しい.
次の様にLとSを交互に計算できれば簡単.
は
こう解けばOK:
こう解けばOK:
は
Dense(黒っぽい)Lと
Sparse(白っぽい)Sを交互に
扱う点が碁に似てるからGoDec
この論文の貢献: • Theorem 1:
この交互計算がlocal minimum
に収束する
• Theorem 2, 3:
ノイズがなければ線形収束する
• Theorem 4:
ノイズがあってもノイズが酷く
なければ線形収束する
Nai:ve GoDecの問題点
12
今までの話を数式で書くと解きたい問題は:
LとSを同時に最適化するのは難しい.
次の様にLとSを交互に計算できれば簡単.
は
こう解けばOK:
こう解けばOK:
は
遅い.毎iterationでsvdするとか
やりたくない.高速化したい.
→Fast GoDec
Fast GoDec
13
Stの計算は同じ
BRP +
Power
Scheme 以後,
近似手法
を説明
BRP
14
元々やりたいこと:
こうやれば厳密に解けるが遅い
…と書いてあるがr個までなのでmnr 計算量:
A1 :列を圧縮するランダム行列
A2 :行を圧縮するランダム行列 を用いて高速化
発表者が知る方法は3つ 1 1 2 2, TY XA Y X A
†
1 1 1 1 2 2 2 2 1 2 1 2, ,T T T
r r r r r r rY U V Y U V L Y A Y Y
1 1 1 2 2 2 2 1
2 1 2 1
, , T T
T T T
Y Q R Y Q R C Q XQ USV
L Q CQ Q USV Q
本論文
REDSVD:
(Fazel+,
2008)
BRP
15
元々やりたいこと:
こうやれば厳密に解けるが遅い
…と書いてあるがr個までなのでmin(mr2,nr2)? 計算量:
A1 :列を圧縮するランダム行列
A2 :行を圧縮するランダム行列 を用いて高速化
発表者が知る方法は3つ 1 1 2 2, TY XA Y X A
†
1 1 1 1 2 2 2 2 1 2 1 2, ,T T T
r r r r r r rY U V Y U V L Y A Y Y
1 1 1 2 2 2 2 1
2 1 2 1
, , T T
T T T
Y Q R Y Q R C Q XQ USV
L Q CQ Q USV Q
本論文
REDSVD:
(Fazel+,
2008)
r x rの逆行列を使う
r x rのSVD 2回+ r x rの逆行列を使う
r x rのSVDを1回使う
BRP
16
元々やりたいこと:
こうやれば厳密に解けるが遅い
…と書いてあるがr個までなのでmin(mr2,nr2)? 計算量:
A1 :列を圧縮するランダム行列
A2 :行を圧縮するランダム行列 を用いて高速化
発表者が知る方法は3つ 1 1 2 2, TY XA Y X A
1
1 1 1 1 1 2 2 2 2 2 1 2 1 2, ,T T T
r r r rY Y U V Y Y U V L Y A Y Y
本論文
(Fazel+,
2008)
条件付きだが||X-L||のBoundが
示されている (Woolfe+, 2008)
Y1, Y2のランクはrなので, Y1r= Y1, Y2r = Y2
だから実は2つは同じでSVDの計算はいらない.
Power scheme
特異値の減衰が遅いと低ランク近似したときに誤差が大きくなる.
解決策:Xの代わりに を低ランク近似
Xの特異値を大きい順にλiとすると, (XXT)qXの特異値はλi
2q+1になるので(特異ベクトルはXと同じ)早く減衰.
しかし,元に戻すために(XXT)-q の計算をするのなら無意味.→QR分解
17
q
TX XX X
QR分解
18
X: m x n
A1: n x r
A2: m x r
Y1=XA: m x r
A2TY1: r x r
R1: p x r
Q1: m x p
→QR分解を利用(累乗計算のため)
証明
19
Naïve GoDecの
local minimumへの
収束証明と1次収束証明
がなされている.
Fast GoDecは
証明なし(たぶん)
収束証明は簡単:
1次収束証明
• Theorem 2, 3:ノイズがなければ線形収束する
• Theorem 4: ノイズがあってもノイズが酷く
なければ線形収束する
証明の概略:
20
これの挙動を見る
Robust PCA (40ページ)の論文の証明技法と同様の方法を使っているらしく,おそらく,これを読まないとちゃんと理解出来ない.
実装:Nai:ve GoDecなら簡単 https://github.com/niam/godec/blob/master/src/godec.cpp
void run(const emat_t& X, const int r, const int k, const val_t eps ){
int loop= 0; val_t norm_rate = 0.0;
val_t xnorm = X.norm();
L_t = X;
S_t; S_t.setZero(X.rows(), X.cols());
do{
Eigen::JacobiSVD<emat_t> svd(X-S_t, Eigen::ComputeThinU | Eigen::ComputeThinV);
auto sigmas = svd.singularValues();
for(int i=r; i< sigmas.size();++i)sigmas[i]=0;
L_t = svd.matrixU()*sigmas.asDiagonal()*svd.matrixV().transpose();
S_t.setZero(X.rows(), X.cols());
select_kbest(S_t, X-L_t, k, Abs());
norm_rate = (X-L_t-S_t).norm()/xnorm;
cout << loop++ << ": " << norm_rate << "=" << (X-L_t-S_t).norm() << "/" << xnorm << endl;
}while(norm_rate > eps);
}
21
外れ値を抜く
SVDする
繰り返す
実験 (Nai:ve GoDec)
22
元画像:
200x180
SVDと比較
23
SVD r=10 Naive GoDec L+S r=8, k=762
使用メモリ量を合わせるため,rが違う
GoDeCの方がSの非0の分メモリを使用
結果 reading ...
FILE_NAME =
/home/ehara/mypic.png
width = 180
height = 200
bpp = 3
0: 0.140223=3611.84/25757.9
1: 0.133084=3427.97/25757.9
2: 0.131239=3380.44/25757.9
(中略)
20: 0.1294=3333.08/25757.9
21: 0.1294=3333.06/25757.9
||X-L||= 4830.8
writing L...
Succeeded in writing?: 1
||X-S||= 25578.7
writing S...
Succeeded in writing?: 1
||X-LpS||= 3333.06
writing LpS...
Succeeded in writing?: 1
||X-svd||= 4089.61
writing svd...
Succeeded in writing?: 1
writing X...
Succeeded in writing?: 1
24 4.73 user 0.02 system 99% cpu 4.779 total
収束してる
SVDより
誤差小さい
200 x 180行列
だから…→
論文の方の実験
25
論文の方の実験
26
まとめ
• SVDでの低ランク近似は,外れ値に弱い
→外れ値を抜きながら低ランク近似する
低ランク:L, 外れ値:S, もとの行列X≒L+S
• Nai:ve GoDecがlocal minimumに線形収束することを証明している.ただし,毎イテレーションごとにSVDを実行するので遅い.
• ランダム行列を使って,近似的に高速に計算できる.ただし,こちらには証明がない(たぶん)
アイデアは良いが,細部が抜けている論文だと感じた.
(Algorithm 2を参照しながらAlgorithm 1までしかないとか)
27
参考文献
Fazel, M., Cand` es, E. J., Recht, B., and Parrilo, P. Compressed sensing and
robust recovery of low rank matrices. In 42nd Asilomar Conference on Signals,
Systems and Computers, 2008
Cand` es, E. J., Li, X., Ma, Y., and Wright, J. Robust principal component
analysis? Journal of the ACM (submitted), 2009.
Halko, N., Martinsson, P. G., and Tropp, J. A. Finding structure with randomness:
Stochastic algorithms for constructing approximate matrix decompositions. arXiv:
0909.4061, 2009.
Zhou, T. and Tao, D. Bilateral random projection based low-rank approximation.
Technical report, 2010.
28
ご清聴ありがとうございました
29