首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度神经网络的正向传播与反向传播

作者:韦 文 杰

编辑:machinelp

前言:

本文旨在总结一段工作和学习时间以来对深度神经网络的正向传播与反向传播的理解,并与朋友们相互交流。个人发现,工作中的学习和学校中的学习都是对某个领域知识的探索,但是方向是反的,在大学里我们可以自顶向下系统性地学习,而在工作中更多是项目驱动,开始可能整体认知是模糊的,慢慢在细节中发现问题向上探索。基于此,本文的认识有一定的局限性,理解不足之处望不吝指正。

一、深度神经网络

在阐述正向传播和反向传播之前,我们需要复习(可能在很多文章或书籍或多或少了解过)神经网络相关概念。

神经网络分为前馈神经网络和循环神经网络。前馈神经网络,也叫深度前馈网络或者多层感知机(MLP),其实质是函数近似机,通过很多线性或者非线性的函数f复合而成,形如,这样多层复合用图直观呈现是一个有向无环图(形如图1),这也是称为网络的原因。x是网络输入,也称输入层,是复合的第一层,因为没有直接对应的输入输出(均需要在训练过程近似),也称为隐藏层,是最后一层有与之对应的样本标签,也称为输出层。深度指复合的层数,例如上式有2层(不算输入层),即该网络深度为2(注意与输入通道数区分)。另外,前馈指输入到输出的直接映射,与之对应的是带有反馈连接的循环神经网络。神经一词是因为网络设计或多或少受到神经科学的启发,但神经网络不是大脑功能的完全模拟,神经网络的发展更多的是数学和工程学科的推动。本文以下分析的神经网络默认是前馈神经网络。

图1

二、正向传播

正向传播,也称为前向传播,指的从输入的特征向量到输出最后到代价函数的这样一个把低级特征逐步计算为抽象的高级特征直到得出损失的过程。依次说明很重要的几点内容,最后用数学表达式总结整个计算过程。

1、隐层单元

隐藏层中并行计算的单元(unit)称为隐层单元,每个单元表示一个向量到一个标量的函数,整个隐藏层完成了特征向量到特征向量的映射。起初隐层单元的设计只是线性映射,即,以此类推整个输入到最后的隐藏层是一个线性系统,只能拟合线性函数,然而真实世界大多数映射是非线性的,例如异或函数线性模型就无法拟合。因此为了能近似非线性函数,考虑在基础上加一层非线性函数g,称激活函数,形成

目前广泛使用的激活函数是整流线性单元,也称relu函数,如图2.

图2

相信很多朋友接触这个函数的第一感受怎么有一个尖点,即不可导点。确实,这个函数在点的位置左导数是右导数是1,因此不可导。通常在软件实现的时候会选择左导数和右导数其中一个输出而不会类似数学定义那样抛出异常。而且,实践证明,不太可能会计算g(0),通常是一个充分小的值,所以我们可以放心地去使用relu函数。

在广泛引入relu函数之前,大多数神经网络使用sigmoid函数(如图3)或者tanh函数(如图4)。sigmoid函数在大多数定义域内趋于饱和,使得梯度学习变得非常困难,极易导致梯度消失(或梯度弥散)。相比之下tanh函数要好一些,在附近近似单位函数,使得训练近似于训练这样一个线性模型,训练更加简单。但显然tanh函数依然不能克服梯度消失的问题。因此relu函数的优势便得以体现,既有非线性的特性,在又是单位函数(导数恒等于1),换言之既减小了梯度弥散的可能性又使得网络更容易训练。为了克服梯度弥散,出现relu的变体,主要思想是使梯度不为零,例如PReLU和LeakyReLU,感兴趣的朋友可自行查阅,在此不作赘述。

图3

图4

2、输出单元

1.用于高斯输出分布的线性单元

给定特征向量,线性单元输出向量:

2.用于Bernoulli输出分布的sigmoid单元

输出是0,1分布,适用于二分类问题,公式见图3。

3.用于Multinoulli输出分布的softmax单元

输出是n个离散值,其本质是将一个K1维的任意实数向量压缩(映射)成另一个K2维的实数向量,其中向量中的每个元素取值都介于(0,1)之间。公式为:

,

3、代价函数

代价函数,也叫损失函数(Loss Function),用于衡量模型输出与样本标签之间的统计误差。网络训练的目标是使得每个样本经过模型预测之后都能输出和样本标签相同的值,当然不仅仅是在训练集还有测试集(模型的泛化能力)。但这是理论情形,在实现的过程中大多数神经网络遵循的规则是最大似然估计。每一个训练样本模型预测输出有对应的置信度,最大似然估计是最大化

,显然对求导是很困难的,一般转化为最大化对数似然,也就是最小化负的对数似然,那么是否就可以将负对数似然作为我们的损失函数呢,显然还不行,公式只是最大化的概率,但并没有指明具体到哪个值,因此常常还要乘以期望输出(这里作者和编辑有冲突,可参考machinelp的:

MachineLN之逻辑回归

),最后的形式大家可能比较熟悉,是我们最常用的交叉熵损失函数,这也说明了为什么在表示标签类别的时候为什么使用one-hot编码,以及为什么损失函数使用交叉熵,输出单元通常配合使用softmax函数。另一种常见的损失函数是均方误差。当输出单元是线性单元时,最大化对数似然函数也等价于最小化均方误差。

熟悉以上三个内容,我们就可以对图1深度为5的神经网络的正向传播过程进行剖析:

值得说明的是上述只是为了阐述方便,实际运用模型可能更宽(隐藏层unit更多)或者更深,具体涉及到架构设计相关理论,暂不展开。理论证明,一个足够深度和宽度的MLP可以近似任意函数,然而我们并不能保证训练算法能学习到这个函数。由此我们继续讨论神经网络的训练算法,即反向传播算法。

三、反向传播

正向传播伪代码:

反向传播伪代码:

第一行是求得损失函数对预测输出的梯度,然后进入循环逐层求梯度。循环体第一条是求损失函数对线性单元输出的求导(注意伪代码中的a不是激活层的输出而是激活层的输入,线性单元的输出),进而可求出损失函数对本层的W,b梯度,为了再继续求上一层损失函数对W,b的梯度,需要对上一层隐藏层输出进一步求导赋值给g.重复所有循环即可得到损失函数对所有层W,b的梯度。至此本文阐述也就结束了。

细心的朋友会对这里含的项好奇,其实这里含的项是损失函数正则项对W,b的梯度。在神经网络中,正则化是非常重要的,我们会开专门的章节来研究和总结。同样的,每层的梯度有了,如何更新呢,这里又涉及到一块很重要的内容,神经网络的优化算法,我们也设置在另外的章节进行阐述。希望朋友们能继续关注并指出笔者的不足,共同进步!

想和machinelp一起成长,请联系machinlp。

MachineLN 交流群请扫码加machinelp为好友:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180826G0WOD700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券