目录
- SW-MSA
- Shifted-Window
- 什么是循环移位
- 重新分割图片并计算Attention
- 如何mask
SW-MSA
Shifted-Window
如上图所示,每一个小块叫做一个patch,每一个深色方块框起来的叫一个local window,在每一个local window中计算self-attention。如果是只计算一次self-attention,每个local window之间是孤立的,相互之间不会产生联系,但是实际上所有的local window组成了一张图片,他们之间应该有关联才对。所以们引入了shifted-window进行了第二次self-attention。
如下图所示,分割图片的window向右向下进行了平移,将图片分割成了Layer1+1
所示的形状。 平移的像素为 向 左 上 角 移 动 ( ( ⌊ M 2 ⌋ , ⌊ M 2 ⌋ ) ) 个 ( 2 × 2 ) 的 像 素 块 向左上角移动(\left ( \left \lfloor \frac{M}{2} \right \rfloor , \left \lfloor \frac{M}{2} \right \rfloor \right ))个(2 \times 2)的像素块 向左上角移动((⌊2M⌋,⌊2M⌋))个(2×2)的像素块。 M M M指的是窗口的大小。
什么是循环移位
循环移位就是把数值变成二进制,然后循环移动的过程;换句话说,循环移位就是将移出的低位放到该数的高位(循环右移)或把移出的高位放到该数的低位(循环左移),左移,和右移动都是对整数进行的操作,在Win32控制台应用程序中,整形占4Byte节32bit。
循环左移的过程:
图像上也是如此,将移出的像素点放到图像的对立侧。
重新分割图片并计算Attention
重新将图片分割成2*2的local window,窗口大小还是原来的,这样每个窗口里面都会是之前窗口的交叉。在对每个窗口计算Attention,就会形成不同窗口之间的connection。
但是会形成一个新的问题,一个新形成的local window在图片上不一定是连续的。比如上面的分隔,$A、B、C $和剩下的区域,都是单独的连续小区域。所以在计算Attention的时候,只需要关注各自连续区域的内容,而其他的地方则需要mask掉。
如何mask
如上图所示,是经过循环位移后重新分割图像。相同数字表示连续的区域。当我们对local window计算Attention的时候,只需要将不同数字mask即可。我们以最后一个窗口为例,解释如何mask。具体操作如下:
首先将local window展平成 N 维 N维 N维向量:
然后将展平的向量和向量的转置,扩展成 N ∗ N ( 这 里 是 16 ∗ 16 ) N*N(这里是16*16) N∗N(这里是16∗16)的矩阵:
然后,两个矩阵对应位置相减得到:
其中 ∗ * ∗代表不为0的值。
按照每行为一个单位看,第一行代表第一个元素应该和哪些元素进行Attention,为0则计算,不为0则mask掉,其他行也是如此。
这样计算那就是 S W − M S A SW-MSA SW−MSA.