NonLocal Neural Network备忘

论文简介

论文由NonLocal mean启发,每个位置的response(响应?)是由全局的权重值求和相关的。NonLocal block设计为可以插入到已有网络结构层与层之间的形式。在视频分类中表现优秀。

intro

对于序列数据(语音),long distance dependency是建立在递归操作上(如LSTM);对于图像,long distance dependency是建立在由多层卷积操作建立的大感受域上的。

卷积和递归都是基于当前邻域,实现long distance dependency必须反复遍历数据。计算方式低效,训练困难,信息不容易实现双向传递。

跟self-attention有点关系,每个局部的输出都考虑了全局的加权平均值(self-attention是在embedding空间中计算的,该论文提出的Transformer模型革了RNN的命)。

我们的网络表现很牛,而且可以作为一个基础模块,插入到已有网络中。

原理

image-20190114133153895

yi为NonLocal mean输出

i为当前计算点index

j为全局所有计算点index

**f(xi,xj)**计算2点之间相似程度(paper提供了4种方式:Gaussian, Embedded Gaussian, Dot Product, Concatenation)

**g(xj)**为j点的response值

C(x)为归一化值,取值为sum_j {f(xi,xj)}

NonLocal Block

image-20190114133936809

yi为NonLocal mean输出

Wz为NL层的可训练权重

xi作为残差连接,将Wz初始化为0时,则可以插入到已有模型中且不影响模型结果。

实验

基于ResNet50的Conv2D和Inflate3D版本,对比插入1、5、10个NonLocal Block之后的表现。

C2D可以直接用ResNet50的预训练权重;I3D可以将卷积核的每片都用2D的版本初始化然后除以t(t为inflate的倍数)

因为Inflate3D计算量比较大,因此每2个resBlock才inflate一个。

Trick

采用Embedded Gaussian计算NonLocal Mean时通道数选为输入通道的一半,再加一层pooling可以进一步降低计算量到1/4

数据画面随机剪裁,从连续的64帧中随机截选32帧作为一组

8GPU,每个GPU计算8组,相当于一个mini-batch有62组数据

训练400k轮,lr=0.01,每150k减少一个数量级

opt用momentum=0.9,weight decay=0.0001,在最后的global pooling layer用0.5的dropout

在每个NonLocal Block的最后一层1x1x1中使用BatchNorm,并且该层权重初始化为0,保证可以插入到任意已训练的网络结构中

实验结果

image-20190114143358883

4种NonLocal Weight计算方法效果接近。

image-20190114143420341

将1个NonLocal Block加到不同位置,效果接近

image-20190114143455820

更深的网络也可以用NonLocal Block进一步提高表现(ResNet101)

NonLocal的提升也不仅仅是因为深度增加了(R50 + 5-block > R101 base)

image-20190114143622712

NonLocal考虑space&time时效果最好(计算量更大?)

image-20190114143709720

对比I3D,减少了计算量,提高了效果

image-20190115221557322

对比C2D、Inflate3D和NonLocal Inflate3D的表现。NonLocal可以与conv3D互补,得到更好表现

image-20190115220819622

用128帧一组数据,效果更好(计算量翻4倍?)基于32帧的训练模型进行训练,lr=0.0025。在更长的数据中,NLI3D相比I3D也仍然有提升。