Non-local Neural Networks

Non-local Neural Networks

论文链接

项目代码

三个词,很舒服

语音增强中很多方法从计算机视觉中借鉴,这篇文章也是前两日看《A Convolutional Neural Network with Non-Local Module for Speech Enhancement》,论文经常提到的,所以过来拜读。

主要是看看公式推导,计算机视觉相关工作可能介绍的不是很严谨。

摘要

提出了通用的non-local module,想法由经典的非局部均值(《A non-local algorithm for image denoising》)而产生,学过数字图像处理课程的读者应该都接触过。

非局部操作将某个位置的响应计算为所有位置特征的加权和。视觉这边对于数据的第六感非常厉害,这种操作也是对数据的充分利用了。

介绍

non-local operation作用是捕捉长距离依赖,在dnn, rnn或者cnn中,只有通过重复调用(虽然好多博客翻译成递归,感觉论文下面说的repeat应该是正确的表达)这些结构才能捕捉到这种全局信息。并且这些重复操作会带来很多问题。首先运算量增大,其次网络结构变复杂,不利于收敛。本文在设计non-local module的时候也考虑了收敛的问题,加入了残差项。

这种长距离依赖,在识别或者增强中就是指一句话不同词之间的联系。有可能对于重复音检测也有帮助。

non-local operation的几个优点:

  1. 非局部运算通过计算任意两个位置之间的相互作用,直接捕捉远程依赖,不用管他们的距离如何,这不同于CNN和RNN。
  2. 实验表明,非局部运算即使层数较少也能够达到效果。
  3. 输入维度和输出维度可以不确定,所以可以方便的嵌入到其他网络中去。

后面在视觉任务上做了一些对比实验,就不介绍了。

即这些实验表明non-local blocks可以作为神经网络的一个基础模块。

这里跳过了related work部分,对于视觉任务在本专栏不予介绍,感兴趣读者的可阅读原文。

Non-local Neural Networks

给出具体的定义。

公式

神经网络中通用形式的非局部均值:

这里是要计算的输出位置(在空间、时间或时空中)的索引,是枚举与对应的所有可能位置的索引。是输入的特征,如语音中的时频特征或者是经过几层卷积后的高维特征。表示输出结果,和的尺寸一样,表示之间的一个标量(相似度之类的),表示了所代表的信息。用于正则化。通过计算i与其他所有位置的相关程度,考虑了长距离依赖。

感觉有DNN的味道,所以作者后面解释了和DNN的区别。非局部的计算包括不同位置之间的关系,全连接通过数据学习权重。即对应的标量(相互性,依赖性,,,)并不是DNN输入的数据(直接是)。

可能是这样理解的,全局信息并不是通过原来的数据本身进行反应的,它们之间的位置以及数据本身的相互作用更能反映全局信息。

实例

上面的公式给出了非局部均值的基本运算,下面就是根据公式寻找合适的,不过奇怪的是,这些不同的公式组合对于网络影响不是很大。即一般的非局部信息是改善网络表现的主要原因,具体的公式带来的区别影响不大。

论文主要讨论了如何确定。简单起见,假定为线性嵌入:表示需要学习的矩阵,通过1*1 卷积实现。

对于

  • Gaussian

    信号学的太烂,很惭愧,没有理解为什么很自然的选择了双边滤波器。

    • 表示点积,计算相似性,也可以使用欧式距离,不过很多框架中对于矩阵乘法支持比较友好。
    • 对应的
  • Embedded Gaussian

    高斯函数的扩展,在一个嵌入空间计算相似性。用于机器翻译的self-attention模块就是嵌入高斯函数-非局部计算的一个特例。即对于给定的是沿着维的softmax操作。即,这便是《Attention is all you need》中的self-attention形式。

    • 对应的

上面的两种公式都有softmax带来的注意力行为,不过为了证明注意力并不是改善模型的主要原因,作者又提出了如下公式

太严谨了吧

  • Dot product

    点积相似性

    • 表示中位置的总个数,而不是函数的和。这样可以简化计算,这种归一化类似于算方差的时候除以,如果不除以,那么随着的尺寸增加,值会无限变大。
    • 点积和嵌入高斯函数的区别就在于是否有softmax,可以当作一个激活函数来看待。
  • Concatenation

    这个操作可以参考论文《A simple neural network module for relational reasoning》,

    • 表示串联,是将拼接向量映射到标量(相似度,距离依赖)的一个矩阵。
    • ,并且给加上ReLU激活函数,没有解释为什么。

Non-local Block

非局部模块公式:

是非局部运算公式给出的结果,表示残差项,可以参考一个设计好的非局部模块。

图里说的很明白了,不过在专栏上一篇文章里,就没有对这个网络的详细描述,二者相差不大,不过明显这个图要清楚一点。

在高维特征使用non-local block会更好一点,参数量少,运算快。

Non-Local blocks算法实现

分别表示上述函数对应数据的channeld,且都等于输入的一半。bottleneck层参考《Deep residual learning for image recognition》,$W_z$计算了pos-wise的embedding信息。保持和输入信号size一致。

优化:

可以是降采样版本的数据,如max-pooling,这样效率可以提高四倍。这种操作并不会导致局部信息依赖,并且可以让计算更稀疏。通过在后面加pooling操作就可以实现。本篇文章使用的所有non-local blocks都使用了上面的优化步骤。

结果验证

图中可以看出,

  1. non-local blocks层数越多(10),效果越好。不过在语音任务中,层数为2效果就是最好了,可能这个地方和模型大小有关。
  2. 嵌入高斯函数比高斯函数效果要好。
  3. 时间和空间信息都加上去,效果最好。
  4. 在模型表现相差不大的情况下,non-local blocks能够更充分的利用数据信息,获得更好的结果。
  5. 并且多个模型对比,一致表明,NL是的确可以作为神经网络中一个基础模块去使用的。

并且由于多了残差项,在收敛上面也可以加快速度,以及后面好多实验,都表明这个结构很优秀,甚至去和残差块去比也不逊色。
重点介绍一下用法和总结。

Which stage to add non-local blocks?

table2 b 和 table2 d表明,在res-net的倒数第二层加入NL blocks会有很大的提升。原因是相较于前面几层res block,后面的高维特征比较容易收敛,相较于最后一层特征,倒数第二层的特征足够去表达全局的距离依赖信息,而最后一层参数过少,反而无法表达这种特征。还有这种结构对于序列模型以及空间模型的表达能力都很强。

总结

通过NL operation去捕捉全局依赖信息,并且这种结构非常灵活,可以嵌入任何已有的网络,在很多任务中,加入这种结构可以明显的提升模型效果,希望这种结构可以变成未来神经网络的一个模块。

文章思路非常严谨,并且通过大量实验证明了结论,读完感觉每篇文章都不容易,都是作者的匠心之作。