TensorFlow从0到1 | 第十章:NN基本功:反向传播的推导

上一篇 9 “驱魔”之反传大法 引出了反向传播算法,强调了其在神经网络中的决定性地位,并在最后窥探了算法的全貌。本篇将详细的讨论算法各方面的细节。尽管我们都能猜到它会被TF封装,但是仍强烈建议把它作为人工神经网络的基本功,理解并掌握它,回报巨大。

《Neural Network and Deep Learning》的作者Nielsen写道:

It actually gives us detailed insights into how changing the weights and biases changes the overall behaviour of the network. That's well worth studying in detail.

实际上它(反向传播算法)给了我们更加细致的洞察:如何通过改变权重和偏置来改变网络的整体行为。非常值得深入的学习。

好在这里面最困难的——推导反向传播四大公式,也并非看上去那么难:keep calm and use chain rule(链式求导法则)。

chain rule

先说前馈

为了能说清楚“反向传播”(Backpropagation),得先从“前馈”(Feedforward)说起。

到目前为止讨论的神经网络,都是以上一层的输出,作为下一层的输入,其中没有回路。也就是说网络中的信息总是从输入层向输出层传播,不存在反馈(Feedback)。这样的网络就是前馈神经网络

对于前馈神经网络,当确定了网络的层数,每层神经元的个数,以及神经元的激活函数,那么给定输入,通过“层层前馈”就能计算输出。用ajl来表示第l层中第j个神经元的输出,那么输出的表达式为:

a<sub>j</sub><sup>l</sup>

上式是l层第j个单个神经元的输出表达式,如果用矩阵来表示某一层所有神经元的输出的话,形式会更加的简单和优美:

a<sup>l</sup>

上式表示了l层神经元的输出与输入(也就是上一层神经元的输出)之间的关系。

为了对上式的矩阵操作看的更加清晰,仍用之前的3层感知器网络举例。

3层感知器

简单回顾下矩阵的乘法的行列约束:Alm·Bmn=Cln,即一个l行m列的矩阵A与一个m行n列的矩阵B相乘,那么结果矩阵C是l行n列。

套用al的公式,计算a2(第二层输出):

a<sup>2</sup>

等价的微观视角:

a<sup>2</sup>的计算

有了前馈表达式,就可以计算出网络各层的输出al,乃至最终的输出aL(L代表网络的总层数)。这样,当前模型的损失函数也能计算出来了,仍以均方差(MSE)作为损失函数:

B-O-F-2 损失函数

用aL(x)代替下式中的output(x),有:

B-N-F-7 损失函数

其中对于单个独立样本Cx来说,有:

B-N-F-8 单个样本的损失函数

从上式的形式上来看,也可以把损失Cx看成神经网络输出aL的函数。

什么在反向传播?

前面介绍了信息的前馈,也明说了信息没有“反向回馈”。那么当我们在说反向传播时,我们在说什么?

答案是“神经元的误差”,“误差”在反向传播。对于第l层的第j个神经元,神经元误差的定义是:

B-N-F-9 误差

实际上你可以把它当成一个纯粹的形式定义,从其表达式可以看出:某个神经元的误差是损失函数C对于该神经元带权输入z的偏导数,其中带权输入z就是神经元激活函数的输入:

B-N-F-10 带权输入

之所以误差会沿着网络反方向传播,主要是基于对反向传播第2个公式的(BP2)的发现、观察和理解。BP2显示:被定义为神经元误差的δl,是由比它更靠近输出层神经元的误差δl+1决定的。基于这个数学推导过程中的发现,人们才获得了误差是反向传播的这个宝贵认知。

再次列出反向传播4大公式:

BP1

BP2

BP3

BP4

此时再回看BP1,就会意识到BP1与BP2配合之强大了:只要通过BP1计算出输出层的δL,那么就可以通过BP2“层层反传”,计算出任意一层的δl。而损失函数C对于wl和bl的偏导数也就可以通过BP3和BP4得到了。

推导前的两个准备

Hadamard乘积

在BP1与BP2中都用到了一个符号“⊙”,它连接两个矩阵完全相同的矩阵,表示Hadamard(哈达玛)乘积。它的运算规则非常的简单(仅次于矩阵加减法),就是两矩阵的对应元素相乘。一个例子:

Hadamard乘积

链式求导法则

多变量链式求导法则,来源:khanacademy.org

BP1推导

BP1的另一种表达方式是分量表达式,对其进行推导。

BP1

对δjl的定义,运用链式求导法则:

推导BP1:1

只有当k=j时,ak=jL才与zjL有关系(ajL = σ(zjL))。k≠j时,∂akL/∂zjL就消失了:

推导BP1:2

因为ajL = σ(zjL),上式中∂ajL/∂zjL可以写为σ'(zjL),即推导出BP1:

BP1

BP1给出了计算δjl的方法,计算起来比看上去要简单的多。把δjl的计算拆分成左右两个部分:∂C/∂ajL和σ'(zjL)。

如果我们使用均方差作为损失函数C,那么单个样本的情况下有:

B-N-F-8 单个样本的损失函数

所以∂C/∂ajL = (aj - yj)。

如果σ是sigmoid函数,有σ'(x) = σ(x) * (1 - σ(x))(可自行证明)。那么σ'(zjL) = σ(zjL) * (1 - σ(zjL)),其中zjL是通过前馈计算获得的。

BP2推导

对BP2的分量表达式进行推导:

BP2

BP2会稍微复杂一点。要想办法将δkl+1 = ∂C/∂zkl+1引入,仍然应用链式求导法则:

推导BP2:1

为了求∂zkl+1/∂zjl,根据定义有:

推导BP2:2

代入∂zkl+1/∂zjl,得到

推导BP2:3

再将上式代回[推导BP2:1],即推导出BP2:

BP2

BP3推导

BP3是求取损失C对于偏置b的偏导数,性质非常好,居然就是δjl本身:

BP3

利用链式求导法则,引入∂C/∂zjl:

推导BP3:1

因为有:

推导BP3:2

推导BP3:3

即推出BP3:

BP3

BP4推导

BP4是求取损失C对于偏置w的偏导数:

BP4

利用链式求导法则,引入∂C/∂zjl:

推导BP4:1

推导BP4:2

推导BP4:3

即推出BP4:

BP4

如果没有反向传播算法

之前提到,由于神经网络的权重参数过多,通过解偏导数方程来得到梯度是不现实的。那么在反向传播算法被应用之前,难道就真的没有任何办法吗?答案是有的,利用导数的定义即可:

导数定义

wj表示第j个权重,对于wj上一个非常小的增量,通过网络的层层传递,最终会导致的损失函数的变化。在上式中,对wj求导,可以近似成等式右边的形式。对于偏置求导也是同理。

这个算法并不复杂,易懂易实现。看似比反向传播四大公式简单很多。

接下来我们算下计算量的帐,就不那么美好了。假设整个网络中有30000个权重(现实中非常小巧的网络),那么对于每一个样本,要得到“损失”对所有30000个参数的偏导,就要进行30001次前向传播计算(多出的1次零头是求初始的C(w))。这是因为对每个权重求偏导,都需要获得当前的“损失”,而“损失”是由网络最后一层输出决定的。

对于海量的训练样本,以及现实中更加庞大的网络结构,计算量就是天文数字了。

反观反向传播算法,尽管其公式刚开始看上去有些凌乱(其实看久了是十分具有美感的),但是对于每一个样本,一趟前向传播,再加一趟反向传播,30000个权重就可以全部计算出来了。这才让大规模的网络训练具有了现实意义。

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-08-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏汪毅雄的专栏

机器学习之回归(二):广义线性模型(GLM)

本文在上篇线性回归的基础上,延伸到广义线性模型,并把广义线性模型目的、假设条件来源,指数族分布、连接函数等各个函数的关系都进行详细地解释。最后用两个常见的 GL...

1.2K1
来自专栏机器人网

人工智能领域 700 多个专业术语-谷歌开发者机器学习词汇表

本文为机器之心编译:该术语库项目目前收集了人工智能领域 700 多个专业术语,但仍需要与各位读者共同完善与修正。本文编译自谷歌开发者机器学习术语表项目,介绍了该...

3288
来自专栏IT技术精选文摘

机器学习之预测分析模型

介绍 预测分析是基于以前收集的数据来预测未来的结果。它包括两个阶段: 训练阶段:从训练数据中学习一个模型。 预测阶段:使用模型预测未知或未来的结果。 预测模...

2706
来自专栏AI科技大本营的专栏

实战 | 速度快3倍,大小仅1/4,这项技术教你多快好省搭建深度学习模型

一般来说,神经网络层数越深、参数越多,所得出的结果就越精细。但与此同时,问题也来了:越精细,意味着所消耗的计算资源也就越多。这个问题怎么破?这就要靠剪枝技术了。...

37314
来自专栏大数据互联网思维

KNN(K-近邻算法):靠跟自己关系的远近来做预测的算法

假设你是某影视网站序员中的一员。你们网站的用户热衷于观看《延禧攻略》《如懿传》这类古装宫廷剧,而你们平台有机会花1000万买下《扶摇》的版权。

1993
来自专栏Duncan's Blog

天池-半导体质量预测

1) 提取特征后,xgboost的mse为0.0325341683406 2) 单个随机森林的5折交叉验证的平均mse为0.0288353227614 (max...

692
来自专栏技术随笔

[译] Perceptual Losses for Real-Time Style Transfer and Super-Resolution(Stanford University)

47112
来自专栏量子位

语义分割中的深度学习方法全解:从FCN、SegNet到各版本DeepLab

王小新 编译自 Qure.ai Blog 量子位 出品 | 公众号 QbitAI 图像语义分割就是机器自动从图像中分割出对象区域,并识别其中的内容。 ? 量子位...

5099
来自专栏机器学习算法工程师

Mask-RCNN论文解读

Mask R-CNN是基于Faster R-CNN的基于上演进改良而来,FasterR-CNN并不是为了输入输出之间进行像素对齐的目标而设计的,为了弥补这个不足...

6678
来自专栏机器学习原理

机器学习(18)——神经网络算法思想:从线性思想到最基础神经网络神经网络算法

前言: 关于“神经网络”这个词想必对人工智能感兴趣额的早已经熟得不能再熟悉了,在机器学习和认知科学领域,人工神经网络(artificial neural ne...

3996

扫码关注云+社区