このブログの更新は X(旧Twitter)アカウント @m_hiyama で通知されます。
Follow @m_hiyama

ご連絡は上記 X アカウントに DM にてお願いします。

参照用 記事

相対モナドと集合係数の線形代数

集合を係数〈スカラー〉とするベクトルや行列の計算は、相対モナドを使うとうまく定式化できます。やってみましょう。小手調べとして、自然数係数の有限次元行列の計算についても述べます。$`\newcommand{\cat}[1]{\mathcal{#1}}
\newcommand{\mrm}[1]{\mathrm{#1}}
\newcommand{\mbf}[1]{\mathbf{#1}}
\newcommand{\msf}[1]{\mathsf{#1}}
%\newcommand{\o}[1]{\overline{#1}}
\newcommand{\id}{\mathrm{id}}
%\newcommand{\op}{\mathrm{op}}
\newcommand{\In}{\text{ in }}
\newcommand{\hyp}{ \text{-} }
%\newcommand{\twoto}{\Rightarrow }
\newcommand{\KC}{\mathop{;;}}
`$

内容:

相対モナド

相対モナドは、最近の記事「二重圏化と米田モナド」でも触れました。米田モナドや反対余米田モナド*1は、相対モナド(正確に言えば、相対スードモナド)です。

相対モナドが通常のモナドと違うのは、ルート関手〈root functor〉と呼ばれる関手の上に定義されることです。ルート関手が恒等関手なら、通常のモナドになります。

相対モナド〈relative monad〉の構成素は「二重圏化と米田モナド // 反対余米田モナド」に書いてますが、以下に繰り返します。「{‥‥}?」は、用語の省略可能な部分を表します。

  1. 2つの圏: $`\cat{C}, \cat{D}`$
  2. ルート{関手}?〈root {functor}?〉: $`J:\cat{C} \to \cat{D}`$
  3. {対象}?コンストラクタ〈{object}? constructor〉: $`T:|\cat{C}| \to |\cat{D}|`$
  4. 単位〈unit〉: $`A\in |\cat{C}|`$ ごとに射 $`\eta_A: J(A)\to T(A)\In \cat{D}`$
  5. {クライスリ}?拡張{演算}?〈{Kleisli}? extension {operator}?〉: $`A, B\in |\cat{C}|`$ ごとに関数 $`\mrm{Ext}_{A, B}: \cat{D}(J(A), T(B))\to \cat{D}(T(A), T(B))`$

相対モナドの法則〈公理〉は書いてなかったので、ここで書き下します。普通のモナドの法則は「絵算で見る、拡張スタイルのモナドとモノイド・スタイルのモナド // 拡張スタイルのモナドの定義」に書いてあります(過去記事の記法は少し特殊ですが)。

状況設定は:

$`\quad A, B, C\in |\cat{C}|\\
\quad f:J(A) \to T(B) \In \cat{D}\\
\quad g:J(B) \to T(C) \In \cat{D}
`$

法則は(実は普通のモナドと同じ):

  1. $`\eta_A ; \mrm{Ext}(f) = f \In \cat{D}`$
  2. $`\mrm{Ext}(\eta_A) = \id_{T(A)} \In \cat{D}`$
  3. $`\mrm{Ext}( f;\mrm{Ext}(g) ) = \mrm{Ext}(f); \mrm{Ext}(g)\In \cat{D}`$

通常のモナドの場合、上記の法則で定義される“拡張スタイルのモナド”と、自己関手圏のモノイドとして定義される“モノイド・スタイルのモナド”が同値である(同じ概念を定義する)ことは、「絵算で見る、拡張スタイルのモナドとモノイド・スタイルのモナド」で絵により示しています。

相対モナドに関しては、モノイドとしての定義は無理で、斜モノイド圏〈skew monoidal category〉内の斜モノイド〈skew monoid〉*2という代数構造が必要になります(「モナド-セオリー対応はラックス斜モノイド関手だろう」参照)。斜モノイドはモノイドに比べて扱いにくいシロモノになりますが、拡張スタイルの相対モナドは通常のモナドとだいたい同じ感覚で扱えます。

自然数係数の有限次元線形代数のために

自然数を係数としたベクトルや行列の計算のための相対モナドを定義しましょう。相対モナドの固有名はサンセリフ体で書くことにして、これから構成する相対モナドを $`\msf{NFLin}`$ とします。'N' は Natural number から、'F' は Finite dimensional から、'Lin' は Linear algebra からです。自然数では引き算・割り算が自由にできないので、半線形代数〈semi-linear algebra〉しか展開できないのですが、名前は 'Lin' としておきます。

個別特定の相対モナド $`\msf{NFLin}`$ の構成素は次のように表します。

$`\quad \msf{NFLin} = (J^\msf{NFLin}, T^\msf{NFLin}, \eta^\msf{NFLin}, \mrm{Ext}^\msf{NFLin})`$

しかし、記法が煩雑になるので、次のようなイイカゲン記法を採用します。

  • $`J^\msf{NFLin}`$ は単に $`J`$ と書く。(一般論と同じ記号をオーバーロード)
  • $`T^\msf{NFLin}`$ は単に $`T`$ と書く。(一般論と同じ記号をオーバーロード)
  • $`\eta^\msf{NFLin}`$ は $`\delta`$ ($`\eta`$ ではない)と書く。
  • $`\mrm{Ext}^\msf{NFLin}`$ は上付きのシャープ記号($`f^\#`$ など)で書く。

具体的な定義を与えます。

  • $`J`$ は、包含関手 $`\mbf{FinSet} \hookrightarrow \mbf{Set}`$
  • $`A\in |\mbf{FinSet}|`$ に対して、$`T(A) := \mrm{Map}(A, \mbf{N})`$
  • $`A\in |\mbf{FinSet}|`$ 、$`a\in A`$ に対して、$`\delta_A(a) := \lambda\,\xi\in A.(\text{if }\xi = a \text{ then }1\text{ else }0)`$
  • $`f:J(A) \to T(B)`$ に対して、$`f^\#: T(A)\to T(B)`$ の定義は以下に説明。

$`\delta_A(a)`$ が $`A\to \mbf{N}`$ という関数(デルタ関数)であることに注意してください。$`T(A) = \mrm{Map}(A, \mbf{N})`$ の要素(自然数値関数)は、$`\delta_A(a)`$ 達の線形結合(正確には半線形結合)で書けます。

$`\quad x = \sum_{a\in A}x(a)\delta_A(a)`$

$`A`$ は有限集合なので、総和は有限和となりちゃんと計算できます。$`x(a)`$ を $`x^a`$ と書くことにします。上付きだけど累乗じゃなくてインデックスです。インデックスとは引数〈argument〉のことなので、$`x^a`$ と $`x(a)`$ は同義です。デルタ関数 $`\delta_A(a)`$ を $`\delta_a`$ と略記すると:

$`\quad x = \sum_{a\in A}x^a\delta_a`$

古典テンソル計算の雰囲気*3になってきました。アインシュタインの総和規則〈Einstein summation convention〉を使って総和記号を省略すれば:

$`\quad x = x^a\delta_a`$

ここでは、アインシュタインの総和規則は使いませんけど。

さて、写像 $`f:J(A) \to T(B) \In \mbf{Set}`$ のクライスリ拡張 $`f^\# = \mrm{Ext}^\msf{NFLin}(f)`$ を定義します。$`T(A)`$ の要素 $`x`$ を $`\sum_{a\in A}x^a\delta_a`$ の形で書くことにします。

$`\text{For }x \in T(A)\\
\quad f^\#(x) = f^\#(\sum_{a\in A}x^a\delta_a) :=
\sum_{a\in A}x^a f(a)
`$

$`x^a`$ は自然数なので、$`f(a)\in T(B)`$ のスカラー倍 $`x^a f(a)`$ は定義可能で、有限総和も計算できます。$`f^\#(x)`$ の定義は大丈夫〈well-defined〉です。

要するに、$`f^\#`$ は $`f`$ を“線形に拡張”したものです。この場合に関して言えば、「クライスリ拡張 = 線形拡張」です。

相対モナドNFLinのクライスリ圏

前節で定義した $`(J, T, \delta, \hyp^\#)`$ が相対モナドであるためには、次の等式の確認が必要です。

  1. $`\delta_A ; f^\# = f \; : J(A) \to T(B) \In \mbf{Set}`$
  2. $`{\delta_A}^\# = \id_{T(A)} \; : T(A) \to T(A)\In \mbf{Set}`$
  3. $`( f; g^\# )^\# = f^\#; g^\# \; : T(A) \to T(C) \In \mbf{Set}`$

定義に従って律儀にやれば出来ることなので確認は割愛します。

一般に、$`f:J(A) \to T(B)`$ の形の射は(相対モナドの)クライスリ射〈Kleisli morphism〉と呼びます。クライスリ拡張に渡す射はクライスリ射です。別言すると、クラスリ拡張はクライスリ射を拡張します。

$`\msf{NFLin}`$ に関して、 2つのクライスリ射の結合(クライスリ結合〈Kleisli composition〉)$`\KC`$ とクライスリ結合に関する恒等射 $`\mrm{kid}`$ を定義します。

$`\text{For }A, B, C\in |\mbf{FinSet}|\\
\text{For }f: J(A) \to T(B) \In \mbf{Set}\\
\text{For }g: J(B) \to T(C) \In \mbf{Set}\\
\quad f\KC g := f; g^\# \; : J(A)\to T(C)
`$

$`\text{For }A\in |\mbf{FinSet}|\\
\quad \mrm{kid}_A := \delta_A \; : J(A)\to T(A)
`$

以上のクライスリ射、クライスリ結合、恒等射により、次のような圏を構成できます。

  • 対象は有限集合
  • 射はクライスリ射 $`f:J(A) \to T(B)`$ 、域は $`A`$ 、余域は $`B`$ とする。
  • 結合はクライスリ結合
  • 恒等射は(クライスリ射の)恒等射

実際に圏になることを確認する必要がありますが、ルーチンワークです。こうして構成された圏を $`\mrm{Kl}(\msf{NFLin})`$ とします。

クライスリ圏の定義から、対象集合とホムセットは次のようになります。

  • $`|\mrm{Kl}(\msf{NFLin})| = |\mbf{FinSet}|`$
  • $`\mrm{Kl}(\msf{NFLin})(A, B) = \mbf{Set}(J(A), T(B))`$

相対モナド $`\msf{NFLin}`$ が「自然数係数の有限次元線形代数のためのモナド」であるのは、自然数係数のベクトル空間(正確には半加群*4)を対象として、そのあいだの線形写像を射とする圏と考えることができるからです。そのことは、次節でより明らかにします。

クライスリ射、線形写像、行列

次の同型があります。

$`\text{For }A, B \in |\mbf{FinSet}|\\
\quad \mrm{Kl}(\msf{NFLin})(A, B) \cong \mrm{Map}(A\times B, \mbf{N})
`$

つまり、圏 $`\mrm{Kl}(\msf{NFLin})`$ のホムセットは、有限集合 $`A\times B`$ をインデキシング集合とする自然数係数行列と一対一対応します。この同型は、以下のカリー化/反カリー化で与えられます。

$`\quad \mrm{Map}(A , \mrm{Map}(B,\mbf{N}) ) \cong \mrm{Map}(A\times B, \mbf{N})`$

上記同型の左から右が反カリー化〈逆カリー化〉ですが、$`f`$ の反カリー化〈逆カリー化〉は $`f_\cup : A\times B \to \mbf{N}`$ とします。$`{_\cup}`$ は絵におけるワイヤーベンディングに由来する象形文字記法です。

相対モナド $`\msf{NFLin}`$ のクライスリ射を $`f:J(A) \to K(B)`$ とします。そのクライスリ拡張は $`f^\# : T(A) \to T(B)`$ です。クライスリ射 $`f`$ の反カリー化〈逆カリー化〉$`f_\cup : A\times B \to \mbf{N}`$ は、クライスリ拡張に対応する行列になっています。これらの具体的な表示を書き下しましょう。

$`x\in T(A)`$ 、$`y\in T(B)`$ を次のように書きます。

$`\quad x = (x^a)_{a\in A} = \lambda\, a\in A.\, x^a \; : A \to \mbf{N}\\
\quad y = (y^b)_{b\in B} = \lambda\, b\in B.\, y^b \; : B \to \mbf{N}
`$

$`f`$ のクライスリ拡張 $`f^\#`$ に $`x\in T(A)`$ を渡した値は、定義により次のように書けます。

$`\quad f^\#(x) = \sum_{a\in A} x^a f(a)`$

$`f(a)\in T(B)`$ の$`b`$-成分(引数〈インデックス〉 $`b`$ を渡した値)は $`f(a)^b`$ と書けますが、これは行列($`f`$ の反カリー化)を使っても書けます。

$`\quad f(a)^b = f(a)(b) = f_\cup(a, b)`$

これにより、次の表示が得られます。等式変形の根拠は、$`b`$-成分をとること(引数を渡して値を求めること)が線形演算になっていることです。

$`\quad (f^\#(x))^b\\
= (\sum_{a\in A} x^a f(a))^b\\
= \sum_{a\in A} (x^a f(a))^b\\
= \sum_{a\in A} x^a (f(a)^b)\\
= \sum_{a\in A} x^a f(a)(b)\\
= \sum_{a\in A} x^a f_\cup(a, b)
`$

したがって、$`y = f^\#(x)`$ と置けば:

$`\quad y = (y^b)_{b\in B} = (\sum_{a\in A} x^a f_\cup(a, b))_{b\in B}`$

これはつまり、クライスリ射 $`f`$ が定義する線形写像が $`f^\#`$ で、その行列表示が $`f_\cup`$ だということになります。

  • クライスリ射 $`f: J(A)\to T(B) \In \mbf{Set}`$
  • 線形写像 $`f^\#: T(A) \to T(B) \In \mbf{Set}`$
  • 行列表示 $`f_\cup: A\times B \to \mbf{N} \In \mbf{Set}`$

集合係数の線形代数のために

自然数の集合 $`\mbf{N}`$ には、足し算と掛け算が載っており、環ではありませんが半環〈semiring〉の構造を持ちます。半環上では半線形代数が展開できます。体上の線形代数とは様相が違いますが、いちいち「半」を付けるのは面倒なので、半環上の半線形代数も単に「線形代数」と呼びます。

集合圏 $`\mbf{Set}`$ は、対象・射のあいだに足し算(直和)と掛け算(直積)が定義されています。半環の法則(例えば、足し算の結合法則)が等式では成立しませんが、同型としての法則は成立しています。よって、集合を係数とする線形代数を展開できます。

集合係数の線形代数の舞台を構成するマシナリーとして相対モナドが使えます。自然数係数に関する $`\msf{NFLin}`$ の集合係数バージョンを定義すれば、その相対モナドが自動的にベクトル空間、線形写像、行列の概念を導入してくれます

集合係数の線形代数のためのモナド」を $`\msf{SetLin}`$ とします。$`\msf{SetLin}`$ は相対モナドで、さらにモナド法則が等式では成立しないという意味でスードモナドです。しかし、スードであることは気にしないことにします(法則が等式であるかのように思う)。

相対モナド $`\msf{SetLin}`$ の構成素の名前は $`\msf{NFLin}`$ の構成素の名前を流用〈オーバーロード〉します。つまり、同じ名前を違う文脈では違うモノと解釈します。

$`\quad \msf{SetLin} = (J, T, \delta, \hyp^\#)`$

構成素達の具体的な定義を与えます。

  • $`J`$ は、包含関手 $`\mbf{Set} \hookrightarrow \mbf{SET}`$
  • $`A\in |\mbf{Set}|`$ に対して、$`T(A) := \mrm{MAP}(A, |\mbf{Set}|)`$
  • $`A\in |\mbf{Set}|`$ 、$`a\in A`$ に対して、$`\delta_A(a) := \lambda\,\xi\in A.(\text{if }\xi = a \text{ then } \mbf{1} \text{ else }\mbf{0})`$
  • $`F:J(A) \to T(B)`$ に対して、$`F^\#: T(A)\to T(B)`$ の定義は以下に説明。

$`\mbf{SET}`$ は、大きい集合達の集合圏です。小さい集合は大きい集合とみなせますが、その“みなし”はルート関手 $`J`$ で行います。$`T(A)`$ は、集合 $`A`$ 上のファミリー〈$`A`$-インデックス付き集合族〉達の集合です。大きい集合圏における写像集合〈関数集合〉なので大文字で $`\mrm{MAP}(\hyp, \hyp)`$ と書いています。$`\delta_A(a)`$ は、集合値のデルタ関数です。$`\mbf{1}`$ は特定された単元集合(例えば、$`\mbf{1} = \{\emptyset\}`$)、$`\mbf{0}`$ は空集合($`\mbf{0} = \emptyset`$)です。

相対モナド $`\msf{SetLin}`$ は、相対モナド $`\msf{NFLin}`$ とよく似てますが、大きな集合を使い大規模化しています。$`\msf{SetLin}`$ は $`\msf{NFLin}`$ のラージサイズ・バージョンです。

$`\msf{SetLin}`$ のモナド法則は次のようです。

  1. $`\delta_A ; F^\# \cong F \; : J(A) \to T(B) \In \mbf{SET}`$
  2. $`{\delta_A}^\# \cong \id_{T(A)} \; : T(A) \to T(A)\In \mbf{SET}`$
  3. $`( f; g^\# )^\# \cong f^\#; g^\# \; : T(A) \to T(C) \In \mbf{SET}`$

法則は同型ですが、定義に基づいて示せます。相対スードモナドの定義には、同型に関する等式的法則〈一貫性条件〉がありますが省略します*5

$`T(A)`$ の要素は、集合 $`A`$ をインデキシング集合とするファミリー〈集合族〉なので、大文字 $`X`$ などで表します。ファミリーを、集合係数のベクトルと考えたいので、引数渡しを上付きインデックス形式として次のように書きます。

$`\text{For } a\in A\\
\quad X^a := X(a) \; \in |\mbf{Set}|
`$

自然数の無限和は定義できませんが、集合の無限和(シグマ型)は定義できます。ファミリー $`X`$ は次のように表示できます。($`\delta_a`$ は $`\delta_A(a)`$ の略記。)

$`\quad X \cong \sum_{a\in A} X^a \times \delta_a`$

注意すべきは、総和記号が、集合〈スカラー〉を足し合わせているのではなくて、ファミリー〈集合係数ベクトル〉を足し合わせていることです。成分 $`X^a = X(a)`$ は集合〈スカラー〉ですが、$`\delta_a = \delta_A(a)`$ は $`A`$ 上のファミリー〈集合係数ベクトル〉です。総和の各サマンド(足されるモノ)はファミリーなのです。よって、上記の同型は、ファミリー $`X`$ を基本的なファミリー $`X^a \times \delta_a`$ 達の無限(かも知れない)総和で表示しています。

さて、クライスリ射 $`F:J(A) \to T(B)`$ を考えます。集合 $`A`$ の要素 $`a\in A`$ に対して、$`F(a)`$ は、集合 $`B`$ 上のファミリーです。

$`\quad F(a) \in \mrm{MAP}(B, |\mbf{Set}|)\\
\text{i.e.}\\
\quad F(a) : B \to |\mbf{Set}| \In \mbf{SET}
`$

$`F`$ のクライスリ拡張 $`F^\#`$ を定義するために、以下で、ほんとうは $`\cong`$ のところを $`=`$ とみなした雑な議論をします。$`F^\#`$ を $`F`$ の線形拡張だとするならば、次の定義が妥当です。

$`\text{For }X = \sum_{a\in A} X^a \times \delta_a\\
\quad F^\#(X) = F^\#(\sum_{a\in A} X^a \times \delta_a) := \sum_{a\in A} X^a\times F(a)
`$

定義の右辺は、$`B`$ 上のファミリー $`F(a)`$ に、集合(スカラーに相当) $`X^a = X(a)`$ を掛けた $`X^a\times F(a)`$ 達の総和です。総和は $`B`$ 上のファミリー達を足し合わせています。

$`Y = F^\#(X)`$ と置けば:

$`\quad Y = (Y^b)_{b\in B} = ( (\sum_{a\in A} X^a\times F(a))^b )_{b\in B}`$

成分を計算すると:

$`\quad Y^b \\
= (\sum_{a\in A} X^a\times F(a))^b \\
= \sum_{a\in A} (X^a\times F(a))^b \\
= \sum_{a\in A} X^a\times F(a)^b \\
= \sum_{a\in A} X^a\times F(a)(b) \\
= \sum_{a\in A} X^a\times F_\cup(a, b)
`$

自然数係数のときとやっていることは同じです。クライスリ射 $`F`$ が定義する集合係数線形写像が $`F^\#`$ で、その集合係数行列表示が $`F_\cup`$ です。

インデックスをひとつだけ持つ $`X = (X^a)_{a\in A}`$ や $`Y = (Y^b)_{b\in B}`$ がベクトルで、線形写像の表示である $`F_\cup = (F_\cup(a, b))_{a\in A, b\in B}`$ が行列です。記法として、$`F_\cup(a, b)`$ を $`F_a^b`$ のように、上下に2つのインデックスを持つ形にすれば、古典テンソル計算により近くなります。

注意点: 大きくてゆるい

相対モナド $`\msf{SetLin}`$ のクライスリ圏 $`\mrm{Kl}(\msf{SetLin})`$ は、通常の意味の圏にはなりません。

  • ホムセット $`\mrm{Kl}(\msf{SetLin})(A, B)`$ が小さい集合とはならない。
  • 射の結合が一意的には決まらない。一意的になるように選択した場合、結合法則や単位法則が等式としては成立しない。

同じ現象は、集合のスパンの圏 $`\mrm{SPAN}(\mbf{Set})`$ でも起こります。これは偶然ではなくて、$`\mrm{Kl}(\msf{SetLin})`$ と $`\mrm{SPAN}(\mbf{Set})`$ はほとんど同じ圏なのです。これらを圏と呼ぶのは正確ではなくて、2-圏〈弱2-圏〉または二重圏として議論すべきものです。

二重圏のなかで $`\msf{SetLin}`$ のクライスリ射(あるいは集合のスパン)を扱うなら、集合を対象として、関数〈写像〉をタイト射とする二重圏を考えます。そのプロ射が $`\msf{SetLin}`$ のクライスリ射(あるいは集合のスパン)です。

相対スードモナド $`\msf{SetLin}`$ は、米田モナド〈米田相対スードモナド〉の特殊ケースとみなせるので、クライスリ圏 $`\mrm{Kl}(\msf{SetLin})`$ と二重圏 $`\mbf{ProfDC}`$ の関係を調べるのがよいかも知れません。

*1:いちいち「反対」を付けずに、単に「余米田モナド」でいいような気がしています。

*2:斜モノイド圏内のモノイド対象を斜モノイドと呼んでいます。

*3:古典テンソル計算では、上下に振り分けたインデックスを使って計算を進めます。

*4:環上の加群で、環が体であるときがベクトル空間です。半環上では加群を半加群と呼びますが、いちいち「半」を付けるのは面倒ですね。僕はテキトーな呼び名を使っています。

*5:例えば "Relative pseudomonads, Kleisli bicategories, and substitution monoidal structures" に一貫性条件の記述があります。