対称性の認識
symmetry6.dataは2の6乗全部で64データを作ってある。この6ビットのパターンが対称かそうでないかに分けて分類したのが symmetry6.teachである。 すなわち
$ cat symmetry6.data 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 ...中略... 0 1 0 0 1 0 ...中略... 1 1 0 0 1 1 ...後略...
すれば分かるとおり,0 0 0 0 0 0 から 1 1 1 1 1 1 の6ビット(26=64とおり) 従って 64 行 6 列のデータとなっている。
教師信号データ symmetry6.teachは, 64行1列のデータであり,例えば入力データが 0 0 0 0 0 0 なら対称であるから 1, 0 0 0 0 0 1 であれば非対称であるから 0 である。 0 1 0 0 1 0 であれば対称だから 1 であり, 1 1 0 0 1 1 も対称なので 1 である。
これをバックプロパゲーションに学習させてみよう。
$ ./bp3.exe -input symmetry6.data -teacher symmetry6.teach -init symmetry6.wgt -hidden 2
学習結果はsymmetry6.wgtに納められている。 これを見ると一番目の中間層ユニットの結合係数と二番目の中間層ユニットの 結合係数とがきれいにシンメトリーになっていることがわかる。
$ cat symmetry6.wgt ### hidden[1] -0.492242 +0.655731 -1.315896 +2.611929 -2.610155 +1.310902 -0.660490 ### hidden[2] -0.486018 -0.650926 +1.289891 -2.565757 +2.570041 -1.292955 +0.644519 ### output[1] +1.234380 -2.829508 -2.839849 ### ./bp3 -hidden 2 -input symmetry6.data -teacher symmetry6.teach -learn 0.05 -moment 0 -prune 0 -decay 0 -error 0.05 -slope 4 -epoch 200 -to 10000 -seed 1037699338 -rand_range 0.1 -allowable_error 0 ### Final MSE = 0.0495308 at iter=816
この学習済みの重み係数行列を使って ./bp3.exe を起動すると
$ ./bp3.exe -input symmetry6.data -teacher symmetry6.teach -hidden 2 -init \ symmetry6.wgt ...中略... ### Final MSE = 0.0495308 at iter=0
のように学習が0回の繰り返し(iter=0)で成立していることが分かる。
この結果を図示すると次のようになる。(PDP book p.340より)

図では入力層が真ん中に,2つの中間層が上下に分かれて描かれている。 それぞれの中間層への重み係数がプラスとマイナスできれいにシンメトリーとなっており, 対称性を認識したことに成功したことが分かる。