第十一周学习周报

目录

摘要

Abstract

自注意力机制

1.1 输入是向量序列的情况

1.1.1 举例说明

1.1.2 输入与输出数量相同

1.1.3 输入是一个序列,输出是一个标签

1.1.4 序列到序列

1.2 Self-attention的运作原理

1.3 Muti-head Self-attention

1.4  Positional Encoding

1.5 Many applications

总结


摘要

本周的主要学习内容是自注意力机制,在过去的学习中,神经网络的输入往往只有一个向量,当输入是多个向量时就需要用到自注意力机制。自注意力机制的核心思想是让模型在处理序列中的每个向量时,能够动态地关注序列中的其他向量,从而更好地捕捉序列中的各向量间的联系。在对self-attention的学习基础上进一步拓展学习到Muti-head Self-attention以及Positional Encoding。自注意力机制广泛应用于自然语言处理(NLP)任务,除此之外它在声音和影像处理中也同样适用。

Abstract

The main learning content of this week is the self-attention mechanism. In the past, the input of the neural network usually has only one vector. When the input is multiple vectors, the self-attention mechanism is needed. The core idea of the self-attention mechanism is to allow the model to dynamically focus on the other vectors in the sequence while processing each vector in the sequence, so as to better capture the connections between the vectors in the sequence. On the basis of self-attention learning, we further expand to Muti-head Self-attention and Positional Encoding. The self-attention mechanism is widely used in Natural Language Processing ( NLP ) tasks, and it is also applicable in sound and image processing.

自注意力机制

目前为止的学习中,不管是在预测观看人数的问题上,还是图像处理上,网络的输入都是一个向量,我们的输出可能是一个数值或者一个类别即regression和classification。当出现更复杂的情况时,例如输入的是多个向量甚至输入的向量数目是可以改变的时候,我们就需要使用到一个新的架构叫做self- attention。

1.1 输入是向量序列的情况

现在假设我们的输入会不一样,每次model输入的sequence的数目,sequence的长度都不一样,那这个时候应该要怎么处理?以下通过几个例子进行说明

1.1.1 举例说明

(1) 文字处理

假设要输入的是一个句子,每个句子的长度都不一样,每个句子里面词汇的数目也都不一样。如果我们把一个句子里面的每一个词汇都描用向量来表示,那我们的model的输入就会是一个vector set,而且这个vector set的大小每次都不一样,句子长度不一样,那你的vector set的大小就不一样。

把一个词汇表示成一个向量的最简单的做法是One-hot Encoding,即创建一个很长的向量使其可以容纳世界上所有的词汇。但是这样有一个十分严重的问题就是词汇之间是没有联系的,从这个向量里你看不出两个词汇之间的关系。

还有另外一个方法是Word Embedding,它会给每一个词汇一个向量,而这个向量是有语义的信息。如果你把word embedding画出来的话,所有的动物、植物、动词等可能会分别聚集成一团。Word Embedding会给每一个词汇一个向量。而一个句子就是一排长度不一的向量。

(2)声音信号

一段声音信号其实是一组向量。我们会把一段声音信号取一个范围,这个范围叫做一个窗口(window),把该窗口里面的信息描述成一个向量,这个向量称为一帧(frame)。通常这个窗口的长度就是25毫秒。 为了要描述一整段的声音信号,我们会把这个窗口往右移一点,通常移动的大小是10毫秒。

一段声音信号就是用一串向量来表示,语音其实是很复杂的。一小段的声音信号,它里面包含的信息量其实是非常可观的,所以声音信号也是一堆向量。

(3) graph

一个图(graph)也是一堆向量。

社交网络是一个图,在社交网络上面每一个节点就是一个人。每一个节点可以看作是一个向量。每一个人的简介里面的信息(性别、 年龄、工作等等)都可以用一个向量来表示。所以一个社交网络可以看做是由一堆的向量所组成的。

一个分子也可以看作是一个图。如果把一个分子当做是模型的输入,每一个分子可以看作是一个图,分子上面的每一个球就是一个原子,每个原子就是一个向量。每个原子可以用独热向量(One-hot vector)来表示。

通过以上几个例子的说明我们已经了解了什么是输入,模型的输入是一组向量,它可以是文字,可以是语音,可以是图。那输出是什么呢?输出的类型共有以下三种:

1.1.2 输入与输出数量相同

每一个向量都有一个对应的标签。当模型看到输入是 4个向量的时候,它就要输出 4个标签。如果是回归问题,每个标签是一个数值。如果是分类问题, 每个标签是一个类别。该类型的模型不需要去烦恼要输出多少的标签。输入是 4 个向量,输出就是 4 个标量。

什么样的应用会用到这一类型的输出呢?举个例子,在文字处理上,假设我们要做的是词性标注。机器会自动决定每一个词汇的词性,判断该词是名词还是动词还是形容词等等。这个任务并不是很容易,例如,现在有一个句子:I saw a saw,这句话的意思是我看到一个锯子,第二个saw 是名词“锯子”。所以机器要知道,第一个 saw 是个动词,第二个 saw 是名词,每一个输入的词汇都要有一个对应的输出的词性。这个任务就是输入跟输出的长度是一样的情况,属于第一个类型的输出。

如果是语音,一段声音信号里面有一串向量。每一个向量都要决定它是哪一个音标。如果是社交网络,给定一个社交网络, 模型要决定每一个节点有什么样的特性,比如某个人会不会买某个商品,这样我们才知道要不要推荐某个商品给他。

1.1.3 输入是一个序列,输出是一个标签

第二种可能的输出是整个序列只需要输出一个标签就好。

举例来说,输入是文字,比如情感分析。给机器看一段话, 模型要决定说这段话是积极的还是消极的。使用情感分析可以让机器自动去判别当一则贴文里面提到某个产品的时候,它是积极的还是消极的。给定一整个句子,只需要一个标签 (积极的或消极的)。给机器听一段声音,让其判断谁讲的这个声音。比如给定一个分子,预测该分子的亲水性等等。

1.1.4 序列到序列

第 3 个可能的输出是我们不知道应该输出多少个向量,机器要自己决定输出多少个向量。例如,输入是 N 个向量,输出可能是 N′ 个标签。N′ 是机器自己决定的。这种任务又叫做序列到序列的任务。

翻译就是序列到序列的任务,因为输入输出是不同的语言,它们的词汇的数量本来就不会一样多。真正的语音识别输入一句话,输出一段文字,其实也是一个序列到序列的任务。

1.2 Self-attention的运作原理

以序列标注(sequence labeling)为例。序列标注要给序列里面的每一个向量一个标签。解决序列标注的问题我们最先想到的就是使用全连接网络。虽然输入是一个序列,但可以不要管它是不是一 个序列,把每一个向量分别输入到全连接网络里面得到输出。

但是这种做法有非常大的不足,以词性标注为例,给机器一个句子:I saw a saw。对于Fully-connected Network,这个句子中的两个saw是同一个词汇。在全连接网络输入同一个词汇,它输出的内容也会是相同的。但实际上,我们希望第一个saw要输出动词,第二个saw要输出名词。

为解决这个问题我们可以把每个向量的前后几个向量都联系起来一起输入到全连接网络,以此可能让全连接网络考虑更多的信息。

在语音识别的过程中,我们不是只看一帧来判断这个帧属于哪一个音标,而是看该帧以及其前后5 个帧(共 11 个帧)来决定它是哪一个音标。所以可以给全连接网络一整个窗口的信息, 让它可以考虑与该向量相邻的其他向量的信息。但是这种方法还是有极限的,如果有某一个任务不是考虑一个窗口就可以解决的,而是要考虑一整个序列才能够解决。

把窗口开大一点是一种方法,但并不实用。因为序列的长度是有长有短的,输入给模型的序列的长度每次可能都不一样。如果要开一个窗口把整个序列盖住,可能要统计一下训练数据,看看训练数据里面最长序列的长度。接着开一个窗口比最长的序列还要长,才可能把整个序列盖住。 但是开一个这么大的窗口,意味着Fully-connected Network需要非常多的参数,可能不只运算量很大,还容易Overfitting。

如果想要更好地考虑整个输入序列的信息,就要用到Self-attention模型。Self-attention模型的运行机制如下图所示,首先Self-attention会获得输入序列中所有的数据信息,经处理后输出同一个数的向量。但输出的向量是经处理后的考虑整个序列的信息之后的向量,接着再将经Self-attention处理后的向量放入FC,最后得到输出。

注:Self-attention模型并非只能使用一次,可以多次使用,并且可以与FC叠加交替使用。

Self-attention的处理过程如下图所示,Self-attention的输入可以是整个网络的输入也可以是某个隐藏层的输出。因此我们在这里用a来表示输入而不是x。Self-attention考虑了输入的所有向量a之后输出同等个数的向量b,输出的每个b都是综合考虑了输入层的其他与自身联系后的结果。

接下来我们以b1向量的产生过程为例,第一步是根据 a1 找出输入序列里面跟 a1 相关的其他向量。自注意力的目的是考虑整个序列,但是又不希望把整个序列所有的信息包在一个窗口里面。所以有一个特别的机制,这个机制是根据向量 a1 找出整个很长的序列里面哪些部分是重要的,哪些向量是和 a1 是有关系的。每一个向量跟 a1 的关联的程度可以用数值 α 来表示。

α的数值计算的常见方法是Dot-product:把输入的两个向量分别乘上两个不同的矩阵,左边这个向量乘上矩阵 Wq,右边这个向量乘上矩阵Wk,得到两个向量 q 跟 k,再把q跟k做点积得到α。

                         

以计算a1与其他向量的α为例

注:这边不一定要用softmax,可以用别的激活函数,softmax只是最常见的,我们可以尝试其他激活函数,看能不能试出比softmax更好的结果。

的Self-attention处理机制以此类推,我们可以用矩阵运算的方式更简单直观的表示各输入向量之间的Self-attention处理过程=,可以用乘上由输入的、  组成的矩阵I,得出由(i=1,2,3,4)组成的矩阵Q。同理可得(i=1,2,3,4)的矩阵K以及(i=1,2,3,4)的矩阵V

求出q,k,v后,接下来是每一个q都会去跟每一个k去计算内积,去得到注意力的分数值。

如果从矩阵操作的角度来看,以α1.1来为例,是以做内积来计算的,我们以由(i=1,2,3,4)组成矩阵的转置矩阵K乘上,即可获得与其他输入向量的所有关系值α1.i(i=1,2,3,4),在此基础上拓展将矩阵K乘上由(i=1,2,3,4)组成的矩阵Q即可获得输入的所有向量与其他向量的α值的矩阵A,再经过Softmax处理获得矩阵A'。

将上述所得的矩阵V乘上矩阵A'即可获得最终的output(i=1,2,3,4)组成的矩阵O,所以整个Self-attention的操作过程可分为以下步骤,先产生了 q、k、 v,再根据 q 和k去计算出相关的α,然后对 v 做加权和。这一串操作就是一连串矩阵的乘法。

在Self-attention层里面唯一需要学习的参数就只有 和 。只有 是未知的,需要通过训练数据把它学习出来。其他的操作都没有未知的参数,都是人为设定好的,都不需要通过训练数据学习。

1.3 Muti-head Self-attention

Muti-head Self-attention将自注意力机制分为多个头。每个头在不同的子空间中进行自注意力计算,这样可以让模型从不同的角度捕捉信息。最后,将各个头的结果进行拼接和线性变换,以得到最终的表示。这种方式提升了模型的表达能力和信息处理能力。多头自注意力的使用是非常广泛的,有一些任务,比如翻译、语音识别,用比较多的头可以得到比较好的结果。至于需要用多少的头,这个又是另外一个超参数,也是需要人为调整的。

为什么会需要比较多的头呢?在使用自注意力计算相关性的时候,就是用q去找相关的k。但是相关有很多种不同的形式,所以也许可以有多个 q,不同的q 负责不同种类的相关性,这就是多头注意力。

 以2 heads 为例,每个输入的向量都有2个头,分别有2个q,k,v。以q为例,首先我们用乘上一个矩阵得到,再用分别乘上不同的矩阵得到  。中的1和2分别表示序号为1和序号为2的两个头,只有相同序号的q,k,v间才能进行运算,运算过程如下:

1.4  Positional Encoding

到目前为止,Self-attention少了一个也许很重要的信息,即位置的信息。对一个Self-attention层而言,每一个输入是出现在序列的什么位置,它是完全没有相关信息的。如果你觉得位置信息是重要的,那你可以把位置信息加入进去,怎么把位置信息加入进去呢?这就要用到一个叫做Positional Encoding的技术。

这个技术是为每一个位置设定一个特定的vector,叫做positional vector。用表示,上标i表示位置,不同的i表示不同的vector。把e加入到中就好了。

最早用的如上图所示。图上面每一列就代表一个e,第一个位置是,第二个位置是,以此类推。 每一个位置的a都有一个专属的e。这种人为设定的位置向量称为hand-crafted。hand-crafted有很多问题,比如在定这个向量的时候只定到128,但是序列的长度是129。

在早期的论文中,为了避免了这种因人为设定向量固定长度而产生的问题,其位置向量是通过正弦函数和余弦函数所产生的。但是到目前为止,Positional Encoding仍然是一个尚待研究的问题,它甚至是可以通过数据学习出来的。

1.5 Many applications

Self-attention在NLP上的应用很广,但Self-attention不是只能应用在NLP上,它还可以应用到很多其他的问题上。

Self-attention for speech

一般的,如果你要用向量来表示一段声音的话,这排向量可能会非常的长。 因为我们之前有说过,在做语音辨识的时候,你要把声音序号表示成一排向量,而每一个向量其实只代表了十的长度而已,所以如果今天是一秒钟的声音讯号,它就有100个向量了。随便讲一句话,都是上千个向量了。所以一段声音讯号,你要描述它的时候,那这个vector的sequence,它的长度可能是非常长的。

长度太大会导致我们的计算量变得很大,例如A'矩阵的计算次数就和长度有关,计算量越大我们就需要用更多的memory来存储这些计算数据。解决这个问题的一个办法就是Truncated Self-attention。其原理就是在处理时我们不需要看一整段的输入,我们只需看一小段范围就好。而这个范围的大小则是由人为决定的,这样就可以加快我们的计算速度。

Self-attention for Image

到目前为止的学习中,我们所知道的Self-attention适用的范围是输入是一排向量的时候。在之前学习CNN时,我们把影像看作是一个很长的向量,但其实我们换个角度,影像也可以看作是一个vector set。以下图为例,我们可以把图片看作一个大小为5*10*3的tensor。其中3代表rgb的三个channel。每一个位置的像素可看作是一个三维的vector,整张图像就有5*10 个向量。

换一个角度来看,影像其实也可以看作是一个vector set,因此也就可以使用Self-attention来处理

总结

通过本周的学习,我了解了Self-attention的原理和基本运作原理以及一些应用场景。通过手写复现加深了对Self-attention机制中的数据处理过程。自注意力机制允许模型在处理每个向量时考虑序列中其他向量的信息。这种机制能够捕捉输入的一组向量的上下文信息得出向量与其他向量间的联系,过滤了与自身没有关系的信息,减少了计算量,从而使得处理长序列变得更加高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值