深度学习 2 : BP 算法

来源:互联网 发布:张艺兴网络剧 编辑:程序博客网 时间:2024/05/22 17:29

BP 即 Back Propagation

一,算法前提

机器学习是数理统计的一种应用,可以看做是,用合适的曲线对给定的一些样本点进行拟合。
深度学习也是数理统计的一种应用,只不过,样本点不再是 ( x , y ) 这样的简单点对,而是 ( X , Y ) 这样由向量,矩阵 等组成的更广义的点对。
因此,( X , Y ) 之间的关系也变得更加复杂,不太可能像 ( x , y ) 一样用简单的函数即可表达。
但是,人们发现,可以用多层神经网络来表示这样的关系,多层神经网络描述本质就是一个多层复合的函数。

二,算法选择

深度学习各层神经网络之间,会使用 W 来表示层间连接权值,可以用 Wnij 表示第 n 层网络中第 i 个节点到第 n+1 层网络中第 j 个节点的连接权值,

同机器学习 ( x , y ) 点拟合目标函数一样,深度学习 ( X , Y ) 也有用于表达拟合的目标函数,通常也称此目标函数为成本函数,
成本函数中含有若干多个连接权值 Wnij , 成本函数就是通过调整每一个连接权值来使得成本函数的函数值最小,即成本最小,

记成本函数为 cost function,
cost function 函数可以看成是由所有待求权值 Wnij 为自变量的复合函数,通常是非凸函数,即含有若干个局部最小值,我们可以通过梯度下降法来有效求解 cost function 的最小值 。

三,梯度下降算法

梯度下降法给定一个初始点,然后求该点的梯度向量,再以负梯度方向为搜索方向,以一定的步长进行搜索,从而确定下一个迭代点,再计算该新迭代点的梯度方向,重复此过程,直到 cost function 收敛 。 那么如何计算迭代点的梯度呢?

cost function 记做:H(W11,W12,...Wij,...Wmn,)
那么 cost function 的梯度向量为:

H=HW11e11+HW12e12+...+HWmnemn
其中,eij 表示正交单位向量。
对此,我们需要求出 cost function H 对每一个连接权值 Wij 的偏导数。

BP算法就是用来求解这种多层复合函数的所有的成千上万个变量的偏导数而生的。
由此,便引入反向传播算法。

四,反向传播

以求函数

Y=(a+b)(b+1)

的偏导数为例,这里设 A=a+b 并且 B=b+1

Ya=YAAa

Yb=YAAb+YBBb

上述计算 Y 到各变量偏导数的方法称为正向链式计算

将每一个变量当做一个节点,可以看到:

计算 Ya 的值等于从 Y 到 a 的路径上( a - A - Y )的偏导值的乘积

计算 Yb 的值等于从 Y 到 b 的路径 1 ( b - A - Y )上的偏导值的乘积加上路径 2 ( b - B - Y ) 上的偏导值得乘积

就是说,对于上层节点 p 和下层节点 q , 要求得 pq , 需要找到 p 节点到 q 节点的所有路径,对每条路径,求得该路径上的所有偏导数之乘积 - 称为路径乘积,然后将所有路径的路径乘积累加起来才能得到 pq 的值。

显然这里的 YA 被重复计算,即路径 a - A - Y 和路径 b - A - Y 都走了路径 A - Y,当神经网络的参数巨多的时候,这种正向链式计算会造成重大的冗余。

BP算法 为了避免这种计算冗余而生,如名字所示,是反向地从上往下寻找路径的:

  1. 从最上层的节点 Y 开始,初始值为 1 , 以层为单位进行处理,对于 Y 下层的所有节点, 将 1 乘以 Y 到某个节点路径上的偏导值,并将结果 “堆放” 在该子节点中。

  2. 这样传播完毕后,第二层的每一个节点都 “堆放” 些值,然后我们针对每个节点,把它里面所有 “堆放” 的值求和,就得到了顶点 Y 对该节点的偏导。

  3. 然后将这些第二层的节点各自作为起始顶点,初始值设为顶点 Y 对它们的偏导值,以”层”为单位重复上述传播过程,即可求出顶点 Y 对每一层节点的偏导数。

以求函数 Y=(a+b)(b+1)a=2 , b=1Y 的梯度为例:

  1. 节点 A 接受 Y 发送的 1 * 2 并堆放起来,节点 B 接受 Y 发送的 1 * 3 并堆放起来,至此第二层完毕.

  2. 求出各节点总堆放量并继续向下一层发送。

  3. 节点 A 向 a 发送 2 * 1并对堆放起来,节点 B 向 b 发送 2 * 1 并堆放起来,节点 B 向 b 发送 3 * 1 并堆放起来,至此第三层完毕,节点 a 堆放起来的量为2,节点b堆放起来的量为 2 * 1 + 3 * 1 = 5。即顶点 Y 对 a 的偏导数为 2 . 即顶点 Y 对 b 的偏导数为 5.

举个不太恰当的例子,如果路径表示欠钱的关系,即 A → Y 表示 A 欠 Y 的钱。以 a , b为例,直接计算 Y 对它们俩的偏导相当于 a , b 各自去讨薪。a 向 A 讨薪,A 说 Y 欠我钱,你向他要。于是 a 又跨过 A 去找 Y。b 先向 A 讨薪,同样又转向Y,b 又向 B 讨薪,再次转向 Y。可以看到,追款之路,充满艰辛,而且还有重复,即 a, b 都从 A 转向 Y。

而BP算法就是主动还款。Y 把所欠之钱还给 A,B。A,B 收到钱,主动把钱转发给了a,b,皆大欢喜。

参考:
https://www.zhihu.com/question/27239198/answer/89853077
http://neuralnetworksanddeeplearning.com/