赞
踩
目录
以Sequence Labeling为例,引出self-attention
Self-Attention不是只能用一次,你可以叠加很多次
Self-attention出现的原因:
现象:当前所讲述的Network的input是 一个向量。不管是在预测YouTube观看人数的问题上;还是影像处理上,我们的输入都可以看作是一个向量,然后我们的输出,可能是一个数值,这个是
Regression,可能是一个类别,这是Classification。
问题:假设我们输入是多个向量,并所输入的向量的长度(数量)是会改变的(即每次Model输入的Sequence的数目,Sequence的长度都不一样时)应该怎处理呢?
1、文字信息
Network输入一段话,每一个句子的长度都不一样,每个句子里面词汇的数目都不一样
我们把一个句子里面每个词汇分别描述成一个向量,那么一个句子就是一个Vector Set,即为Network的输入
词汇表示向量的方法可以使用Word Embedding, 他可以让词汇彼此之间都有联系
Word Embedding会给每一个词汇表示一个向量,而这个向量是有语义的资讯。
如果把Word Embedding画出来的话,所有的动物可能聚集成一团,所有的植物可能聚集成一团,所有的动词可能聚集成一团。
2、声音信号
一段声音讯号是一排向量,把一段声音讯号取一个范围,这个范围叫做一个Window。把这个Window里面的资讯描述成一个向量(Frame),在语音上,我们会把一个向量叫做一个Frame,通常这个Window的长度就是25个Millisecond
把这一个小段的声音讯号(Window)变成一个Frame,变成一个向量就有百百种做法,那这边就不细讲
一小段25个Millisecond里面的语音讯号;为了描述一整段的声音讯号,会把这个Window往右移一点通常移动的大小是10个Millisecond。所以一段声音讯号可以用一串向量来表示。
而因每一个Window往右移都是移动10个Millisecond,所以一秒鐘的声音讯号有100个向量,所以一分鐘的声音讯号,就有这个100乘以60,就有6000个向量
3、图
一个Graph 也是一堆向量,我们知道说Social Network就是一个Graph
在Social Network上面每一个节点就是一个人,然后节点跟节点之间的edge就是他们两个的关系连接。而每一个节点可以看作是一个向量,你可以拿每一个人的Profile资讯、性别、年龄、工作等信息,从而将这些信息用一个向量来表示。所以一个Social Network 可以看做是一堆的向量所组成的
有三种不用的输出可能性
1、每一个向量对应一个Lable
当Model假设输入是四个向量,它输出四个Label。而每一个Label如果是一个数值,那就是Regression的问题,如果每个Label是一个Class,那就是一个Classification的问题
2、一整个Sequence只输出一个Label
3、由机器决定应该输出多少个Label
比如:句子翻译的问题(sequence to sequence)
输入跟输出数目一样多的状况又叫做Sequence Labeling,你要给Sequence里面每一个向量,都给它一个Label,那怎样解决这个问题呢?
首先,由于一般方法 :使用全连接的Network虽然也可以达到我们想要的效果,但他们所输出值之间并没有关联性。如下图所示:
比如以词性标记为例,给机器一个句子l saw a saw。对Fully-Connected Network来说,后面这一个saw跟前面这个saw完全一模一样,它们是同一个词汇呀,既然Fully-Connected的Network输入同一个词汇.它没有理由输出不同的东西。
但实际上.你期待第一个saw要输出动词,第二个saw要输出名词。但对Network来说它做不到,因为这两个saw明明是一模一样的,你叫它一个要输出动词,一个要输出名词,它会非常地困惑完全不知道要怎麽处理,其中的原因:向量之间没有关联性。
所以怎麽办,有没有可能让Fully-Connected的Network,考虑更多的,比如说上下文的Context的资讯呢?
有的!把前后几个向量都串起来,一起丢到Fully-Connected的Network就结束了
所以我们可以给Fully-Connected Network,一整个Window的资讯,让它可以考虑一些上下文的资讯:我现在要考虑的这个向量+相邻的其他向量的资讯。
但这样子方法有极限。因为,如果今天我们有某一个任务,不是考虑一个Window就能解决此问题,而是要考虑整个Sequence才能够解决,那要怎麽办呢?
可能会有人想把Window开大一点,大到可以把整个Sequence盖住就OK了呀。但是,今天Sequence的长度是有长有短的,我们给Model输入的Sequence,每次可能都不一样。如果我今天要开一个Window,把整个Sequence盖住。那我可能就需要统计一下我的训练资料,然后看看训练资料里面,最长的Sequence有多长,然后开一个Window比最长的Sequence还要长,我才有可能把整个Sequence盖住。
但是你开一个这麽大的Window,意味着Fully-Connected Network需要非常多的参数,那可能运算量很大,还容易Overfitting
所以有没有更好的方法,来考虑整个Input Sequence的资讯呢?---self-attention
Self-attention的运作方式:Self-Attention会吃一整个Sequence的资讯
如上图所示:输入4个Vector就输出 4个Vector
而这4个Vector都是考虑一整个Sequence以后才得到的
如此一来,它就不是只考虑一个非常小的范围或一个小的Window,而是先考虑整个Sequence的资讯,再决定现在应该要输出什麽样的结果,这个就是Self-Attention。
可以把Fully-Connected Network和Self-Attention交替使用.
Self-Attention的Input是一串Vector,而这Vector可能是整个Network的输入,也可能是某个Hidden Layer的output,所以我们不是用x来表示它,而是用进行表示。
那么Input一排向量后,Self-attetion会output一排b向量。每个b都是考虑了所有的 以后才生成出来的。所以如下图所示,刻意画了非常非常多的箭头,表示考虑了到以后才生成的,考虑到以后才生成的,同理也是一样,都是考虑整个input的sequence,才产生出来的。
接下来就是跟大家说明,怎麽产生b这种向量的?
首先,要明白:self-attention里面有一个特别的机制,这个机制是根据这个向量,找出整个sequence里面,到底哪些部分是重要的;哪些部分跟所判断的是和哪一个label有关系的;哪些部分是我们要决定 的class(决定的regression数值)的时候所需要用到的资讯。
而每一个向量跟的关联的程度,用一个数值α来表示,如下图所示。
那么这个self-attention,如何自动决定两个向量之间的关联性呢?给它两个向量跟,它是怎麽决定跟有多相关,然后给它一个数值α呢?
对于α的计算有非常多的方法,但今日最常用的方法,也是用在Transformer里的方法就是:
如下图所示,用上述方法计算每个向量对 关联程度。你把乘上得到,且这个q有一个名字,叫Query,他就相当于你使用搜寻引擎去搜寻相关文章的时候,去搜寻相关文章的关键字,这个搜寻的动作叫做Query。
然后接下来都要去乘上,得到k这个Vector叫做Key,然后把这个Query,跟这个Key 算Inner-Product即Dot-Product得到α
表示搜寻关键字时他们之间的关联性是多少。这个a关联性叫做Attention score。剩下的计算同理。
其实一般q1也会跟自己算关联性,自己跟自己计算关联性这件事情有多重要呢?你可以自己在做作业的时候试试看,看这件事情的影响大不大了。
计算出跟每一个向量的关联性以后,然后将其都输入到Soft-Max层,得到。如下图所示:
这边不一定要用Soft-Max,用别的替代也没问题。比如说有人尝试过说用ReLU,那结果发现还比Soft-Max好一点,所以你不一定要用Soft-Max,你要用什么Activation Function都行,只要你高兴就好。然而Soft-Max是最常见的。
怎麽抽取重要的资讯呢?
比如说如果'跟的关联性很强,那么所对应的α'得到的值很大。那我们在做Weighted Sum之后,得到的b1值,就可能会比较接近
所以谁的那个attention score最大,谁的那个v就会Dominant你抽出来的结果。
同理计算方式一样。
首先,已知每个都产生
他们都是乘以得出来的,如下图所示:(是network中的参数,他们是会被learn出来的)
其次,计算attention scores
如上图所示,计算attention scores的过程可以看作矩阵与向量相乘。 (可以把到拼起来,当作是一个矩阵的四个row)
而所以,如下图所示:
最后,求得最后的输出O,如下图当V与第一列进行点乘时得到
整理到一起为:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。