前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TensorFlow从1到2 | 第一章 消失的梯度

TensorFlow从1到2 | 第一章 消失的梯度

作者头像
用户1332428
发布2018-03-08 16:41:47
8740
发布2018-03-08 16:41:47
举报
文章被收录于专栏:人工智能LeadAI人工智能LeadAI

上一主题 《TensorFlow从0到1》介绍了人工神经网络的基本概念与其TensorFlow实现,主要基于浅层网络架构,即只包含一个隐藏层的全连接(FC,Full Connected)网络。

新主题 《TensorFlow从1到2》 将探索近5年来取得巨大成功的深度神经网络(Deep Neural Networks),它已成为机器学习中一个独立的子领域——深度学习(Deep Learning)。

本篇解释“深度”的含义,并引出在纵向扩展神经网络时所遇到的一个障碍——消失的梯度问题(Vanishing Gradient Problem)。

Vanishing Gradient Problem,来源:https://www.youtube.com/watch?v=SKMpmAOUa2Q

神秘的黑盒

神经网络是一个“黑盒”(Black Box)。不仅外行人看它如此,即使是对亲手构建它并训练它的工程师而言,亦是如此。

它的神秘,并不在于打不开、看不到,而是学习过程不可控,识别原理不可解释。

以一个全连接网络为例。当预设了它的架构,并对其进行初始化后,剩下的就是喂数据给它,至于网络中数以万计的权重和偏置如何调整,又将止步何处,整个动态优化的过程人类完全插不上手。

当网络训练收敛,并惊艳的输出超越人类的识别结果,若此时去查看网络的所有参数和中间结果,肯定会令人失望的,因为那无非是一堆调整的恰到好处的数字,但它们究竟意味着什么概念和逻辑,则不得而知。

理解隐藏层

机器思考的逻辑形式如密码一般晦涩难懂,但是并没有妨碍它成功的应用在诸多领域。所幸研究者除了关注如何进一步提升网络性能,还积极尝试去“解码”机器学习的秘密,而且已经获得了很多启发性的理解。

简单来说,从神经网络输入层的“裸数据”开始,经历层层前馈(Feedforward),最终在输出层获得一个高度抽象的、人类定义的类别概念,而这两端之间的每一层隐藏层都可以看做不同层次的概念表示,离输入层越近的抽象程度越低,反之离输出层越近的抽象程度越高。

以一个识别汽车图片的网络为例,来模拟这种理解,如下图所示。

第一个隐藏层,输入图像像素,可能表示形状的概念。第二个隐藏层,输入为几何形状,概念进一步抽象,可能表示汽车的零部件,直到输出层可以用于综合判断是否可以分类为汽车。

概念层次

上图只是对解释神经网络一种理想的模拟。实际情况中,不同的数据和目的,会训练出不同的网络,而每一层意义也会大相径庭。基于这种启发,研究者已经发展出逐层的可视化分析手段,尝试去理解机器学习的机理。

“深度”的定义

2006年,Hinton发表《基于深度置信网络的快速学习方法》,深度神经网络(DNN)和深度学习(Deep Learning)被提出。

从形式上说,包含两层或更多隐藏层的网络即可称为深度神经网络。

《Deep Learning》中深度学习的定义如下:

(本书所围绕的)这个方案让计算机从经验中学习,并根据层次化的概念体系来理解世界,而每个概念则通过与之关联的更简单的概念来定义。从经验获取知识这种方法,可以避免由人类形式化的制定所有计算机所需要的知识。运用层次化的概念,计算机可以通过较简单的概念来构建复杂的概念。如果我们绘制一个图形来表示概念是如何建立在其他概念之上,这个图形会很深,具有很多层。基于这个原因,我们称这种方法为AI深度学习。

理解机器视角下的层次化概念意义深远,一旦可以充分解释,人类就可以向机器请教,从而照亮思维的盲区。遭遇过Master(即AlphaGo)的柯洁,在正式对战AlphaGo之前,就已经知道了结局:

人类数千年的实战演练进化,计算机却告诉我们人类全都是错的。

我觉得,甚至没有一个人沾到围棋真理的边。但是我想说,从现在开始,我们棋手将会结合计算机,迈进全新的领域达到全新的境界。

棋士柯洁

无效的隐藏层

基于对深度的理解,我们似乎获得了一个简单可行的终极方案:尽可能的增加隐藏层!

以MNIST识别为例,使用在上一主题中构建好的全连接网络进行训练,测试结果如下表所示:

隐层数量

每隐层神经元数

迭代次数

识别精度

代码

1

隐层x1

100

30

95.25%

tf_2-1_1_hidden_layers.py

2

隐层x2

100

30

95.87%

tf_2-1_2_hidden_layers.py

3

隐层x3

100

30

96.3%

tf_2-1_3_hidden_layers.py

4

隐层x4

100

60

96.08%

tf_2-1_4_hidden_layers.py

令人稍感绝望,随着隐藏层数量的增加,识别精度增长并不显著,而当隐藏层数量增加到4层时,不仅需要更多的迭代次数,识别精度反而开始下降了。

可说好的“深度”呢?

消失的梯度

通过追加隐藏层来实现深度神经网络,并不奏效。真正的问题不在“深度”本身,而是由梯度下降算法所指导的训练过程存在困难,其中一个经典障碍就是消失的梯度问题(Vanishing Gradient Problem),以及与之成对存在的爆炸的梯度问题(Exploding Gradient Problem)。

以下图中的网络为例来解释下梯度消失问题。

假设我们能抽出由蓝色神经元构成的前馈路径,形成一个每层只有一个神经元的多层网络,尝试获得损失C对第一层神经元偏置b1的梯度。采用链式法则进行反向传播进行推导:

整理得到下式,再次表达出反向传播的含义:参数的梯度会受到其后每层神经元的乘性影响,越靠近输出层的,乘性因子越多。这会导致梯度的不稳定——容易过大或者过小,最终各层神经元的更新速率差异显著。

接下来说明梯度是如何消失的。

假设网络参数初始化符合标准正态分布N(0,1),且神经元的激活函数采用Sigmoid函数,那么大部分情况下|w| < 1,而Sigmoid的导数σ' < 1/4。Sigmoid导数曲线见下图。

Sigmoid导数曲线

于是有:

可见网络越深,靠近输入层的神经元的梯度越小,几近消失,神经元也停止学习。

ReLU是救星吗?

ReLU

当看到sigmoid激活函数导数的最大值不过1/4时,你一定会想到ReLU(Rectified Linear Units),整流线性单元,如上图所示。在输入大于0时,它的导数为1,几乎完美。

可如果一个ReLU就能解决深度神经网络难训练的问题,Hinton就不会在2006年发表《基于深度置信网络的快速学习方法》了。

将隐藏层的激活函数全部换成ReLU进行实验,结果如下表所示。尽管识别精度比Sigmoid版本高了2个点,但是随着层数的增加,识别精度并没有出现大幅的提高。

隐层数量

每隐层神经元数

迭代次数

识别精度

代码

1

隐层x1

100

30

97.62%

tf_2-1_1_hidden_layers_relu.py

2

隐层x2

100

30

97.72%

tf_2-1_2_hidden_layers_relu.py

3

隐层x3

100

30

97.79%

tf_2-1_3_hidden_layers_relu.py

4

隐层x4

100

60

97.79%

tf_2-1_4_hidden_layers_relu.py

尽管RelU已取代Sigmoid称为神经元标配激活函数,很大程度上平衡了各层更新速率的差异,但是基于梯度下降算法导致的梯度不稳定性,是算法本身所固有的:

深度学习的复兴

2006年,Hinton的深度信念网络(Deep Belief Network,DBN),是通过对每层神经元单独进行训练来完成学习过程的,成为第一批成功应用深度架构训练的非卷积模型之一,由此开启了深度学习的复兴。而将深度学习带入巅峰的则是我们主题的主角:卷积神经网络(CNN)。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人工智能LeadAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档