FANCOMI Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・新規事業のエンジニア・技術ブログ

非負ッ値行列・ファクトリゼーション ~ 半群じゃないから難しくないもん!

Introduction

 こんにちは、k_oomoriです。今回は非負値行列因子分解 (Non-negative Matrix Factorization, 略してNMF) を用いたデータの解析について触れてみたいと思います。

 まず最初に用語の定義として、「非負値行列」とは全ての要素が非負値(0以上の実数)であるような行列を指すこととします。これを用いると、NMFとは「与えられた非負値行列Vを2つの非負値行列WHの積に(近似的に)分解するアルゴリズム

 V\approx WH \tag{1}

と表現できます。これにより、なんとVの中に潜んでいる特徴を抽出することができるというのです!これについては後ほど説明します。

 ひとまずはVの具体例を見てみましょう。いくつかのニュース記事の中に特定の単語がそれぞれ何回現れるかを数えるという状況を想像してください。例えば記事が3つ、対象とする単語が5つの場合、出現回数を次のように並べることができます。 f:id:fan_k_oomori:20160506125639p:plain
上記の例では、記事Aの中に単語1が2回、単語2が0回、…、記事Cの中に単語5が3回現れたことを意味しています。出現回数が負になることはありえないので、これは3×5の非負値行列になっています。このようなデータに対してNMFを適用すると、記事をうまく分類できるという結果が得られています。
 他にも顔画像に対してNMFを適用すると、顔のパーツをうまく抽出したりできるようです。

なぜ特徴を抽出できるのか?

 ここに3人のユーザ(A,B,C)、4つの広告(a,b,c,d)があり、各人が各広告をクリックした回数が次の非負値行列で与えられるとします。 f:id:fan_k_oomori:20160506125645p:plain
実はこれは次のように分解できることがわかります。 f:id:fan_k_oomori:20160506125656p:plain
単に「特徴1,2,3」とか言っても感覚が掴みにくいので、特徴1=アイドル、特徴2=電子書籍、特徴3=ソシャゲとしてみましょう。すると(4)の第1因子から、ユーザAはアイドル2:電子書籍1くらいの興味があり、ユーザBはアイドルにしか興味がなく、ユーザCはソシャゲにはまっている人と解釈できます。第2因子の方は、広告aがアイドル全面推し、広告bはアイドルをフィーチャーした電子書籍、広告cは純粋ソシャゲ、広告dはアイドル風味のソシャゲとなります。このように人・広告ごとの特徴を捉えた後で(3)を見てみると、ああ、アイドル好きなユーザBがアイドル広告aを9回もクリックしたんだなとか、ソシャゲ廃人Cはソシャゲ要素のない広告a,bには見向きもしないんだな、といったことが読み取れます。
 今のは各因子が与えられたとしてそこから掛け合わせた行列の値を見るという方向でしたが、これを逆に辿ると、単なるユーザ×広告のクリック数のデータでしかなかったものから何か特徴のようなものを引き出せることが期待できるのがわかるでしょう。なお、その「特徴」が一体何であるかについては、人間が考察しなければわかりません。

乗法的更新アルゴリズム(Multiplicative update rule)

 では与えられたVからWHを近似的に求めるアルゴリズムに進みましょう。まず、(1)を満たすようなW,Hを見つけようとしているので、2つの行列(ここではVWH)がどれくらい近いかを判断する基準が必要になります。ここではコスト関数として、各成分の2乗和(いわゆる行列のFrobeniusノルム)を採用します。

 \displaystyle ||A-B||^2 = \sum_{ij}(A_{ij}-B_{ij})^2 \tag{5}

Ref.[2]で示されているように、ノルム(5)は以下の乗法的更新ルールの下で非増加 (non-increasing) です。※1

 \displaystyle H_{a\mu}\leftarrow H_{a\mu}\frac{(W^TV)_{a\mu}}{(W^TWH)_{a\mu}}, \quad
W_{ia}\leftarrow W_{ia}\frac{(VH^T)_{ia}}{(WHH^T)_{ia}} \tag{6}

つまり、WHの初期値を適当に(ランダムでよい)用意し、(6)を何度も繰り返し適用していけば、WHVに近づいていくのです!

 さてこれまでVWHに分解するという話をしてきましたが、行列のサイズ(行数、列数)はどうなるのでしょう?Vのサイズは与えられたデータ量によって決まります。ここではVの行数をn、列数をmと置くことにします。

 \displaystyle
V=
  \overbrace{
    \left(
      \begin{array}{ccc}
        \cdot  & \cdots & \cdot \\
        \vdots & \ddots & \vdots \\
        \cdot  & \cdots & \cdot
      \end{array}
    \right)
  }^m\quad
\Biggr\}n \tag{7}

WHVを比較しているので、Wの行数はnHの列数はmとなります。またWHの積を考える以上、Wの列数とHの行数は同じ(ここではrと置きます)でなければなりませんが、それがいくつになるかは一意的には決まりません。これは、抽出されるべき特徴の数を人間が推測して与えるか、またはrを調整されるべきパラメータとして扱うべきであるということを意味します。
 ここで(1)の両辺の要素数を計算してみましょう。左辺は明らかにnmです。右辺はnr+rm=r(n+m)となります。今やりたいことは、膨大な元データ(Vのこと)の中からある程度少数の特徴を発見して整理しようということなので、

 \displaystyle
nm>r(n+m) \quad \Leftrightarrow \quad r<\frac{nm}{n+m} \tag{8}

を満たす、言い換えるとrnmのうち小さい方と同程度かそれ以下の大きさであることが望ましいです。逆にrが小さすぎる場合、動かすことができるパラメータの量が減ってしまうので、コストを十分に小さくできない可能性が高くなります。
 以上をもとに、実際にアルゴリズムを走らせ、コスト値の収束性やr依存性を見てみましょう。 テストデータとして948\times 239行列を用意し、100回のイテレーション(繰り返し)を行った例を以下に示します。 f:id:fan_k_oomori:20160506131946p:plain
NMFの収束性。横軸:イテレーションの回数、縦軸:コスト/行列の要素数。

横軸はイテレーションの回数、縦軸はコスト値(5)を948\times 239で割ったもの(つまり各要素ごとに取った差の2乗の平均値)、凡例はrの値を表します。このグラフから、以下のことが読み取れます。

  • rの値がいくらであっても、50~60回程度繰り返すとコスト値は収束する。
  • rの値を大きくしていくにつれて、コストの収束値は減少する。これは、動かせるパラメータ(自由度)が多くなるほどVを近似しやすくなることを示す。
  • rの値が大きいと、ランダムな初期値からスタートしたにもかかわらずコスト値の変動が少ない。逆にrの値が小さいときには極小ではあるが最小ではない解にはまる可能性がある。

 なお、以上の話の中に正方行列は一切出てこず、Vの自分自身との積などは定義されていません。なので今回考えている行列には群どころか半群の構造すら入っていません。正方行列の集合だと何かとトピックが豊富なのですが、今回はただ更新ルール(6)に従って計算するだけなので特に難しいことはありません。※2

更新ルール(6)に関する注意

 この更新ルール、n回目のイテレーションによって得られる値をW_{(n)}, H_{(n)}と書くとき、私は最初てっきり

 \displaystyle
\begin{eqnarray}
& &H_{(n+1)a\mu}= H_{(n)a\mu}\frac{(W_{(n)}^T V)_{a\mu}}{(W_{(n)}^T W_{(n)}H_{(n)})_{a\mu}}\\
& &W_{(n+1)ia}= W_{(n)ia}\frac{(VH_{(n)}^T)_{ia}}{(W_{(n)}H_{(n)}H_{(n)}^T)_{ia}}
\end{eqnarray}

の意味かと思って実装してみたのですが、これでは収束しない!実は f:id:fan_k_oomori:20160506133010p:plain
としなければなりませんでした。摂動論などに馴染んだ(毒された?)私には意外だったのですが、これって普通なんですかね?

実データ解析

 それではいよいよ実際のデータ解析に入ります。今回は元データ(V)としてnendのコンバージョンデータを使用し、広告キャンペーンの特徴による分類を試みたいと思います。データ例はこちらになります。行がユーザ、列がキャンペーンに対応しています。ただ眺めていても一切面白くないですね。しかし、この中に宝が埋まってると期待して採掘を行います。
 まずはrの決定の仕方を考えなければなりません。上記のVn=638, m=236なので、(8)式よりr\lt 172.3という制限がつきます。営業サイドに尋ねたところ、多少細かく分類したとしてもキャンペーンのカテゴリ数は100くらいという意見でしたので、今回はr=100という値を用いることにします。
 イテレーション回数を100として(6)のアルゴリズムにかけた結果、W\timesHという結果が得られました。Wはユーザ×特徴、Hは特徴×キャンペーンの情報を担っているので、Hの方に着目します。
 さて、問題はどうやってこのデータから特徴の似通ったキャンペーンを抽出するかですが、やり方はいろいろあり得ると思います。今回は、各キャンペーン(つまり各列)に着目するとそれぞれがr=100次元のベクトルとみなせることから、ベクトル間のコサイン類似度を元に値が大きいものを抜き出してみました。ここでは具体的なキャンペーン名を挙げられないのが残念ですが、営業側に確認していただいたところ、一部大手クライアントのキャンペーンには関連性が不明瞭なものがあるものの、概ね納得できる関連性を抽出できているとのことでした。あらかじめキャンペーンに属性情報等を付与したりしたわけでもないのに、多くのユーザがとった行動データからこのような関係性を抜き出せるというのは大変興味深いですね。またこのような「誰が見ても関連ありそう」という情報だけでなく、いわゆる「ビールと紙おむつ」のような未知の価値ある情報を引き出せれば言うことはありません。

Furthermore...

 今回はNMFを用いてキャンペーン間の関連性を調べましたが、某密林よろしく「このキャンペーンでコンバージョンしている人はこんなキャンペーンでもコンバージョンしています」的なことも容易に調べられるので、これらの結果を比較してみる価値はあると思います。
 またグラフ理論的な観点からは各キャンペーンは頂点(vertex)であり、今回はそれらの間のリンクの強さを調べたことになりますが、さらに踏み込んで大域的なコミュニティ構造を調べてみるのも面白いかもしれません。
 最終的にはより効果的な広告の配信につなげていきたいですが、それはまた別のお話。

Summary

 In this article I first illustrated why Non-negative Matrix Factorization (NMF) was expected to reveal some hidden features from users' behavioral data. Then I described the multiplicative update rule and applied it to conversion data in nend to classify ad campaigns based on their similarities.
 Further possible directions would include: (1) study of other methods for finding relationships between ad campaigns to be compared with NMF, and (2) make use of this achievement to develop more effective advertising solutions.

References

[1] D. D. Lee and H. S. Seung, "Learning the parts of objects by non-negative matrix factorization," Nature 401, 788-791, 1999. リンク切れの場合はこちら
[2] D. D. Lee and H. S. Seung, "Algorithms for Non-negative Matrix Factorization," In NIPS, 556-562, 2000. リンク切れの場合はこちら
[3] 集合知プログラミング(書籍)
[4] Non-negative Matrix Factorization(非負値行列因子分解) - あらびき日記


※1. ^ Ref.[2]ではもう一つ別の更新規則も与えられているのですが、そちらでは基準となるコスト関数が 拡張されたKullback-Leiblerダイバージェンス という(5)より複雑な表式で与えられるため、今回は(6)のルールを採用することとします。
※2. ^ とかなんとか言ってますが、単にタイトルが言いたかっただけなのは確定的に明らか。