论文简介
论文由NonLocal mean启发,每个位置的response(响应?)是由全局的权重值求和相关的。NonLocal block设计为可以插入到已有网络结构层与层之间的形式。在视频分类中表现优秀。
intro
对于序列数据(语音),long distance dependency是建立在递归操作上(如LSTM);对于图像,long distance dependency是建立在由多层卷积操作建立的大感受域上的。
卷积和递归都是基于当前邻域,实现long distance dependency必须反复遍历数据。计算方式低效,训练困难,信息不容易实现双向传递。
跟self-attention有点关系,每个局部的输出都考虑了全局的加权平均值(self-attention是在embedding空间中计算的,该论文提出的Transformer模型革了RNN的命)。
我们的网络表现很牛,而且可以作为一个基础模块,插入到已有网络中。
原理
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
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,保证可以插入到任意已训练的网络结构中
实验结果
4种NonLocal Weight计算方法效果接近。
将1个NonLocal Block加到不同位置,效果接近
更深的网络也可以用NonLocal Block进一步提高表现(ResNet101)
NonLocal的提升也不仅仅是因为深度增加了(R50 + 5-block > R101 base)
NonLocal考虑space&time时效果最好(计算量更大?)
对比I3D,减少了计算量,提高了效果
对比C2D、Inflate3D和NonLocal Inflate3D的表现。NonLocal可以与conv3D互补,得到更好表现
用128帧一组数据,效果更好(计算量翻4倍?)基于32帧的训练模型进行训练,lr=0.0025。在更长的数据中,NLI3D相比I3D也仍然有提升。