我很难弄清楚为什么我的前馈人工神经网络几乎总是无法学习我简单的“OR”感知器:
我尝试了各种网络配置:1或2个隐藏层,隐藏层上2到8个神经元,偏差(值= 1,连接到每个隐藏神经元和输出神经元)
对于此示例,网络如下所示:
[1] [3]
[2] [4] [6]
[5]
- 输入图层:[1]和[2]
- 隐藏层:[3]和[4]和[6]
- 输出图层:[6]
符号:
- 神经元i:[i]
- [i]和[j]之间的权重:w(i,j)
- [i] value:v(i)
- [i]错误:e(i)
- sig(t):1 /(1 + e ^ -t)
权重初始化
将每个权重设置为-0.5和0.5之间的随机值
输入
v(1)和v(2)设置有随机值:0或1
传播价值(从左到右):
- v(3)= sig(v(1)* w(1,3)+ v(2)* w(2,3))
- v(4)= sig(v(1)* w(1,4)+ v(2)* w(2,4))
- v(5)= sig(v(1)* w(1,5)+ v(2)* w(2,5))
- v(6)= sig(v(3)* w(3,6)+ v(4)* w(4,6)+ v(5)* w(5,6))
预期输出:如果(v(1)或v(2))为真,则为1,否则为0
- e(6)=(预期 - v(6))* v(6)*(1 - v(6))
传播错误(从右到左)
- e(3)= e(6)* w(3,6)* v(3)*(1 - v(3))
- e(4)= e(6)* w(4,6)* v(4)*(1 - v(4))
- e(5)= e(6)* w(5,6)* v(5)*(1 - v(5))
更新权重(学习率= 1)
- w(1,3)= w(1,3)+ v(1)* e(3)
- w(1,4)= w(1,4)+ v(1)* e(4)
- w(1,5)= w(1,5)+ v(1)* e(5)
- w(2,3)= w(2,3)+ v(2)* e(3)
- w(2,4)= w(2,4)+ v(2)* e(4)
- w(2,5)= w(2,5)+ v(2)* e(5)
- w(3,6)= w(3,6)+ v(3)* e(6)
- w(4,6)= w(4,6)+ v(4)* e(6)
- w(5,6)= w(5,6)+ v(5)* e(6)
执行300次并打印每个结果:
- 如果v(6)> 0.5,这是真的
- 如果v(6)< 0.5,这是假的
- 与预期产出比较
几个世纪之后,网络几乎总是返回v(6)> 0.9,即使对于v(1)= v(2)= 0
有时候(大约20次中有1次),它有效,网络正确学习
我做错了什么?
修改
我找到了它!
罪魁祸首是:
- e(3)= e(6)* w(3,6) * v(3)*(1 - v(3))
- e(4)= e(6)* w(4,6) * v(4)*(1 - v(4))
- e(5)= e(6)* w(5,6) * v(5)*(1 - v(5))
应该是:
- e(3)= e(6)* w(3,6)
- e(4)= e(6)* w(4,6)
- e(5)= e(6)* w(5,6)