在VIT中计算transformer的QKR三个矩阵的时候,是怎么做的
时间: 2024-04-07 13:32:48 浏览: 46
在Vision Transformer(ViT)中,计算Transformer的Q、K和V矩阵的过程与传统的Transformer模型基本相同。具体来说,假设输入序列为$X\in\mathbb{R}^{N \times D}$,其中$N$是序列的长度,$D$是每个序列元素的维度(在ViT中,$D$通常等于patch vector的维度),则Transformer的Q、K和V矩阵的计算过程如下:
首先,将输入序列$X$分别通过三个线性变换$W_q\in\mathbb{R}^{D \times d_k}$、$W_k\in\mathbb{R}^{D \times d_k}$和$W_v\in\mathbb{R}^{D \times d_v}$,得到三个新的序列$Q\in\mathbb{R}^{N \times d_k}$、$K\in\mathbb{R}^{N \times d_k}$和$V\in\mathbb{R}^{N \times d_v}$,其中$d_k$和$d_v$是Transformer模型中的超参数,通常情况下$d_k=d_v=D_{head}$,其中$D_{head}$是每个注意力头(attention head)的维度。
$$Q=XW_q,K=XW_k,V=XW_v$$
然后,将$Q$、$K$和$V$分别重塑为$N_{head}\times N\times D_{head}$的三维张量,其中$N_{head}$是注意力头的数量。具体来说,将$Q$、$K$和$V$分别划分为$N_{head}$个子矩阵,然后将这些子矩阵沿着序列长度的维度进行拼接,得到三个新的三维张量$Q'\in\mathbb{R}^{N_{head} \times N \times D_{head}}$、$K'\in\mathbb{R}^{N_{head} \times N \times D_{head}}$和$V'\in\mathbb{R}^{N_{head} \times N \times D_{head}}$。
$$Q'=\text{reshape}(Q, [N_{head}, N, D_{head}])$$
$$K'=\text{reshape}(K, [N_{head}, N, D_{head}])$$
$$V'=\text{reshape}(V, [N_{head}, N, D_{head}])$$
最后,使用$Q'$、$K'$和$V'$计算Transformer的注意力矩阵$A\in\mathbb{R}^{N_{head} \times N \times N}$,并将其与$V'$相乘,得到最终的输出序列$Z\in\mathbb{R}^{N_{head} \times N \times D_{head}}$。
$$A=\text{softmax}(\frac{Q'K'^T}{\sqrt{D_{head}}})$$
$$Z=\text{matmul}(A, V')$$
需要注意的是,在ViT中,每个注意力头生成的$Z$都将按照序列长度的维度进行拼接,得到最终的输出序列$Z\in\mathbb{R}^{N \times D}$。同时,ViT中使用了一种称为“multi-head self-attention”的技术,该技术将输入序列分别传递给多个注意力头进行处理,以增加模型的表达能力和学习能力。
阅读全文