李宏毅机器学习2021笔记—self-attention(上)

本文为李宏毅老师机器学习2021的self attention一节的学习笔记,接在CNN之后。学习本节之前,需要有一定的基础知识。

self attention解决的问题
到目前为止,我们network的input都是一个向量,输入可能是一个数值或者一个类别。但是假设我们需要输入的是一排向量,并且向量的个数可能会发生改变,这个时候要怎么处理。
比如文字处理的时候:李宏毅机器学习2021笔记—self-attention(上)_第1张图片
比如我们输入词汇,每个词汇都相当于一个向量,我们可以用很长的一个向量,来表示世界上所有的东西,但是这里有一个问题,就是它假设所有的词汇都是没有关系的,比如猫和狗,都是动物,但是这样没有办法把它分类在一起,没有语义的资讯。
有一个叫word embedding的方法,可以把一些东西分类,比如猫狗分类成动物,树、花分类到植物里面去。

又比如:一个图,也可以看成是一堆向量。
李宏毅机器学习2021笔记—self-attention(上)_第2张图片
一个social network,一个graph,也可以看成是一堆向量表示的,里面的一个节点,可以看成是一个向量。

输出是什么

李宏毅机器学习2021笔记—self-attention(上)_第3张图片
第一种类型,输入是几个向量,输出就是几个lable,它可能是一个数值,就是一个regression的问题,输出也可能是一个分类,就是一个classification的问题。这里输入4个向量就是输出4个向量。
比如输入一个句子,I saw a saw,这里每一个输入的词汇就有一个对应的lable。
又比如一个social network,比如给一个图片,机器要决定每一个节点,比如说这个人会不会买某一个商品。
第二种类型,就是一整个sequence,只需要输出一个lable就可以了。
比如给机器一句话,它判断这个句子是正面的还是负面的。
第三种可类型,就是输入n个向量,输出的几个lable是机器自己决定的。
(seq2seq就是sequence to sequence,比如这一种翻译的例子,就是seq2seq的任务,后面还会讲到)

sequence labeling

李宏毅机器学习2021笔记—self-attention(上)_第4张图片
输入和输出一样多的情况,也叫做sequence labeling。
我们可以用fully conneted network解决这个问题,但是这样会有瑕疵,比如输入I saw a saw,这两个saw,对于FC(fully conneted network,全连接网络,下同)来说,是一模一样的,但是实际上它们一个是动词,一个是名字,还是有区别的。
或者我们可以直接把这几个向量前后串联起来,然后一起丢到FC里面。
但是这样不能解决所有的问题,我们输入的sequence是有长有短的,如果开一个大的Window,那FC就需要非常多的参数,不止是很难训练,而且很容易过拟合。
这里我们就需要一个self-attention的技术。

**

self-attention

**李宏毅机器学习2021笔记—self-attention(上)_第5张图片
self-attention会把一整个sequence的资讯都吃进去,然后你输入几个向量,它就输出几个向量,比如图上,输入不同颜色的向量,就会输出不同颜色的向量,这里用黑色的框框,表示它不是普通的向量,是用来表示考虑了一整个sequence的向量。
self-attention也可以和FC交替使用,用self-attention来处理整个sequence的资讯,FC来专注处理某一个位置的资讯。
李宏毅机器学习2021笔记—self-attention(上)_第6张图片
self-attention是怎么运作的呢?李宏毅机器学习2021笔记—self-attention(上)_第7张图片
self-attention的inpu就是一串的向量,这个向量可能是整个网络的input,也可能是中间某一层的output,所以我们用a来表示它,代表它可能做过一些处理。
这里的每一个b都是考虑了所有的a产生的,比如b1是考虑a1~a4产生的,b2是考虑a1 ~ a4产生的。
那么怎么产生b1这个向量呢?
第一个步骤:根据a1找出这个sequence里面和a1相关的其他向量
李宏毅机器学习2021笔记—self-attention(上)_第8张图片
每一个向量和a1关联的程度,我们用一个数值α来表示。
那么这个α是怎么产生的呢?
就是给一个a1和a4,怎么去决定它们之间的关联程度α是怎么样的呢?
李宏毅机器学习2021笔记—self-attention(上)_第9张图片
那我们就需要一个计算attention的模组。
这个模组,就是拿两个向量a1和a4作为输入,然后输出的是一个α。
怎么计算这个数值,有各种不同的做法,比较常见的有dot-product。
这里就是左边这个向量乘以一个Wq,右边这个向量乘以一个Wk,得到q和k,再把他们做element-wise(就是对应数值相乘,这里听了好几遍哈哈,要不是以前听过一遍课绝对听不出来),然后再全部加起来,得到一个scalar,这个scalar就是α。
这是一种计算的方式,还有其他的方式,比如additive,就是把他们分别乘以一个矩阵,再加起来,再经过一个激活函数,最后经过一个transfor,最后得到一个α。
李宏毅机器学习2021笔记—self-attention(上)_第10张图片
那么怎么把它套用在self-attention里面呢?
这里就是把a1和a2、a3、a4分别去计算他们之间的关联性。
就是把a1乘上Wq得到q1,叫做query。
a2、a3、a4都乘以一个Wk得到一个k2,叫做key。
再把q1和k2算inner-product得到α。α1,2就表示,query是1提供的,key是2提供的,就表示1和2之间的关联性。
α1,2也叫做attention score,就是attention的分数。
接下来就以此类推,和a3、a4计算,得到α1,3,和α1,4。
(实际操作中,a1也会计算和自己的关联性,就是算出来一个α1,1)
李宏毅机器学习2021笔记—self-attention(上)_第11张图片
算完关联性之后,会做一个soft-max。跟前面的分类的soft-max是一模一样的。
(softmax就是把多个数值标准化到0~1之间,分类问题里面是根据这个可能更好的看出最后是分到哪一类里面,相当于增强最大可能的项)
(也可以用别的,不一定非要用soft-max)
李宏毅机器学习2021笔记—self-attention(上)_第12张图片
接下来我们要根据这个关联性,来抽取重要的资讯。
我们会把a1~a4这里面每一个向量,乘上Wv得到一个新的向量,用v1、v2、v3、v4表示。
接下来,把v1~v4每一个都乘上α’,然后加起来得到b。这里就是如果某一个关联性很强,比如得到的v2的值很大,那么加起来之后,这个值可能就会更加接近v2

总结:所以这里我们就讲了,怎么从一整个sequence得到一个b1.

你可能感兴趣的:(李宏毅深度学习笔记,机器学习,深度学习,人工智能)