テンソルとは何か|数学的定義から機械学習・実装・分解まで完全解説

テンソルとは何か(概要)

テンソル(tensor)は、数学・物理学・工学・データサイエンスなどで広く使われる概念で、「多次元の配列」や「多重線形写像」を一般化したものです。日常的にはスカラー(数値)、ベクトル(一次元配列)、行列(二次元配列)の一般化として扱われ、任意の次数(次元数)を持つ配列をテンソルと呼ぶことが多いです。ただし、本来の数学的定義は「基底変換に対して特定の変換則を満たす多重線形写像」であり、単なる配列(array)とは区別されます。機械学習や深層学習の実装上では「テンソル=多次元配列」として使われることが一般的です。

基本概念:次数(階数)と成分

  • 次数(order / degree / rank):テンソルが持つインデックスの数を指します。0次がスカラー、1次がベクトル、2次が行列、3次以上が高次テンソルです。機械学習文脈では「次元(dim)」「ランク(rank)」と呼ばれることもありますが、注意が必要です(後述)。

  • 成分表現:テンソルは成分 T_{i j k ...} のように添字で表されます。例えば 3次テンソルは T_{i j k} と書けます。各添字はそれぞれのモード(軸)に対応する成分空間の基底に依存します。

  • 基底依存性:数学的テンソルは座標変換の法則に従います。つまり、基底を変換すると成分は特定の方法で変化します(共変/反変の扱い)。これが単なる配列との大きな違いです。

数学的定義(簡潔な説明)

厳密には、テンソルはベクトル空間 V とその双対空間 V* に関する多重線形写像として定義できます。たとえば、(r, s) 型テンソルは、r 個の双対ベクトル(線形汎関数)と s 個のベクトルを受け取りスカラーを返す多重線形写像です。このときテンソルの成分は、選んだ基底に依存して決まります。

添字表示での変換規則は次のような形で表されます(行列による基底変換 A を用いる簡略形):新しい成分は元の成分に変換行列を掛け合わせたものになります。各添字ごとに変換行列またはその逆行列が作用します。

添字記法とアインシュタインの縮約記法

テンソル計算では添字を用いる表記が便利です。アインシュタイン記法(縮約記法)では、上下の同じ添字を繰り返すと和(縮約)を取ることを意味します。例えば行列積は A_{i k} B_{k j} = C_{i j} のように書けます。テンソル計算での縮約は、テンソルの内積やトレースなど多くの操作を簡潔に表現します。

主要なテンソル演算

  • 外積(outer product):ベクトル u と v の外積は二つのテンソルを結合して高次テンソルを作る操作です。u_i v_j = T_{i j} のように書けます。

  • 縮約(contraction):ある添字対について和を取る操作です。行列でいう行列積やトレースが該当します。

  • モード積・k-モード積:高次テンソルと行列を特定の軸(モード)で掛ける操作。テンソル分解や多変量解析で頻出します。

  • 転置・配列操作:添字の入れ替え(軸の入れ替え)、リシェイプ(形状の変更)、連結など、配列としての操作も多用されます。

  • アインシュタインの和記法(einsum):複雑な縮約や軸操作を指定するための便利な記法で、実装上も numpy や TensorFlow、PyTorch の einsum 関数でサポートされています。

テンソルの「ランク」についての注意点

「ランク(rank)」という語は文脈によって異なる意味を持ちます。

  • テンソルの次数(order):先に述べた添字の数。0次・1次・2次などを指す。

  • 行列のランク:2次テンソル(行列)に対しては一次独立な行や列の数を指す古典的な概念。

  • テンソルランク(CPランク):高次テンソルに対しては「最小の外積の和で表せる数」をランクと呼ぶ定義があり、これは計算的に難しく(NP困難)行列のランクとは性質が異なります。

物理学・工学におけるテンソル

物理学や連続体力学では、テンソルは座標変換則に従う量として扱われます。代表例:

  • 張量場:位置ごとにテンソルを割り当てる場。力学での応力テンソル(Cauchy stress tensor)、物質の変形を表すひずみテンソルなど。

  • 一般相対性理論(GR):時空の計量テンソル g_{μν} が重力と時空の幾何を記述します。張量の変換法則は物理量の座標不変性を確保します。

機械学習・深層学習におけるテンソル

機械学習分野では、テンソルはデータやモデルのパラメータを表す多次元配列として扱われます。フレームワーク(TensorFlow、PyTorch、NumPy など)におけるテンソルは次のような特徴を持ちます:

  • 形状(shape):各軸のサイズ(例:(batch, channels, height, width))

  • データ型(dtype):浮動小数点(float32, float64)、整数、ブール、量子化(int8)など

  • デバイス(device):CPU、GPU、あるいは TPU などの計算単位に配置できる

  • 自動微分(autodiff):テンソルは演算履歴を持ち、逆伝播(バックプロパゲーション)で勾配を計算できることが多い

  • ブロードキャスト:異なる形状のテンソル同士の演算で、サイズ1の軸を自動拡張して演算を行うルール

ここで重要なのは、機械学習でいう「テンソル」は数学的テンソルの「座標変換則」を必ずしも満たすものではなく、実務上は「多次元配列」として非常に有用に扱われている点です。

テンソルの実装上の注意点

  • メモリレイアウト:配列は行優先(C 記法)や列優先(Fortran 記法)でメモリに配置されます。stride(ストライド)やビュー(view)操作により予期せぬコピー発生やパフォーマンス差が出ます。

  • コピーとビュー:リシェイプやトランスポーズの多くはビュー(データを共有)ですが、ある操作ではデータのコピーが発生するためコストに注意が必要です。

  • 量子化と省メモリ表現:推論の効率化のために int8 などで量子化されたテンソルが使われます。精度と効率のトレードオフがあります。

  • スパーステンソル:多くの要素がゼロの場合、疎な表現(インデックス付きデータ、CSR/COO など)がメモリ・計算効率上有利です。

  • ハードウェア特化:NVIDIA の Tensor Core のようにテンソル演算を高速化する専用ユニットがあり、データ型やアライメントに依存した最適化が必要です。

テンソル分解・低ランク近似

高次テンソルの解析ではテンソル分解が重要です。代表的な分解:

  • CP 分解(CANDECOMP / PARAFAC):テンソルを原子的な外積の和で表す方式。テンソルランクに相当する最小の項数で表すことを目指します。

  • Tucker 分解:中心テンソル(コア)と複数の因子行列に分解する方法で、行列の特異値分解(SVD)を高次元に拡張したようなものです。

  • テンソル列挙(TT)やHT 分解:高次元テンソルをコンパクトに表現するための方法で、高次元データの次元呪いに対処する用途があります。

これらは信号処理、推薦システム、非負行列分解の一般化、スパース表現学習など幅広い応用があります。Kolda & Bader のレビュー(2009)はテンソル分解の総説として定評があります。

実践例(簡単な数式例)

ベクトル u ∈ R^m、v ∈ R^n の外積 u ⊗ v は m×n 行列 M で M_{i j} = u_i v_j です。3次テンソル T に対してモード-1 行列積(行列 U と掛ける)は、(U ×_1 T)_{a j k} = U_{a i} T_{i j k} のように書かれます(和は縮約)。

よくある誤解と注意点

  • 機械学習のテンソル=数学的テンソル:実装上は多次元配列であり、座標変換の意味を持たないことが多い点に注意。

  • ランクの混用:次数(order)とテンソルランク(外積和の最小数)を混同しないこと。

  • 高次テンソルの計算困難性:高次テンソルに対する最適化問題やランク決定は計算量的に難しい場合がある(NP困難な問題が含まれる)。

応用分野の例

  • 物理学・連続体力学:応力・ひずみ・ヤコビアン・計量テンソルなど。

  • 機械学習・深層学習:入力データ、畳み込みカーネル、重み行列などの表現。

  • 信号処理・時系列解析:多チャネル時系列データの高次表現と分解。

  • 推薦システム:ユーザ×アイテム×コンテキスト の高次データ表現。

  • コンピュータビジョン・自然言語処理:画像や文脈を高次テンソルでモデル化する手法。

まとめ — 実務での使い方のポイント

  • 実務的には「テンソル=多次元配列」として捉えて問題ありませんが、理論的背景(変換法則、共変性・反変性)を知っておくと物理や幾何的な問題での誤用を避けられます。

  • テンソル演算の効率(メモリレイアウト、コピー、デバイス間転送)を意識すると、大規模モデルや実運用での性能が大きく変わります。

  • 高次テンソル解析(分解、低ランク近似)はデータ圧縮や特徴抽出に強力ですが、計算コストと数理的な難しさを伴います。

参考文献