SwinIR: Image Restoration Using Swin Transformer

Attention is all you need.

Transformer 架构

Transformer 的整体架构由 个 Encoder 和 个 Decoder 组成,这里的

image.png

位置编码 Positional Encoding

对于每一个词嵌入向量,我们将其与一个矩阵进行拼接,使词向量具有其文本位置的信息。Vaswani 等人在 Transformer 原始论文中提出的方案,位置编码矩阵是通过三角函数公式计算得到的固定值,不参与模型训练。它的核心优势是可以处理任意长度的序列(超出训练时的最大长度也能生成对应的编码)。

设向量维度为 ,第 个词的位置编码 为:

通过原词向量与 的拼接得到新的词向量(此后的词向量都表述为拼接 后的词向量)。

自注意力机制 Self-Attention

该机制意在处理文本中的上下文关联,让词向量包含其临近词语的信息。

设计线性变换矩阵 ,对于嵌入矩阵(词向量拼接为的矩阵,大小为 ,我们设:

其中 的大小一般固定为 ,在实际计算中通常 一般代指 Query,Key,Value,分别代指当前向量的匹配对象;用于匹配的关键值;向量代表的实际信息。

据此,我们可以计算出注意力值:

除以 是为了防止内积过大, 归一化后我们得到了一个正交矩阵,第 行就表示该单词对其他单词的 attention 系数。再乘以 得到矩阵 ,其中 的第 行就表示第 个单词的最终向量,是由注意力系数矩阵与 矩阵相乘得到,包含了文本中所有单词的词向量的一定比例。

多头注意力 Multi-Head Attention

将嵌入矩阵 传入 个不同的注意力机制中,分别计算出 。最终将其拼接(Concat)后传入 Linear 层得到多头注意力输出的最终的

拼接(Concatenation)和线性变换(Linear)是什么?

对于矩阵 ,构造矩阵 使得:

的横向拼接。

在 Multi-Head Attention 中, 的大小是 ,我们将其拼接为 ,使其恢复维度,也就是尽量保持 ,为线性变换做准备。

Linear 指的是未确定矩阵 的参数为可学习参数,使得

Encoder 结构

残差连接 Residual Connection

经过多头处理得到 ,在这一步进行:

也就是将多头处理后的 与多头处理前的 直接相加。用于解决多层网络训练时反向传播因为层数过大梯度被稀释的情况。让机器仅对增量差异进行学习,相当于一个差分的作用。

层归一化 Layer Normalization

Layer Normalization(简称 LN)是深度学习中一种特征归一化技术,由 Jimmy Lei Ba、Jamie Ryan Kiros 和 Geoffrey Hinton 于 2016 年在论文《Layer Normalization》中提出。它的核心思想是对单个样本的所有特征维度进行归一化处理,适用于 RNN、Transformer 等序列模型和小批量训练场景。

Norm 的作用是将词向量 调整为均值为 ,方差为 的标准分布,即:

其中 各维均值, 为方差。

更平凡地,可以写成:

来调整想要得到的均值和方差。一般 是可学习参数,让模型在归一化后能重新调整特征的缩放和偏移,保留模型的表达能力(如果纯归一化会让特征分布过于单一,丢失有用信息)。

Feed Forward

一个两层的全连接层,第一层激活函数为 ,第二层不使用,通用公式为:

处理后加上 Add & Norm。

Decoder 结构

Decoder 由两个 Multi-Head Attention 和一个 Feed Forward 组成,其中第一个 Multi-Head 使用了 Masked。

掩码 Masked

据一般的理解,文字的工作具有很强的顺序性,也就是当你在处理第 个词的时候,你不能先知道 个词是什么,这在翻译里更容易理解。Masked 的工作就是将 及之后的所有词全部屏蔽掉,Mask 矩阵是一个下三角矩阵(上三角部分全为 )。使之与 按位相乘即可。

信息传输

Decoder 的第二个 Multi-Head Attention 中使用的 矩阵是根据 Encoder 的输出计算得到的。

Output 结构

Decoder 执行完毕后,我们会得到一个嵌入矩阵 ,线性变换层是一个简单的全连接神经网络,它可以把 投射到一个比它大得多的,被称为对数几率的向量里,也就是词库

之后对 进行 归一化,也就是总和为 的词库,将其数值视为其对应概率。至此,Transformer 的基本架构就结束了。

Vision Transformer

ViT,将 Transformer 用于计算机视觉上的运用。

图像块 Image Patches

ViT 首先将输入图像切分为多个固定大小的图像块(Patches)。这些图像块被线性嵌入到固定大小的向量中,类似于 NLP 中的单词嵌入。每个图像块都被视为一个独立的“视觉单词”或 token,并用于后续的 Transformer 层中进行处理。

Transformer 编码器

与 NLP 中一致,ViT 同样使用了 Positional Embedding 和 Multi-Head Attention 机制。并在子层后用到了 Add & Norm 进行训练优化。在之间也同样会有 Masked 和 Dropout 等策略。

在 MHSA 后仍然会跟一个 MLP Block 的两层全连接层,激活函数一般使用

分类令牌 Class Token

在输入时,ViT 一共需要 个 Token,其中包含 个 Patch Token 和 个 Classification Token(简称cls_token)。

cls_token 最开始是一个随机初始化的 维向量,在训练过程中,cls_token 会提取局部特征(也就是对 Patch Token 进行注意力计算)进行全局特征的补全。

在输出分类特征时,ViT 会仅提取最终层的 cls_token 向量,完全舍弃所有 Patch Token—— 因为此时的 cls_token 已承载全图全局特征,而 Patch Token 仍仅保留局部特征,无单独分类价值。

分类头 Classification Head

在提取出 cls_token 后,将其输入进分类头,就进入 ViT 的输出部分了。ViT 的分类头是根据预训练或微调的任务特点做了极致的差异化设计,这是 ViT 在视觉任务上实现高泛化性,高微调效率的关键,

预训练阶段使用的是多层感知头,标准设计包括 LN,线性变换,GeLU,Dropout和再一次线性变换。预训练通常基于超大规模数据集,类别数多、数据分布复杂,需要稍复杂的非线性映射,让模型学习到更泛化的全局视觉特征,避免欠拟合;增加 LayerNorm 是为了对 cls_token 特征做归一化,提升特征分布的稳定性,适配大规模预训练的训练波动。

微调阶段使用单一线性层,预训练后的 cls_token 已经聚合了通用的全局视觉特征,微调仅需简单的线性映射,就能将通用特征适配到具体任务的类别空间,无需非线性变换。


Swin Transformer

在上面我们知道,经典的 ViT 最后导出 cls_token,其对图像全局信息的把控是到位的,但却可能无法有效捕捉局部特征,Swin Transformer 便采用窗口和分层的形式来替代长序列的方法。我们可以将当前这件事做 次,每次都会两两进行合并,向量数越来越小(400 个 token 到 200 个 token 到 100 个 token),窗口的大小也会增大。分层操作也就是,第一层的时候 token 很多,第二层合并 token,第三层合并 token,就像我们的卷积和池化的操作。而在传统的 Transformer 中,第一层怎么做,第二层第三层也会采用同样的尺寸进行,都是一样的操作。

基于移位窗口的多头自注意力模块 W-MSA / SW-MSA

W-MSA 相比 MSA 就是将一个 Patch 划分为若干窗口,每个窗口独立计算注意力,其缺点明显,那就是窗口间的关联性不大。

所以窗口需要移位,也就是 SW-MSA(Shifted Window MSA),与 W-MSA 相比,区别在于划分窗口时不在时等大小的窗口,而是将划分窗口同时向右和向下平移 个像素。在 SW-MSA 方法中,将特征划分为多个不规则的块,则增加了计算量,因为 W-MSA 模块将模型划分为 个等大小的块,而 SW-MSA 将模型分为 个块,因此模型计算量加大。为此,设计了重新排列了不同的块:

sample2

在上图中,左边为 W-MSA 得划分方法,中间为 Shifted Window 划分后的块,每个块进行了 的编号。为了减少计算量,首先将 两块移到最下方 的下面,然后,将 移动到右边 的右边,最后,将 移动到最右下角。这样可以间接的划分为新得四块,如上图右边红色所圈部分所示,从而保持和 W-MSA(左边红色所圈部分)相同得计算量。