【第十周】李宏毅机器学习笔记08:各种各样的Attention

摘要

本周主要学习了除了 Self-attention 之外的各种 attention 机制,包括 Local Attention 、Stride Attention 和 Global Attention 等,每种不同的 attention 机制都适应于不同场景的任务。在多头注意力机制中,通常不同的头采取不同的注意力机制,充分利用了多种注意力机制的优点。除此之外还学习了可以让机器自己学习应该计算哪个部分注意力的机制,机器将输入序列传入一个新的神经网络,经过训练后生成一个矩阵来标记哪一部分的注意力应该被计算。最后,学习了怎么减少注意力矩阵中的冗余信息以及减少计算的复杂度。

Abstract

This week, I mainly studied various attention mechanisms other than self-attention, including Local Attention, Stride Attention, and Global Attention, among others. Each different type of attention mechanism is suited for tasks in different scenarios. In multi-head attention mechanisms, it’s common to use different attention mechanisms in each head, thereby taking full advantage of the benefits of multiple attention mechanisms. Additionally, I learned about mechanisms that allow machines to learn which parts of the attention should be calculated. The input sequence is fed into a new neural network, which generates a matrix marking which parts of the attention should be computed. Finally, I studied how to reduce redundancy in the attention matrices and decrease computational complexity.

1.各种各样的Attention

在这里插入图片描述

Attention不仅只有Self-attention一种,还有各种各样的变化。

在这里插入图片描述

传统的 self-attention 需要对输入序列的每个向量求 query 矩阵和 key 矩阵,然后再把他们俩俩做点乘得到 attention score,再把它们通过一个 softmax函数构成的N×N矩阵称为 attention matrix。在输入序列特别长的情况下,attention matrix 可能会非常的大,计算量与 N 2 N^2 N2 成正比。为了解决这个痛点衍生出了许多不同的 attention 机制。

在这里插入图片描述

Self-attention 只是网络结构中的一个组件,上图红圈的地方其实也不一定要采用 self-attention,也可以采用其他的 attention 机制。但是,在 transformer 里,feed forward 层中的计算量要比 attention 层中的要大得多,采用其他 attention 机制的收益其实并不大。

1.1.Skip Some Calculations with Human Knowledge

在这里插入图片描述

Attention 机制最大的一个痛点是要计算一个 N×N 的矩阵,为了减少运算量,我们可以只计算矩阵中的一部分内容而不需要计算出整个矩阵的内容。

1.1.1.Local Attention/Truncated Attention

在这里插入图片描述

比如在某些问题中,我们只需要求得相邻序列的 attention score 就能完成任务,而不需要求整个 attention 矩阵。如上图所示,灰色部分直接设为0,我们要计算的其实只有主对角线的蓝色部分。但是这种方法只能感知到相邻信息的资讯,实际上和CNN很相似,不如直接使用CNN。因此,local attention 虽然可以加快 attention matrix 的计算,但是不一定会得到一个非常好的结果。

1.1.2.Stride Attention

在这里插入图片描述

也可以采用 stride attention 机制来解决 local attention 只关注相邻序列的问题。可以求相邻两个单位或者一个单位的 attention matrix。如上图,灰色部分都置0,而绿色部分就是要求的 attention score。

1.1.3.Global Attention

在这里插入图片描述

Global attention 中通常会寻找几个 special token。例如可以把一个序列的前两个 token 当做 special token,或者直接插入两个新的 token 来当做 special token。在这个例子中,属于special token 的 query 可以 attend 到所有的 key,同理,所有的 query 都能 attend 到属于 special token 的key。此时灰色区域置为0,序列中的任意两个 token 是通过 special token 来交换信息的。

1.1.4.Using Multiple Attentions Simultaneously

在这里插入图片描述

对于各种各样的 attention patterns,到底采用那种才好吗?实际上我们可以全部都采用,在 multi-head attention 层中,我们可以让不同的 head 使用不同的 patterns。

在这里插入图片描述

比如Longformer 就是使用了 local attention 、stride attention和 global attention。而Big Bird实际上就是longformer + random attention。

1.1.5.Focus on Critical Parts

在这里插入图片描述

在一个 attention matrix 中,attention score 有高有低,低的地方说明注意力得分小,对结果的影响不大,为了降低计算量可以直接置为0。

所以,我们要怎么样找到注意力权重比较小的部分呢?

在这里插入图片描述
我们可以采用 clustering 的技术,把相近的 query 和 key 分为同一类。

在数据科学和机器学习中,“clustering”(聚类)是一种无监督学习技术,用于将一组数据对象分成若干个组或簇(clusters),使得同一个簇内的对象彼此相似,而不同簇的对象彼此相异。聚类的目标是在未标记的数据集中发现内在的结构或模式。

在这里插入图片描述

只用处于同样的类里我们才计算它们的注意力得分,而其他地方全部置为0,这样就可以加快这个矩阵的计算。

1.2.Learnable Patterns

先前提到的内容都是人们用所学知识来决定哪一块需要计算 attention score,那么我们能不能让机器自己学习来决定要计算 attention score 的区域呢?

在这里插入图片描述

我们需要生成一个矩阵,其中蓝色方块用1表示,白色方块用0表示。这个矩阵代表 attention matrix 中需要计算 attention score 的位置。

在这里插入图片描述

我们可以让输入序列通过一个神经网络,生成一个和序列长度一样的 vector。把所有生成出来的 vector 拼起来之后也要形成一个 N×N 的矩阵。这个矩阵就可以通过某种方法等到一个标记计算 attention score 位置的矩阵。

1.3.Reduce Redundancy in Attention Matrix

在这里插入图片描述

实际上,我们并不总是需要计算一个完整的 attention matrix。如上图所示,对于一个 attention matrix,假设各个深色位置的 value 是相同的,在这个矩阵中就存在许多冗余的信息,我们仅需计算上图右侧的矩阵即可。

在这里插入图片描述

具体的做法就是我们在 key 序列中挑选出来 K 个具有代表性的 key 向量,这样子求得的注意力矩阵大小只有 N×K ,减少了计算量。然后再挑选出 K 个具有代表性的 value 向量,将注意力矩阵中的每一行分别与K 个 value 向量进行线性组合就可以到得到输出向量。

那么,我们为什么不挑出k个具有代表性的query向量,使得attention matrix 更小呢?

实际上这个操作是可行的,但是要针对不同的任务进行改变。由于 output 序列的长度和 query 序列的长度是一直的,假设 query 序列只挑选其中几个向量进行计算,那么输出序列也会减少。对于那种输入n个向量后输出n个label的任务来说,显然是不可行的。

1.4.Reduce Number of Keys

在这里插入图片描述

挑选出具有代表性的 key 序列主要有以下几种办法:1.将这个序列通过一个 CNN 后序列会变短,留下来的几个向量就是具有代表性的向量;2.将这个序列再乘上一个 N×K 的矩阵,实际上最后得到的 K 个向量就是对原向量组的 K 个不同的线性组合。

1.5.Reduce Computational Complexity

在这里插入图片描述

Attention matrix 的计算如上图所示,假设我们先忽略softmax 函数。

在这里插入图片描述

在线性代数中,矩阵乘法是满足结合律的,无论先算后两个矩阵相乘还是前两个矩阵相乘,最后得到的结果是一样的。但是,两者进行乘法运算的次数是不同的。

在这里插入图片描述

对于先求后两个矩阵的方法来说,乘法运算的次数与 N 2 N^2 N2 成正比。

在这里插入图片描述

而对于先求前两个矩阵的方法来说,乘法运算仅与 N N N成正比,两者的计算量差距其实挺大的。

总结

Local Attention机制中,每个位置只考虑其附近的元素来进行注意力计算。这种方式降低了全局注意力机制所需的计算成本,因为它限制了查询(queries)可以访问的键值对(key-value pairs)的范围。Stride Attention使用步幅(stride)来跳过某些位置,从而减少需要进行注意力计算的位置数量。例如,在处理图像时,模型可能不会对每一个像素点都应用注意力机制,而是每隔几个像素点才应用一次。这种机制可以有效地减少计算量,并且在处理高维度数据(如图像或视频)时尤为有用,因为它可以帮助模型关注更高级别的特征,而忽略一些细节。相对于局部注意力,Global Attention允许每个位置考虑整个序列中的所有其他位置。这意味着在计算注意力权重时,查询可以访问所有的键值对。虽然这种方法提供了最大的上下文信息,但由于其需要计算序列中每一对元素之间的关系,因此它的计算成本也是最高的。Global Attention非常适合那些需要捕捉到输入数据之间长距离依赖的任务。在实际应用中,可能会根据任务需求组合使用这些机制。例如,在多头注意力机制中,可以设计使得某些头部采用局部注意力而另一些头部则使用全局注意力,以此来结合两者的优点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值