上篇讲到了非局部均值滤波方法,何曾想2005年的这篇去噪滤波的论文居然能走这么远,成了Transformer的核心。

Nonlocal attention


相似度计算

在Nonlocal attention中,相似度计算通过衡量不同位置(或元素)之间的相关性或相似度,为后续的加权求和提供权重信息。在nonlocal滤波中,常用的相异度计算方法是欧氏距离的平方,然而在网络中还没有办法实现范数距离,因此使用相似系数计算距离的系列,即计算内积,点这里

描述样本(或样本特征)间相似程度的统计量很多,目前用得最多的是距离和相似系数,距离多用于样本的分类,相似系数多用于特征的分类。
在这里插入图片描述

相异度矩阵

相异度矩阵(Dissimilarity Matrix)用于表示数据点之间的相似度或距离。在非局部滤波(Non-local Means Filtering)中,相异度矩阵用于计算图像中不同像素块之间的相似度,进而确定权重。

相异度矩阵 D \boldsymbol{D} D是一个 n × n n \times n n×n的矩阵,其中 n n n是数据点的数量。矩阵中的每个元素 D ( i , j ) D(i, j) D(i,j)表示数据点 i i i和数据点 j j j之间的相似度(或距离)。相似度可以是多种度量方式,常见的包括欧氏距离(高斯核欧氏距离)、余弦相似度等。

鸢尾花数据集举例,观察相异度矩阵的样子。鸢尾花数据集150个样本,这个相异度矩阵是 150 × 150 150\times150 150×150。由于一类中的样本和其他类中的样本相似性弱,因此从相异度矩阵能看出三个类别。蓝色表示距离小,黄色表示距离大。这个数据集中1-50个样本是第一类,以此类推。
在这里插入图片描述

在这里插入图片描述


标量的线性组合
y i = ∑ j a i j x j = a i 1 x 1 + a i 2 x 2 + ⋯ + a i n x i , i = 1 , 2 , … , n \begin{aligned} {y}_i &= \sum\limits_{j} a_{ij} x_j \\ &= a_{i1}x_1 + a_{i2}x_2 + \cdots + a_{in}x_i, \quad i=1,2,\dots,n \end{aligned} yi=jaijxj=ai1x1+ai2x2++ainxi,i=1,2,,n

向量点积形式
y i = [ a i 1 , a i 2 , … , a i n ] [ x 1 x 2 ⋮ x i ] y_i = [a_{i1}, a_{i2}, \dots, a_{in}] \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_i \end{bmatrix} yi=[ai1,ai2,,ain] x1x2xi

矩阵形式

[ y 1 y 2 ⋮ y i ] = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ] [ x 1 x 2 ⋮ x i ] \begin{bmatrix}y_1 \\ y_2 \\ \vdots \\ y_i\end{bmatrix} =\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_i \end{bmatrix} y1y2yi = a11a21an1a12a22an2a1na2nann x1x2xi

简写形式
y = A x \boldsymbol{y} = \boldsymbol{A} \boldsymbol{x} y=Ax


向量的线性组合
y i = ∑ j a i j x j , i = 1 , 2 , … , n \boldsymbol{y}_i = \sum\limits_j a_{ij} \boldsymbol{x}_j, \quad i=1,2,\dots,n yi=jaijxj,i=1,2,,n

y i \boldsymbol{y}_i yi的矩阵向量乘法表示
y i ⊤ = [ a i 1 , a i 2 , … , a i n ] [ x 1 ⊤ x 2 ⊤ ⋮ x n ⊤ ] = a i 1 x 1 ⊤ + a i 2 x 2 ⊤ + ⋯ + a i n x n ⊤ \boldsymbol{y}_i^\top = [a_{i1}, a_{i2}, \dots, a_{in}] \begin{bmatrix} \boldsymbol{x}_1^\top \\ \boldsymbol{x}_2^\top \\ \vdots \\ \boldsymbol{x}_n^\top \end{bmatrix} = a_{i1}x_1^\top + a_{i2}x_2^\top + \cdots + a_{in}x_n^\top yi=[ai1,ai2,,ain] x1x2xn =ai1x1+ai2x2++ainxn

矩阵形式

[ y 1 ⊤ y 2 ⊤ ⋮ y n ⊤ ] = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ] [ x 1 ⊤ x 2 ⊤ ⋮ x n ⊤ ] \begin{bmatrix} \boldsymbol{y}_1^\top \\ \boldsymbol{y}_2^\top \\ \vdots \\ \boldsymbol{y}_n^\top \end{bmatrix} =\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{bmatrix} \begin{bmatrix} \boldsymbol{x}_1^\top \\ \boldsymbol{x}_2^\top \\ \vdots \\ \boldsymbol{x}_n^\top \end{bmatrix} y1y2yn = a11a21an1a12a22an2a1na2nann x1x2xn

Y = A X \boldsymbol{Y} = \boldsymbol{A} \boldsymbol{X} Y=AX
其中,
样本矩阵
X = [ x 1 ⊤ x 2 ⊤ ⋮ x n ⊤ ] = [ x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋱ ⋮ x n 1 x n 2 ⋯ x n n ] \boldsymbol{X}=\begin{bmatrix} \boldsymbol{x}_1^\top \\ \boldsymbol{x}_2^\top \\ \vdots \\ \boldsymbol{x}_n^\top \end{bmatrix}= \begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1n} \\ x_{21} & x_{22} & \cdots & x_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n1} & x_{n2} & \cdots & x_{nn} \end{bmatrix} X= x1x2xn = x11x21xn1x12x22xn2x1nx2nxnn
注意力系数矩阵
A = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ] \boldsymbol{A}=\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{bmatrix} A= a11a21an1a12a22an2a1na2nann
输出矩阵
Y = [ y 1 ⊤ y 2 ⊤ ⋮ y n ⊤ ] = [ y 11 y 12 ⋯ y 1 n y 21 y 22 ⋯ y 2 n ⋮ ⋮ ⋱ ⋮ y n 1 y n 2 ⋯ y n n ] \boldsymbol{Y} = \begin{bmatrix} \boldsymbol{y}_1^\top \\ \boldsymbol{y}_2^\top \\ \vdots \\ \boldsymbol{y}_n^\top \end{bmatrix}=\begin{bmatrix} y_{11} & y_{12} & \cdots & y_{1n} \\ y_{21} & y_{22} & \cdots & y_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ y_{n1} & y_{n2} & \cdots & y_{nn} \end{bmatrix} Y= y1y2yn = y11y21yn1y12y22yn2y1ny2nynn


Nonlocal attention

卷积操作在局部区域进行特征提取。non-local处理将特征图上的特征点表示为所有特征点的加权和,在全局范围内用其他位置的特征增强当前位置的特征。

通用的non-local操作定义:

y i = 1 C i ∑ ∀ j s ( x i , x j ) ψ ( x j ) \boldsymbol{y}_i = \frac{1}{C_i} \sum_{\forall j} s(\boldsymbol{x}_i, \boldsymbol{x}_j) \psi(\boldsymbol{x}_j) yi=Ci1js(xi,xj)ψ(xj)

式中, x \boldsymbol{x} x为对应位置上的输入特征, y \boldsymbol{y} y为增强后的输出, s ( x i , x j ) s(\boldsymbol{x}_i, \boldsymbol{x}_j) s(xi,xj)计算 x i \boldsymbol{x}_i xi x j \boldsymbol{x}_j xj之间的相似性, ψ ( ⋅ ) \psi(\cdot) ψ()则用于对 j j j的特征进行变换, C i {C_i} Ci用于对输出进行归一化。

简而言之,non-local的核心是计算当前位置的特征与特征图所有特征间的相似性,然后根据相似性对所有特征加权输出。

在实现时,相似性函数 s s s则可以有以下选择(通过实验发现函数 s s s的具体实现影响不大):

以下是Nonlocal Network中给出的相似度计算公式:

  1. Gaussian Function(高斯函数)

公式为:

s ( x i , x j ) = e x i ⊤ x j s({\boldsymbol x}_i, {\boldsymbol x}_j) = {\rm e}^{{\boldsymbol x}_i^{\top} {\boldsymbol x}_j} s(xi,xj)=exixj

其中, x i {\boldsymbol x}_i xi x j {\boldsymbol x}_j xj分别表示两个位置(或元素)的特征向量。这个公式直接计算了特征向量之间的点积,并通过指数函数进行放大,以得到相似度权重。

  1. Embedded Gaussian(嵌入高斯)

公式为:

s ( x i , x j ) = e θ ( x i ) ⊤ ϕ ( x j ) s({\boldsymbol x}_i, {\boldsymbol x}_j) = {\rm e}^{\theta({\boldsymbol x}_i)^{\top} \phi({\boldsymbol x}_j)} s(xi,xj)=eθ(xi)ϕ(xj)

其中, θ ( x i ) \theta({\boldsymbol x}_i) θ(xi) ϕ ( x j ) \phi({\boldsymbol x}_j) ϕ(xj)分别表示对 x i {\boldsymbol x}_i xi x j {\boldsymbol x}_j xj进行的线性变换(通常通过1x1卷积实现)。这种方法通过嵌入空间中的点积来计算相似度。

  1. Dot Product(点积)

公式为:

s ( x i , x j ) = θ ( x i ) ⊤ ϕ ( x j ) s({\boldsymbol x}_i, {\boldsymbol x}_j) = \theta({\boldsymbol x}_i)^{\top} \phi({\boldsymbol x}_j) s(xi,xj)=θ(xi)ϕ(xj)

与Embedded Gaussian类似,这种方法也使用了线性变换后的特征向量进行点积运算。

  1. Concatenation(拼接)

公式为:

s ( x i , x j ) = ReLU ( w f ⊤ [ θ ( x i ) , ϕ ( x j ) ] ) s({\boldsymbol x}_i, {\boldsymbol x}_j) = \text{ReLU}(w_f^{\top} [\theta({\boldsymbol x}_i), \phi({\boldsymbol x}_j)]) s(xi,xj)=ReLU(wf[θ(xi),ϕ(xj)])

其中, [ θ ( x i ) , ϕ ( x j ) ] [\theta({\boldsymbol x}_i), \phi({\boldsymbol x}_j)] [θ(xi),ϕ(xj)]表示将 θ ( x i ) \theta({\boldsymbol x}_i) θ(xi) ϕ ( x j ) \phi({\boldsymbol x}_j) ϕ(xj)拼接成一个更长的向量, w f w_f wf是一个可学习的权重向量。这种方法通过拼接和线性变换来捕捉不同位置之间的复杂关系,并通过ReLU函数引入非线性。

函数 θ \theta θ ϕ \phi ϕ ψ \psi ψ选择为线性变换, W θ {\boldsymbol W}_\theta Wθ W ϕ {\boldsymbol W}_\phi Wϕ W ψ {\boldsymbol W}_\psi Wψ为可学习的权重矩阵,一般为 1 × 1 1\times 1 1×1的卷积。


通过softmax函数对计算得到的相似度进行归一化处理,以确保权重之和为1。


根据信息检索领域的一些术语分别起了名字,即查询(Query)、关键词(Key)和内容(Value)。通过 Query 和 Key 计算相似度,生成注意力权重,再对 Value 加权求和。自注意力(例如Transformer)它们是同一值,尽管是不同的线性变换。一般K和V是同样的。

W θ → W Q {\boldsymbol W}_\theta \rightarrow {\boldsymbol W}_Q WθWQ
W ϕ → W K {\boldsymbol W}_\phi \rightarrow {\boldsymbol W}_K WϕWK
W ψ → W V {\boldsymbol W}_\psi \rightarrow {\boldsymbol W}_V WψWV


图书馆检索系统

Query (Q) 你的研究问题
Keys (K) 每本书的目录、索引、关键词(检索系统匹配的依据)
Values (V) 每本书的实际内容
相似度计算 系统比较你的问题与每本书的目录匹配程度
Softmax(权重) 根据匹配程度,决定每本书在最终报告中占多大比例
加权求和 研究员助理按比例提取各书内容,合成一份报告

在这里插入图片描述

比图书馆更精确的比喻:专家委员会

  • 你的问题 (Q) = 委托研究课题
  • 专家的简历 (K) = 他们的专长领域(用来匹配)
  • 专家的知识 (V) = 他们的实际知识
  • 权重 = 每位专家在委员会中的发言权重
  • 加权输出 = 委员会提交的综合报告

复杂问题通常涉及多个交叉领域,单个专家有盲点,委员会可以互补。


矩阵表示,这只是为了实现。

但是,需要计算所有点的输出,怎么办呢?循环?矩阵工作室不喜欢,GPU不喜欢。一切为了利用GPU的并行计算功能。

reshape

在非局部注意力机制中,为了方便计算相似度并进行加权求和,首先需要对高维特征(如图像块)进行reshape。

假设输入特征图 X {\mathbf X} X,其尺寸为 H × W × d H \times W \times d H×W×d,其中 H H H W W W是特征图的高度和宽度, d d d是特征数(通道数)。将特征图 X {\mathbf X} Xreshape成一个二维矩阵 X {\boldsymbol X} X,其形状为 n × d n \times d n×d,其中, n = H W n=HW n=HW,这样每个行向量代表了一个位置的特征向量。

X = reshape ( X , ( H × W , d ) ) {\boldsymbol X}= \text{reshape}({\mathbf X}, (H \times W, d)) X=reshape(X,(H×W,d))

在这里插入图片描述

n × d n \times d n×d维的数据矩阵 X \boldsymbol{X} X的结构,其中第 n n n行代表转置后的数据向量 x i ⊤ \boldsymbol{x}_i^\top xi。图中展示了一个 n × d n \times d n×d的矩阵:每行对应一个 token(如一个词或图像 patch);每列对应一个特征维度。

矩阵运算


这两幅图说明如何通过矩阵乘法实现。

  1. 计算相异度矩阵(模式识别中的基础概念,后面紧跟)
    在这里插入图片描述
  2. 加权求和
    在这里插入图片描述

注:如果公式对你来说只是运算,那太可悲了。我很同情这样讲解nonlocal的人,对线性变换的意义完全不理解。


在这里插入图片描述
加权求和是将每一个向量(彩色条)用它对应的相似度(彩色点)作为权重相乘,并求和。这里如若对矩阵乘积运算很熟悉,了解它的几何意义,而不是只会计算,那对该矩阵运算想做什么一目了然。然而,上面引用的那个图的黄线和黄点即说明了如何进行矩阵运算。这里简单说明线性变换的几何意义。

线性变换相当于空间变换,即从一个空间变换到另一个空间,变换矩阵的每一行实际上是变换空间的基向量,左边的每一行(彩色点)实际上在新空间的表示系数,空间变换就是基向量的线性组合。如果你的线性代数老师没有讲线性变换的几何意义,那就让你的老师回家卖红薯去吧。这里用矩阵后乘表示。

在这里插入图片描述
强调:虽然是两两计算内积,但是两个矩阵的地位是不同的,对于每个 q q q,计算与 K K K中所有点的内积,结果一行是每个 q q q K K K中对应的权系数。无论归一化,还是后面Transformer中除以 d k \sqrt{d_k} dk 都是对行进行处理。

补充说明

  • Self-Attention 的输入用矩阵 X {\boldsymbol X} X进行表示,则使用线性变换矩阵 W Q {\boldsymbol W}_Q WQ W K {\boldsymbol W}_K WK W V {\boldsymbol W}_V WV计算 Q \boldsymbol{Q} Q K \boldsymbol{K} K V \boldsymbol{V} V矩阵。线性变换的目的是特征变换,类比PCA,目的是降维,比如降维为原来的 1 / 2 1/2 1/2。降维是模式识别的基本概念,学过模式识别的都知道它的作用。不同的是, W Q {\boldsymbol W}_Q WQ W K {\boldsymbol W}_K WK W V {\boldsymbol W}_V WV是可学习的权重矩阵。
  • Transformer的自注意力中的相似度计算简单使用两点的点积,特征变换后的两点内积。
  • 这个softmax归一化公式实际上有问题。公式中的 Softmax 是对相异度矩阵的每一行用Softmax进行归一化,即每一行的和都变为 1。代码中这样写没有问题,这个函数可以独立处理矩阵的每一维。那些不能区分数学语言和函数语言的人,我表示无能为力。
  • 为什么用softmax进行归一化?softmax通过指数运算(exp函数)对输入值进行放大,从而放大了输入值之间的差异。高斯滤波、双边滤波和非局部滤波的权重都是距离的(负)指数函数。其实概率分布中很多都是指数函数,这说明什么呢?说明自然界中很多现象都适合用指数函数描述。

计算过程

  1. 线性变换:
    • 为了计算自注意力,首先对输入序列进行线性变换,生成三个不同的向量:查询向量(Query)、关键词向量(Key)和内容向量(Value)。分别表示为 Q Q Q K K K V V V

Q = X W Q , K = X W K , V = X W V Q = {\boldsymbol X}{\boldsymbol W}_Q, \quad K = {\boldsymbol X}{\boldsymbol W}_K, \quad V = {\boldsymbol X}{\boldsymbol W}_V Q=XWQ,K=XWK,V=XWV

其中 X {\boldsymbol X} X是输入序列, W Q {\boldsymbol W}_Q WQ W K {\boldsymbol W}_K WK W V {\boldsymbol W}_V WV是可学习的权重矩阵。
在这里插入图片描述

  1. 计算相异度矩阵:
    • 计算查询向量和关键词向量之间的点积,得相异度矩阵 S S S

S = Q K ⊤ d k S = \frac{QK^{\top}}{\sqrt{d_k}} S=dk QK

在这里插入图片描述
4. 应用 Softmax:
应用 Softmax 函数对相异度矩阵 S S S行归一化 ,得注意力权重矩阵 A A A

A = softmax ( S ) A = \text{softmax}(S) A=softmax(S)
在这里插入图片描述
5. 加权求和:

  • 使用注意力权重矩阵 A A A对内容向量 V V V进行加权求和,得到输出向量 Y Y Y

Y = A V Y = AV Y=AV

在这里插入图片描述


网络实现,这只是矩阵表示的网络实现

在这里插入图片描述

Nonlocal的块中加了一个残差连接,残差学习的作用不用说了吧。


  1. 线性变换
    Q ⏟ n × l = X ⏟ n × d W Q ⏟ d × l K ⏟ n × l = X ⏟ n × d W K ⏟ d × l V ⏟ n × l = X ⏟ n × d W V ⏟ d × l \begin{aligned} \underbrace{\boldsymbol{Q} }_{n \times l}=\underbrace{ \boldsymbol{X} }_{n \times d}\underbrace{{\boldsymbol W}_Q}_{d \times l}\\ \underbrace{\boldsymbol{K} }_{n \times l}= \underbrace{\boldsymbol{X} }_{n \times d}\underbrace{{\boldsymbol W}_K}_{d \times l}\\ \underbrace{\boldsymbol{V} }_{n \times l}=\underbrace{ \boldsymbol{X}}_{n \times d}\underbrace{{\boldsymbol W}_V}_{d \times l}\\ \end{aligned} n×l Q=n×d Xd×l WQn×l K=n×d Xd×l WKn×l V=n×d Xd×l WV

  2. 计算注意力权重矩阵
    A ⏟ n × n = s o f t m a x [ Q K ⊤ ] softmax ⁡ ( Q K ⊤ ) \underbrace{\boldsymbol{A}}_{n \times n} = \mathrm{softmax}\left[ \boldsymbol{Q} \boldsymbol{K}^\top \right] \quad \phantom{\operatorname{softmax}(Q K^\top)} n×n A=softmax[QK]softmax(QK)

  3. 加权求和
    H ⏟ n × l = A ⏟ n × n V ⏟ n × l \underbrace{\boldsymbol{H}}_{n \times l} = \underbrace{\boldsymbol{A}}_{n \times n}\underbrace{\boldsymbol{V} }_{n \times l} n×l H=n×n An×l V

  4. 线性变换(为了残差连接)
    Y ⏟ n × d = H ⏟ n × l W Y ⏟ l × d \underbrace{\boldsymbol{Y}}_{n \times d} = \underbrace{\boldsymbol{H}}_{n \times l} \underbrace{{\boldsymbol W}_Y}_{l \times d} n×d Y=n×l Hl×d WY

  5. 残差连接
    Z ⏟ n × d = X ⏟ n × d + Y ⏟ n × d \underbrace{\boldsymbol{Z}}_{n \times d} = \underbrace{\boldsymbol{X}}_{n \times d} + \underbrace{\boldsymbol{Y}}_{n \times d} n×d Z=n×d X+n×d Y

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐