机器学习第十一周周报

文章总结了自注意力机制的不同类别,包括回顾、局部注意力、全局注意力。自注意力通过建模序列内元素间依赖关系,改善了长距离依赖的捕捉。局部注意力提高计算效率,而全局注意力考虑整个序列。文章探讨了不同策略来优化计算效率,如聚类和选择性计算,以及替代注意力机制的可能性。
摘要由CSDN通过智能技术生成

摘要

自注意力机制在自然语言处理领域的革新已显著提高了各种任务的性能。自注意力机制的目的是让程序注意到整个输入中不同部分之间的相关性,用来解决全连接神经网络对于多个相关的输入无法建立起相关性的问题。自注意力能够对序列中元素之间的依赖关系进行建模,从而实现更有效的上下文感知表示。该机制为序列中的元素分配不同的权重,有效捕获长距离依赖关系,并缓解传统循环神经网络中遇到的问题。本周将基于前几周学习的自注意力机制的知识,对自注意力机制类别进行总结。

Abstract

The innovation of self-attention in the field of natural language processing has significantly improved the performance of various tasks. The purpose of the self-attention is to make the program pay attention to the correlation between different parts of the whole input, and to solve the problem that the fully connected neural network can not establish the correlation for multiple related inputs. Self-attention can model the dependencies between elements in a sequence, so as to achieve more effective context-aware representation. The self-attention assigns different weights to the elements in the sequence, effectively captures long-distance dependencies, and alleviates the problems encountered in traditional cyclic neural networks. This week, we will summarize the categories of self-attention based on the knowledge of self-attention learned in previous weeks.

一、自注意力机制类别总结

1.回顾

先回顾之前学习的self-attention。
假设输入序列长度是N,为了捕捉每个value或者token之间的关系,需要对应产生N个key与之对应,并将query与key之间做dot-product,就可以产生一个Attention Matrix(注意力矩阵),维度N*N。这种方式最大的问题就是当序列长度太长的时候,对应的Attention Matrix维度太大,会给计算带来麻烦。
对于transformer来说,self-attention只是大的网络架构中的一个module。由上述分析我们知道,对于self-attention的运算量是跟N的平方成正比的。当N很小的时候,单纯增加self-attention的运算效率可能并不会对整个网络的计算效率有太大的影响。因此,提高self-attention的计算效率从而大幅度提高整个网络的效率的前提是N特别大的时候,比如做图像识别。
在这里插入图片描述
如何加快self-attention的求解速度呢?根据上述分析可以知道,影响self-attention效率最大的一个问题就是Attention Matrix的计算。如果我们可以根据一些人类的知识或经验,选择性的计算Attention Matrix中的某些数值或者某些数值不需要计算就可以知道数值,理论上可以减小计算量,提高计算效率。

2.local attention

举个例子,比如我们在做文本翻译的时候,有时候在翻译当前的token时不需要给出整个sequence,其实只需要知道这个token两边的邻居,就可以翻译的很准,也就是做局部的attention(local attention)。这样可以大大提升运算效率,但是缺点就是只关注周围局部的值,这样做法其实跟CNN就没有太大的区别了。
在这里插入图片描述
如果觉得上述这种local attention不好,也可以换一种思路,就是在翻译当前token的时候,给它空一定间隔(stride)的左右邻居,从而捕获当前与过去和未来的关系。当然stride的数值可以自己确定。
在这里插入图片描述

3.global attention

还有一种global attention的方式,就是选择sequence中的某些token作为special token(比如标点符号),或者在原始的sequence中增加special token。让special token与序列产生全局的关系,但是其他不是special token的token之间没有attention。以在原始sequence前面增加两个special token为例:
在这里插入图片描述
到底哪种attention最好呢?
对于一个网络,有的head可以做local attention,有的head可以做global attention
这样就不需要做选择了
下面几个例子:

  • Longformer就是组合了上面的三种attention
  • Big Bird就是在Longformer基础上随机选择attention赋值,进一步提高计算效率

上面集中方法都是人为设定的哪些地方需要算attention,哪些地方不需要算attention,但是这样算是最好的方法吗?
并不一定。对于Attention Matrix来说,如果某些位置值非常小,我们可以直接把这些位置置0,这样对实际预测的结果也不会有太大的影响。也就是说我们只需要找出Attention Matrix中attention的值相对较大的值。但是如何找出哪些位置的值非常小/非常大呢?
下面这两个文献中给出一种Clustering(聚类)的方案,即先对query和key进行聚类。属于同一类的query和key来计算attention,不属于同一类的就不参与计算,这样就可以加快Attention Matrix的计算。比如下面这个例子中,分为4类:1(红框)、2(紫框)、3(绿框)、4(黄框)。在下面两个文献中介绍了可以快速粗略聚类的方法。
在这里插入图片描述
在这里插入图片描述
有没有一种将要不要算attention的事情用learn的方式学习出来呢?
有可能。我们再训练一个网络,输入是input sequence,输出是相同长度的weight sequence。将所有weight sequence拼接起来,再经过转换,就可以得到一个哪些地方需要算attention,哪些地方不需要算attention的矩阵。有一个细节是:某些不同的sequence可能经过NN输出同一个weight sequence,这样可以大大减小计算量。
上述我们所讲的都是N*N的Matrix,但是实际来说,这样的Matrix通常来说并不是满秩的,也就是说我们可以对原始N*N的矩阵降维,将重复的column去掉,得到一个比较小的Matrix。
在这里插入图片描述
具体来说,从N个key中选出K个具有代表的key,每个key对应一个value,然后跟query做点乘。然后做gradient-decent,更新value。
为什么选有代表性的key不选有代表性的query呢?因为query跟output是对应的,这样会output就会缩短从而损失信息。
怎么选出有代表性的key呢?这里介绍两种方法,一种是直接对key做卷积(conv),一种是对key跟一个矩阵做矩阵乘法。
在这里插入图片描述

4.自注意力机制计算

之前学习过自注意力机制计算的过程,self-attention还可以用另一种方法来看待。这个计算的方法跟原来的self-attention计算出的结果几乎一样,但是运算量会大幅度减少。简单来说,先找到一个转换的方式φ(),首先将k进行转换,然后跟v做dot-product得到M维的vector。再对q做转换,跟M对应维度相乘。其中M维的vector只需要计算一次。
在这里插入图片描述
b1计算如下:
在这里插入图片描述
b2计算如下:
在这里插入图片描述
可以这样去理解,将φ(k)跟v计算的vector当做一个template,然后通过φ(q)去寻找哪个template是最重要的,并进行矩阵的运算,得到输出b。

那么φ到底如何选择呢?不同的文献有不同的做法:
在这里插入图片描述
在计算self-attention的时候一定需要q和k吗?
不一定。在Synthesizer文献里面,对于attention matrix不是通过q和k得到的,而是作为网络参数学习得到。虽然不同的input sequence对应的attention weight是一样的,但是performance不会变差太多。
attention的价值到底是什么?处理sequence一定要用attention吗?可不可以尝试把attention丢掉?
有没有attention-free的方法?下面有几个用mlp的方法用于代替attention来处理sequence。
在这里插入图片描述

5.总结

下图中,纵轴的LRA score数值越大,网络表现越好;横轴表示每秒可以处理多少sequence,越往右速度越快;圈圈越大,代表用到的memory越多(计算量越大)。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值