(15)—自注意力机制 (上)

network架构——self attention

解决的问题是:network的输入是一个向量,但是如果输入是一排向量的时候,而且输入向量的数目是会发生改变的呢?应该怎么处理呢?

举例:输入是个序列长度很长

第一个例子是文字处理,假设现在的输入是句子,并且每个句子的长度是不一样的,把每个句子当中的词当作一个向量来描述的话,那我们模型的输入就会是一个vector set,并且这个vector set的大小取决于句子的长度。

那怎么把词汇表示成向量呢?最简单的做法是:one-hot Encoding,但是这种方法是在向量里面得不到相互的联系,另外的一种方法是word Embedding,这种方法就是给每一个词汇定义一个向量,并且这些向量是存在语义的,如果将word Embedding画出来的话,词汇会根据意思进行一个自主的分类。

word Embedding是怎么得到的,不是今天讲课的重点。word Embedding这种方法是给每一个词汇一个向量,而一个句子就是一排长度不一样的向量。

接下来的这个例子也是讲一个向量的序列当作是输入:一段声音信号是一排向量,把一个声音信号取一段范围,这个范围叫做window,把这个window里面的信息描述成一个向量,这个向量叫做frame,(在语音上会把一个向量叫做是frame),这个向量的长度是25ms。怎么把这个25ms的声音变成一个向量呢?有各式各样的做法(不细讲),为了将这个的声音讯号用向量描述出来,会把这个25ms的的向量往右移动10ms,为什么设置成25ms和10ms是已经调试好的,这是最好的结果。一秒钟的声音信号有100个frames,一分钟的声音讯号就有6000个向量。

所以声音讯号也是一堆向量。

还有什么东西是一堆向量?一张图,social network也是一张图,在social network上面的每一个节点就是一个人,每一个节点可以看作是一个向量。

所以一个social network可以看做是一堆向量组成的。

还有什么例子和图片有关的呢?

一个分子可以看作是一个图形,分子上面的每一个原子可以看作是一个向量,那么原子怎么用向量来表示的那?可以用one-hot vector来表示

 

 所以分子也是一堆向量组成的。

现在说完输入了(文字,语音和图形),那输出呢?输出有三种可能性:

1,输入和输出的长度是一样的。

 每一个向量都有一个对应的label,假如说模型现在有四个输入那对应的输出就是四个label,每一个label可能是数值,可能是一个分类。但是在这个模型当中输入和输出的长度是一样的。

什么样的地方会用到这种类型呢?在文字处理上面,假设今天做的是POS tagging(词性标注),让机器自己决定每一个词汇到底是什么样的词性。在语音上面,在一段语音里面有一串的向量,每一个向量都要决定他是哪一个拼音。在social network上面的话,每一个节点要机器决定他是什么样的特性。

2,一整个序列只要输出一个label

 如果是文字的话,给机器看一段话,让机器决定这段话的语义是积极的还是消极的。在语音上面的话,要机器辨认一段语音,决定这段声音是谁讲的。在图形上的话,现在给出了一个分子,预测这个分子有没有毒性过着是这个分子的亲水性如何。

3,不知道输出多少个label,要让机器自己决定。这种任务又叫做seq2seq

 翻译就是seq2seq的任务,因为输入输出不是一样的语言, 词汇的数目也是不一样的。真正的语音辨识也是seq2seq的任务。

现在我们要学的是第一种类型的任务——sequence labeling(序列标记)

给sequence 里面的向量每一个都标记一个label,怎么解释sequence labeling的问题呢,现在将问题放在fully-connected work当中,输入虽然是一个sequence,但是不用管,把每一个向量分别输入到fully-connected network当中,那fully-connected network就会给我们输出,根据所做的产生正确的输出就结束了,但是这样做有很大的瑕疵,结社今天做的是词性标记的问题,给机器一个句子,对fully-connected network来说,句子当中的动词的saw和名词的saw是一样的,怎么改善这样的状况呢?

有没有一种可能是让fully-connected network考虑更多的关于上下文的信息呢?局势讲动词saw前后的词语串联起来一起放进fully-connected network当中就可以实现词性标注。(作业二)

 但是这种方法还是有极限的,现在我们考虑一个序列不是考虑一个window就能解决的,而是说要考虑整个的序列才能解决,要怎么办?

要用到self attention:这种方法就是会覆盖一整个的序列的信息,然后输入几个向量,就会输出几个向量,输出的这几个向量的特点就是考虑的是一整个的序列之后才得到的。再把这几个考虑到一阵个句子的向量再放进fully-connected work当中, 在决定输出的是什么。

 

 self attention不只能使用一次,可以叠加很多次,self attention的输出经过fully-connected network之后得到输出,也可以在经过一次 self attention,重复前面的步骤之后在得到最终的结果

 关于 self attention最知名的文章是:Attention is all you need.

 self attention是怎么运作的呢?他的输入就是一串的向量,这个向量可能是整个network的输入,也可能是某个隐藏层的输出,下面的例子当中的输入用a表示,有可能这个输入是经过了一些处理的。输出就是一排的b向量,但是每一个b都是考虑了整个的输入才产生的。

 现在来说明怎么产生的b1这个向量的。第一步:根据输入的a1在整的序列当中找出和a1相关的其他向量。每一个向量跟a1相关联的程度用\alpha来表示。self attention的模块是怎么自动决定两个向量之间的关联性的呢?

 这就需要一个计算attention的模组,这个模组就是将两个向量当作是输入,直接就输出\alpha这个数值,把这个数值\alpha当作是两个向量关联的程度,怎么计算这个数值呢?常见的计算方法叫做Dot-product,就是把输入的这两个向量分别乘上两个不同的矩阵得到q和k这两个向量,再把q和k在做Dot-product之后得到一个数值,这个数值就是\alpha。另外的一种方法就是Additive,同样是将这两个输入的向量乘上两个矩阵得到q和k,然后把q和k相加放进到tanh的函数当中,通过一个transformer得到\alpha

最常用的方法是左边的这种方法,也是用在transformer里面的这种方法。

 接下来就是计算a1和a2,a3,a4之间的\alpha

 得到{\alpha }'之后,根据这个数值去抽取这个序列里面的重要的信息,抽取信息的过程:

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年5月13日
下一篇 2022年5月13日

相关推荐