📑

テンソルネットワークをわかったつもりになれる記事

に公開

背景

テンソルネットワークは、以前から機械学習への応用が模索されてきた手法であるが、近年は量子コンピューティングとの関連で再び注目され、機械学習の文脈でも少し存在感を見せている。

テンソルネットワークは、ブースティングツリーやニューラルネットワークのような特定のモデルを指すわけではないが、どこか得体の知れない凄さを感じる。だが、いざ学ぼうとすると、量子コンピューティングの話題に引きずり込まれることが多く、よくわからない概念に圧倒されて、困惑して、そっとページを閉じたのは、きっと私だけじゃない。

この度、私はChatGPTに教えを乞いながら、混乱しつつも食い下がって2〜3時間みっちり勉強した結果、「テンソルネットワーク、完全に理解した」状態になったので、その成果を記すことにする。本記事では、量子コンピューティングに一切触れずにテンソルネットワークを理解してもらうことを目指す。実際、テンソルネットワークは量子コンピュータと無関係でも十分に有用だ。

テンソルとは何か

テンソルとは、ベクトルや行列の一般化である。ベクトルは1階のテンソル、行列は2階のテンソル。このあたりは知っている人も多いだろう。

階数とは「添字の数」と捉えるとわかりやすい。たとえば3階以上のテンソルを身近なところで挙げれば、

  • カラー画像:X座標、Y座標、色 → 3階テンソル
  • 動画:時刻、X座標、Y座標、色 → 4階テンソル

機械学習におけるテンソルネットワーク

さて、テンソルネットワークは機械学習においてどんなときに使えるのか。端的に言えば、入力データが高階のテンソルである場合だ。

たとえば前述の画像(3階)や動画(4階)がそうだが、これらにはCNNや3D-CNNなど十分高性能な専用のモデルがある。わざわざテンソルネットワークを使う必要はあまりない。

では他に、高階テンソルを扱う場面とは?それが量子コンピューティングである。量子ビットがN個あれば、量子回路への入力はN階のテンソルとみなして扱う。だからこそ、テンソルネットワークは量子の文脈で語られることが多い。しかし、量子に不慣れな人からすると、難解な概念が波のように押し寄せ、テンソルネットワークの理解までたどり着けない。

高階テンソルは案外そこら中にある

じゃあ量子以外の領域で、高階テンソルが入力になるケースなんてあるのか?実は案外そこらじゅうにある。これに気づくだけでも、テンソルネットワークを学ぶモチベーションは一気に上がる。

サンプル命題

1階のテンソル

企業の売上データから、その企業の業績が将来アップするのか、ダウンするのかを予測するモデルを構築するケースを考える。最も単純な売上データとして、月単位の売上金額を記録した以下のような時系列を考えよう。

, 売上
2025/1, 100
2025/2, 160
2025/3, 130
..

これは添字が月だけだから、1階のテンソル(ベクトル)である。

2階のテンソル

しかし、これだけでは企業の成績はあまり見えてこない。充実させるために商品別に売上を記録したデータを考える。

, 商品A, 商品B
2025/1, 40, 60 
2025/2, 100, 60
2025/3, 80, 50
..

月と商品の2つの軸を持つデータとなり、2階のテンソルになった。

3階のテンソル

さらに、地域別でも細分化するデータもあり得る。

, 商品A-地域a, 商品B-地域a, 商品A-地域b, 商品B-地域b
2025/1, 20, 50, 20, 10
2025/2, 40, 40, 60, 20
2025/3, 30, 50, 20, 30
..

月、商品、地域という3軸のデータであり、3階のテンソルである。

高階のテンソル (横スクロール地獄の世界)

さらに別の軸を加えることも可能だ。購入者の年齢層、購入頻度など、いくらでも細分化して集計できる。これはまさに、高階テンソルを扱っている状況に他ならない。

にもかかわらず、私たちは普段それを「高階テンソル」とは意識していない。なぜなら、私たちが直感的に理解できるのは二次元の表であり、自然とそこに落とし込もうとしてしまうからだ。上述のように、本当は3階テンソルデータなのに、「商品」と「地域」という2つの軸について、全組み合わせを商品A-地域a, 商品B-地域a, 商品A-地域b, 商品B-地域bのように羅列することで、無理やり2次元の表にしてしまう。

こうした“無意識の2次元化”には弊害もある。まず、データサイズの無駄が発生する。
商品×地域くらいの組み合わせならまだしも、さらに年齢層、性別、曜日…と軸を増やしていくと、
軸の数がNになった時、データ量はO(d^N)のオーダーになる(dは各軸の次元数とする。簡単のため全軸同次元として)。

誰しも一度は悩んだ経験があるだろう。データを細かく集計しようとすると、列がやたらと増えて横スクロール地獄になる現象を。あの状態こそ、高階テンソルを力技で平面に押し込んだ結果だ。

実はここまでで、本記事で伝えたかったことの8割くらいはもう押さえている。この時点で「なるほど、意外とテンソルを扱う機会多い」と思えたなら、それだけでも十分。ここから先は、機械学習に興味がある人向け。

機械学習における課題

データ量が増えて保存コストが嵩むだけならまだしも、機械学習でモデルを構築する際にはさらに厄介だ。次元の呪いがのしかかるからだ。つまり、学習データ数に対してパラメータが増えすぎる。

また、列ごとの特徴量も解釈しづらい。たとえば、この超横長の表には、「地域aで30代の人に対する商品Aの売上」のような列が登場することになる。一見細かく見えて有用そうだが、この列が何を意味していて、何が効いているのかが非常にわかりにくい。「地域が重要なのか」「30代という年齢層が効いているのか」「商品Aが鍵なのか」—— 複数の軸の情報が混ざり合っているため、ドメイン知識を適用しようにも判断のしようがない。例えば、たとえば「業績予測において地域の売上傾向はあまり重要でない」と分かっていても、この特徴量を残すべきかどうか迷うことになる。

高階テンソルデータの効率的な表現法 = テンソルネットワーク

ここまで見てきたように、現実世界のデータはしばしば3階、4階、それ以上の高階テンソル構造を持つ。
にもかかわらず、我々はそれを2次元の表に落とし込み表現しようとする。もちろん、2次元の表は人間が認識するために必要な姿なので、仕方ないところはある。しかし、機械学習モデルへのインプットデータとして見た時には、二次元の表にしたデータは決して最適な姿ではない。

かと言って、高階テンソルをそのままモデルに突っ込むのも、次元の呪いや、ドメイン知識を活かしにくいといった同様の課題を抱えることになる。

これを解決する手法のひとつがテンソルネットワークであり、中でも最も基本的かつよく使われる形式がMPS(Matrix Product State)である。 MPSでは、N階のテンソルをN個の3階テンソルの連鎖(チェーン)として表現する。これにより、もとのO(d^N)のデータサイズが、O(N d D^2)にまで圧縮される(Dは縮約(内積っぽい計算)に使う内部次元で、実用上それほど大きくないことが多い)。Nの冪乗が消えているところからデータ量が削減できるイメージが湧くだろう。

しかもこの分解の仕方には、嬉しい効果がある。各テンソルは元の軸(例えば「月」「商品」「地域」など)ごとに対応しており、それぞれが意味を持つ構造になる。そのため、「この軸の情報は業績予測に大して寄与しない」といったドメイン知識を反映しやすくなる。実際、影響が薄い軸に対応するテンソルを丸ごと入力から省くことで、モデルを簡素化し、過学習も抑えやすくなる。

例えば、「地域の傾向は、企業の業績予測にあまり関係ない」というドメイン知識があったとしたら、地域軸に対応するテンソルを入力からごっそり省くという判断ができる。

このように、MPSを適用することで、データ量も圧縮できる上に、ドメイン知識でさらに不要な入力も削減でき、過学習を抑える効果が期待できる。

まとめ

本来であれば、この流れでMPSの原理まで踏み込むべきかもしれないが、本記事ではここまでとする。
というのも、「なぜテンソルネットワークが有用なのか」が自分の中で腹落ちして、ひとまず満足してしまったからだ。

今回は、テンソルが実務でどのように現れ、なぜそのままでは扱いづらいのかを整理した。そのうえで、機械学習においてテンソルネットワークがどのように役立つのか、直感的な説明をしてみた。どこか一つでも腹落ちした部分があれば嬉しい。

Discussion