本文提出了一个新的视觉Transformer,称为Swin Transformer,它可以作为计算机视觉的一个通用骨干(backbone)。将Transformer从语言改编为视觉的挑战来自于两个领域之间的差异,比如视觉实体的尺度变化很大,以及与文本中的文字相比,图像中的像素分辨率很高。为了解决这些差异,我们提出了一个层次化的Transformer,其表示方法是通过 S \textbf{S} Shifted win \textbf{win} windows来计算的。移位的窗口方案通过将自我注意(self-attention)的计算限制在不重叠的局部窗口,同时也允许跨窗口的连接,从而带来了更高的效率。这种分层结构具有在不同尺度上建模的灵活性,并且相对于图像大小具有线性计算复杂性。Swin Transformer的这些特质使其与广泛的视觉任务兼容,包括图像分类(ImageNet-1K上87.3%的最高准确率)和密集预测任务,如物体检测(COCO test-dev上58.7%的APbox和51.1%的APmask)和语义分割(ADE20K val上53.5% mIoU)。它的性能超过了以前的最先进水平,在COCO上为+2.7% APbox和+2.6% APmask,在ADE20K上为 +3.2% mIoU,证明了基于Transformer的模型作为视觉骨干的潜力。分层设计和移位窗口的方法也被证明对所有MLP架构有益。代码和模型在this https URL公开提供。
This paper presents a new vision Transformer, called Swin Transformer, that capably serves as a general-purpose backbone for computer vision. Challenges in adapting Transformer from language to vision arise from differences between the two domains, such as large variations in the scale of visual entities and the high resolution of pixels in images compared to words in text. To address these differences, we propose a hierarchical Transformer whose representation is computed with \textbf{S}hifted \textbf{win}dows. The shifted windowing scheme brings greater efficiency by limiting self-attention computation to non-overlapping local windows while also allowing for cross-window connection. This hierarchical architecture has the flexibility to model at various scales and has linear computational complexity with respect to image size. These qualities of Swin Transformer make it compatible with a broad range of vision tasks, including image classification (87.3 top-1 accuracy on ImageNet-1K) and dense prediction tasks such as object detection (58.7 box AP and 51.1 mask AP on COCO test-dev) and semantic segmentation (53.5 mIoU on ADE20K val). Its performance surpasses the previous state-of-the-art by a large margin of +2.7 box AP and +2.6 mask AP on COCO, and +3.2 mIoU on ADE20K, demonstrating the potential of Transformer-based models as vision backbones. The hierarchical design and the shifted window approach also prove beneficial for all-MLP architectures. The code and models are publicly available at~\url{this https URL}.
Subjects: Computer Vision and Pattern Recognition (cs.CV); Machine Learning (cs.LG)
Cite as: arXiv:2103.14030 [cs.CV]
(or arXiv:2103.14030v2 [cs.CV] for this version)
https://doi.org/10.48550/arXiv.2103.14030
Focus to learn more
Submission history
From: Han Hu [view email]
[v1] Thu, 25 Mar 2021 17:59:31 UTC (1,064 KB)
[v2] Tue, 17 Aug 2021 16:41:34 UTC (1,065 KB)
ICCV 2021 Best Paper
论文地址:https://doi.org/10.48550/arXiv.2103.14030
源码地址:https://github.com/microsoft/Swin-Transformer
二者的不同之处:
在ViT模型中,是直接对特征图下采样16倍,在后面的结构中也一致保持这样的下采样规律不变(只有16x下采样,不Swin Transformer那样有多种下采样尺度 -> 这样就导致ViT不能构建出具有层次性的特征图)
这些模型先在ImageNet-1K数据集上进行预训练后,再在ImageNet-1K上的表现。
可以看到:
我们看一下这些模型先在ImageNet-22K数据集上进行预训练后,再在ImageNet-1K上的表现。
从表中可以看到,在ImageNet-22K预训练后,所有模型的ImageNet-1K准确率都有提升。
假设我们的输入图片的shape为 H × W × 3 H \times W \times 3 H×W×3的图片,首先通过Patch Partition模块 -> 图片的shape变为 H 4 × W 4 × 48 \frac{H}{4} \times \frac{W}{4} \times 48 4H×4W×48。接下来再依次通过 Stage1 ~ Stage8。
这个结构非常像ResNet,图片首先通过一个stem层,之后经过若干个Stage结构对特征图进行特征提取和下采样。
partition 英[
pɑːˈtɪʃn
] 美[pɑːrˈtɪʃn
]
n. 隔断; 分割; 隔扇; 隔板墙; 分治; 瓜分;
vt. 分割; 使分裂;
假如左边的矩形是输入图片,shape为 4 × 4 × 3 4 \times 4 \times 3 4×4×3(注意是三通道而非单通道)。Patch Partition会使用一个 4 × 4 4 \times 4 4×4大小的窗口对输入图像进行分割。分割之后对每一个小的窗口在channel方向进行展平处理。即图片的长度和宽度缩小4倍,而channel变为4×4×3=48。
经过Patch Partition层之后,tensor经过Linear Embedding层对输入特征图的channel进行调整。通过调整之后,特征图的channel变为 C C C。这里的 C C C具体为多少是根据Swin Transformer的具体类型进行调整的。
Note:
nn.Conv2d(inp=3, oup=48, kernel_size=(4, 4), stride=4)
tensor.flatten()
和一维卷积实现,即nn.Conv1d(inp=48, oup=C, kernel_size=1, stirde=1)
,最后加上一个nn.LinearNorm()
即可。Patch Merging的实际作用是下采样。通过Patch Merging后,特征图的高和宽会缩减为原来的一半,Channel会翻倍。
从上图可以看到,特征图的尺寸变为原来的一半,深度(通道数)翻倍。
对于普通的MSA模块,会对输入特征图的每一个像素求解 Q , K , V Q, K, V Q,K,V,每一个像素求得的 Q Q Q 会和特征图上每一个像素的 K K K 进行匹配。然后再进行一系列的操作。
而对应Window Multi-head Self-Attention而言,首先会对特征图进行分割处理,分割为一个一个的Window,然后在每一个Window内部开始执行MSA。注意:在进行MSA时,Window与Window之间是没有任何通信的。
这么设计WMSA的目的是:减少计算量。
同样的,这样的设计也会引入一些缺点:Window之间无法进行信息交互。这将会导致特征图的感受野变小,没法看到全局的视野,这肯定对最终的预测结果有影响。
首先回忆下单头Self-Attention的公式:
A t t e n t i o n ( Q , K , V ) = S o f t M a x ( Q K T d ) V {\rm Attention}(Q, K, V) = {\rm SoftMax}(\frac{QK^T}{\sqrt{d}})V Attention(Q,K,V)=SoftMax(dQKT)V
对于特征图中的每个像素(或称作token
,patch
),都要通过 W q , W k , W v W_q, W_k, W_v Wq,Wk,Wv 生成对应的 q u e r y ( q ) query(q) query(q), k e y ( k ) key(k) key(k) 以及 v a l u e ( v ) value(v) value(v)。这里假设 q , k , v q, k, v q,k,v 的向量长度与特征图的深度 C C C 保持一致。那么对应所有像素生成 Q Q Q 的过程如下式:
Q h w × C = A h w × C ⋅ W q C × C Q^{hw \times C} = A^{hw \times C} \cdot W_q^{C \times C} Qhw×C=Ahw×C⋅WqC×C
token
)拼接在一起得到的矩阵(一共有 h w hw hw 个像素,每个像素的深度为 C C C)补充一个矩阵乘法FLOPs计算方式,假设有如下两个矩阵做矩阵乘法:
A a × b ⋅ B b × c A^{a\times b} \cdot B^{b \times c} Aa×b⋅Bb×c
这两个矩阵相乘之后,FLOPs为: a × b × c a \times b \times c a×b×c。
所以根据矩阵运算的计算量公式可以得到生成 Q Q Q 的计算量为 h w × C × C hw \times C \times C hw×C×C,生成 K K K 和 V V V 同理都是 h w C 2 hwC^2 hwC2,那么总共是 3 h w C 2 3hwC^2 3hwC2。接下来 Q Q Q 和 K T K^T KT 相乘:
X h w × h w = Q h w × C ⋅ K T ( C × h w ) X^{hw \times hw} = Q^{hw \times C} \cdot K^{T(C \times hw)} Xhw×hw=Qhw×C⋅KT(C×hw)
对应计算量为 ( h w ) 2 C (hw)^2C (hw)2C。
接下来忽略除以 d \sqrt{d} d 以及 s o f t m a x {\rm softmax} softmax的计算量,假设得到 Λ h w × h w \Lambda^{hw \times hw} Λhw×hw,最后还要乘以 V V V:
B h w × C = Λ h w × h w ⋅ V h w × C B^{hw \times C} = \Lambda^{hw \times hw} \cdot V^{hw \times C} Bhw×C=Λhw×hw⋅Vhw×C
对应的计算量为 ( h w ) 2 C (hw)^2C (hw)2C。
那么对应单头的Self-Attention模块,总共的计算量为:
3 h w C 2 Q , K , V + ( h w ) 2 C Q K T + ( h w ) 2 C ⋅ V = 3 h w C 2 + 2 ( h w ) 2 C \underset{Q, K, V}{3hwC^2} + \underset{QK^T}{(hw)^2C} + \underset{\cdot V}{(hw)^2C} = 3hwC^2 + 2(hw)^2C Q,K,V3hwC2+QKT(hw)2C+⋅V(hw)2C=3hwC2+2(hw)2C
在实际使用过程中,使用的是多头的Multi-head Self-Attention模块(MSA),在之前的文章中有进行过实验对比,多头注意力模块相比单头注意力模块的计算量仅多了最后一个融合矩阵 W O W_O WO 的计算量 h w C 2 hwC^2 hwC2。
O h w × C = B h w × C ⋅ W O C × C O^{hw \times C} = B^{hw \times C} \cdot W^{C \times C}_O Ohw×C=Bhw×C⋅WOC×C
对应的计算量为 h w C 2 hwC^2 hwC2。
所以总共加起来是: 4 h w C 2 + 2 ( h w ) 2 C 4hwC^2 + 2(hw)^2C 4hwC2+2(hw)2C。
对于W-MSA模块首先要将特征图划分到一个个窗口(Window)中,假设每个窗口的宽高都是 M M M,那么总共会得到 h M × w M \frac {h} {M} \times \frac {w}{M} Mh×Mw 个窗口,然后对每个窗口内使用多头注意力模块(MSA)。
刚刚计算高为 h h h,宽为 w w w,深度为 C C C 的特征图的计算量为 4 h w C 2 + 2 ( h w ) 2 C 4hwC^2 + 2(hw)^2C 4hwC2+2(hw)2C,这里每个窗口的高为 M M M 宽为 M M M,带入公式得:
4 ( M C ) 2 + 2 ( M ) 4 C 4(MC)^2 + 2(M)^4C 4(MC)2+2(M)4C
又因为有 h M × w M \frac {h} {M} \times \frac {w}{M} Mh×Mw 个窗口,则:
F L O P s ( W - M S A ) = h M × w M × [ 4 ( M C ) 2 + 2 ( M ) 4 C ] = 4 h w C 2 + 2 M 2 h w C \begin{aligned} {\rm FLOPs(W{\text -}MSA)} & = \frac{h}{M} \times \frac{w}{M} \times [4(MC)^2 + 2(M)^4C] \\ & = 4hwC^2 + 2M^2 hw C \end{aligned} FLOPs(W-MSA)=Mh×Mw×[4(MC)2+2(M)4C]=4hwC2+2M2hwC
故使用W-MSA的计算量为 4 h w C 2 + 2 M 2 h w C 4hwC^2 + 2M^2 hw C 4hwC2+2M2hwC。
F L O P s ( M S A ) = 4 h w C 2 + 2 ( h w ) 2 C F L O P s ( W - M S A ) = 4 h w C 2 + 2 M 2 h w C \begin{aligned} {\rm FLOPs}({\rm MSA}) & = 4 h w C^2 + 2(hw)^2 C \\ {\rm FLOPs}({\rm W{\text -}MSA}) & = 4hwC^2 + 2M^2 hwC \end{aligned} FLOPs(MSA)FLOPs(W-MSA)=4hwC2+2(hw)2C=4hwC2+2M2hwC
其中:
为了直观看出两者计算的不同,假设输入图片的shape为 X ∈ R 112 × 112 × 128 \mathcal{X}\in {\mathbb R}^{112 \times 112 \times 128} X∈R112×112×128,Window的尺寸为 M M M。(输入输出通道数不变),则两种MSA的计算量如下:
MSA类别 | M = 1 M=1 M=1 | M = 2 M=2 M=2 | M = 3 M=3 M=3 | M = 4 M=4 M=4 | M = 5 M=5 M=5 | M = 6 M=6 M=6 | M = 7 M=7 M=7 |
---|---|---|---|---|---|---|---|
MSA (M) | 41104.1792 | 41104.1792 | 41104.1792 | 41104.1792 | 41104.1792 | 41104.1792 | 41104.1792 |
W-MSA (M) | 825.2948 | 834.9286 | 850.9850 | 873.4638 | 902.3652 | 937.6891 | 979.4355 |
Δ \Delta Δ | -97.9922% | -97.9688% | -97.9297% | -97.8750% | -97.8047% | -97.7188% | -97.6172% |
从表中的数据可以看到,W-MSA相比MSA而已,切割窗口的设计可以为模型省出巨大的计算量。
图2. 所提出的Swin Transformer架构中计算自我注意力的移位窗口方法的说明。在第 l l l 层(左),采用了一个常规的窗口划分方案,在每个窗口内计算自我注意力。在接下来的第 l + 1 l+1 l+1 层(右),窗口分区被转移,产生了新的窗口。新窗口中的自我注意计算跨越了第 l l l 层中先前窗口的边界,提供了它们之间的联系。
前面有说,采用W-MSA
模块时,只会在每个窗口内进行自注意力计算(MSA),所以窗口与窗口之间是无法进行信息传递的。为了解决这个问题,作者引入了Shifted Windows Multi-Head Self-Attention(SW-MSA)模块
,即进行偏移的W-MSA
。如上图所示,左侧使用的是刚刚讲的W-MSA
(假设是第 l l l 层),那么根据之前介绍的W-MSA
和SW-MSA
是成对使用的,那么第 l + 1 l+1 l+1 层使用的就是SW-MSA
(右侧图)。根据左右两幅图对比能够发现窗口(Windows)发生了偏移(可以理解成窗口从左上角分别向右侧和下方各偏移了 ⌊ M 2 ⌋ \left \lfloor \frac {M} {2} \right \rfloor ⌊2M⌋个像素)。
看下偏移后的窗口(右侧图),比如对于第一行第2列的 2 × 4 2\times 4 2×4 的窗口,它能够使第 l l l 层的第一排的两个窗口信息进行交流。再比如,第二行第二列的 4 × 4 4\times 4 4×4 的窗口,他能够使第 l l l 层的四个窗口信息进行交流,其他的同理。那么这就解决了不同窗口之间无法进行信息交流的问题。
根据上图,可以发现通过将窗口进行偏移后,由原来的 4 4 4 个窗口变成 9 9 9 个窗口了。后面又要对每个窗口内部进行MSA,这样做感觉又变麻烦了。
对于新生成的 9 个Window,如果想要实现并行计算,那么就需要对边上 8 个Window进行填充,填充到 4 × 4 4 \times 4 4×4 大小。如果我们使用这种策略,那么我们就相当于是计算了 9 9 9 个 4 × 4 4 \times 4 4×4 大小Window,计算量又增加了。
为了解决这个麻烦,作者又提出而了Efficient batch computation for shifted configuration
,一种更加高效的计算方法。下面是原论文给的示意图。
图4. 移位窗口分区中自我注意(SW-MSA)的高效批量计算方法的说明。
感觉不太好描述,然后霹雳巴拉WZ重新绘制了该图。下图左侧是刚刚通过偏移窗口后得到的新窗口,右侧是为了方便大家理解,对每个窗口加上了一个标识。然后0对应的窗口标记为区域A,3和6对应的窗口标记为区域B,1和2对应的窗口标记为区域C。
接下来对划分的区域进行了2次平移,如下图所示。
移动完毕后,我们对Window重新进行划分,如下图所示。
移动完后,4
是一个单独的窗口;将5和3
合并成一个窗口;7和1
合并成一个窗口;8, 6, 2, 0
合并成一个窗口。这样又和原来一样是 4 4 4 个 4 × 4 4 \times 4 4×4 的窗口了,在对这4个4×4的Window进行W-MSA计算的话能够保证计算量是一样的。
但是我们直接简单粗暴地在每个Window中进行W-MSA计算(其实就是MSA计算)的话,就会引入一个新的问题。
对于第一个4×4的Window来说其实没有影响,因为它本身就是一个4×4的Window,但对于B
来说,这个Window是由两个分开的区域组合在一起的,而且5
和3
本来就不是相邻的两个区域,如果我们强行MSA计算的话,其实是有问题的。所以我们希望在B
中个Window中可以单独计算区域5
的MSA和区域3
的MSA。
那么具体是怎么实现的呢?
在论文中,使用的不是原本的MSA而是masked MSA即带蒙板mask的MSA,这样就能够通过设置蒙板来隔绝不同区域的信息了。
关于mask如何使用,可以看下下面这幅图,下图是以上面的区域5和区域3为例。
对于该窗口内的每一个像素(或称token
,patch
)在进行MSA
计算时,都要先生成对应的 q u e r y ( q ) query(q) query(q), k e y ( k ) key(k) key(k), v a l u e ( v ) value(v) value(v)。假设对于上图的像素0
而言,得到 q 0 q^0 q0 后要与每一个像素的 k k k 进行匹配(match)。
假设 α 0 , 0 \alpha _{0,0} α0,0 代表 q 0 q^0 q0 与像素0
对应的 k 0 k^0 k0 进行匹配的结果,那么同理可以得到 α 0 , 0 \alpha _{0,0} α0,0 至 α 0 , 15 \alpha _{0,15} α0,15。按照普通的MSA计算,接下来就是SoftMax操作了。
但对于这里的masked MSA,像素0
是属于区域5
的,我们只想让它和区域5
内的像素进行匹配。那么我们可以将像素0
与区域3
中的所有像素匹配结果都减去100(例如 α 0 , 2 , α 0 , 3 , α 0 , 6 , α 0 , 7 \alpha _{0,2}, \alpha _{0,3}, \alpha _{0,6}, \alpha _{0,7} α0,2,α0,3,α0,6,α0,7 等等),由于 α \alpha α 的值都很小,一般都是零点几的数,将其中一些数减去 100 100 100 后再通过SoftMax得到对应的权重都等于 0 0 0 了。所以对于像素0
而言实际上还是只和区域5
内的像素进行了MSA。
对于其他像素也是同理,具体代码是怎么实现的,后面会在代码讲解中进行详解。
注意,在计算完后还要把数据给挪回到原来的位置上(例如上述的A
,B
,C
区域)。
关于相对位置偏执,论文里也没有细讲,就说了参考的哪些论文,然后说使用了相对位置偏执后给够带来明显的提升。根据原论文中的表4可以看出,在ImageNet数据集上如果不使用任何位置偏执,top-1为 80.1 % 80.1\% 80.1%,但使用了相对位置偏执(rel. pos.)后top-1为 83.3 % 83.3\% 83.3%,提升还是很明显的。
第一二行:
这说明窗口与窗口之间的信息交互是非常有必要的。
原版的MSA计算公式如下:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V {\rm Attention}(Q, K, V) = {\rm softmax}(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
在Swin Transformer中,给出的公式为:
A t t e n t i o n ( Q , K , V ) = S o f t M a x ( Q K T d k + B ) V {\rm Attention}(Q, K, V) = {\rm SoftMax}(\frac{QK^T}{\sqrt{d_k}} + B)V Attention(Q,K,V)=SoftMax(dkQKT+B)V
那这个相对位置偏执是加在哪的呢,根据论文中提供的公式可知是在 Q Q Q 和 K K K 进行匹配并除以 d \sqrt d d 后加上了相对位置偏执 B B B。
由于论文中并没有详解讲解这个相对位置偏执,所以霹雳吧啦WZ根据阅读源码做了简单的总结。
如下图,假设输入的特征图高宽都为 2 2 2,那么首先我们可以构建出每个像素的绝对位置(左下方的矩阵),对于每个像素的绝对位置是使用行号和列号表示的。
比如蓝色的像素对应的是第0行第0列所以绝对位置索引是 ( 0 , 0 ) (0,0) (0,0),接下来再看看相对位置索引。
首先看下蓝色的像素,在蓝色像素使用 q q q 与所有像素 k k k 进行匹配过程中,是以蓝色像素为参考点。然后用蓝色像素的绝对位置索引与其他位置索引进行相减,就得到其他位置相对蓝色像素的相对位置索引。例如黄色像素的绝对位置索引是 ( 0 , 1 ) (0,1) (0,1),则它相对蓝色像素的相对位置索引为 ( 0 , 0 ) − ( 0 , 1 ) = ( 0 , − 1 ) (0,0)−(0,1)=(0,−1) (0,0)−(0,1)=(0,−1),这里是严格按照源码中来讲的,请不要杠。那么同理可以得到其他位置相对蓝色像素的相对位置索引矩阵。
同样,也能得到相对黄色,红色以及绿色像素的相对位置索引矩阵。接下来将每个相对位置索引矩阵按行展平,并拼接在一起可以得到下面的 4 × 4 4\times 4 4×4 矩阵 。
请注意,我这里描述的一直是相对位置索引,并不是相对位置偏执参数(并不是公式中的那个 B B B)。因为后面我们会根据相对位置索引去取对应的参数。
比如说黄色像素是在蓝色像素的右边,所以相对蓝色像素的相对位置索引为 ( 0 , − 1 ) (0,−1) (0,−1)。绿色像素是在红色像素的右边,所以相对红色像素的相对位置索引为 ( 0 , − 1 ) (0,−1) (0,−1)。可以发现这两者的相对位置索引都是 ( 0 , − 1 ) (0,−1) (0,−1),所以他们使用的相对位置偏执参数都是一样的。
其实讲到这基本已经讲完了,但在源码中作者为了方便把二维索引给转成了一维索引。具体这么转的呢,有人肯定想到,简单啊直接把行、列索引相加不就变一维了吗?
比如上面的相对位置索引中有 ( 0 , − 1 ) (0,−1) (0,−1) 和 ( − 1 , 0 ) (−1,0) (−1,0) 在二维的相对位置索引中明显是代表不同的位置,但如果简单相加都等于 -1 那不就出问题了吗?
这说明如果直接相加,那么位置索引就没有了(会有明明位置不同,但索引值相同的情况)!
接下来我们看看源码中是怎么做的。
首先在原始的相对位置索引上加上 ( M − 1 ) (M-1) (M−1) ( M M M 为窗口的大小,在本示例中 M = 2 M=2 M=2),加上之后索引中就不会有负数了。如下图所示:
接着将所有的行标都乘上2M-1。如下图:
最后将行标和列标进行相加。
这样就得到一元相对位置索引矩阵。这个矩阵即保证了相对位置关系,而且不会出现上述 0 + (-1) = (-1) + 0 的问题了。
刚刚上面也说了,之前计算的是相对位置索引,并不是相对位置偏执参数。真正使用到的可训练参数 B ^ \hat{B} B^ 是保存在relative position bias table表
里的,这个表的长度是等于 ( 2 M − 1 ) × ( 2 M − 1 ) (2M-1) \times (2M-1) (2M−1)×(2M−1) 的。那么上述公式中的相对位置偏执参数 B B B 是根据上面的相对位置索引表根据查relative position bias table表得到的,如下图所示。
刚才我们求的是索引,并不是用到的值,用到值需要通过求得的索引去查表得到。
看图说话, 我们发现relative position index
这个矩阵的一共有9个数,而relative position bias table
的个数也是9个。图中也写了,矩阵的大小为 ( 2 M − 1 ) × ( 2 M − 1 ) (2M-1)\times (2M-1) (2M−1)×(2M−1)。
那么为什么是 ( 2 M − 1 ) × ( 2 M − 1 ) (2M-1)\times (2M-1) (2M−1)×(2M−1)呢?看下面这张图:
M M M 是Window的大小,不是数量,这里我就懒得改了
首先回忆下Swin Transformer的网络架构:
图3:(a)Swin Transformer(Swin-T)的结构;(b)两个连续的Swin Transformer区块(用公式(3)表示)。W-MSA和SW-MSA是多头自我注意模块,分别具有常规和移位的窗口配置。
下图(表7)是原论文中给出的关于不同Swin Transformer的配置,T
(Tiny),S
(Small),B
(Base),L
(Large),其中:
win. sz. 7×7
表示使用的窗口(Window)的大小dim
表示特征图的channel深度(或者说token的向量长度)head
表示多头注意力模块中head的个数