テンソル演算の基礎から実務まで—定義・演算・添字表記・分解・実装ガイド

はじめに

テンソル演算は、線形代数での行列演算を多次元へ一般化した概念であり、物理学、微分幾何、機械学習、信号処理など広範な分野で基礎的に用いられています。本コラムでは「テンソルとは何か」から始めて、テンソルに特有の演算(足し算・スカラー倍・外積・縮約・テンソル積・要素積など)、添字表記(アインシュタインの縮約記法)や指標の上げ下げ、数値実装上の注意点、代表的なライブラリと応用まで、できるだけ厳密かつ実務に役立つ形で解説します。

テンソルの定義(数学的視点と計算視点)

数学的にはテンソルはベクトル空間に関する多重線形写像やその成分表示(配位子)として定義されます。つまり、テンソルは「入力に対して線形に応答する多変量の写像」を一般化した概念です。一方で計算的(実装)視点では、テンソルは多次元配列(多次元の数値配列、n 次元配列)として扱われます。両者は密接に対応しますが、注意点として数学でいう「テンソルのランク(rank)」と数値計算で使われる「テンソルのランク(分解でのランク)」は異なる概念である点に留意が必要です。

基本的な用語と表記

  • 秩(order)/階(degree):テンソルの次元の数。ベクトルは1階、行列は2階、3次元配列は3階テンソル。
  • 成分表示:添字 i, j, k ... を用いて T_{i j k} のように表す。添字の位置(上付き・下付き)は、共変・反変を示す(微分幾何や一般相対論で重要)。
  • アインシュタイン縮約記法:同じ添字が上下に現れればその添字について和を取るという省略記法。例:A_i{}^i は A_i^i = Σ_i A_i^i。
  • テンソルのランク(数学):テンソルが表す多重線形写像の性質に関する概念。別に「分解ランク(CPランク)」など計算的なランク概念がある。

主要なテンソル演算

以下にテンソル演算をタイプ別に整理します。説明は配列の形(次元と添字)を念頭に置いています。

加算・スカラー倍

同じ形状(同じモードの次元を持つ)テンソル同士で要素ごとに加算・減算が可能です。スカラーを掛けると全成分がそのスカラー倍になります。行列の線形代数と同様の挙動です。

外積(Outer product)とテンソル積(Tensor product)

ベクトル a (長さ m) と b (長さ n) の外積は m×n の行列(2階テンソル)を作ります。一般に階数 p のテンソルと階数 q のテンソルの外積は階数 p+q のテンソルになります。テンソル積は多くの場合、外積と同義で使われますが、抽象的にはテンソル積空間(圏論的/線形代数的構成)を指すこともあります。

縮約(Contraction)/内積

縮約は添字を合致させて和を取る操作で、テンソルの階を下げます。行列の積は一例で、A_{i k} B_{k j} の k に関して縮約すると(和を取ると)行列積 C_{i j} が得られます。一般にiとjのように同じ添字に対して上下の位置が反対でないと厳密には縮約の定義が成立しない文脈もあります(計量テンソルにより上げ下げ可能)。

要素ごとの積(Hadamard product)

同じ形状のテンソル同士の要素対応で掛け合わせる操作。行列では A ∘ B(ハダマード積)。テンソルの形が一致していることが前提。

転置・添字の置換(Permutation)

テンソルのモード(軸)を入れ替える操作。行列の転置は2階テンソルの特殊ケース。一般的なテンソルでは任意の軸順序への並べ替え(permute / transpose)が可能で、アルゴリズムやメモリレイアウトで重要。

行列化(Matricization)/展開(Unfolding)

高次元テンソルを特定のモードに沿って行列に変換する操作。テンソル分解(例:Tucker分解)や最適化でよく用いられます。行列化は各モードごとの「モード-n 展開」などの呼び名があります。

テンソル分解

テンソルを低次元因子に分解する手法群。代表的なものにCP分解(CANDECOMP/PARAFAC)、Tucker分解、Tensor Train (TT) 分解などがあります。高次元データの次元削減、特徴抽出、圧縮に有用です(詳細は Kolda & Bader (2009) の総説参照)。

添字位置と計量(上げ下げ)

物理や微分幾何でのテンソルは添字の上下(上付き=反変、下付き=共変)を区別します。これらは基底の変換法則が異なるためで、内積や指標の移動(インデックスの上げ下げ)は計量テンソル g_{ij} を使って行われます。計量が存在しない単純な数値配列としてのテンソル(機械学習でのテンソル)は添字の上下を区別しないことが多いですが、理論的解析では重要な概念です。

数値計算上の実装と性能上の留意点

高階テンソルを扱う際は計算コストとメモリコストが急増します。以下は主要な考慮点です。

  • メモリ複雑度:密な k 階テンソルの格納は O(n^k) のメモリを要する(各モードが大きさ n と仮定)。したがって高階密テンソルはすぐに扱えなくなる。
  • スパース性の活用:データが疎であれば圧縮形式(座標形式 COO、CSR など)を用いることでメモリと計算時間を節約できる。
  • メモリレイアウト:連続メモリ(行優先/列優先)に沿った軸順の演算が高速。テンソルの軸入れ替えはメモリの見方を変えるだけでなくコピーコストが発生するため注意。
  • ハードウェア最適化:GPU/TPU を使う際、行列演算(BLAS)の高速化やカーネル設計が重要。テンソルライブラリはしばしば内部で大域的に行列化して既存の高速演算を利用する。
  • 自動微分:機械学習フレームワーク(TensorFlow, PyTorch 等)はテンソル演算に対して自動微分を提供し、勾配計算を自動化する。

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

「ランク」という語は分野により意味が変わりやすいです。

  • 線形代数での行列ランク:行列(2階テンソル)の線形独立な行列/列の数。
  • テンソルの CP ランク(分解ランク):テンソルを最小の外積(一次テンソルの和)で表す際の項数。行列のランクと等価ではないし、決定も困難(NP困難問題の変種)。
  • 多重ランク(モードごとのランク):Tucker 分解で現れる各モードのランク(多次元 SVD に相当)。

したがって「テンソルのランクが小さい=扱いやすい」と単純化するのは危険で、どのランクを指しているのかを明確にする必要があります。

主要ライブラリと実務での使い方

  • TensorFlow / PyTorch:テンソルを基本データ型として高速な自動微分とGPU/TPU対応を提供。機械学習実装で標準。
  • NumPy(numpy.einsum):汎用の多次元配列操作。einsum はアインシュタイン記法風に任意の縮約を指定できる。
  • TensorLy:Python でのテンソル分解ライブラリ。CP、Tucker、TT などの実装を提供。
  • 専用ツール(MATLAB Tensor Toolbox、Kruskal 等):研究用途での高度なテンソル操作・分解.

応用例(概観)

  • 機械学習:ディープラーニングのデータはテンソル(画像は3次元テンソル、バッチを含めると4次元など)。テンソル分解を特徴圧縮やモデル圧縮に利用。
  • 物理学・相対論:テンソルは場や応力の記述に必須。指標の上下と計量は理論の中心。
  • 信号処理:多次元信号の分解やノイズ除去にテンソル分解が使われる。
  • 推薦システム:ユーザー×アイテム×コンテキスト の3次元テンソルの分解で潜在因子を抽出。

数値的・理論的な注意点

  • 丸め誤差と不安定性:高次元演算や大規模縮約は誤差の蓄積に注意。数値安定なアルゴリズム設計が必要。
  • 最適化問題の非凸性:テンソル分解の多くは非凸最適化で局所解に陥りやすい。初期化や正則化が重要。
  • 計算コスト:高次テンソルの直接操作は計算量・メモリともに爆発するため、低ランク近似やスパース化、ストリーミング手法が活用される。

実践的なヒント

  • まず問題の本質を捉えて、テンソルが本当に必要か(行列で済むか)を検討する。
  • 軸(モード)の順序を最適化してメモリアクセスを改善する。必要であれば遅延転置やビュー操作を使う。
  • 可能な限り既存の高度に最適化された BLAS/ライブラリ を利用して、低レベルの最適化はライブラリに任せる。
  • テンソル分解を用いる場合は、分解のランク選定、正則化、交差検証を行う。

結論

テンソル演算は、単なる「多次元配列の演算」以上に、線形代数や微分幾何の理論と接続する深い概念を含みます。計算機上では配列操作として効率的に実装され、機械学習や物理モデルなどで重要な役割を果たします。理論的な定義(添字の上下や計量)と計算的実装(メモリ・性能・ライブラリ)を両方押さえることが、正しくかつ効率的にテンソルを扱う鍵です。

参考文献