SlideShare a Scribd company logo
1 of 25
Download to read offline
Common Lispで関係データ学習
スパース非負値テンソル分解の実装
masatoi0
Twitter: @masatoi0
Github: masatoi
このスライドの流れ
●
関係データについて
●
非負値テンソル分解(NTF)
●
文書クラスタリングへの応用
●
ベンチマーク
●
まとめ
関係データとは
●
関係に注目したデータ
– 例
●
文書と単語の関係
●
ユーザと商品の関係
●
ユーザと商品と店舗の関係
●
ユーザと商品と店舗と時間の関係
関係データとは
●
関係に注目したデータ
– 例
●
文書と単語の関係(2次のテンソル=行列)
●
ユーザと商品の関係(2次のテンソル=行列)
●
ユーザと商品と店舗の関係(3次のテンソル)
●
ユーザと商品と店舗と時間の関係(4次のテンソル)
●
関係はテンソルで表現できる
– テンソル=多次元配列
テンソル分解
●
n次のテンソルをn個の(テンソルの各軸の次元数×ランク)の因
子行列のかけ算で近似する
– 2次のテンソル(行列)の場合
テンソル分解
●
n次のテンソルをn個の(テンソルの各軸の次元数×ランク)の因
子行列のかけ算で近似する
– 3次のテンソルの場合
因子行列の解釈
●
ランクRをクラス数とみる
●
文書数×ランクの因子行列にはその文書がどのクラスに属するかのスコアが入る
●
ランク×単語数の因子行列にはそのクラスにおける各単語の重要度スコアが入る
文書数
単語数 単語数
文書2
ランクR=2
ランクR
文書3
文書1
クラス1 クラス2
テンソル分解で何ができるか
●
ユーザの購買行動(どの店舗でどの時間帯にどういう商品をどう
いう順番で買った)からユーザの集団をグルーピング、スコアリ
ングする
– → キャンペーンを出し分ける(クーポンなど)
●
ユーザの動画試聴履歴(どの動画をどの時間帯にどういう順序で
以下略)からユーザや動画の集団をグルーピング、スコアリング
する
– → レコメンド(おすすめ)
テンソル分解のアルゴリズム
●
非負値テンソル分解(NTF): テンソルの要素が非負値であるとい
う制約を入れたもの
●
元のテンソルと推定テンソル(因子行列の積)の距離を最小化
KLダイバージェンス
元のテンソル 推定テンソル
X X^
テンソル分解のアルゴリズム
●
因子行列をランダムに初期化する
●
KLダイバージェンスが収束するまで以下を繰り返す
– テンソルの各軸について以下を繰り返す
●
因子行列からXの推定値X^を計算する
●
因子行列を以下の更新式で更新する(3次のテンソルの場合)
スパース(疎)なデータとは
●
例:文書と単語の関係を「文書に出現した単語のカウント」で表現
– 総単語数は数万だが、1つの文書に現われる単語数は数百
– 高次のテンソルほどスパースになる傾向
単語1 単語2 単語3 ・・・ 単語m
文書1 0 0 0 0 3
文書2 1 0 0 0 0
・・・ 0 0 0 4 0
文書n 1 0 3 0 0
ほとんどは0!
スカスカ!!
テンソル分解のアルゴリズム(再)
●
因子行列をランダムに初期化する
●
KLダイバージェンスが収束するまで以下を繰り返す
– テンソルの各軸について以下を繰り返す
●
因子行列からXの推定値X^を計算する
●
因子行列を以下の更新式で更新する(3次のテンソルの場合)
ほとんど0!
値のあるところだけ計算すればいい
(X^も)
スパーステンソルの実装
●
値が入っているところだけインデックスと値を保存する
i j k
0 1 0
1 3 4
2 1 0
1 2 3
2.0d0
1.1d0
0.1d0
3.4d0
値が入っている要素の数
インデックス行列 値ベクトル
実装例:スパース版、因子行列の積
(defun sdot (factor-matrix-vector X-indices-matrix X^-value-vector)
(let ((R (array-dimension (svref factor-matrix-vector 0) 1)))
(loop for datum-index from 0 below (array-dimension X-indices-matrix 0) do
(setf
(aref X^-value-vector datum-index)
(loop for ri from 0 below R
sum
(let ((prod 1d0))
(loop for factor-index from 0 below (length factor-matrix-vector) do
(let ((factor-matrix (svref factor-matrix-vector factor-index)))
(setf prod
(* prod (aref factor-matrix
(aref X-indices-matrix
datum-index
factor-index)
ri)))))
prod))))))
実際は全部型宣言している
https://github.com/masatoi/cl-tensor-decomposition/blob/master/src/core.lisp
実装例: スパース版、更新式の分子
余談:loopマクロ内で型宣言できる
●
loop内のfor、with、sumの後などで型宣言できる
(let ((coefficient 0.1d0)
(sum 0d0))
(declare (type double-float coefficient sum))
(loop for i from 1d0 to 10d0 do
(locally (declare (type double-float i))
(incf sum (* coefficient i))))
sum)
同じものをこう書ける
(loop for i double-float from 1d0 to 10d0
with coefficient double-float = 0.1d0
sum (* coefficient i) double-float)
cl-tensor-decomposition
●
https://github.com/masatoi/cl-tensor-decomp
osition
●
現状スパーステンソルのみに対応
●
非負値テンソル分解を実装
●
依存ライブラリなし。ピュアCommon Lisp
実験:livedoorニュースコーパス
●
https://www.rondhuit.com/download.html
●
9つのニュースサイトの記事から計7367本収録
●
前処理
– cl-igoで形態素解析
– 出現回数が10回以下の単語は除外(残り:18372)
– cl-docclassでTF-IDF(単語の重要度の指標)を作る
– TF-IDFのリストからスパーステンソルを作る (7367 × 18372の行列)
●
ここでデモ
更新回数とKLダイーバジェンスの変化
家電チャンネル
peachy
sports-match
独女通信
homme
topic-news movie-enter
it-life-hack smax
データインデックス
×ランクの因子行列
縦軸:クラス
横軸:文書
単語に関する因子行列
●
it-life-hackとsmaxはどちらもガジェット
紹介系のサイト
●
クラス5のスコアを高い順に単語をソート
してみると
(("し" . 109.04348336374113d0) ("-" . 91.76240489421657d0)
("." . 80.22526454474105d0) ("する" . 68.73491346986165d0)
("アプリ" . 59.488869830729435d0) ("さ" . 52.781681554591586d0)
("こと" . 45.48072174188368d0) ("S" . 44.04332757282218d0)
("スマート" . 43.58858431692711d0) ("Android" . 42.880740024926
("フォン" . 41.5900016998051d0) ("機能" . 39.61094803968125d0)
("画面" . 38.953993254594835d0) ("D" . 38.47405210344859d0)
("対応" . 38.33622104653764d0) ("iPhone" . 38.22991834768812d0)
("できる" . 37.78998727076581d0) ("れ" . 36.63509001753045d0)
("1" . 35.76099918261546d0) ("更新" . 35.07252805392462d0)
("MAX" . 34.42454891347022d0) ("ドコモ" . 34.266829031851984d0
("いる" . 34.21895668244226d0) ("4" . 33.44497396822497d0)
("表示" . 33.08796409388794d0) ("3" . 33.06364629768795d0)
("い" . 32.36813235247307d0) ("搭載" . 31.18409160813955d0)
("利用" . 30.953497498544024d0) ("/" . 30.569191539539645d0)
("2" . 30.36076372879857d0) ("0" . 29.05991598378217d0)
("ソフトウェア" . 28.89717214039585d0) ("サービス" . 27.03884186
("エスマックス" . 26.72421411670221d0) ("5" . 26.229389734295932
("2012" . 25.907128252614832d0) ("でき" . 24.54449025743606d0)
("設定" . 23.670266563223958d0) ("発売" . 23.001893999487788d0)
("端末" . 22.962858265014454d0) ("モデル" . 22.96066355339083d0
("Google" . 22.762411648093355d0) ("日" . 22.32364730031569d0)
("発表" . 21.999375894699472d0) ("通" . 21.82406245475157d0)
("PC" . 21.740461516948752d0) ("月" . 21.616063841314215d0)
("なっ" . 21.475621693724506d0) ("向け" . 21.28304378020104d0)
("よう" . 20.77684659725571d0) ("(" . 20.61264922848054d0)
("製品" . 19.979585643979085d0) ("記事" . 19.94115350068962d0)
他との比較
●
Common LispだとCLMLのNMF(非負値行列分解)がある
(密な行列にのみ対応)
●
livedoorニュースコーパスのデータ中で値が入っていると
ころは1%くらい → スパース化の効果がでかそう
●
R=9で更新回数10回にかかった時間
– CLMLのNMF:475.838秒
– cl-tensor-decomposition:1.538秒
309倍の高速化!!!
まとめ
●
スパース版NTFをつくった
●
livedoorニュースコーパスの分析に応用してみた
– CLMLのNMFの300倍速くなった
TODO
●
ランクRは大きければいいというものではない(過学習する)
– 交差検証して適切なランクを選ぶ
●
Tucker分解
– 因子行列に加えて一辺Rのコアテンソルとのかけ算でテンソルを近似する、より一般
的なモデル
●
Netflix Prize Data
– https://www.kaggle.com/netflix-inc/netflix-prize-data
●
リクルートのCoupon Purchase Prediction
– https://www.kaggle.com/c/coupon-purchase-prediction
参考文献
●
関係データ学習 (機械学習プロフェッショナルシリーズ)
●
複合データ分析技術と NTF[Ⅱ・完]──テンソル
データの因子分解技術と実応用例──
●
http://www.kecl.ntt.co.jp/icl/ls/members/tatsushi/PDF/IEICE_vol
99_no7_691-698.pdf

More Related Content

More from Satoshi imai

lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
 
Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境Satoshi imai
 
Lispmeetup #56 Common lispによるwebスクレイピング技法
Lispmeetup #56 Common lispによるwebスクレイピング技法Lispmeetup #56 Common lispによるwebスクレイピング技法
Lispmeetup #56 Common lispによるwebスクレイピング技法Satoshi imai
 
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめSatoshi imai
 
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装Satoshi imai
 
Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類Satoshi imai
 
Lispmeetup #45 Common Lispで音声合成
Lispmeetup #45 Common Lispで音声合成Lispmeetup #45 Common Lispで音声合成
Lispmeetup #45 Common Lispで音声合成Satoshi imai
 
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common LispによるディープラーニングLispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common LispによるディープラーニングSatoshi imai
 
Lisp meetup #29 cl-online-learningの紹介
Lisp meetup #29 cl-online-learningの紹介Lisp meetup #29 cl-online-learningの紹介
Lisp meetup #29 cl-online-learningの紹介Satoshi imai
 

More from Satoshi imai (9)

lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境
 
Lispmeetup #56 Common lispによるwebスクレイピング技法
Lispmeetup #56 Common lispによるwebスクレイピング技法Lispmeetup #56 Common lispによるwebスクレイピング技法
Lispmeetup #56 Common lispによるwebスクレイピング技法
 
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
 
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
 
Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類
 
Lispmeetup #45 Common Lispで音声合成
Lispmeetup #45 Common Lispで音声合成Lispmeetup #45 Common Lispで音声合成
Lispmeetup #45 Common Lispで音声合成
 
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common LispによるディープラーニングLispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
 
Lisp meetup #29 cl-online-learningの紹介
Lisp meetup #29 cl-online-learningの紹介Lisp meetup #29 cl-online-learningの紹介
Lisp meetup #29 cl-online-learningの紹介
 

lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装