Non-local Neural Networks论文理解
文章目录
- 解决什么问题
- 本文创新点\贡献
- 前人方法
- 本文IDEA来源
- 方法
- 方法概述
- 相关
- 解决的点
- 优点
- 原理
- Non-local Neural Networks
- 方程式
- 多种fff表达式
- Non-local Block
- 更高效的改动
- 训练
- 实验
- 总结
- 代码
解决什么问题
提出non-local操作来建立block,来捕捉长距离的依赖
本文创新点\贡献
提出的建立non-local block的方法能方便的插入到很多计算机视觉结构中,在视频分类、位姿估计和图像识别中都有很好的效果
这个图能很好说明什么叫non-local,前两个都是在中心的邻域做一些操作
前人方法
有使用很大的感受野来获取远距离依赖的尝试,之前的方法中长距离依赖只能通过重复的操作卷积、循环,通过数据逐步传播信号,但是这样有局限性:
信号在多次的重复中消失?计算耗时?
计算效率低
优化困难
作者在这里距离的是残差网络和长短期记忆网络,这俩个都对数据多次重复利用,不过残差网络也有找到response的能力?不同层数的特征图融合,能让相关的特征在一个图中显示出来?
在多次跳跃依赖的建模中有困难,比如远距离之间
多次跳跃依赖是指关联的递进? 充电器->手机->人 这样的吗?
本文IDEA来源
没说
方法
方法概述
对每个位置都计算一个response,能更好的获得位置间的联系
相关
和self-attention相关,self-attention通过考虑全部位置,取其在嵌入空间中的加权平均值,来计算一个序列里某个位置的response
解决的点
长距离的相关点的response计算问题,延伸到了图像、视频上
优点
- 可以直接计算两个位置的交互,而不用考虑距离的问题
- 效率高,效果好,只用几个层
- 输入尺度多样,很容易和其他模型结合
原理
和其他方法的比较:
- non-local考虑了全部的位置,而卷积和序列却不能考虑这么多信息
- 虽然考虑了全部的位置信息,但是又和全连接不同:
non-local是基于不同位置之间的联系来计算response的,而全连接使用的是学习到的权重,并且直接多种输入大小,而全连接的输入大小是固定的且没有位置间的对应用的是“fff”来处理不同位置,而不是“WxWxWx”
- 位置自由,可以放在深度神经网络的前面或后面,利于将non-local和local信息结合起来
Non-local Neural Networks
方程式
yi=1C(x)∑∀jf(xi,xj)g(xj)y_i = \frac{1}{C(x)} \sum_{\mathclap{\forall j}}f(x_i,x_j)g(x_j)yi=C(x)1∀j∑f(xi,xj)g(xj)
其中iii是输出位置的index,jjj代表全部的可能的位置,iii位置的response是和其他的jjj位置一起计算的
xxx是输入signal,可以是图片、序列、视频,一般是他们的特征
yyy是和xxx一样大的输出signal
成对函数fff计算iii和jjj之间的标量
ggg函数计算在jjj位置的输入signa 的表达
1C(x)\frac{1}{C(x)}C(x)1用来正则化response
多种fff表达式
fgf\ gfg都有多种计算公式,而实验证明,不同的公式算出来的效果差别不是很大
先将ggg假设成简单的线性嵌入:
g(Xj)=Wgxjg(X_j) = W_g x_jg(Xj)=Wgxj
其中WgW_gWg是需要学习的权重矩阵,再空间上就是个1×11\times 11×1的卷积
Gaussian:
f(xi,xj)=exiT⋅xjf(x_i,x_j) = e^{x^T_i \cdot x_j}f(xi,xj)=exiT⋅xj
其中xi,xjx_i,x_jxi,xj也可以用欧式距离,但是点乘更方便深度学习计算
C(x)=∑∀jf(xi,xj)C(x) = \sum_{\forall j}f(x_i,x_j)C(x)=∀j∑f(xi,xj)
Embedded Gaussian:
Gaussian函数的简单拓展,能计算嵌入空间的相似性
f(xi,xj)=eθ(xi)Tϕ(xj)f(x_i,x_j) = e^{\theta(x_i)^T\phi(x_j)}f(xi,xj)=eθ(xi)Tϕ(xj)
其中θ(xi)=Wθxi\theta(x_i) = W_{\theta}x_iθ(xi)=Wθxi和ϕ(xj)=Wϕxj\phi(x_j) = W_{\phi}x_jϕ(xj)=Wϕxj是两个嵌入
为什么又加了两个参数就能计算相似性了?
C(x)=∑∀jf(xi,xj)C(x) = \sum_{\forall j}f(x_i,x_j)C(x)=∀j∑f(xi,xj)
Softmax:
在 Attention is all you need 论文中,使用了softmax,所以这也有个softmax版本的:
y=softmax(xTWθTWϕx)g(x)y = softmax(x^TW^T_{\theta}W_{\phi}x)g(x)y=softmax(xTWθTWϕx)g(x)
但是作者把这个softmax版本的应用到空间/时空间的图像/视频任务上,发现作用并不明显(指softmax),然后提供了其他的版本
前面两个Gaussian可以直接写成softmax
Dot product:
f(xi,xj)=θ(xi)Tϕ(xj)f(x_i,x_j) = \theta(x_i)^T\phi(x_j)f(xi,xj)=θ(xi)Tϕ(xj)
这是采用嵌入的版本,C(x)=NC(x) = NC(x)=N,NNN就是xxx的位置的数量,这样能简化梯度计算,而且规范化是很有必要的,因为输入的大小是变化。
这里的NNN是下采样后的数量
Concatenation:
f(xi,xj)=ReLU(wfT[θ(xi),ϕ(xj)])f(x_i,x_j) = ReLU(w^T_f[\theta(x_i),\phi(x_j)])f(xi,xj)=ReLU(wfT[θ(xi),ϕ(xj)])
其中[⋅,⋅][\cdot,\cdot][⋅,⋅]表示串联,而且wfw_fwf是一个权重向量,能把串联向量映射成标量
C(x)=NC(x) = NC(x)=N
之后就适当的选择版本,当成个参数来调吧
Non-local Block
封装到block中,这样能更好的合并到其他的结构中:
zi=Wzyi+xiz_i = W_z y_i + x_izi=Wzyi+xi
这个+xi+x_i+xi就是个残差操作,这个残差的操作可以在不破坏预训练模型的情况下,将non-local block插入到任何预训练的模型中(此时将WzW_zWz初始化为0)
这要怎么操作,虽然按理来说不需要啥权重,但是要怎么让改动的结构和权重对应上?看看6DVNet怎么做的
Non−localBlock计算图Non-local Block计算图Non−localBlock计算图
更高效的改动
通过参数的设置来提高效率:
设置Wg,Wθ,WϕW_g,W_{\theta},W_{\phi}Wg,Wθ,Wϕ的通道数是xxx的通道数的一半,这是根据残差网路的论文来的,这样能减少计算量。
WzW_zWz的通道数和xxx一样,因为之后还要和xxx相加
通过下采样的trick还能用来进一步减少计算量:
将yyy的方程式改为:
yi=1C(x^)∑∀jf(xi,xj^)g(xj^)y_i = \frac{1}{C(\hat{x})}\sum_{\forall j}f(x_i,\hat{x_j})g(\hat{x_j})yi=C(x^)1∀j∑f(xi,xj^)g(xj^)
其中x^\hat{x}x^是xxx的下采样版本,加个池化层就能做到,能减少
成对计算的1/41/41/4计算量。
在 Non-local Block计算图 ϕ\phiϕ后面加个池化层来完成。
训练
backbone: ResNet-50
学习率:共400K次迭代,一开始设置为0.01,每150K除10
动量:0.9
权重衰减:0.0001
dropout:全局池化后使用,比例是0.5
使用BatchNorm来未调模型,能减少过拟合,BN的缩放参数初始化成0
loss变化曲线loss变化曲线loss变化曲线
实验
效果图效果图效果图
网络深度和block数量的比较网络深度和block数量的比较网络深度和block数量的比较
越深的网络,越多的non-local block,效果越好,作者使用了残差块做了消融实验,说明了效果提升并不是网络变深的原因,而是non-local block的功劳
增加block的位置探究增加block的位置探究增加block的位置探究
如果添加的太晚的话,特征图较小(7×77\times 77×7)的话,效果也不好,所以要看特征图的大小
MaskRCNN的效果提升Mask\ RCNN的效果提升MaskRCNN的效果提升
总结
感觉主要是对[ Attention is all you need ]做了些改动,yyy的公式是相似的,作者又提出了很多版本的yyy的公式,最终选择哪个公式还是要看应用的环境,亮点应该在与从NLP领域迁移到了CV领域,而且做成了一个容易插入的block
代码
点乘版本的代码,这是源码
import torch
from torch import nnclass NL_block(nn.Module):def __init__(self,input_dim,sub_sample,bn):super(NL_block, self).__init__()self.input_dim = input_dimself.sub_sample = sub_sampleself.sub_dim = self.input_dim // 2self.bn = bnif self.sub_dim == 0:self.sub_dim = 1Conv = nn.Conv2dMaxpool = nn.MaxPool2dBatchNorm = nn.BatchNorm2dself.theta = Conv(self.input_dim,self.sub_dim,kernel_size=1,stride=1)self.phi = Conv(self.input_dim,self.sub_dim,kernel_size=1,stride=1)self.g = Conv(self.input_dim,self.sub_dim,kernel_size=1,stride=1)# theta的 HxW 不能取半,否则就回不到原来的维度了if self.sub_sample:self.phi = nn.Sequential(self.phi,Maxpool(kernel_size=2))self.g = nn.Sequential(self.g,Maxpool(kernel_size=2))if self.bn:self.W = nn.Sequential(Conv(self.sub_dim,self.input_dim,kernel_size=1,stride=1),BatchNorm(num_features=self.input_dim))else:self.W = Conv(self.sub_dim,self.input_dim)def forward(self,x):batch = x.shape[0]# theta并没有下采样,现在是原版的所有元素400个,通道数减少了一般x_theta = self.theta(x).view((batch,-1,self.sub_dim)) # 5 400 4# 对phi进行下采样,x的总数变成了100x_phi = self.phi(x).view((batch,self.sub_dim,-1)) # 5 4 100# 让原版的特征图的每个元素都和所有的下采样的元素对应起来,这里的100维度代表权值f = torch.matmul(x_theta,x_phi) # 5 400 100# g也下采样g_x = self.g(x).view(batch,-1,self.sub_dim) # 5 100 4N = x_phi.shape[2]f_div_c = f / N# 5 4 20 20# 如此每个元素都是下采样后所有元素的加权和y = torch.matmul(f_div_c,g_x).view(batch,self.sub_dim,*x.size()[2:])z = self.W(y) + xreturn zif __name__ = "__main__":x = torch.randn((5,8,20,20))model = NL_block(x.shape[1],True,True)result = model(x)
Non-local Neural Networks论文理解相关推荐
- Every Document Owns Its Structure: Inductive Text Classification via Graph Neural Networks论文理解
[标题] <Every Document Owns Its Structure: Inductive Text Classification via Graph Neural Networks& ...
- Exploring the Connection Between Binary andSpiking Neural Networks论文解读
Exploring the Connection Between Binary andSpiking Neural Networks论文解读 前言 总说 提出B-SNN(论文中为Ⅲ) 实验和结果(论文 ...
- Procedural Noise Adversarial Examples for Black-Box Attacks on Deep Neural Networks论文笔记
Procedural Noise Adversarial Examples for Black-Box Attacks on Deep Neural Networks论文笔记 0. 概述 如今一些深度 ...
- Sequence to Sequence Learning with Neural Networks论文翻译
Sequence to Sequence Learningwith Neural Networks论文翻译 摘要 深度神经网络是在困难的学习任务中取得卓越性能的强大模型.尽管拥有大量的标记训练集,DN ...
- 《Understanding the Effective Receptive Field in Deep Convolutional Neural Networks》理解深卷积神经网络中的有效感受野
前言 论文推荐来自B站UP-启释科技,该up对感受野和卷积有深刻的理解 推荐感受野视频讲解: 深度理解感受野(一) 深度理解感受野(二) 深度理解感受野(三) 深度理解感受野(四) 深度理解感受野(五 ...
- ImageNet Classification with Deep Convolutional Neural Networks论文翻译——中英文对照
文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 翻译论文汇总:https://github.com/SnailTyan/deep-learning-papers- ...
- ImageNet Classification with Deep Convolutional Neural Networks论文翻译——中文版
文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 翻译论文汇总:https://github.com/SnailTyan/deep-learning-papers- ...
- EWC:Overcoming catastrophic forgetting in neural networks论文笔记
EWC:Overcoming catastrophic forgetting in neural networks 概要 根据某些参数对先前任务的重要性来缓解某些参数权重的学习率 EWC 约束重要的参 ...
- 【注意力机制】Squeeze-and-Excitation Networks论文理解
摘要 卷积操作: 卷积操作是卷积神经网络(CNNs)的核心构造块,它通过融合每一层局部接受域(感受野)内的空间和信道信息使网络构建信息特征.大量先前的研究已经调查了这种关系的空间成分,试图通过 ...
最新文章
- Linux13-bash脚本编程基础及配置文件
- PPT文件转avi/wmv/mpeg格式最好的软件
- python【力扣LeetCode算法题库】66-加一
- 通过反射获取无参构造方法并使用
- 推荐VSCode12个比较实用的插件
- linux连接建立的时间,用timedatectl在Linux中检查当前时区及更改时区(创建符号链接来更改时区)...
- 手把手教你成为年薪60万的架构师
- C语言bound函数,C/C++-STL中lower_bound与upper_bound的用法以及cmp函数
- Linux CentOS 7 安装 Redis
- 下载量超 20 亿的 8 款 Android 应用涉广告欺诈,谁在“猎杀”猎豹移动?
- 彩虹代刷网用php几,php彩虹代刷网八套模板源码+教程
- 固态硬盘使用一段时间后测速变慢的解决方法
- 机器学习:噪声和错误
- C++制作“简单”小游戏
- Android inflate解析
- 相忘于江湖—记一位朋友
- 凭借近2亿的年销量,小米三年超越苹果的可能性有多大?
- 关于写javaweb项目,遇到的问题:三层架构
- 11月18日——离noip还有1天[游戏王YGO]
- 【CXY】JAVA基础 之 Collections