我很难弄清楚为什么我的前馈人工神经网络几乎总是无法学习我简单的“或”感知器:
- 0 或 0 : 0
- 1 或 0 : 1
- 0 或 1 : 1
- 1 或 1 : 1
我尝试了各种网络配置: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] 值:v(i)
- [i] 错误:e(i)
- 信号(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,则为 True
- 如果 v(6) < 0.5,则为 False
- 与预期输出比较
在几个 epoch 之后,网络几乎总是返回 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)