介绍BP法之前,我们先了解一下神经网络的概念。
神经网络是我们借助生物的神经网而抽象出来的一种数学模型。
我们知道生物的神经网是由神经元作为单元而构成的。那我们的神经网络也是有神经元的抽象而构成的。
生物神经元有如下特点
1.神经元对于其他多个神经元传递过来的信号,如果他们不超过某个固定的值(阈值),则神经元不做出任何反应。
2.对于其他多个神经元传递过来的信号,如果他们的和超过某个固定大小的值(阈值),则神经元做出反应(称为点火),向另外的神经元传递固定强度的信号。
3.对于其他多个神经元传递过来的信号中,每个信号所占的权重不一样,这可以理解成y=w1x1+w2x2+…+b的w即权重不一样。其实这样我们抽象的一个参数也能找到现实世界所对应的物理意义
现在我们定义神经元,在生物的角度上来说就是分化,数学上就是神经元的子集。
1.输入层神经元,这类神经元只能接受一个参数,并原封不动的向下一次输出
2.接受多个输入,并且有激活函数,输入变量经过激活函数判断阈值,来确定是否输出。
然后我们把神经元连接成网络状。这就是我们的神经网络
我们的输入层采用第一种神经元,他的任务就是与采集样本的数据,并输入的神经网络中
隐藏层,并不像看起来那么简单,在这里面处理的就是复杂的逻辑,隐藏层里面可以有卷积神经网络等等。
输出层,根据隐藏层的反馈,来确定判断结果
激活函数,最初我们采用的阶跃函数,但是我们知道,神经网络的计算,通常是用梯度下降法来确定参数的,但是梯度下降的话,避免不了和求导打交道,所以阶跃函数的越变点不可导这个就很烦人了。所以激活函数现场通常采用sigmoid函数和Relu函数
普及完基本概念,我们就拿一个例子来引出BP法反向误差传递法
反向误差传递的思路也很简单,根据名字我们可以猜到,他的大概意思的传递误差来修正我们的参数,怎么传递,向那传递?当然是反向传递,何解?
来看我们的网络
输出层—》隐藏层—》输出层
我们在哪得到的误差,肯定是你计算完成之后,然后算平方和误差对吧?
然后反向传递
输出层—》隐藏层—》输出层
|——|
这样我们的误差传递到隐层了
所以我们得定义一个变量,用来干这件事情,我们娶个名子叫神经单元误差用δ表示
定义如下
δ jl= ∂z jl/∂J(θ)(l=2,3,…)
δ表示 神经单元的加权输入z给平方误差带来的变化率,如果神经网络符合数据,根据最小值条件,变化率应该为0.换言之如果神经网络符合数据,根据最小值条件,δ=0。那么我们可以认为δ表示与符合数据这种理想状态的偏差,这个偏差表示为误差。
∂w jil∂J(θ)=δ jla il−1(l=2,3,…)
所以我么要做的就是
计算δ–》根据上式计算计算平方和误差c的偏导–》对于全体数据将上式相加,计算c的梯度
我们根据上面的神经单元误差知道
现在我们求出δ
根据上面2式有
我们将其一般化,就是写成通用的公式
然后带入loss函数计算
我们假设激活函数为sigmoid函数,则带入计算