Non-local Neural Networks 2017 论文笔记

探讨了非局部操作在捕获长距离依赖关系中的作用,将其与自注意力机制统一,提出了一种可泛化的基础网络模块。此模块在视频分类、图像检测等任务中提升了模型性能。

卡内基梅隆大学 FaceBook AI Research

自己的想法:

将经典计算机视觉中的non-local mean操作与自注意力统一起来, 这两种思想其实是有异曲同工之妙的。各种自注意力机制都是本文方法的特例,而本文的non-local 机制则是一种可泛化的基础网络模块,厉害。

这里有篇讲解non-local mean思想的文章:https://www.jianshu.com/p/a9771abedf50(大佬写的文章读起来就是清晰)

摘要

卷积操作和循环操作都在局部块上进行处理。论文提出的Non-Local operations 作为一个通用的构建基块操作,能够捕获长距离的依赖关系。该模块可以插入到许多计算机视觉架构中。在视频分类任务中,论文的Non-Local模型在 Kinetics and Charades 数据集上获得了SOTA的性能。在静态图像识别中能够提升模型在检测、分类、相机定位任务中的性能。

论文简介

深度神经网络的一个重点是捕获长距离依赖关系。对于序列数据主要方法是循环操作,而对于图像数据,主要通过深度带来的大感受野解决长距离依赖的建模问题。

卷积和循环操作都是在局部区域上进行,前者在空间而后者是在时间上。通过反复执行在数据中传播信号,捕获长距离依赖关系。但是这种重复的局部操作具有局限性:

  1. 计算效率低下
  2. 使得优化更新变得很难解决

针对以上问题,论文提出了基于计算机视觉中经典的non-local平均操作的泛化型方法,可以高效简单快速的捕获长距离依赖。直观地,non-local操作将某个位置的响应计算为输入特征中所有位置的加权和。位置集可以是在空间、时间或时空中,这意味着该操作适用于图像、序列和视频问题

这样做的好处是:

  1. 非局部运算通过计算任意两个位置之间的交集(不管它们的位置距离如何)直接捕获远程依赖关系;
  2. 计算快,使用更少的层就能到达最好的效果
  3. 保持了输入大小,且输出尺寸可变,可以很容易地与其他操作相结合

作者还在检测和分割、相机定位任务上进行了实验,non-local操作只要付出很小的计算代价就可以提高三项任务的准确性。实验表明,非局部操作通常是有用的,并且可以成为设计深层神经网络的基本构造块。

Non-local Neural Networks

首先介绍定义和公式,然后介绍一些实例

公式

在位置(空间或者时间、时空)i 处的non-local 输出为:
y i = 1 C ( x ) ∑ ∀ j f ( x i , x j ) g ( x j ) y_i = \frac{1}{C(x)}\sum_{\forall j}f(x_i,x_j)g(x_j) yi=C(x)1jf(xi,xj)g(xj)
x表示输入信号, j 表示所有与i 有可能有关系的位置。函数 f 计算输入信号中 i、j位置之间的关系,函数g 计算X_j的特征表达,第一项为归一化因子。

从公式可以看出non-local操作计算所有的j的可能位置,但是卷积和循环操作只在局部进行。

non-local操作又与全连接层不同,non-local中使用i、j 位置之间的关系 f ( x i , x j ) f(x_i,x_j) f(xi,xj)作为权重,而全连接层使用的是训练好的权重,也就是说全连接层没有把位置间的关系作为函数的输入。此外。全连接层要求输入的size是固定的,丢失了位置间的对应关系。

non-local 操作可以作为神经网络的基础模块应用在网络层的前面部分,而全连接层一般在网络的最后部分。这使得non-local 操作可以对丰富的局部以及全局结构信息进行建模。

实例化

这里介绍了几个不同版本的f和g函数,但是最后的实验证明模型对于函数的选择不敏感,说明模型性能的提升都是来自于其non-local操作。

首先定义g为线性函数: g ( x i ) = W g x j g(x_i) = W_g x_j g(xi)=Wgxj ,其中 W g W_g Wg是需要学习的权重,具体的使用1X1的卷积来实现

其次定义f函数,可以有不同的版本:

  • 根据non-local求平均以及双边滤波器的思想,首先想到高斯函数:
    f ( x i , x j ) = e x i T x j 归 一 化 因 子 : C ( x ) = ∑ ∀ j f ( x i , x j ) f(x_i,x_j)=e^{x_i^Tx_j} \\ 归一化因子:\quad C(x)=\sum_{\forall j}f(x_i,x_j) f(xi,xj)=exiTxj:C(x)=jf(xi,xj)

  • 对高斯函数进行扩展:Embedded Gaussian
    f ( x i , x j ) = e θ ( x i ) T ϕ ( x j ) θ ( x i ) = W θ x i , ϕ ( x j ) = W ϕ x j f(x_i,x_j)=e^{\theta(x_i)^T\phi(x_j)} \\ \theta(x_i) = W_{\theta}x_i,\quad \phi(x_j)=W_{\phi}x_j f(xi,xj)=eθ(xi)Tϕ(xj)θ(xi)=Wθxi,ϕ(xj)=Wϕxj
    作者指出self-attention模块本质上就是Embedded Gaussian,其f函数为softmax:

    f ( x i , x j ) = s o f t m a x ( x i T W θ T W ϕ x j ) f(x_i,x_j) = softmax(x_i^TW_{\theta}^TW_{\phi}x_j) f(xi,xj)=softmax(xiTWθTWϕxj).因此本文工作将经典计算机视觉中non-local平均的思想与自注意力模型统一了起来。

  • Embedded 点乘
    f ( x i . x j ) = θ ( x i ) T ϕ ( x j ) 归 一 化 因 子 C ( x ) = N f(x_i.x_j) = \theta(x_i)^T\phi(x_j)\\ 归一化因子\quad C(x)=N f(xi.xj)=θ(xi)Tϕ(xj)C(x)=N
    其中N表示x中的位置个数,而不是f的和,这样可以简化梯度的计算,并且使得输入尺寸可变成为可能。

  • Concatenation:该函数在关系推理网络中用到,引入了激活函数ReLU
    f ( x i , x j ) = R e L U ( w f T [ θ ( x i ) , ϕ ( x j ) ] ) 同 上 , C ( x ) = N f(x_i,x_j) =ReLU(w^T_f[\theta(x_i), \phi(x_j)])\\ 同上,\quad C(x) = N f(xi,xj)=ReLU(wfT[θ(xi),ϕ(xj)])C(x)=N
    中括号中表示“Concatenation”操作.

  • more …

Non-local Block

将实例化的f、g函数带入到公式中得到non-local 的输出y_i,然后得到non-local block:
z i = W z y i + x i z_i = W_zy_i + x_i zi=Wzyi+xi
公式中第二项是残差连接项,上面的做法的好处是可以随意嵌入到任何一个预训练好的网络中,因为只要设置W_z初始化为0,那么就没有任何影响,然后在迁移学习中学习新的权重。这样就不会因为引入了新的模块而导致预训练权重无法使用
在这里插入图片描述

基于non-local的视频分类模型:

Baseline: 2D ConvNet (C2D)

在这里插入图片描述

直接使用预训练的ResNet权重进行初始化。模型唯一涉及时间域的操作是池化层。换句话说,该模型简单聚合了时间维度的信息

Inflated 3D ConvNet (I3D):

将之前的2D模型中的卷积核进行“inflating”(膨胀)得到三维卷积模型。

对于残差块中的卷积核做两种不同的膨胀:

  1. 3×3膨胀为3×3×3,记为 I 3 D 3 × 3 × 3 I3D_{3×3×3} I3D3×3×3
  2. 第一个1×1的膨胀为3×1×1,记为 I 3 D 3 × 1 × 1 I3D_{3×1×1} I3D3×1×1

Non-local network

在之前的两个模型中分别插入非局部块,转换为non-local网络

实验内容

视频分类数据集上的实验:

消失实验:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图像检测、分割、定位数据集上的实验

在这里插入图片描述

在这里插入图片描述

可以看出非局部模块对大多数任务都有提升作用。

### Non-local Neural Networks 的基本原理 Non-local Neural Networks 是一种用于捕捉图像或序列数据中全局依赖关系的方法。其核心思想来源于非局部均值方法[^1],并进一步扩展到神经网络领域。以下是对其基本原理的详细介绍: #### 1. 非局部操作的核心概念 Non-local 操作旨在捕获输入信号中的远距离交互关系。它通过计算任意两个位置之间的响应来实现这一点。具体来说,对于给定的位置 \(i\) 和其他所有位置 \(j\),Non-local 模块会基于它们的关系权重调整该位置的特征向量。 这一过程可以被形式化描述为以下公式: \[ y_i = \frac{1}{C(x)} \sum_{j} f(x_i, x_j) g(x_j), \] 其中, - \(f(\cdot)\) 表示一对位置之间关系的函数; - \(g(\cdot)\) 表示对另一个位置特征的变换; - \(C(x)\) 是归一化项,通常取为常数或者由 \(f(\cdot)\) 定义的总和。 这种机制允许模型不仅关注局部邻域内的信息,还能够利用更广泛的上下文信息[^3]。 #### 2. 关系推理模块的影响 Santoro 等人在研究中提出了一个简单的神经网络模块用于关系推理[^2]。他们的工作表明,在处理复杂场景理解任务时,显式建模对象间的关系是非常重要的。这启发了后续关于如何设计有效的关系感知架构的研究方向之一就是引入 non-local 结构作为基础组件。 #### 3. 构造 Non-local 模块 为了便于集成进现有各种类型的深度学习框架之中,论文给出了具体的实现方式——即所谓的 “non-local block”。这个构建单元内部包含了前面提及过的 non-local 运算逻辑,并且可以通过堆叠多个这样的 blocks 来增强整个系统的表达能力[^4]。 下面是一个 Python 实现的例子,展示了如何在一个标准 CNN 之后加入 Non-local Block: ```python import torch.nn as nn import torch class NonLocalBlock(nn.Module): def __init__(self, in_channels, inter_channels=None): super(NonLocalBlock, self).__init__() self.in_channels = in_channels self.inter_channels = inter_channels if self.inter_channels is None: self.inter_channels = in_channels // 2 conv_nd = nn.Conv2d bn = nn.BatchNorm2d self.g = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1) self.W = conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels, kernel_size=1) self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1) self.phi = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1) self.bn = bn(self.in_channels) def forward(self, x): batch_size = x.size(0) g_x = self.g(x).view(batch_size, self.inter_channels, -1) g_x = g_x.permute(0, 2, 1) theta_x = self.theta(x).view(batch_size, self.inter_channels, -1) theta_x = theta_x.permute(0, 2, 1) phi_x = self.phi(x).view(batch_size, self.inter_channels, -1) f = torch.matmul(theta_x, phi_x) f_div_C = F.softmax(f, dim=-1) y = torch.matmul(f_div_C, g_x) y = y.permute(0, 2, 1).contiguous() y = y.view(batch_size, self.inter_channels, *x.size()[2:]) W_y = self.W(y) z = W_y + x return z ``` 此代码片段定义了一个通用版本的 Non-local Block 类型,适用于二维空间上的张量运算(例如图片)。注意这里采用了嵌入高斯相似度衡量法来进行注意力分配。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值