【何恺明最新论文】非局部神经网络,打造未来神经网络基本组件

简介: 何恺明又出论文了,这次与CMU和FAIR的几位作者合作,提出了“非局部神经网络”。受计算机视觉中的经典非局部均值方法的启发而来,非局部网络可以作为一个简单高效的通用模块,嵌入现有视觉模型中,实验证明能够提高图像及视频分类精度,用作者的话说,在视频分类任务上,即使没有任何花里胡哨的处理,我们的非局部模型也能在 Kinetics 和 Charades 数据集上获得与一些当前视觉竞赛的冠军模型相当乃至更好的效果。

大神 Kaiming He 日前在 arXiv 上新挂出来一篇论文,标题延续了一贯的简洁风格,叫做《非局部神经网络》(Non-local Neural Networks)。


这是一篇 CMU 与 FAIR 合作的论文,第一作者是 CMU 的 Xiaolong Wang,其他两位作者是 Ross Girshick(DenseNet 作者之一)和 Abhinav Gupta(CMU 教授,他今年 CVPR + ICCV 一共发表了 15 篇论文)。

22c977cd8d655ab30672dd5a47a6fece5753cde4

摘要

卷积和递归运算都是一次处理一个局部邻域的基本计算组件(building block)。在本文中,我们将非局部运算(non-local operation)作为获取长时记忆(long-range dependency)的一类通用组件。受计算机视觉中的经典非局部均值方法的启发,我们的非局部运算将一处位置的响应计算为所有位置的特征的加权和。这个组件可以插入到许多计算机视觉结构中。在视频分类任务上,即使没有任何花里胡哨的处理,我们的非局部模型也能在 Kinetics 和 Charades 数据集上获得与一些当前视觉竞赛的冠军模型相当乃至更好的效果。在静态图像识别中,我们的非局部模型提高了 COCO 物体检测/分割和人体姿态估计这些任务的性能。代码今后公开。

004ae979c14ffb6b49f7aa61b83f28361e799693

作者训练好用于视频分类的一个网络,在时空上进行非局部运算的示例。计算时,位置 Xi 的响应等于时空中所有位置的特征的加权和。注意第一帧里球的位置与后两帧球的关联。来源:论文(下同)

76efd35c0a609104c1ae75c3435956d26bf9fc58

论文中给出的深度神经网络非局部计算公式,其中 i 是(空间、时间或时空上的)输出位置的序号,计算的就是位置 i 的响应,j 是所有可能位置的序号。x 是输入信号(一般是特征,可以是图像数据、序列数据或视频数据),y 是与 x 相同大小的输出信号。函数 f 计算 i 和所有 j 之间的标量(代表两者间的关系)。一元函数 g 计算位置 j 处的输入信号的表征。最终响应通过因子C(x)归一化。

将非局部计算作为获取长时记忆的通用模块,提高神经网络性能

在深度神经网络中,获取长时记忆(long-range dependency)至关重要。对于序列数据(例如语音、语言),递归运算(recurrent operation)是长时记忆建模的主要解决方案。对于图像数据,长时记忆建模则依靠大型感受野,后者是多层卷积运算堆叠的结果。

卷积和递归运算处理的都是一个局部邻域,可以是空间局部邻域,也可以是时间局部邻域,因此只有不断重复这些运算,逐步在数据中传播信号,才能获取长时记忆。而不断重复局部计算有几个限制。首先,计算效率低下。其次,会产生一些优化问题,需要仔细解决。最后,这些问题使 multihop dependency 建模十分困难,multihop dependency 建模就是在很长的时间/空间位置之间来回传送信息。、、

6f3b6aaa89fb8c0d5afcc5ddb43c338d383696ba

非局部运算是计算机视觉中经典的非局部均值运算的一种泛化结果。直观地说,非局部运算将某一处位置的响应作为输入特征映射中所有位置的特征的加权和来进行计算。

在本文中,我们将非局部运算作为一个高效、简单和通用的模块,用于获取深度神经网络的长时记忆。我们提出的非局部运算是计算机视觉中经典的非局部均值运算的一种泛化结果。直观地说,非局部运算将某一处位置的响应作为输入特征映射中所有位置的特征的加权和来进行计算。这些位置可以是空间位置,也可以是时间位置,还可以是时空位置,这意味着我们的计算适用于图像、序列和视频问题。

作者在论文中写道,使用非局部运算有几大好处:(a)与递归和卷积运算的渐进的操作相比,非本局部运算直接通过计算任意两个位置之间的交互来获取长时记忆,可以不用管其间的距离;(b)正如他们在实验中所显示的那样,非局部运算效率很高,即使只有几层(比如实验中的5层)也能达到最好的效果;(c)最后,他们的非局部运算能够维持可变输入的大小,并且能很方便地与其他运算(比如实验中使用的卷积运算)相组合。

59597fa7abb2b3dd81cd2aa155734866e7db4a11

一个时空非局部组件。特征映射被表示为张量,⊗表示矩阵乘法,⊕表示单元和。每一行进行softmax。蓝框表示1×1×1的卷积。图中显示的是嵌入式高斯版本,具有512个通道的瓶颈。

“我们展示了非局部运算在视频分类应用中的有效性。在视频中,分隔开的像素在空间和时间上都会发生长时交互(long-range interaction)。我们的基本单元,也即单一的一个非局部模块,可以以前向传播的方式直接获取这些时空记忆。增加了几个非局部模块后,我们的“非局部神经网络”结构能比二维和三维卷积网络在视频分类中取得更准确的结果。另外,非局部神经网络在计算上也比三维卷积神经网络更加经济。我们在 Kinetics 和 Charades 数据集上做了全面的对比研究。我们的方法仅使用 RGB 数据,不使用任何高级处理(例如光流、多尺度测试),就取得了与这两个数据集上竞赛冠军方法相当乃至更好的结果。”

为了证明非局部运算的通用性,作者在 COCO 数据集上进行了物体检测、实例分割和人体姿态关键点检测的实验。他们将非局部运算模块与 Mask R-CNN 结合,新模型在计算成本稍有增加的情况下,在所有三个任务中都取得了最高的精度。由此表明非局部模块可以作为一种比较通用的基本组件,在设计深度神经网络时使用。

实验及结果

在这一节我们简单介绍论文中描述的实验及结果。

51ae355f24180852186ff9a4be0ada0c2f4e6135

视频的基线模型是 ResNet-50 C2D。三维输出映射和滤波核的尺寸用T×H×W 表示(二维核则为 H×W),后面的数字代表通道数。输入是32×224×224。方括号里的是残差模块。

95896e649652c49c8d703411861fd026dacb48de

(c)展示了将非局部模块加入 C2D 基线后的结果,实验中用到了50层和101层的ResNet,可以看出,总体而言,增加的非局部模块越多,最后的精度越高。

(d)展示了时间、空间和时空同时非局部的效果,时空一起的效果最好。

(e)对比了非局部模块和三维卷积神经网络,增加了非局部模块(5个)的效果要好一点点。

9ff8b76915b1ac1393ac0b25e402790089a066a9

(f)将非局部与三维卷积相结合的效果,结合了比单纯的三维卷积更好。

(g)检验了在128帧的视频中(f)中的模型的效果,发现能够保持比较稳定。

07f4e72685010c72e6f0d3c34b7cb31c366c2785

最后,下面这张图展示了将非局部模块与 Mask R-CNN 结合后,在 COCO 物体检测、实例分割以及人体关键点检测任务中性能均有所提升,使用了50和100层的ResNet,以及152层的ResNeXt。

6e52e0b57b86c14d708592bf5ad4ac35a5c751a6

知乎讨论:将传统视觉处理里的好方法整合进入深度神经网络,值得关注

知乎用户 Dr.Frankenstein 认为:这篇论文动机直接,但也需要一些想象力才能提出,将传统视觉处理里的好操作想法融合到深度网络里做成一个组件,延续了一直以来发paper的思路,值得关注的是实验结果。以下内容经授权转自知乎,详见文末链接。

Non-local mean的传统工作,这篇文章里做了简要介绍。在这里应用到CNN里面,说得暴力一点,就是在做一个网络的时候把卷积核搞的跟整张图片一样大,那为啥要这么暴力呢?

我们要回归CNN一开始的设计思想。CNN一开始是面向目标实体识别的任务的。它就是要模拟人的认知方式,达到一个从局部到宏观的层次化认知流程。所以每一层的卷积核就不该设计的太大,底层的去捕捉轮廓信息,中层的组合轮廓信息,高层的组合全局信息。

但对于序列化的任务,这种思路就不一定能学到充分的需要的信息。比如一个人跳水的视频,每一帧中CNN可以很好的识别他的脚在哪,一个卷积核能覆盖的位置也就是脚及其四周。而要识别跳水的动作,我们要看到他的脚跟他的膝盖、他的大腿、胳膊,发生了一系列的相对位移关系,这些信息是将跳水区别于相扑运动的重要信息,因为运动员静态地看都是只穿小裤衩而已。而这些信息难以被关注于局部的卷积核收集到。

要注意的是,卷积核真的只关注于局部吗?如果只看一层,那答案就是“是的”。但纵观整个网络,不同的全局信息最终被综合,但由于sampling损失了大量信息,就没有这篇文章这种暴力做法来得效果明显。所以传统CNN不是很local,但是信息逐层传递丢失太多以致于不能有期待的效果。

到这里你会发现这篇文章的想法是很简单直接的,但是有趣的其实是实验的结果:

  1. 单一的non-local block加在较浅层次效果显著。Reasonable。高层次丢失的信息太多了,找不到细小的远距离的联系,太模糊了。
  2. 多个non-local block加入,也就是加深non-local特性,有一定效果提升但不会很明显。Reasonable。既然容易起作用的是在低层加,那么使劲加深其实意义不大,加多了这种东西就要考虑梯度消失和引入噪声。毕竟你把背景全都扔进来算。
  3. 时空同时non-local比单一时间维度或单一空间维度效果都要好。这不是废话吗。
  4. Non-local比三维CNN要好。也是废话。这是有人会问,non-local这么吊怎么不把卷积层全都替换掉?肯定不行的!你要依赖小卷积核去捕捉主体信息,同时用他的block捕捉全局信息,两者相辅相成才有好的效果。

值得注意的是,在视频变长以后,non-local的trick的提升变小了。Reasonable。因为在时间维度上,这些短视频帧数太短,时间维度上的小卷积得到的信息不足,劣势明显。时间变长了,non-local也不能handle这么大的信息量了,损失一些信息的小卷积反而不那么差劲了。

总结来说,insight可以的,不算很灌水。实验有些有趣的结论,但不属于极其优秀的那一类。调参是玄学,能不能有很好效果且看公布代码。

知乎用户 2prime 也做了想法类似的工作,我们取得授权后将部分评论节选如下:

文章里面提出来attention就是nonlocal算子的特例是非常有见识的,在视频的时间一档做了一个nonlocal attention,巧妙地将kernel做成两个函数的内积,就是\phi和\theta,然后矩阵内积做出来了kernel,最后内积上提取出来的特征1x1卷积核用来降维。

非局部神经网络究竟如何?至少,作者在结论中写道,所有任务,只需简单增加一个非局部模块,就能得到稳定的性能提升。我们希望非局部神经网络能够成为未来网络结构的基本组成部分(essential component)。


原文发布时间为:2017-11-23

本文作者:费欣欣

本文来自云栖社区合作伙伴新智元,了解相关信息可以关注“AI_era”微信公众号

原文链接:【何恺明最新论文】非局部神经网络,打造未来神经网络基本组件

相关文章
|
1月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
38 8
C++ Qt开发:QTcpSocket网络通信组件
|
2月前
|
机器学习/深度学习 算法 PyTorch
python手把手搭建图像多分类神经网络-代码教程(手动搭建残差网络、mobileNET)
python手把手搭建图像多分类神经网络-代码教程(手动搭建残差网络、mobileNET)
46 0
|
12天前
|
存储 负载均衡 监控
|
13天前
|
JSON Kubernetes 网络架构
Kubernetes CNI 网络模型及常见开源组件
【4月更文挑战第13天】目前主流的容器网络模型是CoreOS 公司推出的 Container Network Interface(CNI)模型
|
15天前
|
机器学习/深度学习 自然语言处理 算法
|
1月前
|
安全 Linux 网络安全
Qt SSL/TLS 安全通信类:构建安全网络应用的关键组件
Qt SSL/TLS 安全通信类:构建安全网络应用的关键组件
64 0
|
1月前
|
存储 网络安全 C++
C++ Qt开发:QUdpSocket网络通信组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QUdpSocket`组件实现基于UDP的网络通信功能。与`QTcpSocket`组件功能类似,`QUdpSocket`组件是 Qt 中用于实现用户数据报协议(UDP,User Datagram Protocol)通信的类。UDP 是一种无连接的、不可靠的数据传输协议,它不保证数据包的顺序和可靠性,但具有低延迟和简单的特点。
20 0
C++ Qt开发:QUdpSocket网络通信组件
|
1月前
|
机器学习/深度学习 开发者
论文介绍:基于扩散神经网络生成的时空少样本学习
【2月更文挑战第28天】论文介绍:基于扩散神经网络生成的时空少样本学习
16 1
论文介绍:基于扩散神经网络生成的时空少样本学习
|
1月前
|
缓存 网络安全 调度
C++ Qt开发:QNetworkAccessManager网络接口组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QNetworkAccessManager`组件实现Web网页访问。QNetworkAccessManager是Qt网络模块中的关键类,用于管理网络访问和请求。作为一个网络请求的调度中心,它为Qt应用程序提供了发送和接收各种类型的网络请求的能力,包括常见的GET、POST、PUT、DELETE等。这个模块的核心功能在于通过处理`QNetworkReply`和`QNetworkRequest`来实现
22 0
C++ Qt开发:QNetworkAccessManager网络接口组件
|
1月前
|
监控 C++ 索引
C++ Qt开发:QNetworkInterface网络接口组件
在Qt网络编程中,`QNetworkInterface`是一个强大的类,提供了获取本地网络接口信息的能力。通过`QNetworkInterface`,可以轻松地获取有关网络接口的信息,包括接口的名称、硬件地址、IP地址和子网掩码等。这个类对于需要获取本地网络环境信息的应用程序特别有用,例如网络配置工具、网络监控程序等。`QNetworkInterface`通过提供一致而易于使用的接口,使得网络编程中的任务更加简便和可靠。
26 4
C++ Qt开发:QNetworkInterface网络接口组件