不確定特異点

広く深く、ところどころ超深く

学習とニューラルネットワーク (4)

誤差逆伝播

前回、入力層と出力層からなる、単一ニューロンによる関数近似を実装してみました。特定の関数はうまく近似できましたが、XOR のような関数は学習が収束せず、近似することができませんでした。

今回は中間層を加えてフィードフォワード型の 3 層ニューラルネットワークを構成し、誤差逆伝播法でニューロンへの入力の重みとバイアスを調整(学習)してみました。収束判定は二乗誤差 0.01 以下、すなわち期待値とは 0.1 までのずれを許容しました。

実験してみると、XOR を近似してる!

CL-USER> (nesper:answer *nn* '(0 0)) ; 0 0 を入力、出力は 0 を期待
0.08755272690312033d0
CL-USER> (nesper:answer *nn* '(0 1)) ; 0 1 を入力、出力は 1 を期待
0.9000703821707596d0
CL-USER> (nesper:answer *nn* '(1 0)) ; 1 0 を入力、出力は 1 を期待
0.9000006720134367d0
CL-USER> (nesper:answer *nn* '(1 1)) ; 1 1 を入力、出力は 0 を期待
0.09601144473575372d0

単純に中間層の段数を増やせば、関数近似能力が向上して収束が速くなるのかと思いきや、そうではないようです。いくら段数を増やしても効果がなく、その代わりにユニット数を増やすと収束するようになったり。学習できるネットワークの条件が気になります。

ついでに、色々なニューラルネットを構成して実験できるようにするため、ネットワークの段数や各層のユニット数を柔軟に変更できるライブラリを作りました。

github.com

近似誤差を少なくしようとして、がんばって繰り返し学習している様子を見ていると、不思議と my ニューラルネットワークに愛着がわいてきます。