世界を動かす技術を、日本語で。

カテゴリー理論の図解 – 自然変換

概要

  • 自然変換 は、関手同士の間の射としてカテゴリ理論の核心をなす概念。
  • カテゴリの等価性 を定義するために、自然変換と等価カテゴリの理解が必要。
  • 対象よりも射(モルフィズム) に注目する視点の重要性。
  • 同型不変性 と自然変換の密接な関係。
  • 等価性 は単なる同型より広く、自然変換によって表現される。

自然変換と等価なカテゴリ

  • Saunders Mac Lane によると、カテゴリは関手を研究するためでなく、 自然変換 を研究するために発明された。
  • 自然変換 は、関手間の「射」にあたり、カテゴリ理論の本質的な役割を担う。
  • 自然変換を理解することで、 カテゴリの等価性 や高度な概念の定義が可能となる。

等価カテゴリの動機

  • 等価カテゴリ の導入は、「2つのカテゴリが等しい」とは何かを考えるための動機付け。
  • 等価性を考えるには、まず「カテゴリの等しさ」とは何かの理解が必要。
  • 等価性 は直感的には難解だが、カテゴリ理論において重要な役割。

対象より射への視点転換

  • Parmenides は「本質は不変」と主張し、 対象(オブジェクト)重視 の見方を提唱。
  • 一方、 HeraclitusWittgenstein のように、「世界は事実(関係や変化)の集まり」と捉える立場も存在。
  • 数学や日常においても、 対象の機能や関係 がその本質を決定する。
  • カテゴリ理論では、 対象は射の始点・終点としてのみ意味がある という考え方が重視される。

同型不変性とその重要性

  • 同型不変性 はカテゴリ理論の根幹であり、すべての構成(積・余積、初・終対象、関数対象)は同型不変。
  • 「同型であれば等しい」と考える点がカテゴリ理論の特徴。
  • 自然変換 は同型不変性の理解に不可欠。

カテゴリの同型と等価性

  • カテゴリの同型(isomorphism)は、 同型不変性 を満たさない場合がある。
  • 等価性(equivalence) は、同型よりも広い概念であり、構造の本質的な違いを無視し、重要な構造を保つ。
  • 例:対象の数が異なっても、射の構造が本質的に同じなら等価とみなす。

等価性の定義とその拡張

  • 順序集合(order)の場合、 同型 は1対1対応する関手が存在し、往復で元の対象に戻ること。
  • 等価性 は、「往復で元の対象に戻る」必要はなく、「元の対象と同型な対象に戻る」だけでよい。
  • 順序集合では、 同値類 の集合が同型なら等価とみなせる。
  • 一般のカテゴリでは、 射の構造 も考慮する必要があり、 スケルトン という概念で等価性を捉えることができる。

関手による等価性の定式化

  • 集合の同型:$A$と$B$に対し、$f: A \to B$と$g: B \to A$が存在し、$f \circ g = ID_B$、$g \circ f = ID_A$となる場合。
  • カテゴリの同型:関手$f: A \to B$と$g: B \to A$が存在し、$f \circ g = ID_B$、$g \circ f = ID_A$となる場合。
  • カテゴリの等価性:$f \circ g \cong ID_B$、$g \circ f \cong ID_A$(ここで$\cong$は同型を意味し、等号ではない)。
  • 等価性 は「往復で全く同じ対象に戻る」必要はなく、「同型な対象に戻る」だけで十分。

まとめ

  • 自然変換 は、カテゴリ理論の「心臓部」と呼べるほど重要な概念。
  • 等価性 は、同型よりも柔軟で、カテゴリの「本質的な構造」を捉えるための道具。
  • 対象よりも射・関係性重視 の視点が、現代のカテゴリ理論の基盤。
  • 自然変換 を理解することで、より深いカテゴリ理論の世界への扉が開かれる。

Hackerたちの意見

これ、HNで少なくとも5回は話題になってるよね。 https://hn.algolia.com/?dateRange=all&page=0&prefix=true&que...

著者のマストドンによると、更新されたみたいだよ。 https://mathstodon.xyz/@abuseofnotation/115298450513159834

カテゴリ理論って何なの?ここでよく話題に上がるけど、みんながそんなにハマってる理由がわからないんだよね。

いろんな数学的システムを考えるための良いモデルのセットなんだよね。統一された語彙みたいな感じ。学部レベルを超えると、最近のカテゴリ理論は代数幾何学や代数トポロジー、表現論などの広い分野で大きな役割を果たしてるよ。

カテゴリ理論は、宇宙の基本的な対象を集合ではなく写像にすることで得られるものなんだ。最初は、写像の方が集合よりも複雑に見えるから、変なことをしてるように思えるかもしれないけど、実は伝統的に写像は集合を使って定義されてきたからなんだよね。集合論では、2つの集合が等しいことを指定したり、1つの集合が別の集合の要素であることを指定したりできるけど、カテゴリ理論では、2つの写像が等しいことや、2つの写像がつながって3つ目の写像を作ることを指定できるんだ。カテゴリ理論は、要件を非常に簡潔に表現するのに使えるよ。

もちろん、モナドの背後にある理論は、ユージニオ・モッギが純粋な関数型言語で計算効果をモデル化するために使われているってことだよね。状態やオプショナルな戻り値(エラーハンドリングに使われる、たぶんモナド)、入出力(リーダー・ライターモナド)などの効果があるんだ。効果を超えて、ワドラーはパーサーにモナドを使った(モナディックパース)。カリー・ハワードの「同型性」(スローガン:命題は型、証明はプログラム/関数)は、ラムベック・スコットの本で最初に説明されたように、コードを論理にカテゴリー的にマッピングする。カテゴリーは抽象化を提供する。まず、Haskell(または他の好きな関数型言語)の動作をHask、Haskell型のカテゴリーで抽出して、それを他のカテゴリーに適用することで、タスク指向のコンセプトを得られるんだ。これが言語の基本的な機能を豊かにして、1) 確率的プログラムや2) 自動微分などのアプリケーションを提供する。コナル・エリオットはこの方向で非常に具体的な仕事をしている。彼がCCC(ラムベックに従って)について話すとき、彼はカーテジアン閉カテゴリーを指していて、関数空間や高次関数のための型コンストラクタを持つという重要な特性を持っている。彼の「カテゴリーへのコンパイル」を見ると、非常に具体的で実践的な感触が得られるよ。彼が示すもう一つの応用はハードウェア合成(自分の関数アルゴリズムをカスタムHWアクセラレーターの設計を自動化するための論理ゲートのネットリストに焼き付けること)だ。要するに、なぜカテゴリーなのか?計算効果、形式的検証、単純型ラムダ計算とカーテジアン閉カテゴリーの同等性、ラムダ計算が関数型プログラミング言語のセマンティクスの基盤であるからだ。

カテゴリー理論はコンピュータサイエンスで人気があるのは、根本的なレベルで、世界を見るための非常に互換性のある方法だからだ。コンピューティングでは、次のことを考える: - 状態の集合 - それらの間の変換 - 「何もしない」変換も含む - 結合的に合成できる(文のシーケンス {a; b;}; c は、文のシーケンス a; {b; c;} と同じように状態を変換する) - でも特定の方法でしかできない:ある状態から他の状態に到達できないこともある。これがまさにカテゴリー理論が研究するようなことだから、分野間での相互作用がたくさんあるんだ。計算は「計算」や「多項式効率」といった特定のカテゴリーの興味深い特性を定義し、カテゴリー理論者がカテゴリー理論や他の数学の分野で興味深い対象を追跡するのに役立つ。逆に、カテゴリー理論はコンピュータサイエンスに対して、状態や変換が何を意味するか、またそれらを異なる方法で定義することの結果についても提案を与える。つまり、私たちの「これをやって次にあれをやる」というメンタルモデルからあまり逸脱せずに、より表現力や効率を捉える方法を見つけられる。これがプログラミング言語やAPI設計において特に役立つんだ。なぜなら、特定の基本的なビルディングブロックのセットが与えられたとき、それらを組み合わせたときにどんな特性を持つかを言うのは本当に難しい問題だから。カテゴリー理論の結果は通常こんな感じ:特定の形のビルディングブロックのセットが与えられたとき、常に望ましい特性を持つように合成できる;または、どんなふうに組み合わせても、結果は特定の望ましくない特性を持たない。ちなみに、特定のコンピュータサイエンスのサブカルチャー(主にカテゴリー理論が好きな人たち)では、型付き関数型プログラミングの言語で計算について話すのが一般的だけど、もし関数型プログラミングが計算をどのように表現するかについて深い理解がなければ、森の中の木々を見失うことがある。関数型プログラマーが「型」や「型コンテキスト」と言うとき、コンピュータの潜在的な(サブ)状態の集合を考えることができるんだ。

カテゴリー理論から得たことの一つは、いわゆる「抽象的ナンセンス」に帰着する特定の議論を繰り返さずに済むってことだ。つまり、扱っている特定のオブジェクトとは関係なく、非常に一般的なマッピング関係の結果なんだ。もっと詳しい人が具体的な例を挙げてくれるかもしれないけど、非常に広い例として、「ホモロジー」を定義する方法はいくつかあって(例えば、単体的、特異的など)、特定のグループをトポロジカル空間に不変量として関連付けることができる。でも、そのグループ間の関係の特性を証明するために必要な議論は、定義の非常に一般的な特性から導き出せて、各ホモロジーの非常に細かい定義から再度議論する必要はないと思う。

2018年(?)のICFPで、私はジョン・ウィグリーとコナル・エリオットの間に座ってた。彼らはカテゴリー理論でプログラミング問題を表現して解決し、その解決策を雇用主が使っているプログラミング言語にマッピングすることについて話していた。彼らの話によると、このプロセスに従って効率的で効果的な解決策を生み出すことに成功しているみたいだった。私はこのプロセスがうまくいく他のケースを探すことにした。いくつか見つけたけど、すぐに思い浮かぶのは高次元解析で、t-SNEがまあまあだったところから、グループがCTから始めてもっと良いものを作ろうとしてUMAPを生み出したんだ。要するに、これはうまくいくし、こういう方法でずっと良い解決策が見つかるよ。(ランダムリンク https://stats.stackexchange.com/questions/402668/intuitive-e... )

みんな理解できてないみたいで、何を見逃してるのか知りたいな :)

抽象代数をプログラミングの視点から見ると、なんか「良いライブラリインターフェースデザインの研究」みたいな感じだね。いろんなものが「合成可能」な方法を説明してる。例えば、関数 A -> BB -> C を合成したり、演算子 A A -> A、ネストできるコンテナ C> -> C みたいな。法律が明確に、ユーザーや最適化者の期待を壊さないようにする方法を指定してる。出力が入力とある意味で同じになるようにして、問題を分解できるし、各ステップで違う関数を使う必要がないんだ。カテゴリ理論の「集合の要素について内省しない」ってアプローチは、特に一般的で役立つ構造(ファンクター、自然変換、レンズ、モナドなど)に焦点を当てることになった。これを学ぶのは、新しいインターフェースやプロトコル、APIを使ったり実装したりすることを学ぶようなもので、コードを少なく書けるし、既存のツールを使えるようになる。コードがより一般的になって、あまりドキュメントを読まなくても使い方がわかるようになる。これに焦点を当てることで、問題解決やコードの構造化に役立つ一般的なアプローチを示唆してる。すぐに入力を内省していじるのではなく、計算の構造的パターンについて考えて、異なるデータ構造やよく知られたパターンのインスタンス間の変換として部分をモデル化することを考えるんだ。例えば、依存関係のある作業をスケジュールする必要があるなら、スタックで無限ループをハックするのではなく、DAGとしてモデル化して、トラバースする順序を決めて(リストに変換)、execute 関数を定義する(fold/reduce)。これで、グラフライブラリをインポートするだけで済むし、一日中デバッグに時間を使う必要がなくなる。人々は一般的にFPを再帰と結びつけるけど、好まれるアプローチは制御フローを完全に分離すること。CTは、それをデータ構造や表現の間の変換に分解することで提案してる。これは非常に強力だけど、DAGを見たことがない人には、なぜ非同期ジョブを実行するためにコードにグラフライブラリをインポートしてるのか混乱するかもしれないね。

カテゴリ理論は、他の方法ではつながりにくいものを理解し、一般化するための素晴らしい高レベルの概念ツールを提供してくれる。一部の人はそれを直接役立てているし、他の人はそのものを楽しんでいるか、あるいは美的理由から楽しんでいる。 (この3つは全部合理的だと思う!)同時に、実は他の純粋数学の分野よりもかなりアクセスしやすいんだよ。少なくとも、オンラインで話されているレベルではね。基本的なカテゴリ理論は抽象的だから学ぶのが難しいかもしれないけど、20世紀以降のほとんどの数学の分野とは違って、厳しい前提条件がほとんどない。大学院レベルの数学のコースを受けなくても、カテゴリやファンクター、自然変換について学ぶことができる。数学者がカテゴリ理論のアイデアを説明するために使う最も一般的な例を理解できないかもしれないけど、非常に一般的なフレームワークだから、コンピュータサイエンスや物理学、他の知っていることから代替の例を見つけるのは難しくない。実際、ここで話題にされる記事のほとんどは、まさにそれをやってると思う。CSやプログラミングの例でカテゴリ理論のアイデアを説明して、HNの人たちが関連性を感じてアクセスしやすいものにしてる。

https://planting.space/ の人たちに ping してるよ!少なくとも過去にHNでリクルートしてた人がいるのは知ってる。しばらく知識を更新してないけど、会社の印象は、カテゴリ理論(+すべての数学)を賢くて役立つ方法でお金にするつもりだったって感じ。少しAIの方にも向かってると思うけど、根本的にはカテゴリ理論が役立つと思ってる人たちの集まりだよ。だから、ping してるんだ!

この本の中で、プログラミングやコンピュータサイエンスはプログラミング言語の型のカテゴリを学ぶことだと教わった。この言葉、金言だね。

それに、コンピュータサイエンスは伝統的には計算に関することがほとんどだから、CTとは関係ないってのも間違いだよ。

「フィッシャープライス」フォントサイズから抜け出すためにページを67%に縮小しなきゃならなかったけど、他は結構面白かった。

これが好きな人は、ステファン・ミラーの論文「カテゴリー理論図のシンプルなカテゴリー理論的理解」も気に入るかもしれないよ。SIGBOVIK 2014に掲載されてる。https://sigbovik.org/2014/proceedings.pdf(PDFの65ページから始まる、マージンページ番号で行くと57ページ)

これは面白いね。でも、最初の哲学についての部分は正しくないよ。パルメニデスは、私たちが本質と呼ぶものを信じていなかったけど、実際には何も変わらないと信じていた(彼の仲間であるエリア派の哲学者ゼノンと一緒に、逆説で有名)。変化が幻想だという考えはかなり馬鹿げていて、プラトンや特にアリストテレスはそれが間違っている理由を考え出し、変化の本質を説明するために「形」の概念を提案した。アリストテレスはプラトンの考えを拡張し、私たちが感覚を通じて観察する物質的現実に基づいてそれを根付かせた。これが本質の概念の本当の起源なんだ。「本質」という言葉はラテン語の「essentia」から来ていて、アリストテレスが変化について議論する際に使う難しいギリシャ語のοὐσία(ousia - 「存在」)に対処するために作られたんだ。

これが提示される一つの方法は、初期のギリシャの哲学者たちが二つの基本的な事実を調和させようと格闘していたということだ:何かは同じままである(不変性や規則性)、そして何かは変わる。ヘラクレイトスはパルメニデスの前で、すべてが変わると言った。パルメニデスは何も変わらないと言い、そして原子論者たち、特にデモクリトスは、変わらない原子が存在し、すべての見かけの変化は異なる基本的な原子の相対的な動きによって説明されると述べて、この二つの見解を統合した。プラトンはこれらすべてに影響を受けた。でも、私は「形」の理論は変化よりもむしろ不変性や規則性を説明するものだと思うんだけど、どうかな?ちなみに、パルメニデスの哲学の中心概念は常に「存在」と訳されるけど、元のギリシャ語の単語が見つからなかった。「οὐσία」じゃないの?

同型性の不変性は、単なる記号ではなく、神経集合や構文に適用される。数学の問題はモデル化することだ。脳はモデル化しない。ヘラクレイトスは、数学が恣意性を加えない限り正しい。 「夜の男は、自らの視力が消えたとき、自分のために光を灯す。生きているとき、彼は死者と接触し、眠っているとき、目覚めているときには眠っている者と接触する。」

ウィーン学派と同型についての興味深い話だね。ハイエクが「心と表現は同型だ」って考えをここから得たんじゃないかな。アリストテレスの「魂について」/『デ・アニマ』で、心が知覚の対象になるって主張してるのを思い出す。

自然変換 α : F ⇒ G がちゃんと指定されてないね。合成形式で表現する時には、自然変換の下付き文字も指定しなきゃいけないし、等式になってるべきなんだ。つまり、もし f : a → e ならば、αₑ ∘ Ff = Gf ∘ αₐ になる。彼が書いたことが意味を持つ高次のカテゴリもあるけど、今の文脈では書かれている通りには正しくないよ。

著者は Jencel P.?この本を以前、Boris Marinov って名前で保存したんだけど?今は違うペンネームで書いてる同じ人なのかな?

同じだよ。彼は自分をわざと隠してるみたい。