注意力机制
看完李沫讲解的Transformer,写一些笔记。只看了注意力机制而不是Transformer本身。
注意力层
输入一个(多个)请求query和许多对key和value(都是一维向量),使用某种相似度计算函数,查询出与query最相似的key对应的value的值。不同的相似度计算方法衍生出不同的注意力机制。
| # Scaled Dot-Product Attention 最简单的注意力机制,“缩放后的内积注意力”,其query和key拥有相同的长度,value的长度是(由此可知输出的向量长度就是)。此方法将query和key的内积作为相似度,即,query与所有key中内积较大的相似度高,内积较小的相似度低。 具体的计算方法是,将query与每一个key做内积,得到的每一个相似度进行“缩放”后使用[[多分类问题#softmax回归算法|softmax]]对所有相似度进行归一化,使用归一化相似度对value进行加权求和则得到最终的输出。实际使用中使用公式如下 其中Q为长度为的查询向量,而K为的矩阵(n为key的个数),这里使用这样的矩阵乘计算query与每一个key的内积,得到一个长度为n的相似度向量,接着除以进行缩放,经过softmax归一化后与value矩阵V相乘以完成加权求和操作。V为一个的矩阵。 当然,更进一步,如果有许多个查询向量,那么Q就是一个查询向量矩阵,计算方法还是一样的。 |
| 之所以需要除以进行缩放,是因为在较大时,内积得到的相似度可能较大,使得softmax函数在输入都偏大,导致梯度消失。所以除一下。 |
多头注意力机制
注意力机制中,所有的Q,K,V都是输入,这意味着,没有可以用于学习的权重(啊这)。所以引入多头注意力机制,首先使用个线性层将Q,K,V投影到低维,再使用个注意力层计算出value,直接将这些value拼接起来,再通过一个线性层投影得到最终结果。 其中这些线性层的参数是可以训练的,取的h越多,模型可能学到的不同映射方法就越多(Transformer中使用的)。在实际上实现的时候可以先拼接Q,K,V,用一个线性层投影得到Q,K,V三个各自的h个不同投影(一次乘以h个不同的矩阵,可以借用batch来实现),再拆分进行Attention操作。
自注意力机制
Transformer使用的就是自注意力机制,即将输入既作为Q,又做为K,又做为V,当然因为内部是多头注意力机制所以进行缩放和内积前对Q,K,V进行了投影操作。可以看出,通过合理设置线性层的大小,自注意力层的输入和输出的大小可以是完全一样的。这就是在Transformer中的情况,输入为n个长度为词向量组成的的矩阵,则其Q,K,V也是同样的,输出大小也相同(也许是为了加上残差连接)。
注意力机制
https://9-extra.github.io/2023/05/05/注意力机制/