1.BP神经网络结构与原理
由于BP神经网络参数超级多,如果不先定义好变量,后面非常难理解,故针对上述图形,定义如下:
通过上面的定义可知:
2.BP神经网络公式推导
第一次项是均方差项(经验风险),第二项是正则项。可以看出,代价函数是关于所有权重和偏置的方程,要通过求代价函数最小来得到最佳的权重和偏置,可以采用梯度下降法逐步下降迭代得到,具体为:
现在就是要求各权重和偏置的偏导,直接求上述式子会发现非常困难,而BP反向传播算法就是一种方便的求解偏导数的方法,可以认为是一种从后往前找规律的方法,下面开始推导:对于第层的参数,可以容易得到
现在的问题转化为求每个样本情况下的代价函数关于各权重和偏置的偏导,通过观察不难发现:对于任何一个样本均有
而是关于上一层w和b的函数,故可以考虑从最后一层开始算起,看能否找到规律,即有:
注意:按照上述定义,对于层的BP神经网络,w和b的参数上标只能取得
并且有:
根据链式法则:
此时设:
对于最后一层,由于映射函数、都是一直的,故此时已经唯一确定了,而前面基层的依然未知。下面来推导倒数第二层:
下面只需要求即可,使用链式法则
注意:k表示当前层数的第k个神经元,而第k个神经元的受到前一层的所有的第i个影响,故有:
故BP神经网络的完整流程如下:
3.BP神经网络的第一种是实现
采用误差平方和作为损失函数,基于反向传播算法推导,可得最终的4个方程式,如下:
一个基本的神经网络:
from BPNetwork_better import mnist_loader
from BPNetwork_better import network
training_data, validation_data, test_data = mnist_loader.load_data_wrapper()
training_data = list(training_data)
net = network.Network([784, 30, 10])
net.SGD(training_data, 30, 10, 3.0, test_data=test_data)
改进后的:
from BPNetwork_better import mnist_loader
from BPNetwork_better import network2
training_data, validation_data, test_data = mnist_loader.load_data_wrapper()
training_data = list(training_data)
net = network2.Network([784, 30, 10], cost=network2.CrossEntropyCost)
# net.large_weight_initializer()
net.SGD(training_data, 30, 10, 0.1, lmbda=5.0, evaluation_data=validation_data,
monitor_evaluation_accuracy=True)