讲一下对transformer的理解。
参考视频链接:https://www.bilibili.com/video/BV1M44y1q7oq
首先是attention注意力机制,以图像举例,图像不同位置的东西我们的注意力是不一样的。通俗点讲就是一副图像我们肯定有关注的东西,也肯定有不关注,我们对不同部分的关注度是不一样的。现在我们需要用一种算法,让计算机帮我们知道,什么位置的注意力应该高,什么样的注意力应该低。而transformer就实现了这种算法。transformer本来是运用在NLP中的,你不能单纯对一个单词进行分析,因为同一个单词可能在不同的句子里是不一样的意思,不同的句子我们放的注意力的位置也是不一样的,也就是我们常说的理解句子要联系上下文。
transformer做的就是将一个向量(或者叫token)和包括自己在内的所有向量计算关系,
然后重构成一个新向量。
举个例子:
向量1 | 向量2 | 向量3 | 向量4 | |
---|---|---|---|---|
向量1 | 0.5 | 0.2 | 0.2 | 0.1 |
这样子向量1就重构成
这样子每一个向量都包含了全局信息,也表示了自己在全局应该得到的注意力。
至于这些权重怎么算,就需要涉及到三个辅助向量。
代表的是queries,用于自己计算自己和其他向量的关系。
代表的是keys,用于其他向量计算其他向量和自己的关系。
代表的是values,用于表示自己的特征。
都是通过输入训练出来的,。对应的就是要训练的权重。
假设对应,内积越大,两个向量关系就大,内积越小,两个向量关系就小。
为了表示方便,我用表示关系(relation),则和的关系可以表示为。
因为各自之间可能维度不同,为了消除维度带来的影响,所以还要除以。
然后经过归一化得到,代表归一化normalized。
则重构为。其余依次类推。
以上就是transformer做得内容了。transformer作为一个backbone,可以广泛地运用到其他领域。
比如在计算机视觉中的应用,即Vision Transformer(Vit)。
Vit论文:https://arxiv.org/abs/2010.11929
Vit代码:https://github.com/google-research/vision_transformer
计算机视觉中很重要一点就是感受野,transformer提高了感受野,使得网络有观察全局的能力。
首先是需要将图像转化成一个个向量,这很简单。
只需要将图像分割成一块块,然后全连接就行了。
那么输入解决了,直接套用transformer就行了吗?
不是的。因为这样子就丢失了位置信息。
因为不论你分割完怎么排列,最后每个向量算出来的结果都是一样的。
而在图像中位置信息非常重要,分割完的每一块都有其特定的位置。
所以需要进行位置编码,将位置信息融入进去。
位置编码有一维的,例如把图片按1、2、3、…排列,
位置编码有二维的,例如把图片按坐标(1,1)、(1,2)、…排列,
理论上应该是二维编码效果比一维的好,但是论文中说实验表明,两者差不多。
不太符合直观感受,因为理论上“(2,1)和(1,1)” 比 “4和1”更能表示位置信息。
另外它还增加了一个0,添加进去一起训练,用于最终预测结果,如上图左侧。
总结一下transformer和cnn差别,
transformer增加了感受野,少层就能捕获到全局信息。而cnn需要多层堆叠,才能获得全局信息。
所以transformer对整副图像的特征提取就做得很好,在很多网络中都表现很好。
但是研究表明,transformer需要的数据量很大。
补充一下Multi-Head Attention。
简单来讲就是不同的东西对同一个东西的注意力是不一样的,
所以我们最好就是参考很多(Multi)东西对同个东西的注意力。
不同的初始化权重对应不同的,不同的对应不同输出。
我们要做的就是初始化多组用多组不同的输出,拼接,然后全连接。
这样子最终的输出就包含不同的对应的注意力的信息了,就会更全面。
其实就跟卷积使用多个卷积核是一样的道理。