行列分解モデルがなぜ、ノイズの除去に役立つのだっけ. NNの文脈で語ると、一度低ランクに写す回帰モデル (autoencoder ではないけどそれっぽい何か) に相当するから、と考えれば、たしかにノイズ除去になっていそう. そもそも行列分解モデルは確率的PCAに相当するものとして示されたものらしい.
ところで純粋な数学的事実に著作権はないと思う.
例えば「角谷の不動点定理」は数え切れない程多く本に載ってあるが、 私がその中の一冊を読んで、その定理をこのブログに載せても、それ自体は何も問題がないと思う. また、名前が付いているくらい(「角谷の不動点定理」といえば、あの定理だと分かる)古典的な論文ともなると、いちいち、その初出の論文だかなんだかを引用すらしない. そんな本を見たことがない.
で、思ったのは、読んでる専門書の内容を、ここに丸写しするのは問題があるのだろうか. 本のスキャンを載せるのは断然アウトだと思う. 自分の言葉で書き直すのは全くセーフだと思う. どの程度まで書き直せばセーフだろうか? ある本に \(1+1=2\) であると書いてあったので私がブログに \(1+1=2\) なんだよ、と何の引用も無く書いたら、誰かが怒ってくるのだろうか?
ノイズや事前分布は基本的に全部ガウス分布だとする.
2種類のデータを考える. それぞれ \(n\) , \(m\) 通りの値を取るとする. それを \(1,\ldots,n\) と \(1,\ldots,m\) だとする. 仮に \(n\) 種類の方を「ユーザー」, \(m\) 種類の方を「アイテム」と呼ぶことにする. 各ユーザー \(i \in n\) と アイテム \(j \in m\) について, ある実数 \(X_{ij}\) が観測されるとする. 従って \(X\) は \(n \times m\) 行列として表現される.
ここで観測には当然ながらノイズが乗るものだから, \(X_{ij}\) は真の値 \(\tilde{X}_{ij}\) にノイズ \(E_{ij}\) が加えられたものである.
\[X = \tilde{X}+E\]ここでノイズは
\[E_{ij} \sim \mathcal N(0, \sigma^2)\]というガウス分布からサンプリングされた値だ.
\(X\) を観測したときに, 真の値 \(\tilde{X}\) を推測したいと思うのは自然な欲求である. 行列分解モデルは \(X\) から \(\tilde{X}\) を推測するための枠組みである.
小さな自然数 \(d < \min\{n,m\}\) を適当に選んで, 2つの行列 \(A \in \mathbb R^{n \times d}\) , \(B \in \mathbb R^{m \times d}\) によって
\[\tilde{X} = A B^T\]なのだとモデル化する. \(\tilde{X}\) のランクは自動的に \(d\) 以下になっていることに註意.
\(A\) の第 \(i\) 行ベクトルを \(A_i\) とし, 同様に \(B\) の第 \(j\) 行ベクトルを \(B_j\) とすれば,
\[X_{ij} = A_i B_j^T + E_{ij}\]と言っている.
ノイズにガウス分布を仮定した場合の最尤推定は自乗誤差最小化になる. 即ち, 行列分解モデルが \(A,B,\sigma\) の下で \(X_{ij}\) を観測する確率は,
\[P(X_{ij} \mid A,B,\sigma) = \beta \exp\left[ - \alpha (X_{ij} - A_i B_j^T)^2 \right]\]ここで \(\alpha, \beta\) は正の定数.
同様に \(X\) を観測する確率は,
\[P(X \mid A,B,\sigma) = \beta^{nm} \exp\left[ - \sum_n \sum_m \alpha (X_{ij} - A_i B_j^T)^2 \right]\]である. 最尤推定をするならば, これを最大化すればよくて, 結局
\[\min_X \sum_n \sum_m (X_{ij} - A_i B_j^T)^2\]を解けばよいことになる.
言い忘れてたけど(言わなくても分かると思って), 自然数 \(n, m\) に対して \(n=\{1,\ldots,n\}\) , \(m=\{1,\ldots,m\}\) という記号も混ぜて用いている.
線形で(活性化しない)、中間層が一層だけの多層パーセプトロンによる回帰モデルを考える. 問題設定はさっきと同じで.
\(X\) または \(\tilde{X}\) は \(n \times m\) 行列なので, 左から掛けることによって \(\mathbb R^n \to \mathbb R^m\) なる(線形)関数だと見做せる.
\[X : \mathbb R^n \to \mathbb R^m\] \[X : x \mapsto Xx\]線形関数は基底の写し方だけを調べれば決まるので, \(\mathbb R^n\) の基底として, \(i\) 番目だけ \(1\) で他が全部ゼロなベクトル
\[\delta_i = \left[ 0,\ldots,0,1,0,\ldots,0 \right]^T\]を \(x\) として入れることを考えると,
\[X \delta_i = x_i\]ここで, \(X\) の \(i\) 列 目を \(x_i ( \in \mathbb R^m)\) と書いた.
今からこの \(X\) 関数を線形一層回帰モデルで表現する. ここで中間層のユニット数を \(d < \min\{n,m\}\) とする.
\[\mathbb R^n \to \mathbb R^d \to \mathbb R^m\]最初の1層目を行列 \(B \in \mathbb R^{d \times n}\) , 2層目を行列 \(A \in \mathbb R^{d \times m}\) とすれば, この多層パーセプトロンは,
\[y = ABx\]と書ける.
ところでやっぱりガウス分布のノイズを仮定すると, 真の \(y\) と \(ABx\) との差の自乗誤差の最小化が最尤推定になる. ここで \(x\) を \(\delta_1, \ldots, \delta_n\) で考えると,
\[\min \sum_n \| x_i - (AB) \delta_i \|_2^2\]ベクトルのL2ノルムを分解して書けば,
\[\min \sum_n \sum_m ( X_{ij} - A_i B_j )^2\]となって, さっきの行列分解と全く同じことをしていたことがわかる (それはそう).
というわけでこの2つのモデルは等価である. それはいいとして. 結局なんでこれが良いモデルなんだろう?
余談. 自乗誤差の最小化を実際に適当なソルバでさせるとき, ゼロに近づけば近づくほど上手く学習したとつい思いがちだが, それはおかしい. 正規分布のノイズを仮定しているのだから, 真の予測ができたときの自乗誤差の平均は \(\sigma^2\) である. 本当に自乗誤差がゼロに近いなら, ノイズがそもそも無いと思ったほうが良いことになる.