1.BP网络的提出
BP神经网络是一种按照误差你先传播算法训练的多层前馈神经网络
2.BP网络的结构:
BP神经网络是一种典型的非线性算法。BP神经网络由输入层、输出层和之间若干层(一层或多层)隐含层构成,每一层可以有若干个节点。层与层之间节点的连接状态通过权重来体现。
只有一个隐含层的时候,这样的BP神经网络属于传统的浅层神经网络;当有多个隐含层的时候,这样的BP神经网络属于深度学习的神经网络。
3.感知器——BP神经网络中的单个节点
包括输入项、权重、偏置(便于区分)、激活函数、输出组成
为什么要引入偏置呢?
4.BP神经网络的核心步骤
BP (Back Propagation)神经网络的核心步骤如下。其中,实线代表正向传播,虚线代表反向传播。
5.BP神经网络的传播
正向传播
正向传播就是指数据(或信息、信号)从输入端输入之后,沿着网络的指向,乘以对应的权重之后再加和,在将结果作为输入在激活函数中进行计算,将计算的结果作为输入传递给下一个节点。依次计算,直到得到最终的输出。
通过感知器的讲解,输入x经过层层计算,得到输出。这个过程,是正向传播阶段。
图解法讲解正向传播
例1:
局部梯度
局部梯度,是指考虑单个节点上的梯度,而不考虑该节点之前的梯度。局部梯度概念的引入,结合链式法则,能够更方便的理解和计算反向传播。
例2:
Sigmoid函数
反向传播
反向传播是指将输出的结果与理想的输出结果进行比较,将输出结果与理想输出结果之间的误差利用网络进行反向传播的过程,本质是一个"负反馈"的过程。
具体的过程是通过多次迭代的过程,不断地对网络上各个节点间的所有的权重进行调整,权重调整的方法采用梯度下降法。
正向传播与方向传播中特殊的运算结构
Max和Min函数所在节点的本地梯度,如果参与后续运算,则本地梯度为1,否则为0。
图c所示情况,上游梯度为两个方向上的上有梯度相加。
例3:
6.通过迭代的方法寻找函数最小值
解析解:通过严格的公示推倒计算,给出的方程的精确解,任意精度下满足方程。
数值解:在一定条件下,通过某种近似计算得到的解,能够在给定的精度下满足方程。
梯度下降法是训练神经网络和线性分类器的一种普遍方法
7.总结
8.
python代码实现简单的BF网络
from numpy import exp,array, random, dot
#从numpy库中调用exp(指数函数)、array(数组)、random(随机函数)、dot(矩阵相乘函数)。
training_set_inputs = array([[0,0,1],[1,1,1],[1,0,1],[0,1,1]])
#bp神经网络训练部分的输入。
training_set_outputs = array([[0,1,1,0]]).T
#bp神经网络训练部分的输出,.T表示矩阵转置。
random.seed(1)
#使用随机函数生成随机数,使用seed函数能够确保每次生成的随机数一致。
synaptic_weights = 2 *random.random((3,1))- 1
#生成一个随机数组,数组格式为3行1列,用来存储初始权重。
for iteration in range(10000):
output = 1 / (1 + exp(-(dot(training_set_inputs,synaptic_weights))))
#使用for语句循环10000次,将训练集的输入和权重采用.dot进行矩阵相乘,将相乘得到的结果输入到sigmoid函数,然后将得到的结果赋值给output.
synaptic_weights += dot(training_set_inputs.T,(training_set_outputs - output) * output * (1 - output))
# 权重的调整采用“误差加权导数"公式。
print(1/(1 + exp(-(dot(array([1, 0, 0]),synaptic_weights)))))
#synaptic_weights是调整之后的最终权重,数组(矩阵)[1,0,0]与这个权重矩阵通过dot函数进行相乘,将相乘的结果作为输入引入到sigmoid函数,得到最终的结果。