盖朗厄尔峡湾位于挪威,两岸耸立着海拔1500米以上的群山。

前言

在阅读相关 diffusion 论文时,经常会遇见许多自己之前不了解的知识,这是很正常的现象。既不用过度担心,也不要躺平,而是要在空闲的时候把不会的知识补上。

这里学习的是关于 Attention is all you need. 论文在视觉方向的应用 ViT。关于 Attention,最主要学习的内容就是 self-attention 实现细节,以及 Multi-Head self-attention。

这里的学习内容主要参考的是:

Attention 回顾

self-attention 回顾

在这里首先回顾一下 self-attention 的实现。图片参考文章

首先我们要在脑海中始终清楚一件事:self-attention 信息处理流程:

借助矩阵并行化,我们可以把权重矩阵 q k v 实现上写作一个矩阵 W,并且 W 针对不同的序列而言是共享的存在,例子中的两个序列 a1a_1a2a_2 与 W 作矩阵乘法得到序列自己的 q k v.

每一个 q1q_1 都要与其他的 kik_i 进行匹配,再除以序列维数开根号,最终得到序列个数的 α1,i\alpha_{1,i},随后将 α1,i\alpha_{1,i} 进行归一化得到 α^1,i{\hat{\alpha}}_{1,i},将归一化得到的结果与 viv_i 相乘并全部相加得到输出。

最后使用此图作为总结:

此图中值得注意的地方是 bib^i 的计算结果是累加和。

multi-head self-attention

多头分割。同样是把嵌入向量输入 qkv 矩阵,不过在得到 q1,k1,v1q^1,k^1,v^1 之后根据 head 的个数将其均分。这里一共有两个 head,所以把 q1q^1 均分为 q1,1q^{1,1}q1,2q^{1,2}k1,v1k^1,v^1 进行同理分割。

不同的映射方案。根据上图可以看出 head1 的两个分量分别来自两个嵌入输入序列 a1,a2a_1,a_2 的第一个分量计算 qkv 之后的结果,并将这两个结果拼接(这里尚未展示拼接),同理可以推断出 head2 的两个分量分别来自 a1,a2a_1,a_2 第二个分量计算 qkv 之后的结果拼接。

这张图说明个什么事呢?还是上面阐述的解释,例如 b2,1b_{2,1} 就是 head2 第一个分量。只要记住了形式,实现起来便不难,但是这样做的好处、优势,还得是看论文才能知道。

至此,Attention 内容复习完成。


pytorch 搭建 ViT 模型

既然要搭建,不得不学习模型结构,有了模型结构,一切便了然于心。