本文为稀土技术社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究!

作者简介:秃头小苏,致力于用最浅显的言语描绘问题

往期回顾:CV攻城狮入门VIT(vision transformer)之旅——近年超火的Transformer你再不了解就晚了! CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇 CV攻城狮入门VIT(vision transformer)之旅——VIT代码实战篇

近期方针:写好专栏的每一篇文章

支撑小苏:点赞、保藏⭐、留言

Swin Transformer原理详解篇

写在前面

​  在前面咱们已经很系统的介绍了Transformer的相关常识,从NLP中的Transformer开端讲起,然后以此为基础详细的介绍了CV邻域VIT模型的原理和代码,对此部分不了解的可先点击下述链接了解详情:

  1. CV攻城狮入门VIT(vision transformer)之旅——近年超火的Transformer你再不了解就晚了!
  2. CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇
  3. CV攻城狮入门VIT(vision transformer)之旅——VIT代码实战篇

​  那么这篇文章将为咱们来讲讲Swin Transformer模型,在叙说这个模型之前咱们能够去这个网站paperswithcode.com 看看这几年各项使命的sota,简直都选用了swin Transformer模型,这足以彰显此模型的强大之处!!!【留意这个网站的paper后有个s喔,不然你可能会进入什么古怪的网站这古怪网站的域名起的可太无语了……】

​  准备好了嘛,咱们这就发车。

网络全体框架

​  在谈及网络的框架之前,咱们先来看看这篇Swin Transformer和咱们之前所介绍的VIT模型有什么差异,论文中给出了下图:

Swin Transformer原理详解篇

​  从直观上来看,左图(a)形似比较复杂,相应的右图(b)就显得简略多了。再看的细心点,能够发现(a)能够用于classification(分类)、segmentation(切割)、detection(检测)等一系列下游使命,而(b)就只用于classification,也便是说此篇Swin Transformer是视觉范畴中一个通用的方案,能够应用于多种使命。

​  咱们再来看看上图中的一些细节,很简单发现,在(b)中图片一向都是选用16倍的下采样,【要是你了解VIT的原理这儿必定就了解,在图画输入的时候会用一个卷积对原图进行16倍的下采样,后边尺度一向没变】 而在(a)中先是进行4倍下采样,然后是8倍,接着是16倍,一向这样下去,直到到达你想要的下采样倍数。这儿特征图尺度不断变小,是不是感觉和卷积十分像呢,其实这儿和卷积的思想是相同的,选用这种层次化的构建方法有利于完成检测和切割使命。【这儿是怎样进行下采样的咱们后文回详细讲解,咱们现在其实就完全能够了解为卷积】

​  上图还表现了Swin Transformer很重要的一点,那便是窗口(windows)的概念。能够看到,(a)图中的特征图都被区分红了一个个的小窗口,Swin Transformer会将这些小窗口送入到Transformer模型中,这样做的优点是能够大幅减小核算量。【这部分是Swin Transformer的难点,也是要点,后文我也会详细的为咱们介绍】


​  介绍了Swin Transformer和ViT的一些差异,下面咱们就来看看Swin Transformer的全体框架,如下图所示:

Swin Transformer原理详解篇

​  图(a)为Swin Transformer的结构, 这儿咱们不解说每个结构的细节,而是看看通过这些结构维度的变化。首要假定输入图片尺度为HW3,首要通过patch Partion将图片分红一个个patch,patch巨细为44,则通过此步后总共会有H4W4\frac{H}{4}\frac{W}{4}个patch,因图片有三个通道,故每个patch的尺度为443=48443=48 ,即咱们通过Patch Partion结构得到特征图尺度为H4W448\frac{H}{4}\frac{W}{4}48。接着咱们会通过Linera Embedding层,这便是一个全连接层,会将刚刚H4W448\frac{H}{4}\frac{W}{4}48的特征图映射为H4W4C\frac{H}{4}\frac{W}{4}C【假如你对ViT模型熟悉的话就会发现,这儿根本是相同的。在ViT代码中这步操作是直接通过卷积完成的,Swin Transformer这部分代码相同是由一个卷积完成】

​  现在咱们得到的是H4W4C\frac{H}{4}\frac{W}{4}C的特征图,下面会通过Swin Transformer Block结构,这儿咱们能够先将其了解为ViT中的Transformer Encoder结构,通过这个结构后输出尺度仍然为H4W4C\frac{H}{4}\frac{W}{4}C。咱们留意到这个结构下面写了一个2,表明咱们会重复这个结构两次。图(b)中表明的便是重复两次的Swin Transformer Block结构,这两次结构是有一些差异的且总是成对出现,因此后边的Swin Transformer Block重复的次数总是2的倍数。【留意上文所输入Swin Transformer Bolok的尺度为H4W4C\frac{H}{4}\frac{W}{4}C,但其实输入Transformer中的尺度应是二维的向量,所以代码中咱们会将前两个维度放一同,即维度变为(H4∗W4)C(\frac{H}{4}*\frac{W}{4})C,之后将其送入Transformer中。相同输出也是二维的向量,咱们得到后再将其打开即好。这些都是在阅览代码后才干知道的细节,咱们稍加留意一点就好】

​  通过榜首个Swin Transformer Block后,尺度为H4W4C\frac{H}{4}\frac{W}{4}C,会将其送入Patch Merging。这层完成了将特征图分辨率折半,通道数翻倍的操作,是不是很像CNN中的卷积呢,其实这儿完成的功用是和卷积一模相同的,可是完成的方式有所不同,后文会详细解说。通过这层后,输出的特征图尺度变为了H8W82C\frac{H}{8}\frac{W}{8}2C

​  接下来都是一些重复的结构了,信任咱们通过我上文的描绘也能了解了。那么下面就要为咱们详细的介绍某些结构的细节了,接着往下看吧!!!


网络结构细节

Patch partition+Linear Embedding

​  为了保证网络结构的完整性,关于这个结构我再简略的提一下。其实在上文我也大概叙说了Patch partition+Linear Embedding是干什么的了,并且也说了在代码中是怎样完成的——通过一个卷积操作即可完成这两步。这儿我不想再唠叨了,假如你还想知道更详细的信息,在我的VIT原理详解篇有关于此部分的详细描绘,感兴趣的自己去看看吧!!!

Patch Merging

​  按网络结构流程来讲,这部分应该是介绍Swin Transformer Block结构,但这是整篇文章最核心、最难了解也是内容最多的,所以我打算放在最终一节叙说,这样由易到难进行介绍咱们可能会更好的接收。

​  其实啊,我上文已经说了通过Patch Merging会到达怎样的作用——特征图分辨率折半,通道数翻倍。那么Patch Merging详细做了什么呢?咱们能够来看一下下图:

Swin Transformer原理详解篇

​  假定咱们的输入是44巨细单通道的特征图,首要咱们会隔一个取一个小Patch组合在一同,最终44的特征图会行成4个22的特征图。【这部分看上图是很好了解的,可是在代码部分对Pathon语法不熟悉的可能觉得有点难了解,我会再下一篇代码解读中为咱们详细讲讲代码是怎样完成的】接下来将4个Patch进行拼接,现在得到的特征图尺度为224。然后会通过一个LN层,这儿当然会改动特征图的值,我改动了一些颜色象征性的表明了一下,LN层后特征图尺度不会改动,仍为224。最终会通过一个全连接层,将特征图尺度由224变为222。到这儿,就把Patch Merging的原理给介绍完了,咱们能够看一下输入和输出的成果是不是完成了特征图分辨率折半,通道数翻倍呢?

Swin Transformer Block✨✨✨

​这部分的结构如下图所示:

Swin Transformer原理详解篇

​咱们再来看一下ViT中的encoder结构,如下图所示:

Swin Transformer原理详解篇

​  对照这两个图,你可能会发现结构根本是相同的。主要差异只在一个地方,即ViT Encoder绿框中的Multi-Head Attention和Swin Transformer Block紫框中的W-MSA(Windows Multi-Head Attention) \SW-MSA(Shifted Windows Multi-Head Attention)。Swin Transformer Block中的两个结构的差异也只在这儿有所不同,下面我就要点来为咱们讲讲W-MSA和SW-MSA。



W-MSA

​  下面先来看看W-MSA。何为W-MSA,即Windows Multi-Head Attention,它也是一个多头的自留意机制。它和传统的 Multi-Head Attention的差异就在于W-MSA会先将特征图分红一个个Windows,然后对每个Windows履行Multi-Head Attention操作,如下图所示:

Swin Transformer原理详解篇

​  这时候必定就有人问了,选用W-MSA比较于传统的MSA有什么优势呢?——这样能够大大的减少模型核算量,下图为论文中给出的两者核算量的比照:

Swin Transformer原理详解篇

​  其间,h和w别离表明特征图的高度和宽度,C代表特征图的通道数,M表明窗口的巨细。

​  那么这个公式是怎样得来的呢,下面就来详细说说MSA和W-MSA的核算量。


MSA核算量

​  依据咱们前面几篇文章的介绍,咱们应该对单头自留意的公式很熟悉了,即Attention(Q,K,V)=SoftMax(QKTdk)VAttention(Q,K,V)=SoftMax(\frac{QK^T}{\sqrt{d_k}})V。咱们先来依据这个公式一步步的推导MSA的核算量。

​  咱们假定,特征图尺度为hwC,榜首步咱们会通过乘对应的Wq、Wk、WvW_q、W_k、W_v矩阵生成Q、K、VQ、K、V,这儿假定Q、K、VQ、K、V的向量长度与特征图A是深度c是共同的。咱们来来看看由A乘WqW_q得到QQ所需的核算量,如下图所示:

Swin Transformer原理详解篇

​  A的维度为hwChwCWqW_q维度为CCCC,则它们相乘后成果QQ维度为hwChwC。再来看QQ中的每个红点(每个像素)都由AA中的一行C个绿点和WqW_q中一列C个黄点相乘得到,即得到一个红点会进行相乘操作CC次,也即得到一个红点的核算量为CCQQ中共有hwChwC个红点,即核算量为hwCC=hwC2hwCC=hwC^2。同理,生成K、V所需的核算量都为hwC2hwC^2,因此生成Q、K、VQ、K、V的进程共需核算量为3hwC23hwC^2【注:后文我不会再画图帮咱们了解核算量是怎样得到的了,咱们可依照我上文思路画图了解,或者咱们能够依据上文得到矩阵乘法核算量的一般公式,即(ab)(bc)(ab) \ \ (bc)的核算量为abcabc

​  接着来看QKTQK^T所用的核算量。QQ的维度为hwChwCKTK^T的维度为为ChwChw,相乘后QKTQK^T维度为hwhwhwhw,则此步所用核算量为(hw)2C(hw)^2 C。接下来会除(dk)\sqrt{(d_k)}和进行SoftMax操作,这两步核算量较少,可忽略。

​  然后用QKTQK^TVV相乘。QKTQK^T维度为hwhwhwhwVV的维度为hwChwC,得到成果维度为hwChwC,则此步所用核算量为(hw)2C(hw)^2 C

​  那么到这儿,单头自留意力机制所用核算量就介绍完了,为上述几个核算量的和,即3hwC2+(hw)2C+(hw)2C=3hwC2+2(hw)2C3hwC^2+(hw)^2C+(hw)^2C=3hwC^2+2(hw)^2C

​  对应多头留意力(MSA)来说,其核算量和单头留意不同就在最终一步乘WoW^o矩阵进程。上一步得到的矩阵维度为hwChwCWoW^o维度为CCCC,则最终成果维度为hwChwC【和输入时维度共同】这一步所需的核算量为hwC2hwC^2

​  综上,MSA所用核算量为3hwC2+2(hw)2C+hwC2=4hwC2+2(hw)2C3hwC^2+2(hw)^2C+hwC^2=4hwC^2+2(hw)^2C

W-MSA核算量

​  W-MSA便是把特征图分红几个小窗口别离送入MSA。所以咱们只需要核算每个小窗口的核算量,然后乘上窗口数量即可得到W-MAS的核算量。现假定每个窗口的宽高都为M,则总共有hMwM\frac{h}{M}\frac{w}{M}个窗口。接下来就先要核算一个窗口的核算量,关于一个窗口来说,其实便是一个MSA,核算公式上文已经给出,咱们只需要将上文的h和wh和w换成现在的M和MM 和 M即可求得一个窗口核算量,其为4M2C2+2(M2)2C4M^2C^2+2(M^2)^2C。而现在共有 hMwM\frac{h}{M}\frac{w}{M}个窗口,则W-MSA的核算量为hMwM(4M2C2+2(M2)2C)=4hwC2+2M2hwC\frac{h}{M}\frac{w}{M}(4M^2C^2+2(M^2)^2C)=4hwC^2+2M^2hwC


​  你细心比照着两个公式,你会发现差异在第二项。MSA为2(hw)2C2(hw)^2C,W-MSA为2M2hwC2M^2hwC。其间hwhw为原图的高和宽,而MM为窗口的高和宽。明显M≤h,M≤wM \le h,M \le w,所以W-MSA的核算量要少。我认为这样说咱们还感觉不到核算量不同有多大,我举个比如咱们来感受一下:假定特征图h=224,w=224,C=3,M=7,则运用W-MSA比运用MSA节约15091034112核算量,如下:

2(hw)2C−2M2hwC=222443−27722423=150910341122(hw)^2C-2M^2hwC=2224^43-277224^23=15091034112



SW-MSA

​  这部分我认为是整篇文章最核心的东西,这儿我会详细的为咱们解说解说。何为SW-MSA,即shifted Windows Multi-Head Attention。咱们先来想想咱们为何要运用SW-MSA,这是由于W-MSA将原始特征图分红一个个小窗口,然后别离送入MSA中,这会导致各个窗口之前没有任何的联络,都是独立的,这明显不是咱们希望看到的。而SW-MSA的出现便是为了解决这个问题,SW-MSA详细是怎样规划的,咱们来看论文中的图片解说:

Swin Transformer原理详解篇

​  左图是W-MSA,右图是SW-MSA,它们别离出现在Swin Transformer Block的相邻两层中。若W-MSA在Layer1层运用,则SW-MSA在Layer1+1层运用。

​  再来看看SW-MSA做了什么?SW-MSA会重新区分窗口,即由上图左侧变成上图右侧,这样区分过后会构成9个巨细形状不同的窗口,这样就解决了窗口直接无法进行信息传递的问题。咱们以上图右侧第二行第二列中心44的窗口为例,这一个窗口结合了Layer1层中四个窗口的信息,是不是很巧妙呢!!!【至于怎样得到SW-MSA区分的窗口的呢,许多博客中根本都是说将原始特征图从左上角别离向右侧和下侧移动⌊M2⌋=2\left\lfloor {\frac{{\rm{M}}}{2}} \right\rfloor = 2个像素,M为窗口巨细。可是这样描绘我仍是不能很好的了解,这个区分窗格后边还有其它操作,代码中这些操作是在一同进行的,就一行代码,进程也很简单了解,所以这部分我会在代码详解篇再详细讲讲】

​  区分好窗口后,就能够对每个窗口进行MSA了。可是你会发现每个窗口的尺度都不相同,这样做MSA是很复杂的。一个很简单想到的方法便是将每个窗口都padding成原始窗口巨细,但很明显这样做又增大了核算量。作者提出了一种十分巧妙的方法,即通过shift(移动)将区分后的窗口进行重组,为便利咱们了解,作图如下:

Swin Transformer原理详解篇

​  首要,给9个窗口标上数字,这样简单展示移动后的成果。第①步将0 1 2这三个窗口移到最下面得到图①,然后将3 6 0这三个窗口移动到最右侧得到图②。咱们来观察一下最终得到的图②,4独自能够构成一个窗口,5和3能够兼并构成一个窗口,7和1能够兼并构成一个窗口,8 6 2 0 也能够兼并构成一个窗口。此刻总共能够分红4个窗口,和没区分窗口前相同,可是现在的4个窗口就解决了原先窗口无法进行信息传递的问题,例如现在5 3构成的窗口交融了原始四个窗口的信息,即便原始的四个窗口之前有了联络。

​  可是这样做还存在一个严峻的问题,便是会导致信息全乱套了。怎样说呢,咱们能够以5 3 区域为例进行解说。5 3区域在原图上是不相邻的两个区域,先通过一系列操作后会将它们放在一同进行MSA操作,这明显是不合适的。因此为了避免这种问题,在运用进程中,咱们会运用Msked掩码来隔绝不同区域的信息,详细是怎样操作的呢,如下图所示:【这儿偷个懒,不想画图了,图片来自于B站响雷吧啦Wz ,咱们能够去看看他的视频,真的会收成许多】

Swin Transformer原理详解篇

​  这儿的窗口巨细是44的,进行MSA时,关于窗口中每个元素都会先生成Q、K、VQ、K、V,然后核算每个像素之前的相关性,即核算attention socres。咱们拿像素0为例,它得到q0q^0后会和一切像素的kTk^T进行相乘,得到16个attention scores。上图a0,0a_{0,0}表明q0q^0k0T{k^0}^T相乘的成果,a0,1a_{0,1}表明q0q^0k1T{k^1}^T相乘的成果,依此类推,共得到16个成果。此刻咱们不会直接进行SoftMax操作,而是先将像素0与区域3中一切像素匹配成果都减去100,如上图中的a0,2、a0,3、a0,6、a0,7a_{0,2}、a_{0,3}、a_{0,6}、a_{0,7}等等。这样操作后再进行SoftMax操作会将减去100的那些attension scores都变成0。【原本attention socres的值较小,减去100后通过SoftMax根本为0】通过这样的操作,像素0其实没有和区域3中的像素进行任何操作,即只相当于在区域5中进行了MSA。那么接下来关于像素1、2、3等都是相同的道理。这儿我额定的提一下,上图为44的窗口,咱们总共会生成多少个attention scores呢?其实很简略啦,一个像素会有16个,总共16个像素,一切总共会有1616个attention scores,记住这个小点喔,后边会考滴【留意:在咱们操作完后,还需要将移动后的窗口还原回去,关于这一点,我在代码详解篇也会论述】

​  最终,我也给出论文中关于此部分的图解,现在看看,是不是很好了解了呢

Swin Transformer原理详解篇

Relative Position Bias详解✨✨✨

​  上文已经介绍了Swin Transformer十分要害的几个结构,信任你看懂这几个部分,也就根本能看懂整个Swin Transformer的结构了。这一节来为咱们介绍相对方位偏置(Relative Position Bias),这是什么呢,其实啊,这个相对方位偏置所起的作用就和Tranformer中的肯定方位编码和ViT的带参数的方位编码是相同的,不过作者通过实验证明在Swin Transformer中运用相对方位偏置的作用要更好,如下图所示:

Swin Transformer原理详解篇

​  通过上图融化实验能够发现,实验相对方位偏置的作用最好。那么问题来了,这个相对方位偏置应该放在什么方位呢,不卖关子了,论文中是放在Self Attention的核算公式中,如下:

Attention(Q,K,V)=SoftMax(QKTd+B)VAttention(Q,K,V)=SoftMax(\frac{QK^T}{\sqrt{d}}+B)V

​  上述公式中的B即为相对方位偏置。咱们先来讨论讨论B的维度应该是怎样的。既然B能够和QKTd\frac{QK^T}{\sqrt{d}}相加,那么B的维度必定是和QKTQK^T维度共同的。QKTQK^T代表的是attention scores,它表明的是像素之前的相关性,他的维度和窗口巨细有关,关于一个44的窗口,其总共有16个像素,则QKTQK^T的维度为1616。是不是肯定很熟悉呢,这点我在上文介绍SW-MSA提到过喔。那我再来举一个比如,如下图所示:

Swin Transformer原理详解篇

​  这个窗口的巨细为77巨细,那么将这个窗口送入MSA中,B的维度是多少呢?没错啦,便是4949!!!

​  这个B的维度搞清楚了后,下面介绍起来就简单多了。下文图片也是选用响雷吧啦Wz 的,咱们能够去重视看看喔!!!

​  下面以22的窗口为咱们展示相对方位偏置是怎样得到的,首要明确一点,窗口巨细为22,则B的维度为44。

Swin Transformer原理详解篇

​  这儿来解说一下上图。首要关于一个22的图,咱们能够很简单的得到二维的肯定方位索引,如榜首行榜首列用(0,0)表明,榜首行第二列用(0,1)表明。接着会以每个像素为基准,队伍都减去其它方位的索引得到相对方位索引。例如以蓝色像素(0,0)为基准,先用(0,0)-(0,0)=(0,0),得到榜首个相对方位索引,接着用(0,0)-(0,1)=(0,-1)得到榜首行第二列的方位索引,同理能够得到其它相对方位索引。这个进程其实就模拟了q和k的匹配进程。咱们用这种方法,会得到4个22的相对方位索引,然后咱们将其按行展平并拼接在一同就得到了相对方位索引矩阵,它是44的。

​  上图最终的结构相对方位索引矩阵是二维的,咱们想将其变成一维矩阵,然后依据相对方位索引去相对方位偏置表里去查找对应的参数,这儿的相对方位偏置表是一个可学习的参数。一个很自然的想法便是把上图中的行和列相加,不就能够变成一维的了嘛。确实是这样没错啦,可是这样粗犷的相加会产生必定的问题,如榜首行第二列元素(0,-1)队伍相加后是-1,榜首行第三列元素(-1,0)队伍相加后也是-1,可是(0,-1)和(-1,0)明显代表了不同的相对方位,所以这么做是不合适的。

​  下面咱们来看看作者是怎么高雅的进行操作的吧!!!如下图所示:

Swin Transformer原理详解篇

​  此刻,咱们会将上图得到的44的矩阵对照相对方位偏置表得到最终的B,其维度为44。如下图所示:

Swin Transformer原理详解篇

​  留意:这个相对方位偏置表维度为(2M-1)(2M-1),这个咱们能够自己捣鼓捣鼓看看能不能推出了,不行的话评论区见吧!!!再强调一下,这个相对方位偏置表是一个可学习的参数。等等还有一点值得一提,关于固定尺度的窗口咱们的相对方位索引矩阵(relative position index)是相同的!!!

模型参数

​  这儿我就直接放图了,咱们看的会更直观:

Swin Transformer原理详解篇

​  主要有四个模型,参数各有差异。其间win.sz.表明窗口巨细,能够看到每个模型的窗口巨细都为77;dim表明通道数或向量长度;head表明MSA中head个数。下面我以Swin-T为例,画了其通过每个模块后的维度变化,咱们能够参阅,如下图所示:

Swin Transformer原理详解篇

小结

​  随意写着写着也快7000字了,写这篇文章时中心隔了两天去湖北散步了一圈,所以感觉写的不是很累,我感觉一些重要的常识点也都涉及到了,假如发现还有补充的点我会更新上去,总之希望咱们都能够学了解Swin Transformer的原理吧!!!

​  在下一篇我将为咱们带来这部分的代码实战,在Swin Transformer模型构建中有的部分仍是有点难了解的,下一篇我尽量的表述清楚吧。最终说一句老生常谈的话,代码你仍是得自己多调试,才干真正的了解。

参阅链接

Swin Transformer论文精读【论文精读】

Swin-Transformer网络结构详解

Swin Transformer从零详细解读

Vision Transformer 超详细解读 (原理剖析+代码解读) (十七)

如若文章对你有所帮助,那就

        

Swin Transformer原理详解篇