欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[深度学习之美】BP 算法双向传输,链式衍生最纠结(入门系列之八)

最编程 2024-04-05 20:29:21
...

更多深度文章,请关注:https://yq.aliyun.com/cloud


系列文章:

一入侯门“深”似海,深度学习深几许(深度学习入门系列之一)
人工“碳”索意犹尽,智能“硅”来未可知(深度学习入门系列之二)
神经网络不胜语,M-P模型似可寻(深度学习入门系列之三)
“机器学习”三重门,“中庸之道”趋若人(深度学习入门系列之四)
Hello World感知机,懂你我心才安息 (深度学习入门系列之五)
损失函数减肥用,神经网络调权重(深度学习入门系列之六)
山重水复疑无路,最快下降问梯度(深度学习入门系列之七)


8.1 BP神经网络极简史

在神经网络(甚至深度学习)参数训练中,BP(Back Propagation)算法非常重要,它都占据举足轻重的地位。在提及BP算法时,我们常将它与杰弗里•辛顿(Geoffrey Hinton)的名字联系在一起。但实际上,辛顿还真不是第一个提出BP算法的人,就像爱迪生不是第一个发明电灯的人一样。但人们记住的,永远都是那个让电灯“飞入平常百姓家”的功勋人物爱迪生,而不是它的第一发明人美国人亨利·戈培尔(Henry Goebel)。
如果说辛顿就是BP算法的“爱迪生”,那谁是BP算法的“戈培尔”呢?他就是保罗·沃伯斯(Paul Werbos)。1974年,沃伯斯在哈佛大学博士毕业。在他的博士论文里,首次提出了通过误差的反向传播来训练人工神经网络[1]。事实上,这位沃伯斯不光是BP算法的开创者,他还是循环神经网络(Recurrent Neural Network,RNN)的早期开拓者之一。在后期的系列入门文章中,我们还会详细介绍RNN,这里暂且不表。
说到BP算法,我们通常强调的是反向传播,但其实呢,它是一个典型的双向算法。更确切来说,它的工作流程是分两大步走:(1)正向传播输入信号,输出分类信息(对于有监督学习而言,基本上都可归属于分类算法);(2)反向传播误差信息,调整全网权值(通过微调网络参数,让下一轮的输出更加准确)。
下面我们分别举例,说明这两个流程。为了简化问题描述,我们使用如图8-1所示的最朴素三层神经网络。在这个网络中,假设输入层的信号向量是[1, -1],输出层的目标向量为[1, 0],“学习率”η为0.1,权值是随机给的,这里为了演示方便,分别给予或“1”或“-1”的值。下面我们就详细看看BP算法是如何运作的?


a37d182a966571c11bcf7c67901d95385c4b2797


图8-1 简易的三层神经网络

8.2.1正向传播信息

正向传播信息,简单说来,就是把信号通过激活函数的加工,一层一层的向前“蔓延”,直到抵达输出层。在这里,假设神经元内部的激活函数为Sigmod(f(x)=1/(1+ex))。之所以选用这个激活函数,主要因为它的求导形式非常简洁而优美:

f(x)=f(x)(1f(x))

事实上,类似于感知机,每一个神经元的功能都可细分两大部分:(1)汇集各路链接带来的加权信息;(2)加权信息在激活函数的“加工”下,神经元给出相应的输出,如图8-2所示。


e799875d1ae2221de6408d195b1148e1b7665699


图8-2 单个神经元的两部分功能

于是,在正向传播过程中,对于f1(e)神经元的更新如图8-3所示,其计算过程如下所示:

f1(e)=f1(w11x1+w21x2)=f1((1)×1+1×(1))=f1(2)=11+e(2)=0.12


15e16a639205944383b5dbed20d10b016a4721e5


图8-3 神经元信息前向更新神经元1的f1(e)

接着,在同一层更新f2(e)的值,过程和计算步骤类似于f1(e),如图8-4所示:

f2(e)=f2(w12x1+w22x2)=f2(1×1+1×(1))=f2(0)=11+e0=0.5


3162a0faa5695dc6019a9f81d6a59ffebfd33f9e


图8-4 神经元信息前向更新神经元2的f2(e)

接下来,信息正向传播到下一层(即输出层),更新神经元3的f3(e)(即输出y1的值),如图8-5所示。

y1=f3(e)=f3(w13f1+w23f2)=f3(1×0.12+1×0.5)=f3(0.62)=11+e0.62=0.65


e0b50156560626a2171ecefcd0106af95a993721


图8-5 神经元信息前向更新神经元3的f3(e)

然后,类似地,计算同在输出层求神经元f4(e)(即输出y2)的值,如图8-6所示。

y2=f4(e)=f4(w14f1+w24f2)=f4((1)×0.12+1×0.5)=f4(0.38)=11+e0.38=0.59


c70fef942c8a8512f172d0d4e7ee3dc6ca646b4c


图8-6神经元信息前向更新f4(e)

到此,在第一轮信号前向传播中,实际输出向量已计算得到y=[0.65,0.59]T,但我们预期输出的向量(即教师信号)是y=[1,0]T,这二者之间是存在“误差”的。于是,重点来了,下面我们就用“误差”信息反向传播,来逐层调整网络参数。为了提高权值更新效率,这里就要用到下文即将提到的“反向模式微分法则(chain rule)”。

8.2.2 求导中的链式法则

(砰!砰!砰!敲黑板!请注意:如下部分是BP算法最为精妙之处,值得细细品味!)
在前面信号正向传播的示例中,为了方便读者理解,我们把所有的权值都暂时给予了确定之值。而实际上,这些值都是可以调整的,也就是说其实它们都是变量,除掉图8-1中的所有确定的权值,把其视为变量,得就到更为一般化的神经网络示意图8-7。


bf27a24908edd07a5e3338e984749d96d3e5613d


图8-7 带权重变量的神经网络

这里为了简化理解,我们暂时假设神经元没有激活函数(或称激活函数为y=x),于是对于隐含层神经元,它的输出可分别表示为:

f1=x1w11+x2w21f2=x1w12+x2w22

然后,对于输出层神经元有:

f3=f1w13+f2w23=(x1w11+x2w21)w13+(x1w12+x2w22)w23=x1w11w13+x2w21w13+x1w12w23