テンソル とは
テンソルという言葉は難しく聞こえますが、すでに知っているものを一つの梯子に通した名前です。一マス = ただの数、スカラーです。一列に並べるとベクトル、格子に広げると行列、格子を何層も積むと立方体です。インデックスが何個要るかが、そのまま階数 (rank) です。0 個、1 個、2 個、3 個。二つのベクトルを外へ掛けた外積 u⊗v = u vᵀ は、最も単純な rank-1 行列を作り、どの行列もこのような断片の和で積めます。SVD がまさにそれでした。行列は二つのベクトルを食べて数一つ、uᵀ M v、を吐き出すこともあります。画像一枚も学習の束一つも、すべてテンソルです。梯子を一段ずつ上ります。マスが点から線へ、面へ、塊へ育つのが、その梯子です。外積の格子が最も単純な行列で、色のチャンネルを積むと白黒の格子が塊になります。
ボタンで階数を一段ずつ上げます。rank 0 はマス一つ、ただの数です。場所を指すインデックスは要りません。rank 1 はマスを一列に伸ばしてベクトルになり、どのマスかを選ぶにはインデックスが一つ要ります。rank 2 は列を格子に広げて行列になり、何行何列なのでインデックスは二つです。rank 3 はその格子を何層も積んだ立方体なので、インデックスは三つです。階数がインデックス軸の個数だということが、一目で見えます。形もいっしょに育ち、点から線へ、線から面へ、面から体積へ行きます。テンソルは新しい怪物ではなく、知っているものを同じ梯子に立てた名前です。
二つのベクトルを外へ掛けて行列を作ります。スライダーで u = (u1, u2) を左の縦に、v = (v1, v2) を上の横に置くと、格子のマス (i, j) には ui · vj が入ります。つまり u⊗v = u vᵀ です。左の値と上の値を掛けたものがその場所の数で、マスは値に応じて濃く淡く塗られます。u を大きくすると行全体が大きくなり、v を大きくすると列全体が大きくなります。どう回しても、この行列のランクはいつも 1 です。すべての行が u の倍数、すべての列が v の倍数なので、独立な方向は一つだけだからです。外積は最も単純な行列、rank-1 の煉瓦です。
ふつうの行列は、rank-1 の煉瓦をいくつか積んで作ります。ボタンで層を一つずつ足せます。層 1 は最初の断片 σ1·u1·v1ᵀ だけで、目標行列の大きな輪郭だけを粗くまねます。層 2 を足すと σ2·u2·v2ᵀ が残りの差を埋め、和が目標行列に合います。画面には、いま作り直した行列と目標を並べ、両者の差も数で見せます。これが SVD の核心です。どの行列も A = Σ σk uk vkᵀ、つまり rank-1 断片の和で、大きい σ からいくつか残すだけでも形はほとんど残ります。圧縮はここから出ます。大きい断片を残すことが、形を保ったまま縮める方法です。
行列は変換ではなく、二つのベクトルを食べる機械としても見られます。固定した行列 M に左から u を、右から v を挟むと数一つが出て、それが uᵀ M v です。これが rank 2 テンソルである行列が、二つのベクトルを受け取ってスカラーを出す双線形形式です。座標平面で u と v の矢印をドラッグすると、下の数字板に uᵀ M v の値がすぐ出ます。一方を固定して他方だけを大きくすると、結果もその分大きくなります。二つの引数それぞれに線形なので双線形です。長さを測る内積、エネルギー ½ xᵀ K x、曲率、応力のように、二つの方向を食べて数一つを返す量は、すべてこの枠です。
テンソルが機械学習の基本の器である理由を見ます。ボタンで次元を一軸ずつ足せます。白黒画像一枚は画素の明るさの格子、つまり [H, W] 行列で rank 2 です。色を入れると赤と緑と青の三チャンネルが積まれ、[H, W, 3] の立方体、rank 3 になります。何枚かを一度に学習すると、その立方体を N 個重ねて [N, H, W, 3]、rank 4 になります。画面は軸を足すたびに、形の名前と格子がどう積まれるかをいっしょに見せます。テンソルは飾りではなく、データのいくつかの軸を一つの器に入れる実用の器です。深層学習の枠の名前に Tensor が入る理由です。