深度学习笔记2-反向传播
2020-03-27 本文已影响0人
林桉
from 感知机
https://blog.csdn.net/duduhonghong/article/details/98668881
机器学习中,神经网络算法可以说是当下使用的最广泛的算法。神经网络的结构模仿自生物神经网络,生物神经网络中的每个神经元与其他神经元相连,当它“兴奋”时,想下一级相连的神经元发送化学物质,改变这些神经元的电位;如果某神经元的电位超过一个阈值,则被激活,否则不被激活。误差逆传播算法(error back propagation)是神经网络中最有代表性的算法,也是使用最多的算法之一。
BP(errorBackPropagation)


激活函数



f为激活函数,一般为sigmoid
从隐含层的第h个神经元看,输入层总共有 d 个权重传递参数传给他,它又总共有 l 个权重传递参数传给输出层, 自身还有 1 个阈值。所以在我们这个神经网络中,一个隐含层神经元有(d+l+1)个参数待确定。输出层每个神经元还有一个阈值,所以总共有 l 个阈值。最后,总共有(d+l+1)q+l 个待定参数。首先,随机给出这些待定的参数,后面通过BP算法的迭代,这些参数的值会逐渐收敛于合适的值,那时,神经网络也就训练完成了。
神经元工作方式
每个神经元接受n个来自其他神经元或者直接输入的输入信号,这些输入信号分别与每条“神经”的权重相乘,并累加输入给当前神经元。每个神经元设定有一个阈值θ,累计值需要减去这个阈值,并且将最终结果通过“激活函数”(f)挤压到(0,1)范围内,最后输出。

公式推导
下面以隐含层到输出层的权重参数 whj 为例说明:
误差:

我们可以按照前面给出的公式求出均方差误差 Ek ,期望其为0,或者为最小值。而BP算法基于梯度下降法(gradient descent) https://datawhalechina.github.io/leeml-notes/#/chapter6/chapter6来求解最优解,以目标的负梯度方向对参数进行调整,通过多次迭代,新的权重参数会逐渐趋近于最优解。对于误差 Ek ,给定学习率(learning rate)即步长 η ,有:

再看一下参数的传递方向,首先 whj 影响到了输出层神经元的输入值 βj ,然后影响到输出值 Yjk ,然后再影响到误差 Ek ,所以可以列出如下关系式1:

根据输出层神经元的输入值 βj 的定义:

得到:隐含层输出

对于激活函数(sigmoid函数):

很容易通过求导证得下面的性质:




类似的:

#BP神经网络
import numpy as np
X=np.array([[0,0,-1],[0,1,-1],[1,0,-1],[1,1,-1]])
Y=np.array([[0],[1],[1],[0]])
V = (np.random.rand(3,2)-0.5)*2/np.sqrt(2)
W = (np.random.rand(3,1)-0.5)*2/np.sqrt(2)
i=1
while i<2000:
B=1/(1+np.exp(-np.dot(X,V)))
ones=-np.ones((4,1))
B=np.hstack((B,ones))
Y_h=1/(1+np.exp(-np.dot(B,W)))
G= (Y-Y_h)*Y_h*(1-Y_h)
E=B*(1-B)*np.dot(G,W.T)
W=W+np.dot(B.T,G)
V=V+np.dot(X.T,E[:,:-1])
i=i+1
print(Y_h)