前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ResNets、HighwayNets、DenseNets:用 TensorFlow 实现超深度神经网络

ResNets、HighwayNets、DenseNets:用 TensorFlow 实现超深度神经网络

作者头像
新智元
发布2018-03-26 10:23:10
1K0
发布2018-03-26 10:23:10
举报
文章被收录于专栏:新智元新智元新智元
【新智元导读】在许多任务中,神经网络越深,性能就越好。最近几年神经网络的趋势是越来越深。几年前最先进的神经网络还仅有12层深,现在几百层深的神经网络已经不是稀奇事了。本文中作者介绍了三个非常深的神经网络,分别是ResNet、HighwayNet和DenseNet,以及它们在Tensorflow上的实现。作者用CIFAR10数据集训练这些网络进行图像分类,在一小时左右的训练之后均实现了90%以上的精度。

神经网络设计的趋势:Deeper

谈到神经网络设计,最近几年的趋势都指向一个方向:更深。几年前最先进的神经网络还仅有12层深,现在几百层深的神经网络已经不是稀奇事了。对许多应用来说,神经网络越深,性能就越好,这在物体分类任务中影响最显著。当然,前提是它们能被恰当地训练。本文中我将介绍三个最近的深度学习网络背后的逻辑,分别是ResNet、HighwayNet和DenseNet。它们都能克服传统网络设计上的限制,使深度网络更容易训练。我也会提供在Tensorflow上实现这些网络的代码。

ImageNet竞赛胜出者的网络层数。网络越来越深的趋势非常明显。

为什么简单地加深网络并不管用?

设计深度网络的第一直觉可能是简单地把许多基本构建块(例如卷积层或全连接层)堆叠在一起。某种程度上这可以管用,但随着传统网络变得更深,网络性能会迅速下降。这是由于神经网络用反向传播的方式训练。训练时,梯度信号必须从网络最顶层反向传播到最底层,以确保网络本身能够正确更新。在传统网络中,当梯度信号通过网络的每一层,梯度会略微减小。对于只有几层的网络来说,这不成问题。但是对于有几十层的网络来说,当信号终于到达网络的最底层时,梯度信号已经差不多消失了。

因此,问题是设计一个神经网络,其中梯度信号可以更容易通过有着几十、甚至几百层深的网络的所有层。这是本文中讨论的当前最先进的网络(ResNets,HighwayNets和DenseNets)背后的目标。

残差网络(Residual Networks)

残差网络(Residual Network),或ResNet,是一种可以用最简单的方式解决梯度消失(vanishing gradient)问题的网络结构。如果在梯度信号的反向传播中出现问题,为什么不为网络的每一层设置一个短路通道(shortcut),使信号的通过更顺畅呢?在传统网络中,层的激活定义如下:y=f(x) 其中f(x)可以是卷积(convolution)、矩阵乘法(matrix multiplication)或批规范化(batchnormalization),等等。当信号反向传播时,梯度必须通过f(x),由于其中包含非线性而可能导致麻烦。反之,在ResNet中每层的实现如下:y=f(x)+x 后面的“+ x”即是短路(直连)通道,它允许梯度信号直接向后传递。通过这些层的stack,理论上梯度传递可以“跳过”所有中间层,直接到达最底层,而且不会发生梯度消减。

虽然理论上是这样,但实际的实现会更复杂。最新的ResNet中, f(x) + x采用的形式如下:

ResNet单元结构。BN指批规范化,Weight可以指全连接层或卷积层

在Tensorflow中可以像下面这样组合这些残差单元实现ResNet:

HighwayNetworks

我想介绍的第二个非常深的神经网络结构是Highway Network。它以一种非常直观的方式建于ResNet上。Highway Network保留了ResNet中的短路通道,但是可以通过可学习的参数来加强它们,以确定在哪层可以跳过,哪层需要非线性连接。Highway Network中的层定义如下:

在这个方程中,我们可以看出前面讨论的两种类型的层的轮廓:y = H (x, Wh) 和传统网络的层相似,y = H (x, Wh) + x和残差单元相似。新的T(x,Wt)函数是什么呢?它的作用像一个开关,决定哪些信息应该通过主路径,哪些信息可以跳过途径。在两条路径都使用T和(1-T),激活的和必须总为1。在Tensorflow中的实现如下:

DenseNetworks

我想介绍的最后一个是Dense Network,或称DenseNet。你可能会认为这是把“跳过连接”这种方式发挥到极致。这里的观点是,如果连接一个从前一层中跳过的连接可以提升性能,那为什么不把每一层和其他的每一层连接起来呢?这样,网络中的信息反向传播总是存在有直接的通路。

dense connection的原理。From: https://arxiv.org/abs/1608.06993

DenseNet不使用加法,而是依赖层的堆叠(stacking):

y = f(x,x-1,x-2…x-n)

这种结构在前馈和反馈设置中都有着直观的意义。在前馈设置中,除了高层特征激活外,任务还能从低层特征激活中受益。以物体分类为例,网络中较低的层可以确定图像的边缘,而较高的层可以确定图像中更大范围的特征,例如人的面部。使用有关边缘的信息有助于在复杂场景中正确地确定对象。在反馈设置中,使所有的层连接起来可以轻易地快速把梯度分别传递到各自的位置中。

但是在实现DenseNet时,不能只是把所有层连接起来。只能把具有相同高度和宽度的层堆叠在一起。因此,我们先是把一系列卷积层稠密堆叠到一起,然后应用跨层(striding)或池化层(pooling layer),再把另外一系列的卷积层稠密堆叠到一起,等等。在Tensorflow上的实现如下:

所有这些网络都可以用CIFAR10数据集训练来进行图像分类,并可以很好地实现几十层的网络,而传统的神经网络做不到。只需稍微调整参数,我能够使它们在一小时左右的训练之后实现超过90%的精度。训练每个模型的完整代码,以及与传统网络的比较已经发布在github(https://github.com/awjuliani/TF-Tutorials/blob/master/Deep%20Network%20Comparison.ipynb)。

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

本文分享自 新智元 微信公众号,前往查看

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

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

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