PyPhi公式ドキュメントより「XOR Network」の解析

# まえがき

統合情報理論(IIT)を扱うライブラリPyPhiの公式ドキュメントから使用例を読み、実際に動かして理解を深めます。

[前回の記事](https://qiita.com/NNNiNiNNN/items/7074d7773b44f33d9b13)ではライブラリの導入と簡単な計算例を扱いました。

今回は公式ドキュメントよりXOR Networkに関する使用例を見てみましょう。

本当に足りない知識で雑な和訳しながら書いてるに過ぎないので、有識者の指摘があるととてもありがたいです。

元記事は[こちら](https://pyphi.readthedocs.io/en/latest/examples/xor.html)

## ネットワークの作成

A, B, Cがそれぞれ繋がり合った完全グラフを考えます。A, B, Cはそれぞれ自分自身との結合は持っていません。

![rapture_20200422164134.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/d7024428-91ec-8ced-6a8c-33daad571e75.jpeg)

それぞれの要素がXOR回路として働き、繋がった二つの頂点から入る入力によって自身の状態(1か0)が決定されるとします。

このネットワークを作成します。このネットワークはちょうどライブラリ内に例として用意されている(接続やTPM、ラベル名ABCまで含めて)ようです。

```python
import pyphi
network = pyphi.examples.xor_network()
```

初期状態は(0, 0, 0)とします。

```python
state = (0, 0, 0)
```

この記事ではmajor complex(主要な複雑?)という構造を調べます。

```python
major_complex = pyphi.compute.major_complex(network, state)
```
これはネットワークの主要な部分を抜き出した、...という理解でいいんでしょうか、この場合においては(A, B, C)で構成されたSubSystemを作ったことと一致するようです。

```python:ドキュメントの例に従ったやつ.py
print(major_complex.phi) # 1.874999
print(major_complex.subsystem) # Subsystem(A, B, C)

'''
以下は前回計算したやり方。計算されたphiが一致する。
subsystem = pyphi.Subsystem(network, state)
print(pyphi.compute.phi(subsystem)) # 1.874999
'''
```
このmajor complexを軸に計算を進めていきます。

## 'concept'という概念

major complexから、cause-effect structure(ces)(因果構造?)という要素を見てみましょう。

```python
ces = major_complex.ces
```
この中身はどうなっているんでしょうか。

```python
print(len(ces)) # 3
```
長さ3の配列のようです。それぞれの要素についたラベルを見てみましょう。

```python
print(ces.labeled_mechanisms)
# (['A', 'B'], ['A', 'C'], ['B', 'C'])
```
AとB, AとC, BとCの三つがこのネットワークの'concept'と呼ばれる要素になっているようです。

### cesとは？

ちょっと振り返って解説をします。

まず、cause-effect structure(因果構造?)とは、$t -1$から$t$、もしくは$t$から$t+1$に状態が変化する際のネットワーク間で影響を与え合う構造のことです。

ネットワークを構成する要素を細分化し、情報が削減不可能なところまで削った構成要素のネットワークを'concept'(概念?)と呼んでいます。

このネットワークの場合では、A-B間、A-C間、B-C間がそれぞれ'concept'となるネットワークのようです。

## conceptの中身を見てみよう

では、conceptの一つ目に注目してみましょう。

```python
concept = ces[0]
print(concept.mechanism) # (0, 1)
```
ノード0, 1(この状態ではラベルの表示はできない?)で構成されたネットワークによるconceptを見てみましょう。

このネットワークのみでΦを計算してみます。

```python
print(concept.phi) # 0.5
```

このネットワーク単体では$φ=0.5$のようです。

### cause(原因)

このネットワークのcause(原因、要因？)のpurview(範囲?)を見てみます。つまりどのネットワークが今のネットワークの状態を決めているか、ということですね。

```python
print(concept.cause.purview)
# (0, 1, 2)
```

ノード(0, 1, 2)からなるネットワーク(まあ要するに全部)が影響を与えているようですね。

今度はこのネットワークのcauseのrepertoire(レパートリー)を見てみましょう。

```python
print(concept.cause.repertoire)
'''
[[[0.5 0. ]
  [0.  0. ]]

 [[0.  0. ]
  [0.  0.5]]]
'''
```
こんな出力を受けました。この形だとちょっとわかりづらいので、省略された部分を丁寧に書いた表を以下に書きます。

|| t-1での状態 |||tでの状態(0, 0, 0)に寄与している確率|
|---- | ----|---- |----| ----|
|  A  |  B  |  C  ||    |
|  0  |  0  |  0  |→|  0.5  |
|  1  |  0  |  0  |→|  0 |
|  0  |  1  |  0  |→|  0  |
|  1  |  1  |  0  |→|  0 |
|  0  |  0  |  1  |→|  0  |
|  1  |  0  |  1  |→|  0  |
|  0  |  1  |  1  |→|  0  |
|  1  |  1  |  1  |→|  0.5  |

こういう意味です。

考えてみると、全てがxorで構成されたネットワークにおいて(0,0,0)になるためには一つ前のステップが(0, 0, 0)もしくは(1, 1, 1)のどちらかしかありえません。この表はそれを表しているわけですね。

### effect(効果)

さらにこのネットワークのeffect(効果)についてpurview, repertoireを見てみましょう。

```python
print(concept.effect.purview)
# (2,)
print(concept.effect.repertoire)
# [[[1. 0.]]]
```
今度はノード2にしか影響を与えていないようです。表にするとこんな感じ。

| t+1での状態||tでの状態(0, 0, 0)から変化する確率|
|---- | ----|---- |----| ----|
|  C  |||    |
|  0  |←|  1  |
|  1  |←|  0 |

(0, 0, 0)からではノード2も0にしか変化できませんね。

### つまりcauseとeffectって何？

causeは「原因」であり、$t-1$から$t$への変化の際の影響を見る。

effectは「結果」であり、$t$から$t+1$への変化の際の影響を見る。

IIT(統合情報理論)の計算においてはこの二つを分けて計算を行います。だいたいその二つの値のどちらか「低いスコア」を最終的に使用する値にします。

## ネットワーク全体を見てみよう

ネットワーク全体とconceptの与えている影響について表にまとめてみると以下のようになります。

$$ \mathrm{Major~Complex: ABC}, 
\Phi = 1.875 $$

|構造|φ|cause purview(原因範囲)|effect purview(効果範囲)|
|---- | ----|---- |----| 
|  $AB$  |$0.5$|$ABC$|$C$    |
|  $AC$  |$0.5$|$ABC$|$B$|
|  $BC$  |$0.5$|$ABC$|$A$|

これを見てみると、ポイントとなるのが「構成要素であるABC全体がMajor Complexに含まれていること」「AB, AC, BCの二つの組み合わせが要因となっていること」「A, B, Cそれぞれ単体ではネットワークの構造を決める'concept'にならないこと」「ABC三つ合わせたネットワークも'concept'にならないこと」などがわかります。

### A単体のネットワークの価値

A単体では本当に価値がないのか？計算してみましょう。

単体と全体でのsubsystemを作ってみます。

```python
subsystem = pyphi.examples.xor_subsystem()
A = (0,)
ABC = (0, 1, 2)
```
cause, effectそれぞれにAの影響はあるのでしょうか。

```python
print(subsystem.cause_info(A, ABC))
# 0.5
print(subsystem.effect_info(A, ABC))
# 0
```

A単体に、effectに関する価値は一切ないことがわかります。

これは、A, B,Cで構成されるxor回路において、Aが「1である」と決定したところでBの値を決定することもCの値を決定することもできない、ということです。二つセットにならなきゃ情報としての価値がありません。

### ABC合わせたネットワークの価値

次に、「ABC」の三つのノードはconceptにならないのか、ということを見てみます。同じ計算をしてみましょう。

```python
subsystem.cause_info(ABC, ABC)
# 0.749999
```

なるほど、確かにcauseの情報はありますね。しかし、これが「最小構成要素であるか」というとどうでしょうか。

minimum information partition(MIP)(最小情報区画?)というものを計算してみましょう。

```python
mip = subsystem.cause_mip(ABC, ABC)
print(mip.phi)
# 0.0
```

ここで出たφ=0というのは...おそらく「ABCを分割して計算した際」と「ABC全体で計算した際」で値の"ズレ"が一切ない、ということを示しています(ここ自信ないです)

どう区切られているのでしょうか。見てみましょう。

```python
print(mip.partition)
'''
 A     B,C 
─── ✕ ─────
 ∅    A,B,C
'''
```
AAみたいなのが出てきました。数式を書き直すと以下になります。

$$ {A\over \varnothing }\times {BC \over ABC} $$

この数式は、「BCの情報がわかればAの情報が完全に切り捨て可能である」ということを表しています。

例えば前の状態でB,Cの(0, 0)がわかっているならAも必ず0です。

同様のことが以下の二つにも言えます。

$$ {B\over \varnothing }\times {AC \over ABC} $$
$$ {C\over \varnothing }\times {AB \over ABC} $$

これでAB, AC, BCの三つがこのネットワークを構成する'concept'であることがわかりました。

# 参考

以上でこの記事を終わります。ここまでの内容はほぼすべて以下の記事の和訳です。

PyPhi公式ドキュメント-XOR Network
https://pyphi.readthedocs.io/en/latest/examples/xor.html

また、[前回の記事](https://qiita.com/NNNiNiNNN/items/7074d7773b44f33d9b13)を読んでいる前提で書きました。