Fri Nov 01 2019

考えてること

データにラベルがあるのなら話は楽だ。出力にも入力にも使えるから。 しかしながら、ラベルというのは目的に沿って人間が付与した単純な一つのクラスタに過ぎない。 それを超えた常識みたいなのを作ることが必要。

いつかの日記に、GANのmode callapse を防ぐのにラベルを使えばどうかなどと書いたが、 初めから入力にラベルを与えて conditional にすればいいだけだったことに今日気がついて、 やることを失くした。 それどころか、単にラベルの予測と Discriminator を兼ねさせるだけでも十分 mode collapse が抑えられることを自分も昔確認したのを思い出した。 cympfh/GAN-semisup-MNIST-Keras この予測器及び判別器は最終層手前までは共通で、最後だけ、10クラス分類とするか、真偽の判定とするかに分岐している。 今思えば、11クラス分類(10クラス + 偽クラス)としても良いかもしれない。

論理を作る。ニューラルネットで。 AND とか OR とか全てのゲートを用意して構成するのは当然出来るに決まっている。 もちろん XOR を作ることが出来るので、原理的に作ることもできる。 そんなことを考えなくても、例えば A IMPLIES BNOT A OR B などと定めることをしなくても、個々のゲートを訓練すれば、 常識的な方法で常識的なものが出来るだろう。 もしかしたら、僅かな確率で A AND NOT A が成り立ったり、三段論法が成り立たないことがあったり、人間的で面白く見えるものが出来上がるかもしれない。

でも所詮疑似科学だ。

個人的には最近はトポスに傾倒している。 細かいことを省けば、トポスというのは subobject classifier というものが備わっているもののことで、その機能があればイコールとか AND とかが作れる。 subobject classifier というのが何か。これまた不正確で雑な説明をすると、部分集合判定器である。 すなわち \(A \subseteq B\) という部分集合があったときに

\[\begin{align*} cl(b) = \begin{cases} \mathrm{true} & \text{ if } b \in A \\ \mathrm{false} \end{cases} \end{align*}\]

という関数 cl が作れる。 トポスというのは任意の部分集合についてこのような関数が構成出来ることを言う。

すると例えば、集合 \(A\) の上のイコールは

\[\{ (a, b) \mid a,b \in A, a=b \} \subset A \times A\]

の subobject classifier だし、AND は

\[\{ (\mathrm{true}, \mathrm{true}) \} \subset \Omega \times \Omega\]

である。 ただしここで \(\Omega = \{ \mathrm{true}, \mathrm{false} \}\) 。

これが大してすごそうに思えないのは、部分集合というのが単純だからだ。単純というのは、属しているか、属していないかの二値だから。 これは cl の値域が true, false の二値であることに対応している。 ていうか集合論だと関係とか関数というのは結局 \(A \times A\) の部分集合で定義できるから、それはそうなんだよな。 上は「部分集合を定義すると、関係とか関数が定義できます」っていうのを丁寧に言っているだけ。

さてトポスは集合に上に成り立っているものではないので、一般に何にでも応用できる。 fuzzy logic とかみたいに曖昧なもの(それは例えば "true である確率" みたいに)をそのままのフレームワークで扱うことが出来る。 その場合の cl は上のように単純ではない。 \(\Omega\) も二値ではなくなるし、イコールも AND ももっと興味深いものになるかもしれない。

で、これをニューラルネットで実装するには? cl の部分を構成出来ればいい?