反向传播算法(BackPropagation,BP)

    在一个多层的神经网络中,反向传播算法就是不断的学习这个网络的权值和偏值,采用梯度下降法使得该神经网络的输出值与真实的目标值之间的误差最小。

    1,那么为什么更新权值和偏值可以使得代价函数最小化呢?  2,以及如何更新权值和偏值呢?

    由于该算法使用了很多的符号,这里需要解释一下各个符号的意义。

    表示第层的第k个神经元到第层的第j个神经元连线上的权值,如下图给出了⽹络中第⼆层的第四个神经元到第三层的第⼆个神经元的链接上的权重:


     我们的权值为什么要这么标记呢,那是因为我们神经网络中每一层的权值都是以矩阵的方式存储的,那么也可以这么理解,他表示第j行第k列对应的元素值,其意义是:第j行表示的就是层所有神经元与层第j个神经元连接相对应的权值。这样记为了方便运算,乍看起来有点别扭而已。

  表示层第j个神经元的输入,表示层第j个神经元的输出,表示第层第j个神经元的偏值,C表示代价函数。那么有:


    其中表示激活函数,比如sigmoid函数。这个且不用考虑。我们符号先说明到这里,剩下的用到再说。

    1,那么为什么更新权值和偏值可以使得代价函数最小化呢?

    我们训练神经网络的目的就是使得代价函数(比如二次代价函数)最小化,我们其实不必在意代价函数的具体形式,不影响我们对BP算法的理解。但是还是要啰嗦一下,以便说明为什么要对权值和偏值进行更新,比如一个单独的训练样本x,其二次代价函数为:

    由此,可以看出来这个函数还依赖于实际的目标值y,但是为什么不把它看成y的函数呢?因为一旦一个训练样本被给定,那么他的实际目标值也已经确定了,所以把它看成神经网络输出值的函数是合理的,因为可以看成是权值和偏值的函数,我们可以通过不断地修改权值和偏值来改变神经网络的输出值。这也就说明了我们可以通过修改权值和偏值可以达到改变输出值得效果。这就是为什么要修改权值和偏值。

    2,以及如何更新权值和偏值呢?

    接下来就要介绍BP算法了,首先介绍一个很重要的概念误差表示第 层第j个神经元上的误差,那么怎么理解这个误差的概念呢?假设如下的神经网络上有一个调皮鬼:


    这个调皮鬼在层的第j个神经元上,它会对输入做出一些干扰,使得输入有一个很小的变化,使得该神经元的输出由变为,那么在前向传播的过程中使得整个神经网络的输出产生的改变。这个要说明一下:的偏导恰是的系数,也是最终改变的倍数。

    现在这家伙变好了,那么他现在要做的就是,试着找到一个使得代价更小,假设是一个很大的一个值(或正或负),那么他就可以选择一个与符号相反的来降低代价。相反如果接近于0,那么无论他如何抉择,也不能带来改善,那么在他看来,这个时候神经元已经很接近最优了。那么我们可以把看成神经元误差的一种度量。

    如上所述,层的第j个神经元的误差可定义为:

    由:



    我们可得输出层的误差方程为:


    根据下一层神经元的输入是上一层神经元输出的线性组合,那么我们是不是可以由下一层神经元的误差来表示当前层的误差呢?可以,由链式法则可得:

  


    因为的函数,即:


    我们对求偏导可得:

  

    故而可得:

  

    由此我们可以知道第层的误差可以由层的误差反馈过来,这就是反向传播(Backpropagation,BP)。由该式 可得其含义:

    层某个神经元j的误差值,等于,第层所有与神经元j相连的神经元的误差值的权重之和,乘以,该神经元j的激活函数的梯度。

    那么权值如何更新呢?由于的函数,即:


    则:



    由梯度下降法可得更新规则为:



    由此我们可以看出,反向传播过程,就是更新神经元误差值的,然后再根据所求出每个神经元的误差值,再正向更新权值和偏值,到此  我们的理论推导已经完事。

  网上有个例子,说的很清楚,不过符号标记简化了,但是不耽误理解BP算法的思想,现copy如下:

  有一个三层的神经网络,两个输入,一个输出,如下所示:


    每个神经元分为两个模块,第一个用来处理,输入信号与相应权重的乘积之和,第二个模块依赖于激活函数f,e是一个中间变量,相当于我们上述的每个神经元的输入z,但是在这里他用z标记为实际的目标值。y是每个神经元的输出信号,。如下图:


    首先我们根据输入信号,来描述前向传播的过程,首先看隐藏层的第一层,如下图:



    计算隐藏层的第二层,其中表示该层的第m个神经元与下一层的第n个神经元连接的权重。如下:


    计算输出层,如下:


    我们到此根据输入信号计算出了输出值,那么与实际的目标值相比较如何呢?我要计算输出层的误差,进而利用反向传播算法不断地更新权值,使得代价最小。再次说明一下,这里的z表示的是实际的目标值。如下图:


    由上述我们的推导可知,我们需要先求出每个神经元的误差值,然后才能更新权值,求误差的过程也是就是反向传播的过程。根据公式,如下图所示:





    到此我们计算完每个神经元的误差值之后,我们就可以根据误差值来正向更新权值了,交代一下,表示学习率,跟我们上述的一样的意思,如下图所示:








    这是一个循环,如果代价函数没有达到我们的要求,就要以此继续下去,直至达到我们的要求。

 





参考:《Neural Network and Deep Learning》

http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
反向传播backpropagation,简称BP)是一种用于训练神经网络的算法,其主要目的是通过计算误差并反向传播来更新每个神经元之间的权重。 以下是一个简单的反向传播算法的代码示例: ```python # 初始化网络参数 input_layer_size = 2 hidden_layer_size = 3 output_layer_size = 1 # 初始化权重和偏差 W1 = np.random.randn(input_layer_size, hidden_layer_size) b1 = np.zeros((1, hidden_layer_size)) W2 = np.random.randn(hidden_layer_size, output_layer_size) b2 = np.zeros((1, output_layer_size)) # 定义激活函数 def sigmoid(z): return 1 / (1 + np.exp(-z)) # 定义反向传播算法 def backpropagation(X, y, W1, b1, W2, b2, learning_rate): # 前向传播 z1 = np.dot(X, W1) + b1 a1 = sigmoid(z1) z2 = np.dot(a1, W2) + b2 y_pred = sigmoid(z2) # 计算误差 delta3 = y_pred - y # 反向传播 delta2 = np.dot(delta3, W2.T) * (a1 * (1 - a1)) # 更新权重和偏差 dW2 = np.dot(a1.T, delta3) db2 = np.sum(delta3, axis=0, keepdims=True) dW1 = np.dot(X.T, delta2) db1 = np.sum(delta2, axis=0) W2 -= learning_rate * dW2 b2 -= learning_rate * db2 W1 -= learning_rate * dW1 b1 -= learning_rate * db1 return W1, b1, W2, b2 # 训练模型 for i in range(1000): W1, b1, W2, b2 = backpropagation(X, y, W1, b1, W2, b2, 0.1) # 预测结果 z1 = np.dot(X, W1) + b1 a1 = sigmoid(z1) z2 = np.dot(a1, W2) + b2 y_pred = sigmoid(z2) ``` 这段代码假设我们要训练一个具有一个隐藏层、2个输入节点和1个输出节点的神经网络。我们首先随机初始化权重和偏差,然后定义了一个`sigmoid`激活函数。然后我们定义了一个`backpropagation`函数,该函数接收输入数据`X`和目标输出`y`,以及当前的权重和偏差,并使用反向传播算法来更新权重和偏差。在训练模型时,我们重复调用`backpropagation`函数,直到模型收敛。最后,我们使用训练好的模型来预测新的输入数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值