以前、オセロとかのコンピュータプレーヤを作ろうとしたときに買った
機械学習の本を、再度読み直してます。
36432


で、本のサンプルプログラム(C)をJavaに移植してみました。
そのまま移植するのではなく理解(しようと)して移植しました。
https://github.com/moremagic/NeuralNetwork


AND、OR、XOR の学習ができているようです。
ただ、初期値によって全然学習が終わらないので
10000回くらい回したらやり直したほうが早かったりして。
理解に誤りがあるのかなぁ。。。

―――データの読み方―――
success!;<誤差の積算値>
入力1:入力2 -> 結果 [期待値]
ルートセル1、中間層2、入力2
結合係数が w 出力の閾値が v
―――――――――――――

1
2
<blockquote>
    <p>success!: 9.72522631682115E-4<br />

0.0:0.0 -> 2.1048348032851755E-9 [0.0]
0.0:1.0 -> 4.494203893919649E-9 [0.0]
1.0:0.0 -> 0.01658627735801011 [0.0]
1.0:1.0 -> 0.9743389665309871 [1.0]
middole_cell_1:
w :-25.966767488584782 -21.838766303836525
v :-25.24437972872704

middole_cell_2:
w :24.814990359871302 26.854400714667996
v :-24.98982808287262

root_cell_1:
w :-23.615814477486857 -20.040147435122034
v :-23.67693306303473

1
</blockquote>

OR

1
2
<blockquote>
    <p>success!: 9.984961860823314E-4<br />

0.0:0.0 -> 0.020821145102820487 [0.0]
0.0:1.0 -> 0.986904712708971 [1.0]
1.0:0.0 -> 0.985186554554593 [1.0]
1.0:1.0 -> 0.010685138970311278 [0.0]
root_cell_1:
neuralnetwork.NeuroCell w :-13.899547230758632 -45.76133262177429 58.98346610991823
v :3.8507452547697736
neuralnetwork.NeuroCell w :20.96868877546408 19.882736771999014
v :21.144335408791168
neuralnetwork.PlainNeuroCell@6d9efb05
neuralnetwork.PlainNeuroCell@60723d7c

neuralnetwork.NeuroCell w :21.673139648571528 19.895005273190577
v :22.60779170551081
neuralnetwork.PlainNeuroCell@6d9efb05
neuralnetwork.PlainNeuroCell@60723d7c

neuralnetwork.NeuroCell w :21.917262738516644 20.90765063585595
v :22.066655668312652
neuralnetwork.PlainNeuroCell@6d9efb05
neuralnetwork.PlainNeuroCell@60723d7c

1
</blockquote>

ORでセルの数を変更してみたパターン

1
2
<blockquote>
    <p>success!: 9.999998757804053E-4<br />

0.0:0.0 -> 0.01565607901030479 [0.0]
0.0:1.0 -> 0.9843365376547136 [1.0]
1.0:0.0 -> 0.9840257641764281 [1.0]
1.0:1.0 -> 0.01590882450376838 [0.0]
root_cell_1:
neuralnetwork.NeuroCell w :-365.4105665250812 385.1828758633156 -237.42312338940806
v :-206.54739026630213
neuralnetwork.NeuroCell w :-0.7213017220262548 -0.3529980165952855
v :0.33995590579649027
neuralnetwork.PlainNeuroCell w : 1.0
neuralnetwork.PlainNeuroCell w : 1.0

neuralnetwork.NeuroCell w :-0.9091437314762971 0.18950392763991109
v :0.9276243088343965
neuralnetwork.PlainNeuroCell w : 1.0
neuralnetwork.PlainNeuroCell w : 1.0

neuralnetwork.NeuroCell w :-0.12845723701645295 0.968071887793374
v :-0.8818498232465766
neuralnetwork.PlainNeuroCell w : 1.0
neuralnetwork.PlainNeuroCell w : 1.0

1
</blockquote>

セルの数を増やしてみたり、学習時のアルファ値を弄ったりしてます。
3層以上になると急に学習コストが上がるみたいで、PC的にもきついようです。
その割には早く学習できるわけではないみたいだし。
入力に対する、中間層の割合を増やしていくと結構速く学習ができるように見えます。
見えてるだけかもしれないですが。


こんな感じでいいのかしら?