自注意力机制-- Self-attention

目录

Network输入的一组向量可以是什么呢?

 输入是a set of vectors ,那输出是什么呢?

 以Sequence Labeling为例,引出self-attention

Self-attention

Self-Attention不是只能用一次,你可以叠加很多次

 Self-Attention过程原理

Self-attention 矩阵化


Self-attention出现的原因:

        现象:当前所讲述的Network的input是 一个向量。不管是在预测YouTube观看人数的问题上;还是影像处理上,我们的输入都可以看作是一个向量,然后我们的输出,可能是一个数值,这个是
Regression,可能是一个类别,这是Classification。

        问题:假设我们输入是多个向量,并所输入的向量的长度(数量)是会改变的(即每次Model输入的Sequence的数目,Sequence的长度都不一样时)应该怎处理呢?

Network输入的一组向量可以是什么呢?

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 可以看做是一堆的向量所组成的

 输入是a set of vectors ,那输出是什么呢?

有三种不用的输出可能性

1、每一个向量对应一个Lable

当Model假设输入是四个向量,它输出四个Label。而每一个Label如果是一个数值,那就是Regression的问题,如果每个Label是一个Class,那就是一个Classification的问题

2、一整个Sequence只输出一个Label

 3、由机器决定应该输出多少个Label

比如:句子翻译的问题(sequence to sequence)

 以Sequence Labeling为例,引出self-attention

输入跟输出数目一样多的状况又叫做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的运作方式:Self-Attention会吃一整个Sequence的资讯

 如上图所示:输入4个Vector就输出 4个Vector
而这4个Vector都是考虑一整个Sequence以后才得到的

如此一来,它就不是只考虑一个非常小的范围或一个小的Window,而是先考虑整个Sequence的资讯,再决定现在应该要输出什麽样的结果,这个就是Self-Attention

Self-Attention不是只能用一次,你可以叠加很多次

 可以把Fully-Connected Network和Self-Attention交替使用.

  • Self-Attention处理整个Sequence的资讯
  • Fully-Connected Network,专注於处理某一个位置的资讯
  • 再用Self-Attention,再把整个Sequence资讯再处理一次
  • 然后交替使用Self-Attention跟Fully-Connected Network

 Self-Attention过程原理

Self-Attention的Input是一串Vector,而这Vector可能是整个Network的输入,也可能是某个Hidden Layer的output,所以我们不是用x来表示它,而是用\alpha进行表示

那么Input一排\alpha向量后,Self-attetion会output一排b向量。每个b都是考虑了所有的 \alpha以后才生成出来的。所以如下图所示,刻意画了非常非常多的箭头,表示b^{1}考虑了a^{^{1}}a^{4}以后才生成的,b^{2}考虑a^{^{1}}a^{4}以后才生成的,同理b^{3}也是一样,都是考虑整个input的sequence,才产生出来的。

接下来就是跟大家说明,怎麽产生b这种向量的?

首先,要明白:self-attention里面有一个特别的机制,这个机制是根据a^{1}这个向量,找出整个sequence里面,到底哪些部分是重要的;哪些部分跟所判断的a^{1}是和哪一个label有关系的;哪些部分是我们要决定a^{1} 的class(决定a^{1}的regression数值)的时候所需要用到的资讯。

 而每一个向量跟a^{1}的关联的程度,用一个数值α来表示,如下图所示。

 那么这个self-attention,如何自动决定两个向量之间的关联性呢?给它两个向量a^{1}a^{4},它是怎麽决定a^{1}a^{4}有多相关,然后给它一个数值α呢?

对于α的计算有非常多的方法,但今日最常用的方法,也是用在Transformer里的方法就是:

  

 如下图所示,用上述方法计算每个向量对 a^{1}关联程度。你把a^{1}乘上W^{q}得到q^{1},且这个q有一个名字,叫Query他就相当于你使用搜寻引擎去搜寻相关文章的时候,去搜寻相关文章的关键字这个搜寻的动作叫做Query。

然后接下来a^{2} ,a^{3},a^{4}都要去乘上W^{k },得到k这个Vector叫做Key,然后把这个Queryq^{1},跟这个Key k^{2}算Inner-Product即Dot-Product得到α

a_{12}表示q^{1}搜寻关键字k^{2}时他们之间的关联性是多少。这个a关联性叫做Attention score。剩下的计算同理。

 其实一般q1也会跟自己算关联性,自己跟自己计算关联性这件事情有多重要呢?你可以自己在做作业的时候试试看,看这件事情的影响大不大了。

计算出a^{1}跟每一个向量的关联性以后,然后将其都输入到Soft-Max层,得到{a_{12}}'。如下图所示:

这边不一定要用Soft-Max,用别的替代也没问题。比如说有人尝试过说用ReLU,那结果发现还比Soft-Max好一点,所以你不一定要用Soft-Max,你要用什么Activation Function都行,只要你高兴就好。然而Soft-Max是最常见的。

  • 首先,根据先前求出的a,我们就知道那些向量跟a^{1}最有关系的。
  • 然后根据soft-Max得到的α',去抽取这个Sequence里面重要的资讯。

怎麽抽取重要的资讯呢?

  •  首先把a^{1}a^{4}每一个向量乘上W^{v}得到新的向量,分别用v^{1},v^{2},v^{3},v^{4}来表示,
  • 接下来把的v^{1}v^{4},每一个向量都去乘上Attention score({a}'
  • 然后再把他们加起来得到b^{1}

比如说如果a^{^{1}}'跟a^{2}的关联性很强,那么所对应的α'得到的值很大。那我们在做Weighted Sum之后,得到的b1值,就可能会比较接近v^{2}

所以谁的那个attention score最大,谁的那个v就会Dominant你抽出来的结果。

同理b^{2},b^{3},b^{4}计算方式一样。

Self-attention 矩阵化

首先,已知每个a^{n}都产生q^{n},k^{n},v^{n}

 他们都是乘以W^{q},W^{k},W^{v}得出来的,如下图所示:W^{q},W^{k},W^{v}是network中的参数,他们是会被learn出来的)

 其次,计算attention scores

 如上图所示,计算attention scores的过程可以看作矩阵与向量相乘(可以把k^{1}k^{4}拼起来,当作是一个矩阵的四个row)

q^{1},q^{2},q^{3},q^{4},所以,如下图所示:

 最后,求得最后的输出O,如下图当V与A^{'}第一列进行点乘时得到b^{1}

 整理到一起为:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值