注意力机制原理

众所周知,智能工作的过程可以比喻为数学上的拟合,通过学习:以往卖出的房子的价格与地皮大小的关系,去拟合一个房价与地皮大小的函数,从而我们能输入一个地皮大小,知道这个房子大约在什么价格。

注意力机制也是类似的原理。

注意力机制中有三个重要概念:query,key,value

query就是:我们输入的,希望去预测房价的,地皮大小

key对应过去就是:训练用的地皮大小数据集

value是:对应的房价数据

当我们拿到了地皮与其对应的房价,自然而然我们就可以去拟合一个函数,让后面输入的地皮,找到它大概的房价,一般来说我们可以通过观察数据集在坐标系中的形状,选择线性还是非线性拟合。

注意力机制原理

而对于注意力机制,则选择了一个更简单粗暴的形式:

假如训练集中有这样一组数据:地皮大小80平时,房价80万;地皮大小100平时,房价120万;地皮大小130平时,房价200万。

而我们希望知道地皮大小90平的房价,那么最一般的思维就是折个中,90平的价格应该在80平与100平之间,是80+1202=100万,显然这样拟合的话没有考虑到别的数据,我们应该把别的数据,那个130平200万的也该考虑进来。

但是显然,你卖东西定价格的时候,你卖大概价值2块钱的笔,没多大必要去参考那些20甚至100块的高级笔,你只需要看看那些卖的价值跟你差不多的笔怎么定的价格,他们卖的笔跟你差不多,价格都是1.5、3块,你卖2块就行了。

同理:对于那些 ”远离“我们的参考数据,如130平差了90平整整40平,我们不太需要过多参考它的价格,对于离我们的数据,我们要着重参考它们

这里的 “远近”,无疑是相似度的概念:以前80平的房子卖了80万,那么如果新一批房子还是80平,那么显然也该卖80万。希望预测的地皮大小和训练数据的地皮也接近,就越能参考训练数据的房价

我们再考虑一下价格,我们更看重80与100的数据,对于130的数据不太看重,那么我们分配的参考权重分别是0.45、0.45、0.1,那么价格就是:80×0.45+120×0.45+200×0.1=110万,参考了所有的数据,这样拟合就更合理一些。

计算注意力分数

注意力机制中计算注意力分数的加性模型、点积模型、缩放点积模型,就是在多维空间中,计算“远近”的方法:
对于一维:5离3和6谁更近,做个加减就行

对于二维:(1,1)离(0,0)和(-3,-3)谁更近,我们得求一下距离

同理继续加维度,我们就是求的高维度上的“距离”概念,或者说输入与训练数据是否“相似”

本质上可以说是去算各个key与query的关系,然后根据关系分配权重。

自注意力机制原理

自注意力机制,一言以蔽之,就是把训练数据的输入:key与value,全部换成了query。

后面计算的注意力分数,就是自己各个部分与自己各个部分比较相似度(可以理解为(1,2)中的1与2分别与1,2去比较相似度),从而计算出分数。

显然还有问题,如果说注意力机制通过前人的数据去学习拟合,那么自注意力机制自己和自己比较相似度,是在算什么呢?

假如有一个句子”What a cute cat”,当我们利用注意力机制去翻译时,我们就是在寻找输入里面是否有和这个句子相似的句子与翻译,假如有训练数据:”What a cute dog”-“多么可爱的狗”和“A cat”-“一只猫”,当我们翻译“What a cute…”时,注意力机制显然更注意前一句,当翻译到cat时,注意力就要更注意后一句了。

但我们利用自注意力机制时,在算什么?让我们从实现开始:

实现

当我们使用自注意力机制时,第一步就是把输入的query赋予key和value,然后三者向量化。变换为向量才能计算。

第二步就是计算注意力分数了,这里使用点积计算。

显然,点积是数学的方法,如果query不变的话,每一次计算都是同一个结果,我上面提到的最简陋的注意力机制还会因为训练数据的不同拟合出不同的注意力分数,而这里似乎不会变化、学习?我们不断的投入数据,这个自注意力机制竟然没有训练东西?

没错,“向量化”,我们在把数据向量化时,还会经过全连接层等手段去变换,q、k、v三者通过不同的全连接层,通常会变成不同的向量。

当我们不断投入训练数据时,训练的就是数据变换为向量的过程,怎样变换向量,让最后的点积计算出来的注意力分配合理。

但在一般实现中,注意力机制也会有向量化的过程。那么区别在哪?

打个比方:自注意力机制的训练,就像寻找”What a cute cat”中词与词的关系(自己内部的联系),经过训练,发现a dog中可以用dog替换cat,因为两者有相似的关系

而注意力机制的训练,则是比较输入一个个词和训练数据的差异,来翻译。