论文阅读- Non-local Neural Networks

本文探讨了卷积和循环操作在处理图像和序列数据时的局限性,即难以有效捕捉远距离依赖。Nonlocal操作作为一种创新方法,通过计算任意两点间的直接交互,解决了这一难题,其优势在于减少计算复杂度,优化信息传递,并保持输入尺寸不变,适用于深度学习的多种场景。
  1. 现存问题
    Both convolutional and recurrent operations are building blocks that process one local neighborhood at a time.(卷积操作只处理neighborhood一小块)

  2. 如何捕获远距离的依赖/相关性?

    • 对于序列化的数据,recurrent operations 是主流的解决方案
    • 对于图像数据,使用大的感受野以及卷积操作的叠加
  3. 现存方法的不足
    卷积和循环操作只能够处理局部数据,所以想获得远距离信息必须有大量的重复
    (1) 计算耗时
    (2) 优化问题?
    (3) 信息难以远距离传递

  4. non local 操作
    a non-local operation computes the response at a position as a weighted sum of the features at all positions in the input feature maps(non local操作将一个位置处的响应计算为输入特征图中各个位置的特征的加权平均)
    在这里插入图片描述
    优点:
    (1) non local操作直接计算两个位置之间的交互,不论这两个位置相隔多远
    (2) 使用更少的层数
    (3) 保留了输入的大小,使得嵌入变得更加容易

  5. 公式
    在这里插入图片描述
    其中i是代表的输出位置的索引,x是输入,j是对所有位置的列举,f(xi,xj)表示输入的第xi和xj之间的相关性,g(xj)中,g用于计算输入数据中j这个位置的特征.

    • 与卷积之间的区别
      对于一个卷积核大小为3卷积操作来说,i − 1 ≤ j ≤ i + 1
    • 与全连接之间的区别
      对于全连接层来说,xi和xj之间的相关性并不是关于输入数据的函数,而是通过学习得到的. 而且全连接层要求输入数据的大小是恒定的
    • 相似度函数
      在这里插入图片描述
    • non local 块
      在这里插入图片描述
      (1) 1*1卷积 bottleneck层降维
      (2) 计算相似度矩阵
      (3) 通过相似度矩阵,对每一个像素进行 non local操作
      (4) 1*1 卷积升维
### 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、付费专栏及课程。

余额充值