自注意力机制(Self-attention)-深度学习-台湾大学李宏毅

模型输入

无论是预测视频观看人数还是图像处理,输入都可以看作是一个向量,输出是一个数值或类别。然而,若输入是一系列向量(序列),同时长度会改变。
在这里插入图片描述

文字处理

把句子里的单词都描述为向量,那么模型的输入就是一个向量集合,并且每个向量集合的大小都不一样。
在这里插入图片描述
将单词表示为向量

One-hot Encoding(独热编码)

向量的长度就是世界上所有词汇的数目,用不同位的1(其余位置为0)表示一个词汇,如下所示:
在这里插入图片描述
在实际情况中,文本中很可能出现成千上万个不同的词,这时候向量就会非常长。其中99%以上都是 0。

这种表示方式默认了所有词汇间没有任何关系,猫和狗都是动物这种关系在向量集中体现不出来,里面没有任何有意义的信息。

one-hot 的缺点如下:

  • 无法表达词语之间的关系
  • 这种过于稀疏的向量,导致计算和存储的效率都不高

one hot representation编码的每个单词都是一个维度,彼此independent。

Word Embedding

给单词一个向量,这个向量有语义的信息,一个句子就是一排长度不一的向量。将Word Embedding画出来,就会发现同类的单词就会聚集,因此它能区分出类别:
在这里插入图片描述

万物皆可Embedding之Word Embedding

语音处理

取一段语音信号作为窗口,可以将10ms内的信息描述为一个向量(帧),滑动这个窗口就得到这段语音的所有向量(一个向量集)。

在这里插入图片描述

Graph

社交网络的每个节点就是一个人,节点之间的关系用线连接。每一个人就是一个向量。
在这里插入图片描述
分子上的每个原子就是一个向量(每个元素可用One-hot编码表示),分子就是一堆向量。
在这里插入图片描述

模型输出

按照输入向量与输出标签的数量关系,可以分为一对一、多对一及多对多。

类型一:一对一(Sequence Labeling)

每个输入向量对应一个输出标签。
在这里插入图片描述

文字处理:词性标注(每个输入的单词都输出对应的词性)。
语音处理:一段声音信号里面有一串向量,每个向量对应一个音标。
图像处理:在社交网络中,推荐某个用户商品(可能会买或者不买)。
在这里插入图片描述

类型二:多对一

多个输入向量对应一个输出标签。

在这里插入图片描述
语义分析:正面评价、负面评价。
语音识别:识别某人的音色。
图像:给出分子的结构,判断其亲水性。

在这里插入图片描述

类型三:多对多(由模型自定seq2seq)

不知道应该输出多少个标签,机器自行决定。
在这里插入图片描述

翻译:语言A到语言B,单词字符数目不同
语音识别

一对一类型:序列标注问题 - 无上下文信息

序列标注:Sequnce Labeling

利用全连接网络,输入一个句子,输出对应单词数目的标签。

在这里插入图片描述

问题:当一个句子里出现两个相同的单词,并且它们的词性不同(例如:I saw a saw. 我看见一把锯子)。期望模型
输出第一个saw为动词,第二个saw为名词,但是这种结构的神经网络不可能做到。

解决方法一:滑动窗口相邻向量信息

解决:让神经网络考虑上下文,利用滑动窗口,每个向量查看窗口中相邻的其他向量的性质。

考虑整条语句分析的情况,需要获取整条语句的词汇信息,需要滑动窗口包含语句所有词汇的向量,这样会导致全连接神经网络的参数暴增,进而导致超大运算量甚至是过拟合。

所以,这种方法不能解决整条语句的分析问题,即语义分析。这就引出了 Self-attention 技术。

解决方法二:全连接网络(Fully Connected Network)

既然是寻找上下文关系,为什么不使用全连接网络?

运算量大&容易过拟合

考虑训练集中最长的语句的长度作为滑动窗口的尺寸,这意为着Fully Connected Network需要大量参数,运算量很大,而且容易overfitting。

解决方法三:Self-attention

输入整个语句的向量到self-attention中,输出相等个数的向量,且输出的每个向量都考虑输入的整个语句向量集的信息。

在这里插入图片描述

输入整个语句的向量到self-attention中,输出对应个数的向量,再将其结果输入到全连接网络,最后输出标签。以上过程可多次重复,fully connected network 与 self-attention 交替使用:

在这里插入图片描述

Google 根据自注意力机制在论文 Attention is all you need 中提出了 Transformer 架构,注意力机制在该论文之前就已经存在,但是,是在Attention is all you need论文中将注意力机制称为Self-attention,并使其发扬光大。

self attention :专注整个序列的信息。FC:专注某个位置的信息

Self-attention

在这里插入图片描述

a表示输入层或隐藏层,每个输出b与所有输入a都相关。

如何保证每个输出都能分析所有输入上下文? - 关联度

在这里插入图片描述

α 表示a1与a4的关联程度。又称为 attention score。

在类似语义分析的任务场景中,每个输出b都需要分析所有a,但是使用滑动窗口又会导致参数量暴增,所以需要根据a1找出输入向量集中 哪些向量与 ’ 判断a1的类别 ’ 相关。

如何确定两个输入向量的关联程度α?- 计算关联度的模组(Dot-product & Additive)

additive attention与dot-product attention
在这里插入图片描述

计算关联度的模组很多,输入两个[输入向量],输出两个[输入向量]的关联程度。

Dot-product(transformer中的方法)

在这里插入图片描述

Additive

在这里插入图片描述

Self-attention 如何利用 Dot-product 计算出关联度?

在这里插入图片描述

注意:a1与自己也要计算关联程度。

【待补充】a1与自己计算关联程度的重要性?

在这里插入图片描述

a i , j a_{i,j} ai,j表示两个输入向量的关联程度,通过 q i q^{i} qi k j k^{j} kj的内积运算得到,其中i表示 q i q^{i} qi是由 a i a_{i} ai计算出来的,j表示 k j k^{j} kj是由 a j a_{j} aj计算出来的

计算出相关性之后,可加一层softmax层(也可以加别的激活函数,比如ReLu)。

在这里插入图片描述

注: b i ( 1 ≤ i ≤ 4 ) b^i ( 1 ≤ i ≤ 4 ) bi(1i4) 是同时计算出来的

如何基于关联度抽取信息?- 加权求和

在这里插入图片描述

哪个 a i , j ′ × v i a^{\prime}_{i,j} \times v^{i} ai,j×vi更大,哪个attention score更大,就更能决定结果 b 1 b^{1} b1

在这里插入图片描述

Self-attention 原理

这里需要三个向量:Query,Key,Value。超详细图解Self-Attention
在这里插入图片描述

在这里插入图片描述

注意: K T Q K^TQ KTQ的结果A,需要经过SoftMax处理。
在这里插入图片描述

在这里插入图片描述
上述过程可以总结为:

输入矩阵 I I I分别乘以 W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv得到三个矩阵Q,K,V
A = K T Q A = K^TQ A=KTQ,经过激活函数处理得到注意力矩阵 A ′ = s o f t m a x ( K T Q d k ) A' =softmax \bigl({\frac{K^{T}Q}{\sqrt{d_{k}}}}\bigr) A=softmax(dk KTQ)
输出 O = V A ′ O = VA' O=VA
即:
A t t e n t i o n ( Q , K , V ) = V ⋅ s o f t m a x ( K T Q d k ) Attention(Q,K,V)=V \cdot softmax \bigl({\frac{K^{T}Q}{\sqrt{d_{k}}}}\bigr) Attention(Q,K,V)=Vsoftmax(dk KTQ)
其中, d k \sqrt{d_k} dk 为向量长度。唯一需要训练的参数就是 W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv

注意力系数计算

  • 阶段1:根据Query和Key计算两者的相似性或者相关性
  • 阶段2:对第一阶段的原始分值进行归一化处理或ReLU
  • 阶段3:根据权重系数对Value进行加权求和,得到Attention Value

所有输入向量中,谁的 attention score 大,谁就能决定Attention Value,即b。

具体计算参考:动手推导Self-Attention

在这里插入图片描述

多头注意力机制 (Multi-head Self-attention)

为什么需要多种注意力?- 相关性可能有多种

有些任务(例如:翻译、语音辨识等)中,multi-head会得到更好的结果。

之前的例子,都是用Q去找K,来计算相关性。但是两个事物之间相关性可能有多种不同的类型。因此设置多种Q(head),多种K(Key),多种V(Value),不同的Q来负责不同的相关性。

head的个数是超参数。

如何计算多头注意力中的相关性?- 按相关类型计算

所有 b i , j b^{i,j} bi,j单独计算,同时得出。比如 b i , 1 , b i , 2 , b i , 3 b^{i,1},b^{i,2},b^{i,3} bi,1,bi,2,bi,3单独计算同时得出。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如上述公式,放在Multi-head的情况下,输入还是Q,K,V,输出是不同head的输出的拼接结果,再投影到 W 0 W^0 W0。其中,对每一个head,可以将Q,K,V通过不同的可学习的参数 W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV投影到一个低纬上面,再做注意力函数attention,最后输出结果。

Query,Key,Value首先经过一个线性变换,然后输入到放缩点积Attention,注意这里要做h次,其实也就是所谓的多头,每一次算一个头。而且每次Q,K,V进行线性变换的参数W是不一样的 W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV。然后将h次的放缩点积attention结果进行拼接,再进行一次线性变换得到的值作为多头attention的结果。

注意力机制问题:没有位置信息

在语义分析任务中,对于Self-attention来说,并没有序列中字符位置的信息。之前的计算过程中,字母右上角出现的数字,与位置信息无关,只是为了讲解而标注的。

为什么需要位置信息?- 位置信息很重要

在语义分析任务中,例如动词是不太可能出现在句首的,因此可以降低动词在句首的可能性,但是自注意力机制并没有该能力。因此需要加入 Positional Encoding 的技术来标注每个词汇在句子中的位置信息。

如何为Self-attention添加位置信息?- Positional Encoding

每一个不同的位置都有一个专属的向量 e i e^i ei,然后再做 e i + a i e^i + a^i ei+ai的操作,之后的计算看到 e i e^i ei就知道 a i a^i ai的位置是i。

如何表示位置信息 e i e^i ei? - 人工标注 & 数据集训练

**blog.csdnimg.cn/b24dd93581c945ce98adec037a17f223.png)**

人工标注表示位置信息

如下图所示,在attention is all you need论文中, e i e^i ei为图中的一列。

在这里插入图片描述

这样 e i e^i ei是人工标注(hand-crafted)的。就会出现很多问题:在确定 e i e^i ei的时候只定到128,但是序列长度是129。在最早的论文 attention is all you need中是没有这个问题的,它通过某个规则(sin、cos函数)产生。

位置编码如何表示更好?是一个待研究的问题。

训练集训练

位置编码可以自定义表示方法,也可以通过对训练集学习来得出。

下图展示的是几种位置表示方法的效果。

在这里插入图片描述

自注意力机制的应用

Transformer 、BERT 模型用到了自注意力机制。
在这里插入图片描述

Self-attention 还可以用在除NLP以外的问题上:语音处理,图像处理。

语音处理

问题:超大输入序列导致复杂度很高 - Truncated Self-attention

attention matrix复杂度是输入向量个数的平方,在语音处理任务中,假设一个向量表示10ms内的语音信息,那么一段语音将由上千个向量组成,这将导致语音处理任务的计算量很大,并且需要很大的存储空间记录计算信息。
在这里插入图片描述

针对该问题,提出了 Truncated Self-attention 思想。计算注意力时,只关注小范围(自定义)上下文信息,而不是整句的上下文信息,加快运算速度,节省存储空间。

在这里插入图片描述
考虑多大范围内的上下文信息,视任务而定。

图像处理

使用CNN时,一张图片可看做一个很长的向量。

一张图片也可看做一组向量:一张5∗10的RGB图像可以看做5∗10的三个(通道)矩阵,把一个像素的三个通道数值看作一个三维向量

在这里插入图片描述

既然一张图片可以看做一组向量,那么也可以使用self-attention进行图像处理。例如:GAN、DETR。

在这里插入图片描述

Self-attention Vs CNN

CNN只考虑感受野中的信息。Self-attention考虑整张图片的信息。

在这里插入图片描述

CNN是简化版的Self-attention。Self-attention是复杂化的CNN。CNN中感受野的大小是自定义的,Self-attention中使用attention找出相关的像素,这些相关的像素可以看作是自动学习得到的“感受野”。

在论文On the Relationship between Self-Attention and Convolutional Layers中,用数学严谨的证明了CNN就是self-attention的特例,self-attention只要设置合适的参数可以做到CNN同样的效果。

在这里插入图片描述

如果用不同的数据量来训练CNN和self-attention,会出现不同的结果。大模型self-attention弹性大,需要更多的训练数据,如果用少量数据训练,容易出现过拟合;而小的模型CNN弹性小,在少量数据集上不容易出现过拟合,但在大数据集

在这里插入图片描述

相关论文:An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale

Self-attention Vs RNN

在这里插入图片描述

1、RNN中,如果想让后面的RNN考虑前面RNN的输入,就需要memory保存前面RNN的输入。而self-attention中每一个输出都分析了所有输入的信息。

2、RNN中,不能平行处理数据,每一层RNN只考虑前一层的输出。而self-attention中可以平行处理数据,同时计算注意力并得到输出。

3、可以使用双向RNN实现跟self-attention一样考虑所有input sequence的功能。但是,即使使用双向RNN,上图中最右FC(黄)想考虑最左输入(蓝),需要memory保存最左输入,一直保存传递到最右FC。

因此很多的应用逐渐把RNN的架构改为Self-attention架构。

在论文Transformers are RNNs: Fast autoregressive transformers with linear attention中,详细介绍了Self-attention 与 RNN的关系,self-attention加上其他结构可等效于RNN。

Self-attention 应用图论(GNN)

GNN:Graph Neural Network

将图中使用Self-attention,图中顶点的关联关系不需要经过学习得到,关联关系可以直接根据边得到。

在这里插入图片描述

Self-attention 众多变形

自注意力机制的缺点就是计算量非常大,因此如何优化其计算量是未来研究的重点,所以出现了很多Self-attention的变形。
在这里插入图片描述

以下论文中,分析了多种self-attention的变形。

Long Range Arena: A Benchmark for Efficient Transformers

Efficient Transformers: A Survey

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值