一、自注意机制的运作原理
1.运作机理
我们就先只讲第一个类型:输入跟输出数量一样多的状况,以序列标注(sequence labeling)
为例。
序列标注要给序列里面的每一个向量一个标签。虽然输入是一个序列,但可以不要管它是不是一
个序列,各个击破,把每一个向量分别输入到全连接网络里面得到输出。这种做法有非常大
的瑕疵,以词性标注为例,给机器一个句子:I saw a saw。对于全连接网络,这个句子中的两
个 saw 完全一模一样,它们是同一个词汇。既然全连接网络输入同一个词汇,它没有理由输
出不同的东西。但实际上,我们期待第一个 saw 要输出动词,第二个 saw 要输出名词。但全
连接网络无法做到这件事。
如何让全连接网络做到"考虑上下文"来给出我们期望的结果呢?
把每个向量的前后几个向量都“串”起来,一起输入到全连接网络就可以了
在语音识别里面,我们不是只看一帧判断这个帧属于哪一个音标,而是看该帧以及其前后 5 个帧(共 11 个帧)来决定它是哪一个音标。所以可以给全连接网络一整个窗口的信息,让它可以考虑一些上下文,即与该向量相邻的其他向量的信息。
但是这种的方法还是有极限的
如果有某一个任务不是考虑一个窗口就可以解决的,而是要考虑一整个序列才能够解决,那要怎么办呢?
有人可能会想窗口开大一点,大到可以把整个序列盖住就可以了。但是序列的长度是有长有短的,输入给模型的序列的长度,每次可能都不一样。如果要开一个窗口把整个序列盖住,可能要统计一下训练数据,看看训练数据里面最长序列的长度。接着开一个窗口比最长的序列还要长,才可能把整个序列盖住。但是开一个这么大的窗口,意味着全连接网络需要非常多的参数,可能不只运算量很大,还容易过拟合。
如果想要更好地考虑整个输入序列的信息,就要用到自注意力模型。
2.自注意模型
自注意力模型会“吃”整个序列的数据,输入几个向量,它就输出几个向量。
而这些向量都是考虑整个序列以后才得到的,所以输出的向量有一个黑色的框