本文的主要贡献在于通过理论分析和大量实验证明使用恒等映射(
identity mapping)作为快捷连接(skip connection)对于残差块的重要性。同时,将BN/ReLu这些activation操作挪到了Conv(真正的weights filter操作)之前,提出“预激活“操作,并通过与”后激活“操作做对比实验,表明对于多层网络,使用了预激活残差单元(Pre-activation residual unit) 的resnet v2都取得了比resnet v1(或 resnet v1.5)更好的结果。
近期已经涌现出很多以深度残差网络(deep residual network)为基础的极深层的网络架构,在准确率和收敛性等方面的表现都非常引人注目。本文主要分析残差网络基本构件(residual building block)中的信号传播,本文发现当使用恒等映射(identity mapping)作为快捷连接(skip connection)并且将激活函数移至加法操作后面时,前向-反向信号都可以在两个 block 之间直接传播而不受到任何变换操作的影响。同时大量实验结果证明了恒等映射的重要性。本文根据这个发现重新设计了一种残差网络基本单元(unit),使得网络更易于训练并且泛化性能也得到提升。
注意这里的实验是深层 ResNet(\(\geq\) 110 layers) 的实验,所以我觉得,应该是对于深层 ResNet,使用”预激活”残差单元(
Pre-activation residual unit)的网络(ResNet v2)更易于训练并且精度也更高。
深度残差网络(ResNets)由残差单元(Residual Units)堆叠而成。每个残差单元(图1 (a))可以表示为:

其中,\(x_l\) 和 \(x_{l+1}\) 是 第 \(l\) 个残差单元的输入和输出,\(F\) 是残差函数。在 ResNet 中,\(h(x_{l})= x_{l}\) 是恒等映射(identity),\(f\) 是 ReLU 激活函数。在 ImageNet 数据集和 COCO 数据集上,超过 1000 层的残差网络都取得了当前最优的准确率。残差网络的核心思想是在 \(h(x_{l})\) 的基础上学习附加的残差函数 \(F\),其中很关键的选择就是使用恒等映射 \(h(x_{l})= x_{l}\),这可以通过在网络中添加恒等快捷连接(skip connection) shortcut 来实现。
本文中主要在于分析在深度残差网络中构建一个信息“直接”传播的路径——不只是在残差单元直接,而是在整个网络中信息可以“直接”传播。如果 \(h(x_{l})\) 和 \(f(y_{l})\) 都是恒等映射,那么信号可以在单元间直接进行前向-反向传播。实验证明基本满足上述条件的网络架构一般更容易训练。本文实验了不同形式的 \(h(x_{l})\),发现使用恒等映射的网络性能最好,误差减小最快且训练损失最低。这些实验说明“干净”的信息通道有助于优化。各种不同形式的 \(h(x_{l})\) 见论文中的图 1、图2 和 图4 中的灰色箭头所示。

为了构建 \(f(y_l)=y_l\) 的恒等映射,本文将激活函数(ReLU 和 BN)移到权值层(Conv)之前,形成一种“预激活(pre-activation)”的方式,而不是常规的“后激活(post-activation)”方式,这样就设计出了一种新的残差单元(见图 1(b))。基于这种新的单元我们在 CIFAR-10/100 数据集上使用1001 层残差网络进行训练,发现新的残差网络比之前(ResNet)的更容易训练并且泛化性能更好。同时还考察了 200 层新残差网络在 ImageNet 上的表现,原先的残差网络在这个层数之后开始出现过拟合的现象。这些结果表明网络深度这个维度还有很大探索空间,毕竟深度是现代神经网络成功的关键。
原先 ResNets 的残差单元的可以表示为:

在 ResNet 中,函数 \(h\) 是恒等映射,即 \(h(x_{l}) = x_{l}\)。公式的参数解释见下图:

如果函数 \(f\) 也是恒等映射,即 \(y_{l}\equiv y_{l}\),公式 (1)(2) 可以合并为:

那么任意深层的单元 \(L\) 与浅层单元 \(l\)之间的关系为:

公式 (4) 有两个特性:
plain)网络不同,普通网络的深层特征是由一系列的矩阵向量相乘得到。残差网络是连加,普通网络是连乘。公式 (4) 也带来了良好的反向传播特性,用 $\varepsilon $ 表示损失函数,根据反向传播的链式传导规则,反向传播公式如下:

从公式 (5) 中可以看出,反向传播也是两条路径,其中之一直接将信息回传,另一条会经过所有的带权重层。另外可以注意到第二项的值在一个 mini-batch 中不可能一直是 -1,也就是说回传的梯度不会消失,不论网络中的权值的值再小都不会发生梯度消失现象。
考虑恒等映射的重要性。假设将恒等映射改为 \(h(x_{l}) = \lambda_{l}x_{l})\),则:

像公式 (4) 一样递归的调用公式 (3),得:

其中,\(\hat{F}\) 表示将标量合并到残差函数中,与公式 (5) 类似,反向传播公式如下:

与公式 (5) 不同,公式 (8) 的第一个加法项由因子 \(\prod_{i=l}^{L-1}\lambda_{i}\) 进行调节。对于一个极深的网络(\(L\) 极大),考虑第一个连乘的项,如果所有的 \(\lambda\) 都大于 1,那么这一项会指数级增大;如果所有 \(\lambda\) 都小于 1,那么这一项会很小甚至消失,会阻断来自 shortcut 的反向传播信号,并迫使其流过权重层。本文通过实验证明这种方式会对模型优化造成困难。
另外其他不同形式的变换映射也都会阻碍信号的有效传播,进而影响训练进程。

第 3 章考察使用不同形式映射(见图 2)来验证函数 \(h\) 是恒等映射的重要性,这章讨论公式(2)中的 \(f\),如果 \(f\) 也是恒等映射,网络的性能会不会有所提升。通过调节激活函数 (ReLU and/or BN) 的位置,来使 \(f\) 是恒等映射。图 4 展示了激活函数在不同位置的残差单元结构图去。
图
4(e)的”预激活“操作是本文提出的一种对于深层残差网络能够更有效训练的网络结构(ResNet v2)。

本章,我们使用 ResNet-110 和 164 层瓶颈结构(称为 ResNet-164)来进行实验。瓶颈残差单元包含一个 \(1\times 1\) 的层来降维,一个 \(3\times 3\) 的层,还有一个 \(1\times 1\) 的层来恢复维度。如 ResNet 论文中描述的那样,它的计算复杂度和包含两个 \(3\times 3\) 卷积层的残差单元相似。
BN after addition
效果比基准差,BN 层移到相加操作后面会阻碍信号传播,一个明显的现象就是训练初期误差下降缓慢。
ReLU before addition
这样组合的话残差函数分支的输出就一直保持非负,这会影响到模型的表示能力,而实验结果也表明这种组合比基准差。
Post-activation or pre-activation
原来的设计中相加操作后面还有一个 ReLU 激活函数,这个激活函数会影响到残差单元的两个分支,现在将它移到残差函数分支上,快捷连接分支不再受到影响。具体操作如图 5 所示。

根据激活函数与相加操作的位置关系,我们称之前的组合方式为“后激活(post-activation)”,现在新的组合方式称之为“预激活(pre-activation)”。原来的设计与预激活残差单元之间的性能对比见表 3。预激活方式又可以分为两种:只将 ReLU 放在前面,或者将 ReLU 和 BN都放到前面,根据表 2 中的结果可以看出 full pre-activation 的效果要更好。


使用预激活有两个方面的优点:1) \(f\) 变为恒等映射,使得网络更易于优化;2)使用 BN 作为预激活可以加强对模型的正则化。
Ease of optimization
这在训练 1001 层残差网络时尤为明显,具体见图 1。使用原来设计的网络在起始阶段误差下降很慢,因为 \(f\) 是 ReLU 激活函数,当信号为负时会被截断,使模型无法很好地逼近期望函数;而使用预激活网络中的 \(f\) 是恒等映射,信号可以在不同单元直接直接传播。本文使用的 1001层网络优化速度很快,并且得到了最低的误差。
\(f\) 为 ReLU 对浅层残差网络的影响并不大,如图 6-right 所示。本文认为是当网络经过一段时间的训练之后权值经过适当的调整,使得单元输出基本都是非负,此时 \(f\) 不再对信号进行截断。但是截断现象在超过 1000层的网络中经常发生。

Reducing overfitting
观察图 6-right,使用了预激活的网络的训练误差稍高,但却得到更低的测试误差,本文推测这是 BN 层的正则化效果所致。在原始残差单元中,尽管BN 对信号进行了标准化,但是它很快就被合并到捷径连接(shortcut)上,组合的信号并不是被标准化的。这个非标准化的信号又被用作下一个权重层的输入。与之相反,本文的预激活(pre-activation)版本的模型中,权重层的输入总是标准化的。
表 4、表 5 分别展示了不同深层网络在不同数据集上的表现。使用的预激活单元的且更深层的残差网络(ResNet v2)都取得了最好的精度。


恒等映射形式的快捷连接和预激活对于信号在网络中的顺畅传播至关重要。
文章首发于我的 github 仓库-cv算法工程师成长之路,欢迎关注我的公众号-嵌入式视觉。
本人水平有限,文章如有问题,欢迎及时指出。如果看完文章有所收获,一定要先点赞后收藏。毕竟,赠人玫瑰,手有余香。
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据
安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un
Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好
在神经网络方面,我完全是个初学者。我整天都在与ruby-fann和ai4r搏斗,不幸的是我没有任何东西可以展示,所以我想我会来到StackOverflow并询问这里的知识渊博的人。我有一组样本——每天都有一个数据点,但它们不符合我能够找出的任何明确模式(我尝试了几次回归)。不过,我认为看看是否有任何方法可以仅从日期预测future的数据会很好,而且我认为神经网络将是生成希望表达这种关系的函数的好方法.日期是DateTime对象,数据点是十进制数,例如7.68。我一直在将DateTime对象转换为float,然后除以10,000,000,000得到一个介于0和1之间的数字,我一直在将
我有一个nokigiri网络抓取工具,它发布到我试图发布到heroku的数据库。我有一个sinatra应用程序前端,我想从数据库中获取它。我是Heroku和Web开发的新手,不知道处理此类问题的最佳方法。我是否必须将上传到数据库的网络爬虫脚本放在sinatra路由下(如mywebsite.com/scraper),并让它变得如此模糊以至于没有人访问它?最后,我想让sinatra部分成为一个从数据库中提取的restapi。感谢大家的参与 最佳答案 您可以采用两种方法。第一个是通过控制台使用herokurunYOURCMD运行scrap