经典BP网络确实挺扯淡的

多层前导神经元的诞生就是因为单层神经元计算模型没法辨认非线性可分的输入。经典例子就是异或操作。

在单神经元模拟上证明确实不行之后,我又继续把BP网络给实现了一下,代码其实非常简单,原理用数学公式看有点晕,其实道理很简单,求一点简单的偏微分然后最小二乘法而已。等到写出代码来就更简单了,比公式更intuitive。

写完后第一个拿来开刀的例子是昨天训练单层网络时留下的代码:与非门。结果有点乐观,在连续按了那个“训练”按钮多次之后,输出确实开始向正确方向收拢。把与门和或门都验证过了之后,我开始打开潘多拉的异或门。令人欣慰的是,单隐层网络果然名不虚传,输出也渐渐开始向正确方向靠拢,只是靠拢不是收敛。走得太慢了,手都酸了。当场写了个10000次循环的训练代码。结果它还没收敛好,那个最关键的 {1,1} -{0} ,还是不对,只有输出0.5左右。即使训练一百万次,结果还是不够乐观,{0,0}和{1,0}是对的,{1,1}和{0,1}都收敛于0.5附近。肯定是书上又有某个东西漏了! 尝试增加隐层内的神经元数量,曙光终于出现了。在训练一百万次之后,终于输出收敛到0和1上去了。指数函数果然收敛慢啊!一百万次训练啊!十万次才刚刚到0.5附近!一定得百万级的训练次数啊。太坑跌太扯淡了。

在反复调整之后,总结一下:

两个隐藏神经元搞不定异或门,刚才又试了一下,训练一亿次都没用。

训练常数,值域在0和1之间,开区间。取得再接近1也没用,收敛还是极慢。

隐藏层的神经元的数量很有用,提到三个立刻就搞定了,虽然还是得训练上百万次。

继续实验:

神经元数量提到四个,只要上万级的训练结果就很好了,数字看上去都是0.95,0.03这种了。千次级仍然不行,看不出收敛方向,还在0.5左右徘徊。

五个,还是要上万级。再增加似乎没用了,而且结果更差。50个神经元就基本保持输出为1不再变化了。

难道是我写错了代码。。。。翻了一下,发现这种单个样本调整权值的方式,确实容易“只顾眼前利益”,导致整体训练进度受阻。看来不是写错了,而是这样计算必然会这样。

总体看来,BP算法其实和神经网络已经没什么关系了,纯粹的计算机思维的产物,不太可能是生物智能的本质。生物神经元肯定不会多级平均分配误差反传信号。生物往往用量来克服质的问题。比如神经元速度慢,那就多用点,给一百亿个,保证速度跟得上。而BP算法增加神经元的数量似乎只有更拖后腿。没有显著帮助。生物也没有人来帮你反复训练。

所以BP算法只是个披着神经网络外皮的cpu思维的算法,不过据说BP算法是目前应用最多的神经网络算法,这说明神经网络领域还未真正到达“智能”的领域,还停留在卖应用赚钱的阶段。

弄清BP之后,下一步就得好好研究一下胜者为王算法了,看上去和智能很有关。

原文地址:https://www.cnblogs.com/hyperddr/p/2170277.html