Image Super-Resolution with Non-Local Sparse Attention 论文笔记

前言

稀疏性表示的注意力机制来进行超分辨问题,论文中叫Non-Local Sparse Attention,即非局部稀疏注意力,目的是在注意力机制的前提上,对特征进行稀疏表示,可以减少计算而又尽可能丢失少量的特征。举个例子,以往的稀疏表示其实本质上是对输入向量进行降维,得到基本向量后在一定范围内进行加权求和,来进行超分辨的重构,如下图左式,D是权重,α是基本向量。具体例子如右图,对这个图象眼睛边缘进行超分辨重构,只要提取到最关键的部分特征进行加权就可以达到目的,而不需要对每一个特征都进行计算,从而减少计算量。

 稀疏注意力机制就是在这个背景下提出的,该论文的工作主要有:

①提出了一种用于超分辨的稀疏注意力模块,可以加入到任何的主框架网络中;

②将LSH应用到这个模块中,可以大大减少注意力机制的计算量(当然也会相应损失一些特征)。

网络框架

整个框架其实很简单,就是稀疏注意力模块加上EDSR主框架的残差网络,将模块加入到框架中提升了超分辨的性能。主要介绍的就是这个模块是怎么设计实现的。

Non-Local Attention

论文中提出的Attention Bucket 如上图所示。对于第一个图中的红点像素,普通的non-local要全局计算其它像素和它的相似性。该方法添加了稀疏约束:通过稀疏性计算一组位置,称为 attention bucket,如第二个图所示,其实就是计算跟该点相似性最大的几个点。然后在这基础上,施加一个距离约束,只取距离较近的点计算相似性,但这样做不能包含大范围内的信息,作者的做法是rank all mutual similarities and then use the top-k entries,就是只取最相似的前k个点,但是,这样就需要首先计算当 query pixel 和所有点间的相似性,计算非常耗时。因此,作者利用了 locality sensitive hashing算法进行快速计算。

Attention Bucket from Locality Sensitive Hashing (LSH)

局部敏感哈希,其实本质上是一种计算相似性的方法。如果按原来的方法每个进行遍历来计算相似度的话需要o²的复杂度,局部敏感哈希通过哈希表希望将复杂度降到o。具体是怎么做的呢,如果按原来的哈希表的方式对特征进行降到特定的维度就不可避免地会丢失信息,因此为了解决这个问题,希望数据即可以降维同时又不丢失相似度的信息,也就是说任意两个特征经过哈希函数降维之后得到的特征,我们希望前后的相似度概率尽可能一致,从而尽可能少地丢失信息。总的概括来说:它是用hash的方法把数据从原空间哈希到一个新的空间中,使得在原始空间的相似的数据,在新的空间中也相似的概率很大,而在原始空间的不相似的数据,在新的空间中相似的概率很小,注意力本质就是计算相似度。

下图就是LSH的怎么映射的过程,首先将任意两个输入的向量x和y,这里对应我们的query和key,本质注意力是需要计算这两个向量的相似度。在LSH中,先将这两个向量映射到一个封闭的球形空间中,然后将这个空间认为分成4个bucket,在上半图中的Random Rotation0可以看到随机旋转一个角度后两个向量x和y分别属于0和3bucket,然后继续旋转一个角度Random Rotation1,分别属于2和2这个bucket,以此类推,旋转3次后,得到x和y的向量LSH编码。下半图也是一样的操作,可以看到,对于两个距离较远的向量来说,对应的就是上半图LSH编码就相差较远;下半图就是两个距离较近的向量编码就相同。个人理解,本质是通过哈希进行向量从高维到低维的一个映射,虽然会丢失部分信息,比如对于下半张图来说x和y向量原来还是有差距的,但是经过编码后就一样了,但是基本不影响实验结果。

下图是LSH的具体过程,对于query和key经过LSH映射之后得到不同的bucket,然后对bucket进行相似度排序,最后只在相同的bucket内计算相似度,而不是全部都计算,这样减少了计算复杂度。现在的时间复杂度为O (L*log(L)) ,而不是时间复杂度成正比O (L²), 这允许我们把注意力操作扩展到更长的序列的时候不会由于运行时间而受到影响。这个分桶过程是随机的,所以Reformer有选择地多次运行这个过程,以减少两个在输入空间很近的向量被随机地放在不同的桶中的可能性。当所有的事情都做了之后,你就有了一个完全替代标准的多头注意力的方法,它可以与计算完整的注意力矩阵相媲美。

 

具体是怎么计算的可以参考这篇文章,也可以多看看LSH的论文Reformer,这篇论文就是把LSH应用到这里来的:

对Reformer的深入解读 - 知乎Locality Sensitive Hashing ( LSH,局部敏感哈希 ) 详解_Kenney_Qin的博客-CSDN博客

Non-Local Sparse Attention

上图是NLSA模块整体结构,特征输入的大小为h×w×c,然后对于红色的特征大小为1×1×c经过投影后转换为特征向量,然后进行旋转,最后转化为特定的哈希编码,当所有的特征向量都完成这一步之后,就形成了一个右图彩色的哈希bucket,设定特定的k值,将上述哈希编码进行分类,每五个一组。下半图开始查询,输入特征向量经过注意力计算之后只取前五个哈希表中相似度最高的向量,然后与v矩阵相乘,从而得到输出的注意力图。整个过程大概是这样,简单概括其实就是通过LSH计算哈希的编码,然后通过计算特征图每个向量用特定的哈希编码来表示注意力的大小,从而达到减少计算量,但是又尽可能少丢失原来相似度信息的目的。

主体框架

就是在残差网络的基础上嵌入了NLSA模块。

实验

超分辨

消融实验

 这个实验展示了在不同的k值时超分辨的效果,首先,基本可以观察到随着k值增大,性能是会有提升的,计算复杂度也会上升,分的哈希表的向量也就越多,也就越接近于transformer。其次是对于NLA和NLSA来说,NLSA在k=100的时候得到的效果是最好的,也就是说对于NLSAk并不是越大越好。

总结

总的来说其实NLSA是基于transformer进行改变的,为了减少计算量从而丢失了一定的特征信息,同时又为了使得丢失信息最少,引入了LSH局部敏感哈希。为transformer提供了一种新的取舍思路,但其实我有一点不太理解就是NLSA为什么在k值增大时性能反而会下降,还有这种思路如果应用在图像降噪会不会有很好的效果,都是可以尝试的方向。同时,这篇文章的LSH是基于Reformer上迁移的,有时间也可以读一下。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值