*注意)この「べじぱみゅの学習メモ」のカテゴリー記事は、ワタクシ自身がこれまでに勉強したいろいろな項目について、テキストにあんまり書いてない内容などを勝手に妄想したメモです。
ワタクシ自身の備忘録のために書いており「初学者にわかりやすく説明する」というものではございません。
導入なしに唐突に話が始まり、おそらく意味不明な文章かもしれません。
しかし、せっかく考えたことなので、記事の内容がもし誰か1人でもお役に立てれば幸いです。

テンソルの分解!

ここでは多次元データの解析にたびたび触れますが、今回は”PARAFAC”について紹介します(私自身の勉強も兼ねてですが)。”PARAFAC”とはParallel Factor Analysisのことで、文献によって「CP分解」(canonical polyadic decomposition)と呼ばれることもあり、両者が混在しています。深い意味はないですが私は最初にこの手法を見たとき”PARAFAC”と書かれていてそれが頭に定着してしまったのでここでは以降PARAFACと呼びます。

今回は実用上多い状況である3次元データ(I×J×K成分)を扱います。3次元データは「3次元テンソル」で表されますが、PARAFACの目的はこの3次元テンソルを3つの「行列」に圧縮することです。(”近似”と言ってもいいかもしれません)。具体的には

1

このように3つのI/J/K行N列の行列です。Nの値は特に決まってませんが「圧縮」なので必要最小限の値、たとえば3とか5とかをイメージしてください。これを図で表現すると

2

こんな感じになります。元データ(3次元テンソル)を、Nペアのベクトルの積和で表現します。残念ながらこの近似を行列A, B, Cで簡潔な積の表式にはできないのですが(後でムリヤリ行列表現します)、成分で書くと

3

このように、非常に簡潔な表現になります(というよりこうなるように分解します)。

やっぱりテンソルより行列を・・・

さて、具体的にどうやるのかを考えていきます。本来元データDはテンソルなのですが、やはり3次元テンソル(縦×横×奥行き)はイメージしにくいです(少なくとも私のへっぽこ頭ではムリです)。というわけで元データをムリヤリ行列の形にします。


11


このように、1つめの軸(I水準)を行に、2つめ及び3つめの軸(J水準・K水準)をムリヤリ1軸に並べて列にした行列(I行JK列)です。これに加え、行列BおよびCに関して


5


このようなJK行N列の行列を(天下り的で申し訳ありません)考えます。これは行列BおよびCの成分の「直積」をひたすら繰り返し構成したもので「Khatri-Rao積」という名前がついてるらしいです(初めて知りました)。この表現を用いると


6


このように、元データの近似表現は2つの行列の積の形になります(私基準ではお世辞にも”簡便”とはいえませんが一応)。本当にこんな謎の表現が適切なのかを確認するため、成分を計算してみましょう。
左辺の行列においてdijki行(k-1)J+j列にいます。一方右辺ですが、AはI行N列、相方はN行JK列なのでその積はI行JK列になります。これのi行(k-1)J+j列の成分を計算してみると

7

このようになり、nで和を取るとたしかに
3

これになっていることがわかります。

別の軸をヒイキしよう!

さて、今は元データをI行JK列の行列に(ムリヤリ)表現しましたが、別の表現もできます。たとえば元データを

8

このように表現し、さらに「Khatri-Rao積」

9

これを用いると、テンソル近似表現は

10

このように表せます。さらに元データを

11

このように表現し、さらに「Khatri-Rao積」

12

これを用いると、テンソル近似表現は

13

このように表せます。いずれの表現でも成分をマジメに計算してみると
3

になっています。

で、アルゴリズムは?


さて、表現(目標)は設定できましたが具体的にどうやってこの表現に持っていくのかを考えましょう。ベースの考え方はこのブログでも何度か取り上げた「交互最小二乗法」です。今回はA, B, Cの3つを「同時最適化」しにいくのですが、

1:B, Cを固定してAを最適化
2:A, Cを固定してBを最適化
3:A, Bを固定してCを最適化

これを収束するまで繰り返します。まずは上記1を考えましょう。「最適化」(つまり「最小化」)の対象はこれです。

14


近似表現と元データとの間で、全成分の差の2乗和を最小化
しましょう、という実にまっとうな考えです。このLをAの成分で微分してゼロとおくことで(それなりに面倒な計算ですが普通に頑張ればできます)

15

こうなります。これが「Aの更新式」です。CTCBTBの間にある*は行列の「アダマール積」で、同じ形の行列の成分同士を掛け算し(行列の掛け算とは違います)、結果の成分としたものです。

プログラムで計算するなら別にこのままでいいのですが、どうもこの式は気持ち悪い(*個人の感想です)ので、少しいじってみます。右辺第1項と2項の積は

4



5

これらの積なのでI行N列の行列になるわけですが、その(i, n)成分は

16

こうなります。ちょっとスッキリしてきました。そこでこの行列および成分を

17

このように置くと、アダマール積は可換なので

18


こうなります。最初の「更新式」よりだいぶスッキリしました(*個人の感想です)。これと同様に、

19


この表現を用いると、BおよびCの更新式は
20


こうなります。よってまとめると、(3次元)PARAFACのアルゴリズムは以下のようになります。

21

「3次元テンソルを分解する」と銘打つとすごくだいそれたことに聞こえますが(少なくとも私には)、最終的に式を書き出してみると初心者でもなんとかなっちゃいそうに見えますね。この手法、任意の3次元データの解析に使える非常に汎用性の高い手法ですので、いろいろ活用してみましょう。


はっぴぃ理系らいふ、いぇい
ヽ(・ε・)人(・ε・)ノ キミモナカマニナロウゼ
   

【文責 べじぱみゅ】