Asakawa's  Neural  Network  Simulator 

東京女子大学のトップページ   情報処理センターのページ   東京女子大学の Gmail のページ   東京女子大学の図書館のページ   浅川のホームページへ戻る   ANNSのページへ戻る

バックプロパゲーション法による排他的論理和の学習

以下のような入出力関係を考える

$ cat xor.input
0 0
0 1
1 0
1 1
$ cat xor.teacher
0
1
1
0

すなわち,入力が
(0,0)のとき0
(0,1)のとき1
(1,0)のとき1
(1,1)のとき0
となる入出力関係を考える。 さっそくシミュレータに学習させてみよう。

$ ./bp3 -input xor.data -teacher xor.teach -hidden 3

-hidden 3 は中間層の数が 3 であることを表している。
中間層の数を変化させて何度か実行させてみよ。

パーセプトロンでも実行してみよ。学習が成立しないはずである。

$ ./perceptron.exe -input xor.data -teacher xor.teach

なぜなら,パーセプトロンでは入力空間を2分する学習しかできず。排他的論理和の問題は, 一本の直線で,入力空間を二分することはできないからである。

線形分離不可能な問題

上述したとおり,パーセプトロンでは排他的論理和 (XOR) 問題は解けない。 排他的論理和とは,上でも説明したとおり 2 つの入力のうちいずれか一方のみが 1 のとき 1 を出力する問題である。 下図を見るとわかるとおり,XOR 問題は一本の判 別直線で白マルと黒マルを分離できない、すなわち線形分離不可能な問題である。 下図ではXOR問題の幾何学的表現を示した。

xor-graph

XOR問題を解くためには,かならず2本の判別直線(従って少なくとも2つの中間層ユニット) が必要なのである。XOR問題を解くための形式的な3層のネットワークの例を以下の図に示した。

xor

この図は,XOR問題の幾何学表現を対応するネットワークとして表現したものである。 一番左が入力層,一番右が出力層,中間の 2 つが中間層である。 ユニットの中に書かれた数値は各ユニットのしきい値を示している。 中間層の 2 つのユニットのうち上の OR と書かれたユニットは, x1 +x2 -0.5>0 のとき発火する。 この式を書き換えると、x2> -x1 +0.5 となるので XOR問題の幾何学的表現を表した上の図の下斜線より上の領域に対応する。 一方、中間層の下の NAND(not and) と書かれたユニットは, -x1 -x2 +1.5>0 のとき発火するので, 移項して x2 < -x1 -1.5 とすれば, 上の図の上斜線より下の領域に対応していることが分かる。 さらに,AND と書かれた出力ユニットは,2 つの中間層ユニットからの情報の論理積 (AND) を計算するユニットになっている。そこで, 2 つの中間層ユニットの両方が発火する場合だけ,出力ユニットも発火し,1 を出力する。

これは,XOR問題の幾何学的表現の図では,「下の斜線より上の領域」 でかつ「上の斜線より下の領域」に対応する。すなわち,図中の黒丸の領域だけが 分離されることになる。このような2本の直線は図中にいくらでも引けることから, XOR 問題の解も無数に存在することが分かる。 図に対応するXOR問題の真偽表を以下の表に示した。

上の図に対応するXOR問題の真偽表
入力層 中間層 出力層
X1 X2 A1 A2 出力
00010
01111
10111
11100

XOR問題の幾何学的表現の図にあるとおり,中間層のユニット 1 個は 1 つの線形判 別関数に相当すると考えられる。中間層から出力層への結合では各出力の論理積 AND を計算していることに相当する。n 個の中間層を用意すれば原理的には

n2+n+2
2
個のカテゴリー分類が可能である。パーセプトロンが XOR 問題を解くことができない理由は入力層から中間層にいたる結合係数を変更する手 段がないことなのである。

誤差逆伝播法(一般化デルタルール)

XOR 問題でも見たように,パーセプトロンの問題点は学習が出力層と中間層の間だ けで行われ,入力層と中間層の結合係数を更新することができないことである。 換言すれば中間層ユニットの誤差を明示的に知る方法はない。このことは信用割り当て credit assignment 問題と呼ばれる。この信用割り当て問題を解決したのがバック プロパゲーション(誤差逆伝播法あるいは一般化デルタルール)である。

サンプルオペレーション

結果の保存は以下のようにする。

$ ./bp3.exe -input xor.data -teacher xor.teach -hidden 2 \
1>bp3-h2.wgt 2>bp3-h2.err

この例では中間層のユニット数を 2 とした場合を示している。 上記のようにすると,標準出力はbp3-h2.wgt というファイルに,標準エラー出力はbp3-h2.err にそれぞれ格納される。

標準出力に吐き出されたデータbp3-h2.wgtは, 次回シミュレーションをそこから再開したい場合などに用いることができるネットワークの 結合係数行列である。サンブルオペレーションを以下に示す。

./bp3 -input xor.data -teacher xor.teach -hidden 2 -init hp3-h2.wgt

一方,標準エラー出力に吐き出されたbp3-h2.err は,エラーの減少の様子と最終的な出力が含まれている。

$ cat bp3-h2.err
...中略...
08200 0.414347 ### MSE
08400 0.428912 ### MSE
08600 0.414783 ### MSE
08800 0.410983 ### MSE
09000 0.427704 ### MSE
09200 0.40911 ### MSE
09400 0.429023 ### MSE
09600 0.420114 ### MSE
09800 0.408396 ### MSE
Pattern 0: ( +0.00 +0.00)->hidden( +0.73 +0.03)->output(+0.00 )=teacher(+0.00 )
  hidden[1] f( +0.25 * +1.00 -2.89 * +0.00 -2.90 * +0.00) =0.735
  hidden[2] f( -0.89 * +1.00 -1.66 * +0.00 -1.66 * +0.00) =0.027
  output[1] f( +0.30 * +1.00 -2.30 * +0.73 -0.50 * +0.03) =0.004
Pattern 1: ( +0.00 +1.00)->hidden( +0.00 +0.00)->output(+0.77 )=teacher(+1.00 )
  hidden[1] f( +0.25 * +1.00 -2.89 * +0.00 -2.90 * +1.00) =0.000
  hidden[2] f( -0.89 * +1.00 -1.66 * +0.00 -1.66 * +1.00) =0.000
  output[1] f( +0.30 * +1.00 -2.30 * +0.00 -0.50 * +0.00) =0.770
Pattern 2: ( +1.00 +0.00)->hidden( +0.00 +0.00)->output(+0.77 )=teacher(+1.00 )
  hidden[1] f( +0.25 * +1.00 -2.89 * +1.00 -2.90 * +0.00) =0.000
  hidden[2] f( -0.89 * +1.00 -1.66 * +1.00 -1.66 * +0.00) =0.000
  output[1] f( +0.30 * +1.00 -2.30 * +0.00 -0.50 * +0.00) =0.770
Pattern 3: ( +1.00 +1.00)->hidden( +0.00 +0.00)->output(+0.77 )=teacher(+0.00 )
  hidden[1] f( +0.25 * +1.00 -2.89 * +1.00 -2.90 * +1.00) =0.000
  hidden[2] f( -0.89 * +1.00 -1.66 * +1.00 -1.66 * +1.00) =0.000
  output[1] f( +0.30 * +1.00 -2.30 * +0.00 -0.50 * +0.00) =0.770

このファイルを見ると,標準誤差 MSE は 9800 以降に 0.05 以下に収束したことがわかる。
さらに,その下にはシステムの入出力が数字で表現されている。
Pattern 0 の入力は (+0.00 +00) でありこれが中間層では (+0.73 +0.03) となり,出力が (+0.00 ) であったことが分かる。最後に教師信号は (+0.00 ) であった。すなわち誤差が小さく学習が成立したことを表している。

エラーファイルを直接 Excel に読み込めば学習曲線を描くことができる。
すなわち Excel を開いて

Excel001
ファイルを選択し,入力画面で「元データの形式」を「固定長」にする。
Excel002
そして,下のウィンドウの適当な位置をクリックすることで,区切り線をを入力して
Excel002
そのままB列を折れ線グラフにすれば,
Excel003

を得る。すなわち学習は,徐々に進行したのではなく,ある時点から急激に誤差が減少した ことがわかる。