反向传播算法(Backpropagation Algorithm,BP算法)是深度学习的重要思想基础

 

目录

一、BP算法的推导

1、前向传播的计算

第一层隐藏层的计算

第二层隐藏层的计算

输出层计算

2、反向传播计算

计算偏导数

二、实际数据代入推导BP算法

1、前向传播计算

第一层隐藏层的计算

第二层隐藏层的计算

输出层计算

2、误差反向传播

输出层误差计算

第二层隐藏层误差计算

第一层隐藏层误差计算

3、更新参数

其实,大概意思就是在输入和输出之间构造神经网络(像人的大脑神经网络一样),当然这个神经网络里面会有很多的神经节点和节点之间相连的边(就想神经元由前到后相连)。然后,这个神经网络作为一个计算的网络,里面会有一些参数,要是参数选的好的话,那么这个模型就可以拿去用了,比如说,看到一张狗的照片,就知道这个是狗了。而反向传播算法就是从结果出发一步步去约束其中的参数,然后使得参数达到最优的状态。

看一看神经元,这里的:

a1、a2、a3指的是输入

w1、w2、w3指的是权重(对应输入的)

b 表示偏置(这里没有呢)

f 表示激活函数(你可以想成是平时数学课上的函数,一般都是比较简单的函数,表现出输入和输出的关系)

z 指的是输出

一、BP算法的推导

这个是一个简单的三层神经网络结构(两个隐藏层,一个输出层)

比如我们来解决一个二分类问题,给一个样本输入,通过前向运算得到输出

输出值域为(0,1),输出的结果越靠近0,就代表样本是0类的可能性越大,反之,1类的可能性越大

 

1、前向传播的计算

基本上都是矩阵运算

  • 第一层隐藏层的计算

  • 第二层隐藏层的计算
  • 输出层计算
  • 2、反向传播计算
    假设我们使用随机梯度下降的方式来训练神经网络的参数:

    损失函数(loss function)或代价函数(cost function),通常作为学习准则与优化问题相联系,即通过最小化损失函数求解和评估模

    型。定义为L\left ( y,\widehat{y} \right ),其中 y 定义为该样本的真实类标,而  \widehat{y}是模型的输出。

    这里有一些损失函数,我们一般用的是第二个平方损失函数:


  • 当损失函数的值为0时,那么表示模型参数训练的炒鸡好的!因为没有损失了。

    使用梯度下降法进行参数的学习,必须计算出损失函数关于神经网络中各层参数(权重w和偏置b)的偏导数。

  • 计算偏导数

BP算法基本就是这些

 

二、实际数据代入推导BP算法

我们对上述的神经网络代值进行计算验证,所有的参数的初始值如下:

注意:这里面的所有的权值w和所有的偏置b的具体的值都是初始值,当然也可以换成其他数字

 

1、前向传播计算

  • 第一层隐藏层的计算

  • 第二层隐藏层的计算
  • 输出层计算
  • 2、误差反向传播

  • 输出层误差计算
  • 第二层隐藏层误差计算
  • 第一层隐藏层误差计算
  • 3、更新参数

    我们已经计算出每一层的误差了,现在我们要利用每一层的误差和梯度来更新每一层的参数

    权重w和偏置b的更新公式如下:

  • 一般来说,权重w的更新会在前面加上一个正则化项来避免过拟合,这里为了简化运算,我们省去正则化项。

    正则化:必须有一种自动的东西来告诉我们哪种程度将最适合所提供的数据,同时告诉我们需要把那些特征的影响降低至最低,以获得最好的预测。

    是学习率:为了能够使得梯度下降法有较好的性能,我们需要把学习率的值设定在合适的范围内。学习率决定了参数移动到最优值的速度快慢。如果学习率过大,很可能会越过最优值;反而如果学习率过小,优化的效率可能过低,长时间算法无法收敛。所以学习率对于算法性能的表现至关重要。

    在每次迭代中去调整学习率的值是另一种很好的学习率自适应方法。此类方法的基本思路是当你离最优值越远,你需要朝最优值移动的就越多,即学习率就应该越大;反之亦反。我们这里设置为0.1。

    每一层的参数更新的计算方法都是一样的,这里只给出第一层隐藏层的参数更新:

  • 哈哈哈哈,具体还有很多东西,大家可以看看mooc复旦大学的商务数据教程!

    对原文进行了修正和添加!