1.Bp算法:
原名是backpropogation,分为正向传递数据,反向进行数据的更新,主要是去进行一些数据传递。一般分为3种层次,有输入层(input layer),隐藏层(hidden layer),输出层(output layer)。其中输入层,输出层一般只有1层,而隐藏层取决于具体实例的学习进程,可以设置多层次。
附录:
1.1 layer1:输入层,有3个输入
1.2 layer2:隐藏层,进行数据的传递
1.3 layer3:输出层,进行数据的输出
w:为传递数据时的权重
b:为传递数据时的偏值
f:为激活函数(因为最后的输出是通过一个非线性的函数进行输出的),我们一般使用的是两种函数,一种是sigmoid函数,还有tanh函数
sigmoid函数:
同时我们也可以了解一下sigmoid函数求导之后的值为:
F‘(X)=F(X)+(1-F(X))(对后面误差反向传播有帮助)
2.Bp算法的正向数据传播:
1.1传播的方式:
与线性代数上的矩阵类似,通过矩阵的乘法来进行每一轮的数据传播,前一层的输出做为下一层的输入来依次传播
其中由w组成的是一个矩阵,它是由权重与前一层的输出的乘积(举证相乘)再加上他们的偏值,得出Z,然后通过非线性函数的转化f(这里为sigmoid函数作为激活函数),才能得到下一层的输出a(同时组成a的也是一个矩阵)
(像上面这样)
向上面这些w,b会在python中的numpy库中通过random函数随机生成,为此正向传播就完成了
3.Bp算法的核心:反向传播数据:
所谓反向传播其实可以理解为机器在学习的过程,通过不断的权值,偏值的更新对算法进行训练,使得他们的数据更为精确,从而达到可以预测的效果。同时这样一个点也是机器学习最为基础的算法。
在反向传递数据之前,我想提的是如何进行偏导,以及张量求导和链式求导法则,现在我简单说一下:
A.偏导的求解:
所谓偏导,其实可以和原函数求导相关联的,只不过求导的对象可能会发生改变,以往我们的对象为一元一次的函数求导,现在可能是微积分求导或者对矩阵求导等等。抓住核心对谁求偏导谁才是真正的变量。
B.张量求导:
https://blog.csdn.net/pku_zzy/article/details/88058838
(这是博客上的一文,有参考价值,但是核心还是的抓住“YX拉伸术”对张量求导可谓是通用的法则)
C.链式求导:
所谓的链式求导其实就是复合函数求导一样的性质,可以结合微分来考虑,其原理是依据导数具有商的性质。对一些较难转化的量变为通过依靠某些中间变量来进行求解。
接下来进行反向传播数据,从输出层开始,首先算出输出层的误差代价。
对于从输出层展开到隐藏层:
注意:
1.其实我们可以从输出层出发来测算出他们之间的相互联系,误差的反向传播其实是一个不断累计求和的过程,他是所有的误差返回值求和再平均取值的一个关系。
2.通过运用链式求导来解决一些张量求导是很有帮助的,就像再E对w求导时不方便计算,我们可以借助a,Z等数据进行求导的化简,最后在进行一个规律的寻找,找出对于返回指向同一个数据的E值时所具有的一些特性,从而方便后面的隐层求导找出规律来
3.所有的计算可以把矩阵类比成一个数的计算,从而更方便我们去理解Bp的原理
对于隐藏层的更新权重:
在到最后的输出层和隐藏层偏值的更新:
以下是自己的详细推导过程:
(字迹有点丑,别介意)