BP——反向传播算法详解

本文主要参考吴恩达和李宏毅的深度学习视频,然后自己做的笔记
反向传播计算部分参考李宏毅的视频讲解,要是有童鞋也对反向传播这一部分的计算不那么清明,可以考虑选择留下来看看我的笔记,也可以移步李宏毅大神的视频讲解

人工神经网络的结构

(注:Markdown敲公式对我来说太困难,后面的公式都用图片的形式展示)
神经网络的结构包括:输入层(input layer)、隐藏层(hidden layer)、输出层(output layer)。如下图所示:
BP——反向传播算法详解
当然,隐含层可以有无数层,这里我只画了两层。
输入层输入的数据是训练样本(x1,x2,…,xn,y),训练样本中的x1到xn表示输入的特征值,而y则表示咱们希望输出的预期值。
隐含层将会进行一系列的计算来缩小训练样本的估计值y’与预期值y之间的误差。
输出层则会输出训练后得到的估计值y’。

前向传播

为了后面的表示方便,我们这里先约定一下每个神经元的表示方法。
aj[l][i]:第i个样本的第l层上第j个神经元的输入,且有 a[0] = x 。
z:中间变量
J:代价函数
g():**函数

前向传播主要完成两个任务:

  1. 计算每一个神经元的**值a;
  2. 是计算最后的代价函数J(y’, y)(如果我们这里只有一个输入样本的话,那么应该叫做损失函数)。

即将用到的公式有(这里就以上面给出的人工神经网络结构为例子,即一个样本的表示形式):
BP——反向传播算法详解
我们定义
前向传播的计算流程:

  1. 输入的准备工作:a[0]、w[1]、b[1]都排排坐,下面准备吃果果啦~
    BP——反向传播算法详解
  2. 求出a[1]
    BP——反向传播算法详解
    根据【人工神经网络结构图】可知,咱们的三个输入都连接到了三个神经元上,每个神经元都要有一个输出,因此咱们最后求得的a[1]也是一个3*1的向量。

咱们将上面的式子扔到神经网络中表示:
BP——反向传播算法详解
看到没有,每一个神经元都要进行一次z和a的计算,一直传到输出层,输出层求得的a就是咱们样本的估计值!

在python中表示求解z、a的式子为:

z = np.dot(w.T, x)+b
a = sigmoid(z)    #这里我采用sigmoid()函数作为**函数,这个函数主要是用来作二分类
  1. 损失函数J(y’, y)在python中的表示:

损失函数:求解单个样本的误差
代价函数:求解多个样本的误差

cost = -y * np.log(y') - (1 - y) * np.log(1 - y')   #这里只是单个样本的损失函数,如果咱们有m个样本的话就需要将这m个样本的损失值全部加起来再除以m求得这m个样本的代价函数。

**函数

**函数的作用:加入非线性因素,解决线性不可分问题。(比如说,现在给你一个得用歪七扭八的线来划分两个区域,你用直线肯定是不可能把他俩完美的分开的,但是加入非线性因素以后,你就可以拟合出一条近乎完美的线来划分这两个区域啦~)

**函数有很多种,咱在上面使用的是用于二分类的一种常用的**函数,一般用在输出层。(不同层可以使用不同的**函数,还有一点很重要的是:**函数得是可微的!因为咱们在反向传播阶段得对**函数求导!)

各种**函数详情请咨询:千奇百怪的**函数 来源:wikipedia

反向传播

老规矩,先约定一波:
dw: J对w求偏导
db: J对b求偏导
dz: J对z求偏导
da: J对a求偏导

步骤:

  1. 求解dw, db
  2. 更新w, b

方法:梯度下降
小工具:链式求导

咱们在计算时一定一定会用到的四个公式:
BP——反向传播算法详解
现在看不太明白这几个公式没有关系,咱们先往后走,看看具体是怎么计算的,一会再看这些公式心就明朗啦~ 加油加油,马上就完了!

梯度下降

具体计算过程