ニューラルネットワークに提供する数字の列であるベクトルは、より一般的な数学的構造であるテンソルのサブクラスです。テンソルとは、次元を複数持つことのできる配列を指します。

Y軸に沿って伸びる行、そしてX軸に沿って伸びる列によって構成された行列というものを皆さんは既にご存知でしょう。1つの軸によって1つの次元が設けられます。テンソルは次元を複数持つことができます。

また、テンソルにはランク(rank)と呼ばれるものもあります。スカラー、あるいは数字1つは、ランク0、ベクトルはランク1、行列はランク2です。ランク3またはそれ以上はすべてテンソルと呼ばれます。

スカラーは点、ベクトルは線、行列は平面、テンソルは3次元以上の物体と言ったほうが分かりやすいでしょうか。行列は行と列の2次元であるため、ランク2と呼ばれます。色イメージを表現するのに使用される3次元テンソルは、チャネル、行、列を持つため、ランク3となります。

複数の次元を持った数学的な物体として、テンソルはシェイプを持ち、テンソルをn次元配列として扱うことによりシェイプを指定します。

ND4Jについては、新しいND配列を作成し、それにデータ、シェイプ、順序をパラメータとして提供します。これを疑似コードで表すと以下のようになります。

nd4j.createArray(データ, シェイプ, 順序)

実際のコードだと、

INDArray arr = Nd4j.create(new float[]{1,2,3,4},new int[]{2,2},'c');

のように4つの要素で構成されています。シェイプが2 x 2、順序が「行優先」、デフォルトのCです(これに対して「列優先」はパラメータ「F」で表されます)。この2つの順序の区別は、表で見るのが最も分かりやすいでしょう。

行優先 (C) 列優先 (Fortran)
[1,2] [1,3]
[3,4] [2,4]

いったんn次元の配列を作成したら今度はそのスライスを使って作業をしたいこともあります。データを複製すると高いので、それより単に複数次元のスライスを「ビュー」することができます。配列の1スライス「a」は以下のように定義することができます。

a[0:5,3:4,6:7]

このスライスにより、n次元から最初の5チャネル、3~4行目、6~7列目などが得られます。各次元のスライスはコロンの前後の数字で表現されています。

線形バッファー

行列は2次元平面、3次元テンソルは立体形のボリュームとして想像すると理解するのに役立ちますが、すべてのテンソルを線形バッファー(linear buffer)として保存します。つまり、テンソルはすべて数字の列にしてしまうのです。

線形バッファーについては、ストライド(stride)というものを指定します。ストライドは、どのように表現を解釈するかを計算層に教えるものです。次のチャネル、行、列に行くためにバッファー内で飛ばす要素の数を指します。各次元にストライドが1つあります。

こちらは、ND4Jで使用するために、どのようにしてテンソルが線形バッファーに変換されるかを簡潔に説明したビデオです。

その他のリソース、用語定義

テンソル(tensor)という語はラテン語のtendere、英語の「to stretch(伸ばす)」という語から派生したものです。テンソルは伸ばすもの(stretcher)と関連しています。元々、テンソルという語は、1898年にWoldemar Voigt(ヴォルデマール・フォークト)によって作られたドイツ語が1915年に英語に導入されたものです。数学的な物体がテンソルと呼ばれるのは、最初は張力により伸びた物質の研究に使っていた語だからです。

テンソルとは、スカラー(インデックスのないもの)、ベクトル(インデックスが1つのもの)、行列(インデックスが2つのもの)を任意数のインデックスへと一般化したものです。- Mathworldより

テンソル(名詞) 数学上の物体で、ベクトルと類似しているがより総称的な呼び方。空間の座標関数である要素の配列で表される。