今年年のKDDベストペーパーを
実装してみました
株式会社プリファードインフラストラクチャー  
⽐比⼾戸  将平
⾃自⼰己紹介
l  ⽐比⼾戸将平(HIDO  Shohei)
l  TwitterID:  Vapnikマン@sla
l  専⾨門:データマイニング、機械学習
l  経歴:
–  2006-‐‑‒2012:  IBM東京基礎研究所データ解析グループ
l  機械学習(特に異異常検知)のアルゴリズム研究開発
l  お客様案件でデータ解析プロジェクトに従事
–  2012-‐‑‒:  株式会社プリファードインフラストラクチャー
l  ⼤大規模オンライン分散機械学習基盤Jubatusチームリーダー
–  2013-‐‑‒:  Preferred  Infrastructure  America,  Inc.
l  Chief  Research  Officer
2
l  今⽇日のトピック:⾏行行列列スケッチ
l  ⾏行行列列スケッチとは
l  Frequent-‐‑‒directionsアルゴリズム
l  評価実験
l  +αのはなし
Agenda
SIGKDD:  Intʼ’l  Conf.  on  Knowledge  Discovery  
and  Data  Mining
l  ACM  データマイニング/機械学習の最難関国際会議
l  理理論論的な保証と同時に実験での(特に⼤大規模)評価が必要
l  今年年は8⽉月中旬にシカゴで開催
l  Best  Research  Paper  Award:  Edo  Liberty  (Yahoo!  Labs,  Haifa)
“Simple  and  Deterministic  Matrix  Sketching”
4
github.com/hido/frequent-‐‑‒directionで公開中
5
l  今⽇日のトピック:⾏行行列列スケッチ
l  ⾏行行列列スケッチとは
l  Frequent-‐‑‒directionsアルゴリズム
l  評価実験
l  +αのはなし
Agenda
⾏行行列列スケッチ:n  x  mのオリジナル⾏行行列列Aを
⼩小さな⾏行行列列Bで近似
l  「近似ができる」という意味
–  以下の性質を良良く保つ
–  BのSVDによる低ランク近似はAのそれをよく近似
l  応⽤用
–  PCA
–  k-‐‑‒meansクラスタリング
–  LSI
7
l  今⽇日のトピック:⾏行行列列スケッチ
l  ⾏行行列列スケッチとは
l  Frequent-‐‑‒directionsアルゴリズム
l  評価実験
l  +αのはなし
Agenda
n  x  mのオリジナル⾏行行列列Aをはるかに⼩小さな
ℓx  m⾏行行列列Bで近似する(n  >>ℓ)
l  元⾏行行列列Aの各⾏行行を、各変数の「表現量量」ベクトルと⾒見見なすと、
sketchは直感的にはよく現れる「⽅方向」をできるだけ残して⾏行行数
を削減する操作として捉えられる
l  そのような操作は、各アイテムの出現個数リストからよく現れる
共起パターンを⾒見見つける、頻出アイテムマイニングと似ている
l  実際、ゼロ⾏行行列列から始まるsketch⾏行行列列BにAの各⾏行行を挿⼊入しな
がら、BのSVDを求めて頻出⽅方向を更更新しつつ、特異異値が⼩小さい
ものに対応する部分はゼロ⾏行行に潰す操作を⾏行行って、逐次的にBを
更更新するアルゴリズムを与えた
l  その結果、以下の不不等式で近似誤差を抑えられる
9
アルゴリズム(超簡単)
10
: BのSVDを逐次計算
: 特異異ベクトルをつぶす
: Aのi⾏行行⽬目それぞれに独⽴立立した操作
: 計算量量はO(nℓm)
Python実装(NumPyつかえば超簡単)
11
l  今⽇日のトピック:⾏行行列列スケッチ
l  ⾏行行列列スケッチとは
l  Frequent-‐‑‒directionsアルゴリズム
l  評価実験
l  +αのはなし
Agenda
評価実験:USPS⼿手書き⽂文字画像データセット
PCAの上位2軸ではられる平⾯面でプロットしてみる
参考:東⼤大冨岡先⽣生の演習問題
http://www.ibis.t.u-‐‑‒tokyo.ac.jp/RyotaTomioka/Teaching/enshu13
13
まずPythonでnumpy.linalgのSVDで再現(⾏行行列列A)
14
l  元⾏行行列列Aの⼤大きさは7291  x  256(n=7291、m=256)
l  ほぼ⼀一致することは確認できた
⾏行行列列AのSVD(近似⽬目標)演習ページから引⽤用
ℓ=  3の場合:さすがに無理理
l  ⻘青⾊色の1が左端、紫の0が右側に集まってはいる…?
15
⾏行行列列AのSVD(近似⽬目標)ℓ = 3で得た⾏行行列列BのSVD結果
ℓ=  4の場合:だいぶばらけた
l  まだ0、1、3以外はかなり混ざってしまっている
16
⾏行行列列AのSVD(近似⽬目標)ℓ = 4で得た⾏行行列列BのSVD結果
ℓ=  5の場合:さらに変形
l  0と3が分かれてきた
17
⾏行行列列AのSVD(近似⽬目標)ℓ = 5で得た⾏行行列列BのSVD結果
ℓ=  6の場合:さらに変形
l  左がやや潰れ始めている
18
⾏行行列列AのSVD(近似⽬目標)ℓ = 6で得た⾏行行列列BのSVD結果
ℓ=  8の場合:ちょっと似てきた
l  真ん中がまた分かれ始めた
19
⾏行行列列AのSVD(近似⽬目標)ℓ = 8で得た⾏行行列列BのSVD結果
ℓ=  16の場合:かなり似てきた
l  真ん中の様⼦子もほぼ⼀一緒に
20
⾏行行列列AのSVD(近似⽬目標)ℓ = 16で得た⾏行行列列BのSVD結果
ℓ=  32の場合:ほぼ⼀一致
l  ⾒見見た⽬目ではもう違いが⾒見見つけられない
l  これ以上ℓを⼤大きくしても結果に変化は⾒見見られない
21
⾏行行列列AのSVD(近似⽬目標)ℓ = 32で得た⾏行行列列BのSVD結果
近似精度度⾯面での結論論
l  ℓ  =  16くらいでほぼ⼗十分な近似結果が得られている
l  数字が10種類しか無いことを考えるとこの結果は⽰示唆的
2222
7291 x 256⾏行行列列AのSVD結果16 x 256⾏行行列列BのSVD結果
l  今⽇日のトピック:⾏行行列列スケッチ
l  ⾏行行列列スケッチとは
l  Frequent-‐‑‒directionsアルゴリズム
l  評価実験
l  +αのはなし
Agenda
冨岡先⽣生からの疑問
l  「ℓを増やしたら実⾏行行時間が短くなっているが何故ですか?」
l  実際にブログに書いた範囲だと実⾏行行時間は減少傾向
24
0"
0.2"
0.4"
0.6"
0.8"
1"
1.2"
1.4"
1.6"
1.8"
3" 4" 5" 6" 8" 16" 32"
ℓ
速度度⾯面の結論論:ℓが精度度的に⼗十分な時が最適?
25
l  ℓを増やせば⾏行行列列BのSVD回数は減っていく
l  実⾏行行時間全体は⼀一度度減ったあと、増えていく
0"
500"
1000"
1500"
2000"
2500"
3000"
3500"
4000"
0"
0.5"
1"
1.5"
2"
2.5"
3"
3.5"
4"
3" 4" 5" 6" 8" 16" 32" 64" 256"
B SVD
ℓ
@tmaeharaさんからのコメント
l  「これ知ってる!!進研ゼミでやったやつだ!!!」
26
そこんとこEdo  Liberty本⼈人に聞いてみました
l  This  indeed  can  be  used  but  I  thought  it  will  be  less  efficient  
in  practice  and  more  complicated  to  code.  So,  I  did  not  
include  it  in  the  paper.
l  Theoretically  though,  it  can  reduce  the  space  usage  by  a  
factor  of  2,  which  theoretical  CS  people  think  is  not  
important  :)
l  That  said,  I  received  quite  a  few  questions  about  that  so  I  will  
say  something  about  it  in  the  journal  version.
l  incremental  rank-‐‑‒1  SVD  updatesも同じように使えると思うよ
l  けど実⽤用的には効率率率悪いし実装するのも難しいよね
l  だからSIGKDDの論論⽂文には⼊入れなかったよ
l  けど少なくともメモリ使⽤用量量は桁違いに良良いはずだよ
l  そこは理理論論の⼈人は気にしないのかもしれないけど…
l  まぁ同じ質問受けまくるからジャーナル版では何か書くよ
27
⾞車車輪輪の再発明あるいは再発⾒見見:
進歩性があるのであればありなのではないか
l  ⼤大規模データだから⼿手法がシンプルに回帰、というのはある
28
まとめ:Frequent-‐‑‒directionsアルゴリズム使えるよ
l  アルゴリズム単純
l  実装簡単(⽐比⼾戸Python版は公開されている)
l  メモリあんまり喰わない
l  オンライン性もある
–  ⾏行行列列Aの各⾏行行に対して独⽴立立して動作する
–  ストリームデータの各サンプル=Aの末尾⾏行行
–  新しいサンプルの到着毎に更更新すれば良良い
l  並列列性もある
–  ⾏行行列列をぶったぎってしまえば独⽴立立して計算できる
l  いろんな機械学習タスクに使える
–  クラスタリング、次元削減、外れ値検知、etc…
29
=
ん…?オンライン、並列列、機械学習…だと…?
30
http://jubat.us/にてOSS公開中!!

今年のKDDベストペーパーを実装・公開しました