前面学习了感知器和自适应线性神经网络。
下面介绍经典的三层神经网络结构,其中每个神经元的激活函数采用Sigmoid。PS:不同的应用场景,神经网络的结构要有针对性的设计,这里仅仅是为了推导算法和计算方便才采用这个简单的结构。
训练步骤:
1.正向传播
2.反向传播(BP)
3.一次正反向传播为一次训练,迭代。
BP算法计算方法:
参数初始化:
正向传播:
隐藏层到输出层:
反向传播:
1.计算误差(欧几里得距离):
2.隐藏层到输出层的权值及偏置b的更新(以W5为例):
(白话解释:权重w的大小能直接影响输出,w不合适那么会使得输出误差。要想直到某一个w值对误差影响的程度,可以用误差对该w的变化率来表达。如果w的一点点变动,就会导致误差增大很多,说明这个w对误差影响的程度就更大,也就是说,误差对该w的变化率越高。而误差对w的变化率就是误差对w的偏导。)
看下图,总误差的大小首先受输出层神经元O1的输出影响,继续反推,O1的输出受它自己的输入的影响,而它自己的输入会受到w5的影响。这就是连锁反应,从结果找根因。
因此,得到W5的偏导:
(sigmoid求导公式:)
因此,可以得到:
同理,更新输出层偏置b:
输出层W的更新公式:
输出层b的更新公式:
3.输入层到隐藏层的权值及偏置b更新:
以更新w1为例: 仔细观察,我们在求w5的更新,误差反向传递路径输出层-->隐层,即out(O1)-->in(O1)-->w5,总误差只有一根线能传回来。但是求w1时,误差反向传递路径是隐藏层-->输入层,但是隐藏层的神经元是有2根线的,所以总误差沿着2个路径回来,也就是说,计算偏导时,要分开来算。看图:
那么,现在开始算总误差对w1的偏导:
先运算:
可以得到:
依次进行计算: