第二十二章:Non-local Neural Networks ——非局部神经网络

文章提出非局部神经网络,通过非局部操作来捕捉深度学习模型中的长程依赖关系,尤其在视频分类、目标检测和分割任务中展现出优势。非局部操作可以作为通用组件,与现有架构结合,提高了模型性能,且对实例化类型不敏感。实验结果显示,非局部块的添加可以显著优于传统的卷积和循环操作,且在计算效率和准确性之间取得良好平衡。

原文信息

原文题目:《Non-local Neural Networks》

原文引用:Wang X, Girshick R, Gupta A, et al. Non-local neural networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 7794-7803.

原文链接:https://openaccess.thecvf.com/content_cvpr_2018/papers/Wang_Non-Local_Neural_Networks_CVPR_2018_paper.pdficon-default.png?t=N6B9https://openaccess.thecvf.com/content_cvpr_2018/papers/Wang_Non-Local_Neural_Networks_CVPR_2018_paper.pdf

0.摘要

        卷积和循环操作都是一次处理一个局部邻域的基本构建模块。在本文中,我们提出了非局部操作作为捕捉长程依赖关系的通用构建模块族。受计算机视觉领域经典的非局部均值方法[4]的启发,我们的非局部操作将一个位置的响应计算为所有位置特征的加权和。这个构建模块可以嵌入到许多计算机视觉架构中。在视频分类任务中,即使没有任何额外的功能,我们的非局部模型在Kinetics和Charades数据集上能够与当前竞争中的优胜者相竞争或超越。在静态图像识别中,我们的非局部模型改进了COCO套件上的物体检测/分割和姿态估计。代码将会提供。

1.简介

        在深度神经网络中,捕捉长程依赖是非常重要的。对于顺序数据(例如语音、语言),循环操作是处理长程依赖建模的主要解决方案。对于图像数据,通过深度卷积操作形成的大感受野来建模长距离依赖关系卷积和循环操作都是在局部邻域中处理,无论是在空间还是时间上;因此,只有当这些操作被重复应用时,才能捕捉到长程依赖关系,并通过数据逐步传播信号。重复局部操作存在几个局限性。首先,计算效率低下。其次,会导致优化困难,需要仔细解决。最后,这些挑战使得多跳依赖建模(例如,在远距离位置之间需要来回传递信息)变得困难。在本文中,我们提出了非局部操作作为一种高效、简单和通用的组件,用于捕捉深度神经网络中的长程依赖关系。我们提出的非局部操作是计算机视觉中经典的非局部均值操作的推广。直观地说,非局部操作通过对输入特征图中所有位置的特征进行加权求和来计算位置处的响应。位置集可以是空间、时间或时空,这意味着我们的操作适用于图像、序列和视频问题。

        使用非局部操作有几个优点:

        (a)与循环和卷积操作的逐步行为相比,非局部操作通过计算任意两个位置之间的相互作用直接捕捉长程依赖关系,而不考虑它们的位置距离;

        (b)正如我们在实验中展示的,非局部操作高效且即使只有少数几层(例如,5层)也能达到最佳结果;

        (c)最后,我们的非局部操作可以保持可变的输入大小,并且可以与其他操作(例如,卷积)轻松组合。

        我们展示了非局部操作在视频分类应用中的有效性。在视频中,远距离的像素在空间和时间上发生长程相互作用。一个非局部块,作为我们的基本单元,可以以前向传播的方式直接捕捉这些时空依赖关系。通过几个非局部块,我们的名为非局部神经网络的架构在视频分类方面比2D和3D卷积网络[48](包括膨胀变体[7])更准确。此外,非局部神经网络在计算上比它们的3D卷积对应物更经济。我们在Kinetics [27]和Charades [44]数据集上进行了全面的消融研究。仅使用RGB,并且没有任何额外的功能(例如,光流、多尺度测试),我们的方法在这两个数据集上取得了与或优于最新的竞赛获胜者相当的结果。

        为了展示非局部操作的普适性,我们在COCO数据集[33]上进一步进行了目标检测/分割和姿态估计实验。在强大的Mask R-CNN基线[19]的基础上,我们的非局部块可以在稍微增加计算成本的情况下提高所有三个任务的准确性。结合对视频的证据,这些图像实验证明非局部操作通常是有用的,并且可以成为设计深度神经网络的基本构建模块。

图1.在我们在Kinetics上训练的用于视频分类的网络中的时空非局部操作。位置xi的响应通过所有位置xj的特征的加权平均计算得到(只显示最高权重的位置)。在我们模型计算的这个例子中,请注意它如何将第一帧中的球与最后两帧中的球联系起来。更多例子请参见图3。

2.相关工作

非局部图像处理。非局部均值[4]是一种经典的滤波算法,它计算图像中所有像素的加权平均值。它允许远距离的像素根据补丁外观的相似性对某个位置的滤波响应做出贡献。这个非局部滤波的思想后来发展成了BM3D(块匹配3D)[10],它在一组相似但非局部的补丁上进行滤波。即使与深度神经网络[5]相比,BM3D也是一个可靠的图像去噪基准。块匹配被用于神经

### 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 类型,适用于二维空间上的张量运算(例如图片)。注意这里采用了嵌入高斯相似度衡量法来进行注意力分配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值