点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:深度学习与计算机视觉

本文作者重新审视了ResNet之所以工作的原因,得出结论: ResNet 本质上就干了一件事:降低数据中信息的冗余度。

最近在总结完成语义分割任务的轻量级神经网络时,看到了 MobileNet V2 中对于 ReLU 层的思考,于是我也回过头重新审视 ResNet 之所以 work 的本质原因。以下是一些个人的见解,如有错误,还望及时指正。

在谈及 ResNet 之前,我们先聊聊故事的背景。

我们知道,在神经网络中,非线性激活层可以为模型引入了非线性,让模型具有更强的拟合能力。如果只是单纯的线性操作层的叠加,则完全可以等价为一个线性层,这就浪费了深度神经网络的一身好本领。

所谓针无两头尖,那么非线性激活层会带来一些什么问题呢?我们以 ReLU 为例来进行说明,其他非线性激活层亦同理。

首先,最直观的,从实验中我们可以注意到一个事实:ReLU 会造成的低维数据的坍塌(collapse)。顾名思义,即是说,低维度的 feature 在通过 ReLU 的时候,这个 feature 会像塌方了一样,有一部分被毁掉了,或者说失去了。能恢复吗?能,但是基本无法百分百还原了。

具体表现出来就是:若是我们对一个 feature,先通过一个给定的变换规则 T,将它映射到它的 embedding space 中,再在该 embedding space 中,利用一个 ReLU 去处理该 feature,最后再把这个 feature 以同样的变换规则(逆方向)给映射回原始空间,我们会发现,这时,这个 feature 已经变得连亲妈都不认得了。如图↓

图片来自《MobileNetV2: Inverted Residuals and Linear Bottlenecks》

ReLU 这个东西,其实就是一个滤波器,只不过这个滤波器的作用域不是信号处理中的频域,而是特征域。那么滤波器又有什么作用呢?维度压缩,俗话说就是降维啦:如果我们有 m 个 feature 被送入 ReLU 层,过滤剩下 n 个(n<m),这不就是相当于对 feature 的维度进行了压缩,使其从 m 维变为 n 维嘛。

那么,为什么低维数据流经非线性激活层会发生坍塌(信息丢失),而高维数据就不会呢?

打个简单但不严谨的比方:大家都有过年抢高铁票的经验吧?几个人(维度低)帮你抢一张票,肯定没有一群人(维度高)帮你抢一张票,成功的概率高啊。几个人里面,大概率全军覆没,没一个能帮上你忙的。而一群人里面,大概率总有那么一个手速惊人的单身青年,帮你抢到你心心念念的回家票。

在数据上也是一个道理,维度低的 feature,分布到 ReLU 的激活带上的概率小,因此经过后信息丢失严重,甚至可能完全丢失。而维度高的 feature,分布到 ReLU 的激活带上的概率大,虽然可能也会有信息的部分丢失,但是无伤大雅,大部分的信息仍然得以保留。所谓留得青山在,不愁没柴烧嘛。更何况被 ReLU 截杀的信息,可能只是一些无用游民(冗余信息)。

那么数据的坍塌,是个很严重的事吗?

那事儿可大了。如果把神经网络比作一个人的话,你这就是给它的某个部位的血管里,丢了个血栓。

当信息无法流过 ReLU 时,该神经元的输出就会变为 0。而在反向传播的过程中,ReLU 对 0 值的梯度为 0,即发生了梯度消失,这将导致神经元的权重无法再通过梯度下降法进行更新,这种现象被称为特征退化。所以这个神经元相当于死掉了,丧失了学习能力。我们说,一旦神经元的输出陷入 0 值,就无法恢复了。

那么,我们应该怎么去规避数据的坍塌呢?非线性激活层到底是个什么样的东西?

其实,对于一个数据,利用非线性激活层对其进行激活,其实是从该数据的信息中提取出其潜在的稀疏性,但是这种提取的结果是否正确,就要分情况讨论了。

对于一个 M 维的数据,我们可以将其看成是在 M 维空间中的一个 M 维流形(manifold)。而其中的有用信息,就是在该 M 维空间中的一个子空间(子空间的维度记为 N 维,N<=M)中的一个 N 维流形。非线性激活层相当于压缩了这个 M 维空间的维度(还记得前面提过的维度压缩吗?)。若是该 M 维空间中的 M 维流形本来就不含有冗余信息(M=N),那么再对其进行维度压缩,必然导致信息的丢失。

而维度低的数据其实就是这么一种情况:其信息的冗余度高的可能性本来就低,如果强行对其进行非线性激活(维度压缩),则很有可能丢失掉有用信息,甚至丢失掉全部信息(输出为全 0)。

与非线性激活层不同的是,线性激活层并不压缩特征空间的维度。于是,我们得到了一条使用激活层的原则

  1. 对含有冗余信息的数据使用非线性激活(如 ReLU),对不含冗余信息的数据使用线性激活(如一些线性变换)。

  2. 两种类型的激活交替灵活使用,以同时兼顾非线性和信息的完整性。

  3. 由于冗余信息和非冗余信息所携带的有用信息是一样多的,因此在设计网络时,对内存消耗大的结构最好是用在非冗余信息上。

根据以上的原则设计出来的结构,聪明的你想到了什么?ResNet。不得不赞叹 Kaiming He 的天才,ResNet 这东西,描述起来固然简单,但是对它的理解每深一层,就会愈发发现它的精妙及优雅,从数学上解释起来非常简洁,非常令人信服,而且直切传统痛点。

ResNet 本质上就干了一件事:降低数据中信息的冗余度

具体说来,就是对非冗余信息采用了线性激活(通过 skip connection 获得无冗余的 identity 部分),然后对冗余信息采用了非线性激活(通过 ReLU 对 identity 之外的其余部分进行信息提取 / 过滤,提取出的有用信息即是残差)。

其中,提取 identity 这一步,就是 ResNet 思想的核心

从本文的观点来看,因为从数据中拿掉了非冗余信息的 identity 部分,会导致余下部分的信息冗余度变高。这就像从接近饱和的溶液中移走了一部分溶质,会使得剩下的溶液的饱和度降低,一个道理。

在这里也引用一下其他的一些观点,方便大家可以从一个更全面的角度去看这个问题:

从特征复用的观点来看,提取 identity 部分,可以让网络不用再去学习一个 identity mapping(虽然是一样的东西,但是毕竟又要从头学起,讲真,换你来试试,这其实真的不容易学到),而是直接学习 residual。这就轻松愉快多了:站在巨人的肩膀上,做一点微小的工作什么的...

既然说了 ResNet 解决的痛点,也顺便多说几句它带来的好处:

  1. 由于 identity 之外的其余部分的信息冗余度较高,因此在对其使用 ReLU 进行非线性激活时,丢失的有用信息也会较少,ReLU 层输出为 0 的可能性也会较低。这就降低了在反向传播时 ReLU 的梯度消失的概率,从而便于网络的加深,以大大地发挥深度网络的潜能。

  2. 特征复用能加快模型的学习速度,因为参数的优化收敛得快(从 identity 的基础上直接学习残差,总比从头学习全部来得快)。

最后是两个小 tips:

  1. 如果一个信息可以完整地流过一个非线性激活层,则这个非线性激活层对于这个信息而言,相当于仅仅作了一个线性激活。

  2. 解决由非线性激活导致的反向传播梯度消失的窍门,就是要提高进行非线性激活的信息的冗余度。

如果您觉得本文对您有所帮助,请高抬贵手点个赞~

接下来会填之前语义软分割的坑和图神经网络的坑,还有一些杂七杂八的:如姿态估计网络啦、deepSLAM 啦、视觉跟踪网络啦、VQA 啦... 最近光忙着看 paper 和写笔记了,有空再整理后发上来。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

残差神经网络究竟在干啥?相关推荐

  1. “血洗”Twitter,“杀疯了”的马斯克究竟想干啥?

    周末有个朋友给我说:马斯克"血洗"Twitter了,你有什么评价? 我去搜了一下,果然,马斯克"杀疯了". 440亿美元收购Twitter以后,他立刻解雇了公司 ...

  2. 产品经理究竟是干嘛的

    产品经理究竟是干嘛的? 简单来说,产品经理主要的工作就是:规划.设计产品,对产品研发过程的控制,最终把产品卖出去的一个过程. 而产品经理,基于服务的对象不同,主要分为两种:to b (针对企业)和to ...

  3. 大数据时代,数据仓库究竟是干嘛的?

    前言 无论你是否专门从事大数据开发,作为一个开发人员,应该都听说过数据仓库的概念,那你知道为什么会出现数据仓库?数据仓库究竟是干嘛的吗?有什么价值和意义呢?那么本文就带到入门,揭开数据仓库的面纱. 数 ...

  4. 基于PaddlePaddle构建ResNet18残差神经网络的食物图片分类问题

    基于PaddlePaddle构建ResNet18残差神经网络的食物图片分类问题 Introduction 本项目是在李宏毅机器学习课程的作业3进行的工作,任务是手动搭建一个CNN模型进行食物图片分类( ...

  5. 【Pytorch】残差神经网络(Residual Networks)

    一.背景 传统的神经网络,由于网络层数增加,会导致梯度越来越小,这样会导致后面无法有效的训练模型,这样的问题成为梯度消弭.为了解决这样的问题,引入残差神经网络(Residual Networks),残 ...

  6. 残差神经网络—代码详解

    一.残差神经网络--ResNet的详述 1.1残差模块--Residual bloack 通过在一个浅层网络基础上叠加 y=x 的层(称identity mappings,恒等映射),可以让网络随深度 ...

  7. 深度学习理论——残差神经网络

    大家好,继续理论学习,今天学习了何凯明大神的又一力作,残差神经网络. 我们知道,网络层数越深,其表达能力越强,但之前人们并不敢把网络设计的太深,因为会有梯度衰减等各种问题让网络的性能大幅度下滑,用一些 ...

  8. 基于双向 lstm 和残差神经网络的 rna 二级结构预测方法

    目录 结果 结论 背景 结果 学习结果和演示 预测结果和比较 讨论 结论 材料和方法 数据收集和处理 摘要 背景: 研究表明,rna 二级结构是由配对碱基构成的平面结构,在基本生命活动和复杂疾病中发挥 ...

  9. Pytorch实现残差神经网络(ResNet)

    1. 残差块 输入X,经过两次次卷积,一次ReLU,得到F(X),在将X与F(X)相加,在经过一个ReLU,即为最后的结果.残差神经网络就是基于残差块的一个深度神经网络. 2. 代码 这篇博客理论涉及 ...

最新文章

  1. 智源社区AI周刊·第二期:过去一周AI领域的新鲜事
  2. 用 C 语言开发一门编程语言 — 字符串与文件加载
  3. iptables透明网桥无法使用透明代理错误
  4. Twitter Storm 序列化
  5. jsp和java使用值_如何将表单的值从jsp发送到Java
  6. 创业者眼中的小程序:某个岗位工资会翻番
  7. c# linux 效率,c# – linux / mono上的HTTP性能
  8. BZOJ 4602: [Sdoi2016]齿轮 dfs
  9. svn 命令行_Ubuntu下Subversion(SVN)的快速安装与配置
  10. linux生成密码文本,Linux下用makepasswd和passwordmaker生成密码
  11. 微服务面试题及详细答案
  12. 计网学习记录,burp抓包等学习记录
  13. python完成非线性拟合
  14. gtx1660是什么级别的_GTX1660相当于什么显卡 三月显卡天梯图秒懂GTX1660性能
  15. 【Unity】让动画系统支持相对坐标
  16. 程序猿的口味-从C++STL聊到MSYS2-Qt
  17. 浙江师范的计算机专业的排名2015,浙江师范大学计算机科学与技术研究生专业排名...
  18. Bochs源码分析 - 6: bochs的物理内存初始化
  19. 【整理】写给java web一年左右工作经验的人
  20. MybatisPlus入门(涉及大部分常用操作)

热门文章

  1. 全球超2万名开发者调研:Python 3渗透率至84%
  2. 阿里资深AI工程师教你逐个击破机器学习核心算法
  3. 面试官问:生成订单30分钟未支付,则自动取消,该怎么实现?
  4. SpringBoot中的线程池,你真的会用么?
  5. 一个比 Spring Boot 快 44 倍的 Java 框架
  6. 深度介绍分布式系统原理与设计
  7. 超级全面的 SpringBoot 注解介绍,每一个用途都应该清晰
  8. Spring 容器的启动过程
  9. 你还在从零搭建项目 ?
  10. 懂点 Nginx 反向代理与负载均衡,是面试加分项没有之一