N次元出力のED法について考えてみた

ED法についてはこの辺から

https://qiita.com/kanekanekaneko/items/901ee2837401750dfdad

https://qiita.com/pocokhc/items/f7ab56051bb936740b8f

# 一次元
天下り的になりますが、今後次元を増やしたときの構成の仕方を考えるために、一度一次元で改めてED法を構成してみます。
ED法の特徴の中から、「重み(シナプス)には、出力を上げるためのものと、出力を下げるためのものがあり、それぞれに正の重みをもつものと負の重みを持つものが存在する」「学習は誤差に従いシナプスの重みの絶対値を増やすことにより行う」という点をもとに作ってみます。

各種シナプスとその後ろに来るニューロン、そこから辿り着く出力を用意します。
ニューロンの種類はまだ確定させず、ニューロンと出力の間は複数のシナプスやニューロンが存在できるものとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/af0eaa62-4286-6c45-4443-b514c4ad9e48.png)

モデル中の計算は、重み付き和と、単調増加の活性化関数のみのため、シナプスの重みの絶対値を増やすと、そこから通るルートにあるシナプスの正負の数により、出力が上がるか下がるかが決定します。
出力を上げたい場合、自身とその後通るシナプスの重みはマイナスが偶数個必要で、
出力を下げたい場合、自身とその後通るシナプスの重みはマイナスが奇数個必要です。
自身を除くと以下の通りになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/fd10286a-62b3-44dd-35e3-56df452d30c6.png)

続くルートが同一のニューロンは同一視できるため、それぞれaとbと文字を振っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/d4f9d517-5549-abbc-9558-91af5da90e79.png)

続いて、ニューロンに注目してまとめます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/11706325-39fe-192f-181d-4b8a67adebc9.png)

ニューロンの後ろに、シナプスを用意します。
ニューロンから伸びるシナプスは、+の重みをもつものと-の重みをもつものの2種類のみ存在できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/ce2c2cdd-fb37-0878-2753-635847b68003.png)

今度は、ニューロンの種類に注目して、必要なマイナスの重みを持つシナプスの個数を数えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/98d90fc1-4b53-e863-90c5-1d31e06f23fc.png)

ここから、未分類のシナプスの種類を確定させることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/b9c853b1-9360-22e5-1907-0920a1bbe21f.png)

最後に、ニューロンの名前をa→+、b→-とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/b7301476-0f24-ef62-01af-35cae36f2748.png)
これにより
出力を上げたいときは、接続元が+のニューロンであるシナプスの重みの絶対値を増やす
出力を下げたいときは、接続元が-のニューロンであるシナプスの重みの絶対値を増やす
ようにすれば良いことが分かりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/02c2e8ee-5624-7f2a-1633-c8cbad1e365b.png)


# 二次元
1次元目をx、2次元目をyとします。
二次元でED法を構成するためには、いくつか方法があります。
## 方法その1
それぞれの次元で独立したED法のモデルを立てます。
シナプスに注目して考えると、
xの出力のみを上げるシナプス
xの出力のみを下げるシナプス
yの出力のみを上げるシナプス
yの出力のみを下げるシナプス
の4種類できます。
それぞれ[1,0][-1,0][0,1][0,-1]とします。
それぞれに+の重みをもつものと-の重みを持つものが存在するため、シナプスは合計8種類あります。
[1,0][-1,0]はxの出力のみに辿り着き、yの出力に接続されてはいけません。
[0,1][0,-1]はyの出力のみに辿り着き、xの出力に接続されてはいけません。
よって[1,0][-1,0]のモデルと[0,1][0,-1]のモデルは独立です。
それぞれのモデルは1次元の場合と同様に組めます。
[ 1, 0]は「xとy両方上げたいとき」と「xを上げyを下げたいとき」
[-1, 0]は「xとy両方下げたいとき」と「xを下げyを上げたいとき」
[ 0, 1]は「xとy両方上げたいとき」と「xを下げyを上げたいとき」
[ 0,-1]は「xとy両方下げたいとき」と「xを上げyを下げたいとき」
に重みの絶対値をあげます。
ニューロンの名前は、
xの+を( 1, 0)
xの-を(-1, 0)
yの+を( 0, 1)
yの-を( 0,-1)
とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/ca9a6b16-861d-b34d-8ad3-f035359fc8b0.png)


## 方法その2
xとy両方に反応するシナプスを用意して構成します。
xとy両方上げるシナプス
xを上げyを下げるシナプス
xを下げyを上げるシナプス
xとy両方下げるシナプス
の4種類できます。
それぞれ[1,1][1,-1][-1,1][-1,-1]となります。
+の重みをもつものと-の重みをもつものがあるため計8種類です。
1次元のときと同様の方法でED法を構成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/77cbca20-12d4-cd61-0557-89021f50e1cd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/4d0b451b-be86-2df0-d4fc-f2362b271ada.png)
同じルートが続くニューロンに同じ名前を与えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/aeeddcc8-8c3f-f3bf-a92b-ac80ae203cc1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/7e81c6c4-fe3b-3f22-31cf-c7ae3fac9318.png)
ニューロンに着目してまとめ、そこから伸びる+と-のシナプスを用意し、後ろに続くマイナスのシナプスの個数を数えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/bd87b6cf-a883-23d3-3efc-040f5490ce9d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/e3be0154-fcb7-65ba-5322-9fd9c5cb0167.png)
ニューロンの後ろのシナプスを分類します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/4db7481c-8f30-2c44-f722-e2e932a17e0b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/99d04b17-b751-69c8-2a2c-886de6bdc006.png)
aを(1,1)、bを(-1,-1)、cを(1,-1)、dを(-1,1)として、図を整理します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/9d6c6fbc-2729-4ccb-46bc-8f9b23f9f19a.png)
中間層の最終層から出力への接続は、それぞれの次元の+に対応するニューロンから値を持ってくるようにします。
(1,1)(-1,-1)のモデルと(1,-1)(-1,1)のモデルは中間層の最終層まで独立です。
## 方法その3
その1とその2で作ったニューロンとシナプスを両方使います。

その2で作ったニューロンからその1で作ったニューロンへ接続することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/cd6dad38-d669-10c2-21d2-ce32d921303e.png)
ただし、分岐せずに接続すると、その2のニューロンが実質その1のニューロンと同じものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/7bdd5e2a-bc7a-afde-8336-d50e906d8ee0.png)
また、その2のニューロンからその1のニューロンへ接続するシナプスは、その1のものもその2のものも使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/520b1f7c-bc3c-27c3-41c9-8206fa361563.png)
その1のニューロン同士を接続するシナプスにその2のものを使っても破綻はしません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/ad394079-e065-a6de-b24d-346040a794ec.png)
シナプスの直接の接続元だけでなく、根の方を追っていって決めても良いかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/d86fc1b7-cb46-2b98-0571-f7dd358b38e8.png)
合流があるとややこしくなりますが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784955/4224aea9-bfdf-987a-6188-a55078992fe4.png)
さらに言えば、(1,1)と(-1,-1)のような、その1やその2では対になっていたニューロンを、対に設置する必要がなくなる気がします。
(1,0)→(1,1)のような、情報が増える方向で接続しなければ、ランダムに配置しても良いでしょう。
ただし、「xとy両方上げたいとき」「xを上げyを下げたいとき」「xとy両方下げたいとき」「xを下げyを上げたいとき」それぞれに対応するシナプスが1つ以上ないと、学習が止まってしまう恐れがあります。

# 三次元
二次元の方法その1と同様にすると、(1,0,0)(-1,0,0)と(0,1,0)(0,-1,0)と(0,0,1)(0,0,-1)の独立した3つのモデルができます。

方法その2に習えば、(1,1,1)(-1,-1,-1)と(1,1,-1)(-1,-1,1)と(1,-1,1)(-1,1,-1)と(-1,1,1)(1,-1,-1)の独立した4つのモデルができます。

他にも、(1,1,0)(-1,-1,0)と(1,-1,0)(-1,1,0)と(1,0,1)(-1,0,-1)と(1,0,-1)(-1,0,1)と(0,1,1)(0,-1,-1)と(0,1,-1)(0,-1,1)の独立した6つのモデルを作ることもできます。
これは、2つ次元を選んで射影をとったモデルと解釈できます。それぞれの構成は、欠けた次元を無視して二次元の方法その2そのものになります。

これらを纏めると、それぞれの次元で+をとるか-をとるか、あるいは選ばないかの3択があり、その組み合わせは3^3通りで、全ての次元を選ばない1通りだけは使えません。全ての次元の正負が逆転したものが対になり独立したモデルを構成できます。よって、(3^3-1)/2=13個のモデルが作れます。

方法その3に習うなら、上記の26種(13対)のニューロン、シナプスを組み合わせられます。
(1,1,1)→(1,0,0)のように、一気に2次元分情報を減らす接続もできます。
(1,1,1)→(1,-1,0)のように情報が減ってない部分で符号がそのままでも全て反転でもない接続はできません。
(1,1,1)からは
( 1, 1, 1)、( 1, 1,0)、( 1,0, 1)、(0, 1, 1)、( 1,0,0)、(0, 1,0)、(0,0, 1)に正の重みをもつシナプスで
(-1,-1,-1)、(-1,-1,0)、(-1,0,-1)、(0,-1,-1)、(-1,0,0)、(0,-1,0)、(0,0,-1)に負の重みをもつシナプスで
接続できます。
# N次元
三次元の場合と同様に、それぞれの次元で+をとるか-をとるか、あるいは選ばないかの3択があり、その組み合わせは全ての次元を選ばない場合を除いて3^n-1通りあるため、3^n-1種のニューロンとシナプスができます。
二次元の方法その3や三次元での説明の通り、次元が増える方向でなく、符号がそのままでも全て反転でもない接続でもなければ、自由に組み合わせられます。
出力の変え方がそれぞれの次元を上げたいか下げたいかの2^n通りあり、それぞれに対応するシナプスが1つ以上あれば学習ができるものと思われます。
出力の中に関係の深い成分が存在していることがわかるなら、モデルの工夫の余地はあるかもしれません。
例えば、MNISTなら、似た文字のみを扱う部分を作ってあげることで、判別の難しいものに優先的にリソースを回せるでしょう。
ただ、一般に対応できるモデルを組むなら、全ての次元に対応する2^(n-1)個の独立したモデルから、1つの次元にのみ対応するn個の独立したモデルに接続するように作るのが結局良い気がします。
あるいはランダムに作るかでしょうか。

# 最後に
実装してないので、机上の空論で終わってますね。本当に良くない。
しかも二次元の方法その3からは理論としてもかなり雑。
一応何次元でも対応できるような理論になりましたが、次元が増えると指数関数的にシナプスの種類が増える等、かなり面倒なモデルのため、ED法は一次元か二次元に抑えて、BP法と組み合わせる方が良い気がします。
逆伝播層1→拡散層→逆伝播層2となっている部分で、逆伝播層2の入り口まで逆伝播してきた誤差を拡散層全体と逆伝播層1の出口に拡散するようにすれば、既存のモデルに容易に組み込める気がします。
この方法なら、BP法の最先端の複雑なモデルの一部分のみED法に置き換えて、学習コストを下げられるでしょう。
以下の記事でやっているのがそういうことなのでしょうか(ちゃんと理解できてない)。

https://qiita.com/FanaticPond3462/items/6b079916d16d1ff2dc83

2つのシナプスやニューロンが対になって独立する、というのは重みが+と-の二種類しかとれない所に原因がある気がするので、ニューロンの出力やシナプスの重みを複素数や四元数で持てるようにするなど、この記事とは別の方向性での工夫はまだできる気がします。