Non-local Neural Networks
1. 摘要
卷积和循环神经网络中的操作都是一次处理一个局部邻域,在这篇文章中,作者提出了一个非局部的操作来作为捕获远程依赖的通用模块。
受计算机视觉中经典的非局部均值方法启发,我们的非局部操作计算某一位置的响应为所有位置特征的加权和。而且,这个模块可以插入到许多计算机视觉网络架构中去。
2. 介绍
在深度神经网络中,捕获远程依赖非常重要。卷积神经网络依靠大的感知野来对远程依赖建模,这是通过重复叠加卷积块来实现的。但同时,它也有一些限制。首先,它在计算上效率低下。其次,它会导致需要仔细解决的优化难题。最后,这些挑战使得多跳依赖性建模非常困难,例如,当需要在远程位置之间来回传递消息时。
假设有一个 3×3 的卷积核,那我们的每一个激活值就只与这 9 个点的值有关,所以也就是局部(local)的。所谓非局部(non-local),也就是说,每一个激活值可能不至与它相邻近的点有关,还可能与离它比较远的点也有关。比如下面第一帧的球,就与后两帧的球相关。

因此,作者提出的非局部操作计算某一位置的响应为所有位置特征的加权和,这些位置可以是空间的、时间的或者时空的。
使用非局部操作有几个优点:(a)与循环和卷积操作的渐进行为相反,非本地操作通过计算任意两个位置之间的相互关系直接捕获远程依赖性,而不管它们的位置距离如何;(b)非局部操作非常有效,即使只有几层(例如5)也能达到最佳效果;(c)最后,非本地操作保持可变的输入大小,并且可以很容易地与其他操作组合(例如卷积)。
3. 网络结构
3.1. 定义

我们要计算输出位置 i 的响应,j 枚举了所有的位置,函数 f 则计算 i 和所有 j 的关系,最后再进行一个归一化。因为 j 考虑了所有可能的位置,所以这个操作是非局部的。而卷积操作只考虑某一个区域,循环操作只考虑当前和最近的时间序列,它们都是局部的。至于全连接,它的权重是学习到的,不是 i 和 j 的一个函数关系。此外,上面的公式可以接受不同的输入大小,并且能保持输出大小和输入一致,而全连接则必须固定输入和输出大小。
3.2. 实例
当然了,f 和 g 可以有不同的选择。但是实验发现,模型对 f 和 g 的选择并不敏感,也就是说通用的非局部操作才是改进的关键。
为了简化,g 只考虑线性形式:

W 是要学习的权重,这也就可以通过一个 1×1 的卷积来实现。
函数 f 则有多种选择:
- Gaussian

高斯函数是最常见的,欧氏距离也同样适用,不过点积在深度学习平台实现则更友好。归一化则采取:

- Embedded Gaussian
另一种则是在嵌入空间使用高斯函数:

采取两个映射:


归一化则与上面保持一样。给定 i,上面的公式实际上也就是沿着 j 方向的一个 Softmax:

为了说明 Softmax 并不是必须的,作者还提出了另外两个选择,它们的归一化用位置 j 的数量 N 来实现。
- Dot product

- Concatenation

3.3. 非局部块
作者进而将上面的方程包装到一个非局部块,从而可以方便地插入到现有的框架中去,一个局部块定义如下:

’+‘ 是引入了残差连接,这样将非局部块插入到现有训练好的模型中后,如果权重系数初始化为零,就可以维持原状态不变。

整个流程如上图所示,为了减小计算,引入了瓶颈结构,先将通道数减为一半。除此之外,还可以对 x 进行空间下采样,也就是在上图中的 φ 和 g 后面加入最大池化,这样可以进一步提高效率。其一个 TensorFlow 实现如下:
def NonLocalBlock(input, subsample=True):
"""
@Non-local Neural Networks
Non-local Block
"""
_, height, width, channel = input.get_shape().as_list() # (B, H, W, C)
theta = tf.layers.conv2d(input, channel // 2, 1) # (B, H, W, C // 2)
theta = tf.reshape(theta, [-1, height*width, channel // 2]) # (B, H*W, C // 2)
phi = tf.layers.conv2d(input, channel // 2, 1) # (B, H, W, C // 2)
if subsample:
phi = tf.layers.max_pooling2d(phi, 2, 2) # (B, H / 2, W / 2, C // 2)
phi = tf.reshape(phi, [-1, height * width // 4, channel // 2]) # (B, H * W / 4, C // 2)
else:
phi = tf.reshape(phi, [-1, height * width, channel // 2]) # (B, H*W, C // 2)
phi = tf.transpose(phi, [0, 2, 1]) # (B, C // 2, H*W)
f = tf.matmul(theta, phi) # (B, H*W, H*W)
f = tf.nn.softmax(f) # (B, H*W, H*W)
g = tf.layers.conv2d(input, channel // 2, 1) # (B, H, W, C // 2)
if subsample:
g = tf.layers.max_pooling2d(g, 2, 2) # (B, H / 2, W / 2, C // 2)
g = tf.reshape(g, [-1, height * width // 4, channel // 2]) # (B, H*W, C // 2)
else:
g = tf.reshape(g, [-1, height * width, channel // 2]) # (B, H*W, C // 2)
y = tf.matmul(f, g) # (B, H*W, C // 2)
y = tf.reshape(y, [-1, height, width, channel // 2]) # (B, H, W, C // 2)
y = tf.layers.conv2d(y, channel, 1) # (B, H, W, C)
y = tf.add(input, y) # (B, W, H, C)
return y
4. 实验结果

对比了几种 f 的选择,发现它们对模型的表现并没有起到决定性的作用,最根本的还是非局部的思想对实验结果有提升。

在第二三四个残差块之后加入非局部块效果相似,都有比较明显的提升;但在第五个残差块之后添加的话,效果没有之前那样明显。作者猜测可能是最后一个残差块的空间分辨率比较小只有 7×7,不足够提供精确的空间信息。

添加更多的非局部块,模型的表现相对来说会更好。
获取更多精彩,请关注「seniusen」!

Non-local Neural Networks的更多相关文章
- Local Binary Convolutional Neural Networks ---卷积深度网络移植到嵌入式设备上?
前言:今天他给大家带来一篇发表在CVPR 2017上的文章. 原文:LBCNN 原文代码:https://github.com/juefeix/lbcnn.torch 本文主要内容:把局部二值与卷积神 ...
- Spurious Local Minima are Common in Two-Layer ReLU Neural Networks
目录 引 主要内容 定理1 推论1 引理1 引理2 Safran I, Shamir O. Spurious Local Minima are Common in Two-Layer ReLU Neu ...
- 论文解读(LA-GNN)《Local Augmentation for Graph Neural Networks》
论文信息 论文标题:Local Augmentation for Graph Neural Networks论文作者:Songtao Liu, Hanze Dong, Lanqing Li, Ting ...
- 【转】Artificial Neurons and Single-Layer Neural Networks
原文:written by Sebastian Raschka on March 14, 2015 中文版译文:伯乐在线 - atmanic 翻译,toolate 校稿 This article of ...
- Deep Learning 16:用自编码器对数据进行降维_读论文“Reducing the Dimensionality of Data with Neural Networks”的笔记
前言 论文“Reducing the Dimensionality of Data with Neural Networks”是深度学习鼻祖hinton于2006年发表于<SCIENCE > ...
- [转]Neural Networks, Manifolds, and Topology
colah's blog Blog About Contact Neural Networks, Manifolds, and Topology Posted on April 6, 2014 top ...
- [CS231n-CNN] Training Neural Networks Part 1 : activation functions, weight initialization, gradient flow, batch normalization | babysitting the learning process, hyperparameter optimization
课程主页:http://cs231n.stanford.edu/ Introduction to neural networks -Training Neural Network ________ ...
- Hacker's guide to Neural Networks
Hacker's guide to Neural Networks Hi there, I'm a CS PhD student at Stanford. I've worked on Deep Le ...
- Stanford机器学习---第五讲. 神经网络的学习 Neural Networks learning
原文 http://blog.csdn.net/abcjennifer/article/details/7758797 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...
- 深度学习笔记(三 )Constitutional Neural Networks
一. 预备知识 包括 Linear Regression, Logistic Regression和 Multi-Layer Neural Network.参考 http://ufldl.stanfo ...
随机推荐
- 小白学Python(20)—— Turtle 海龟绘图
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行 ...
- Vue:Elementui中的Tag与页面其它元素相互交互的两三事
前言 公司系统在用elementui做后台开发,不免遇到一些需要自己去根据原有的功能上,加一些交互的功能.今天来介绍下我在用elementUi里的Tag标签与多选框交互的过程,东西听上去很简单,但就是 ...
- PY个欧拉筛
大数据用 python? 速度感人 突然来了一发 python 欧拉筛,调了半天之后输入 1e7 过了几秒钟之后出解了,PY 果然神速 没学过 PY 的小同学可以当做 VB 的阅读程序,反正语言隔离都 ...
- vscode调试php
xdebug调试vscode 下载xdebug.dll扩展库 php.ini配置 [XDebug] xdebug.remote_enable = xdebug.remote_autostart = z ...
- Vue的渐进式理解(笔记)
在我看来,渐进式代表的含义是:主张最少. 每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式. 比如说,Angu ...
- NLP 中任务及相关概念
命名实体识别 命名实体识别(Named Entity Recognition,简称NER),又称作"专名识别",是指识别文本中具有特定意义的实体,主要包括人名.地名.机构名.专有名 ...
- Python实现IP地址归属地查询
一.使用淘宝IP地址库查询 使用淘宝的Rest API,可以快速查询IP地址的归属地: 图00-淘宝IP地址库RestAPI使用说明 图01-使用淘宝免费IP地址库-查询IP归属地 存在问题:淘宝的免 ...
- mnist 卷积神经网络
# from keras.models import Sequential# from keras.layers.core import Dense,Activation,Flatten #creat ...
- 前端之JQuery:JQuery文档操作
jquery之文档操作 一.相关知识点总结1.CSS .css() - .css("color") -> 获取color css值 - .css("color&qu ...
- 用selenium启动chrome浏览器
python 3.7 pycharm 1.安装selenium pip3 install selenium 2.下载与chrome匹配的chromdriver.exe,放到项目的解释器路径下,跟pyt ...