クーの自由研究

マスターの かえるのクーは8年の任期を終え消失しました。クーⅡ世の中の人絶賛募集中です。(特にオリオン座&プレイアデス方向の方は優遇します)助手がメイド喫茶から生還し、リハビリを兼ねて復帰しています。

複素数テンソル同士の類似度は???

完全に行き詰ったきょうこのごろ

複素数ってとってもセクシーで素敵だと思えてきた、かえるのクーの助手の「井戸中 聖」(いとなか セイ)でございます。

f:id:AssistantOfKoo:20211129185234p:plain f:id:AssistantOfKoo:20211129190212p:plain

さて、早速ですが、自己符号化器ではテンソル・多次元ベクトル間の類似を計算する方法として概ね「内積」を使います。

内積はコサイン類似度に相当します。ほかにユークリッド距離計算を使うものがあります。乱暴に言うと、角度のだいたい同じ程度がコサイン類似度で、位置のだいたい同じ程度がユークリッド距離になります。

遠くからある目標に近づく場合、最初はユークリッド距離のほうが有用ですが、目標近傍では角度の方が大切になる傾向があると認識しています。

類似度について

自己符号化器では、類似度というより、「類似していなさ度」や距離の差を「コスト」「エラー」としてこれを手掛かりに偏微分して最適(とおもわれる)解を求めていきます。

f:id:AssistantOfKoo:20211129194208p:plain

実数の場合はこれでいいのですが、複素数の内積は類似度を測る計算として用いていいのかが(個人的理解として)わかっていません。複素数テンソルの類似度を評価する方法がいまだに検索できずにいます。複素数は少なくとも「dot」「vdot」などの内積計算では類似性は計算できない感覚があります。(具体的説明がどこにもみつからないので、自分の感覚でしかありません)

単に次元が倍になるのとは違う気がするし

一番直観的なのが、複素平面を通常のユークリッド空間とみなしてユークリッド距離を計算するのがいい気がします。ただし、「類似度合」を計算する場合は、実数の距離と虚数の距離をそれぞれ個別に計算しないといけない感じがしています。自分でも何をいっているのか分かりません。

高校・大学の教科書のラインに沿った説明はあるのですが、私の興味のある「ニッチ」な部分の説明は「ニッチ」だけあって見つかりません。私の求める距離は複素数の疑似空間距離「=実数」ではなく「複素数」としての距離(距離も複素数)だからです。

いろいろ考えてみます。引き算すればいいだけ説も捨てがたいですが、ほしいのは1次元複素数です。シンプルに考えればよいのかもしれません。

今週のお題となりそうです。

numpy.einsum という知らないテンソル/ベクトル計算がでてきたので、勉強します。

結局複素数はよさげなの、どうなの?

下の記事(直訳)などを読むと、萎えますが、進んで失敗することも自由研究の心意気です!

そう囁くのよ私のゴーストが

根拠はありませんが、「まな板の上のおさかな」は必要なので、複素数テンソル同士の類似距離を以下に仮定してみます。A, Bは複素数テンソル/多次元ベクトルです

注意:以下の式はあくまで実験用のもので、数学的には根拠がありません。

単純な複素差

単純な複素差=AとBのリアル成分の差の総和+AとBの虚数成分(実数)の差の総和 × i(虚数単位)

\displaystyle{iDiff = \sum_{ijk...} Real(A _{ijk...} - B _{ijk...}) + \sum_{ijk...} Image(A _{ijk...} - B _{ijk...}) * i}

単純な複素数内積距離(実数と虚数を分離計算)

単純な複素数内積距離=AとBのリアル成分の内積 + AとBの虚数成分(実数)の内積× i(虚数単位)

\displaystyle{iDist = \sum_{ijk...} (Real(A _{ijk...}) * Real(B _{ijk...}))}
\displaystyle{\ \ + \sum_{ijk...} (Image(A _{ijk...}) * Image(B _{ijk...})) * i}

類似度でみるなら、上記の項をそれぞれ

\displaystyle{\sqrt{\sum_{ijk...} (Real(A _{ijk...})) ^2} \sqrt{\sum_{ijk...} (Real(B _{ijk...})) ^2} }   ,

\displaystyle{\sqrt{\sum_{ijk...} (Image(A _{ijk...})) ^2} \sqrt{\sum_{ijk...} (Image(B _{ijk...})) ^2} }

で割ればよいかもです。(実数と虚数の)位相を意識した比較をしたければ、全項を

\displaystyle{\sqrt{\sum_{ijk...} (Real(A _{ijk...})) ^2 \sum_{ijk...} (Real(B _{ijk...})) ^2 + \sum_{ijk...} (Image(A _{ijk...})) ^2 \sum_{ijk...} (Image(B _{ijk...})) ^2 } }

で割ればいいかもです。完全になんちゃって!です。

単純ユークリッド複素距離(実数と虚数を分離計算)

単純な複素数ユークリッド距離=AとBのリアル成分のユークリッド距離+AとBの虚数成分(実数)のユークリッド距離 × i(虚数単位)

\displaystyle{uDist = \sqrt{\sum_{ijk...} (Real(A _{ijk...} - B _{ijk...})) ^2}}
\displaystyle{\ \ + \sqrt{\sum_{ijk...} (Image(A _{ijk...} - B _{ijk...})) ^2} \ * i }

としてみます。複雑に考えずに、「なんかこれでいいのでは?」という気になってきました。正規化が必要な感じはしますが、とりあえずはこれですすめます。。。

数式を書くとおバカな発案でも頭よさげにみえるかもです

内容は高校で習った3平方の定理そのものです。

でも、ブログの伝説のジンクスに『数式を書くと「誰も読んでくれなくなる」』があるそうです。もともと、読んでくださる方は極端に少なく、わたくしのダジャレにも耐性がある強者な方々なので、たぶんへっちゃらです!(もちろん貴方も含まれてます)