1. BP算法的提出
BP算法最初是由Paul Werbos在1974其博士论文中首次论证。 David E. Rumelhart 、Geoffrey Hinton、Ronald J. Wlilliams 三人在1986年再次发表在了1986年10月9日的Nature上,(原始论文地址这个要收费,文末有免费的paper地址,整个paper篇幅不长,有兴趣的可以下来读一读。) 目前我们通常说的BP算法多指86年提出的算法。
2. BP算法的理解
BP算法的理解可以拆解成三部分:
- 反向传播
- 梯度下降
- 链式法则
下面我们简单的说下各部分的细节
2.1 反向传播
何为反向传播?就是使用预测值与实际值的差异来反向更新网络的参数。这里的差异指通过损失函数计算出的,举例,如:,这个总体的就是我们要更新参数的依据。
2.2 梯度下降
来更新参数,怎么更新呢?我们先从简单的入手,如下这个网络。(偏置项没有画)
w1
w2
w3
w4
w5
w7
w6
w8
x1
h1
X2
h2
O1
O2
这里我们把、代入、,再把、代入,最后我们会得到一个关于的式子(这个式子太长了,不写了),我们的就是把输入到这个式子计算得到的。说了这么多,其实我只是想表达一件事儿,就是神经网络看起来很复杂,但用数学描述后,就是一个很大的复合函数。把输入变量输进来,就能得到(网络的输出当然是),之后就好办了,更新一个函数的参数我们可以用梯度下降法:
2.3 链式求导
,这里我们以更新参数来举例说明:
我们看看是从哪里开始影响的
我们定义sigmoid函数为 , sigmoid函数内的式子定义为(偏置项可以理解为,为参数), 损失函数定义为,则:
(这里没有展开,所以看着不长),当然这个式子的输入是、。我们计算关于的偏导,这里用到了数学中的链式法则,即:
因为只有包含 所以
所以
而 这三个变量在正向传播时已经计算出了,也就是说算到这步,我们就求出了,然后我们把结果代到中就可以更新参数了。
3. 再谈反向传播
现在有很多人一聊起BP算法就提链式法则,忽略了反向传播的基本思想,原因可能是现在的各种神经网络参数更新都使用这种方法,但殊不知,在这个简单的思想提出前,多层感知机的参数学习一直是一个很大的问题。这个思想统治了近35年的神经网络参数更新方式。但有意思的是,前两年,做为这个算法的提出者Hinton大神,亲自提出了要推翻BP算法的想法,用Hinton的说法是(下面不是原话哈,我的理解),BP算法是不符合人脑学习规律的,人脑是从前向后一边接收信息,一边学习的,而不是到最后看到结果了才学习(更新参数),而我们的神经网络其实是模拟人脑结构的(基于神经元),但学习方法确与人脑的不符,之后如果神经网络要有大的发展,必定是舍弃BP算法,寻找到一种从前向后的学习方法。