深層学習を勉強する時、私はTensorFlowを使ってモデル構築するのですが、よく考えたらTensorって何なのか言葉で説明できません。
この記事ではTensorの概略を説明できることを目的とします。
Tensorとは
結論から言うと、Tensorとは多次元配列のことです。
私たちはよくデータを扱う時、スカラーやベクトル、配列を使います。要はこれらをまとめて管理するためにTensorという枠組みを用意しているだけなのです。
ここでTensorでは階という単位を用いて、
スカラー : 0階のTensor
ベクトル : 1階のTensor
行列 : 2階のTensor
三次元配列: 3階のTensor
・・・
という風に表します。メリットは〇階のTensorと言うことでデータの形をイメージできることですね。しかし二次元配列ならともかく、多次元配列なんてイメージすら出来ないですよね。そこで数式的に見てみましょう。
まず、0階のTensorの式は
x
のみです。これはただ任意の数字があるだけですね。次に1階のtensorを見ると、
x_i
となり、添え字の$i$が付き、何番目の成分か取り出せるようになりました。さらに2階のTensorでは
x_{ij}
と記述できます。そもそも1階のTensorを$j$個並べたものなので、$j$個目の1階Tensorの$i$番目の成分だと理解できます。3階、4階のTensorでも同様に添え字が増えていくだけなのですが、ここで大事なのは
D階のTensorであれば、D個の添え字をつければ表現可能である
ちなみに添え字が後ろの方にあるほど、高次のTensorを示していることになります。(例外もあると思いますが、一般的にはそのような認識で大丈夫だと思います)
データもTensorで表せれる
例えばグレースケールの画像を考えてみましょう。28×28ピクセルの画像であれば、
x_{ij} (i, j = 1, ..., 28)
と表せます。各$i, j$にピクセルの黒さの値が入ってます。グレースケールの動画であれば
x_{ijt}(t=1, 2, ...)
とでも表せます。この場合3階のTensorとなり、tはフレームです。他にもセンサーデータや音声などもTensorで表現可能であり、だからこそTensorは有用なのですね。
また、データの流れも添え字から見えてくると感じています。例えば畳み込みニューラルネットワークでグレースケール画像$s_{ij}$にn個フィルタ$f$を通す時、フィルタに添え字kを与えると、フィルタを通った後の画像は
y_{ijk} = f_k(x_{ij})(k=1, ..., n)
と表せます。今まで$y_{ijk}$だけ見てもよく分からなかったのですが、添え字の順番に注目するだけでも理解が進みます。
数学的なTensor
上記だけでも概要は理解できましたが、深層学習でもテンソル積という計算が使われることがあり違いが分かりません。そこでより数学的なTensorにも触れてみたいと思います。
※私は数学は専門外なので、概念の理解が出来ればOKとします。
そもそもテンソルには
- 代数学における「ベクトル空間のテンソル積」
- 物理や微分幾何における「テンソル場」
- その他,数の高次元配列としてのテンソルなど
といった複数の意味があります。記事の初めに定義したテンソルは3番目の意味ですね。この章では1番目のテンソルについて調べてみます。
この文脈においてテンソル積とは
2つのベクトル空間$V, W$に対して定まる新しいベクトル空間$V \otimes W$
と定義されます。
んーこれだけだと何をしたいのか全く分かりませんね。
時間がかかりすぎるので詳細な証明は参考サイトに載せている高校数学の美しい物語さんの記事をみていただくとして、テンソル積がやりたいことは、
ベクトルの内積を線形写像として扱いたいが、そのような特性は持たない。なので理想的な計算ができるようなベクトル空間$V \otimes W$を作り、内積を線形写像とみれるようにする
これがテンソル積の目的なのですね。線形写像の定義を確認すると、
[引用]https://mathlandscape.com/linear-map/
とあります。
確かに線形写像として扱えるなら計算がとても楽になりそうですね。
まとめ
Tensorという抽象的なことについて、より具体的な説明ができるようになりました。
しかしテンソル積の目的などはまだハッキリと分かっておらず、線形代数を習い直さないとなーと感じました。
参考サイト