赞
踩
自然语言处理领域(NLP)的输入通常是一句话或几个连续语义字符的嵌入词向量,因此输入整体表现为“向量集合”的形式,即VectorSet。
使用嵌入词向量的原因起初是机器学习模型处理的输入必须是数值向量形式,因此必须将单个语义字符转变为对应的向量;而早期的One-Hot编码形式虽然可以将每个字符都映射为独一无二的向量编码,但是却失去了字符间的语义相似性;正因如此,基于文本数据事先得到字符的嵌入词向量便成为了后续语义分析的前置工作(预训练),且通常决定后续预测或分类任务的表现。
言归正传。
考虑一个具体的NLP应用:词性标注,其目标是为每一个单词标注词性,如名词、动词、冠词等。比如对于一句英文“I saw a saw”,对于懂英文的我们而言,自然知道其意思为“我看到了一把锯”,同样也可以尝试为其进行词性标注,第一个“saw”为动词,第二个“saw”则为名词。
解决上述任务的一种自然想法是:训练一个统一的MLP(多层感知机或神经网络),然后当输入“I”时输出“名词”,输入第一个“saw”时输出“动词”,输入第二个“saw”时输出“名词”。
然而很快你会发现存在问题:当输入就是单词“saw”时,输出的结果可能是“名词”也可能是“动词”,而对于训练好的MLP(或全连接层FC)而言,只要输入相同,输出就应该一样才对!
人们很快发现原因是没有考虑单词的上下文(Context)。所以一种改进的版本是设定一个长度为3的Window,每次分析单词时,综合考虑其前后各一个、总共三个单词的信息,这样就可以一定程度避免上述问题。
之所以说一定程度,是因为“window”方案显然需要考虑超参数窗口大小的问题,一般考虑设定所有相关Context的最大长度作为Window,但是势必会导致冗余的计算与存储成本。
那么有没有办法让模型自动学习到任一字符分析需要的所有相关上下文呢?
前述谈到如果人工制定上下文窗口大小,势必会出现与实际数据的Mismatch,导致冗余计算与存储成本。所以人们希望可以有一种自动计算出相关且重要的数据信息的方法。
自注意力机制应运而生!
自注意力机制的核心其实有三个:
1)投影 | 将原有向量集合映射(投射、投影)到一个新空间,使得在新空间下可计算语义相似性;
2)相似度计算 | 基于余弦相似度的点积(内积)运算来得到注意力分数,本质是权重;
3)加权求和 | 将向量集合的值空间投射与注意力分数加权求和,即得到新空间下目标向量(查询方)相关的上下文信息
需要注意的是,由于注意力分数本身是由查询方和比较方的内积相似度计算得到,因而将其作为权重求和时可以实现强相关的向量贡献大,相关性小的向量贡献小的效果,从而实现了自动提取与目标向量相关的上下文信息的目的。
为了方便理解,我们可以简单看看针对序列中第一个向量的注意力分数如何计算。
1)如果想计算向量a1相关的注意力分数,其实就是需要计算a1与其余向量的点积相似度,因而将a1看作是查询方(Query),与其比较相似度的其他向量看作键值对象(Key);
2)无论是查询方还是键值对象,都借助各自共享矩阵投射到新空间,如a1可以得到q1,k1,向量a2投射得到k2等;
3)向量a1与a2的相似度可以由q1和k2的点积得到,类似a1与a3的相似度由q1和k3的点积得到
4)得到的结果借助softmax归一化,使得其成为和为1的数值(符合权重和为1的要求)
5)最后使用a2、a3等对应的值投影v2、v3等一一和对应的注意力分数(相似度)相乘并求和,即可得到融合了a1相关上下文信息后的新输出b1
6)类似方法可以求得b2、b3和b4,上述数值均融合了序列中的上下文信息
自注意力机制的优势不仅在于可以自动融合目标分析相关的上下文信息,还在于其运算过程相对简单,且可以通过矩阵表示,从而便于分布式运算,使得其在GPU上并行处理,大大提升时间效率。
如何将自注意力机制表示为矩阵运算呢?
1)将原始向量a1、a2、a3和a4作为列向量组成矩阵,左乘上Wq映射矩阵,即可得到相应的查询矩阵q1、q2、q3和q4;
2)类似地,将原始向量a1、a2、a3和a4作为列向量组成矩阵,左乘上Wk映射矩阵,即可得到相应的键值矩阵k1、k2、k3和k4;
3)将原始向量a1、a2、a3和a4作为列向量组成矩阵,左乘上Wv映射矩阵,即可得到相应的键值矩阵v1、v2、v3和v4;
4)计算注意力分数时,采用k的转置与q做矩阵乘法,此时行列数值均为序列长度N,因而自注意机制的空间复杂度为O(n^2);
5)最后用键值矩阵(v1,v2,v3,v4)乘上归一化后的注意力矩阵A’即可得到输出矩阵,输出矩阵O的每一列恰好对应于相应的输出(O的形状为1×N)
当然,上述自注意力机制中假定我们只需要一种投影就可以捕捉到所需的相关性模式,然而实际中可能存在多种相关性模式,此时就需要引入多头注意力机制(Multi-head Attention),其思想其实比较简单,即对于第一次投影后得到的q1,继续进行二次投影得到q11和q12,然后分别对key和value域执行二次投影,后续分别计算注意力得分和最终输出;本例中是以“Two-head”为例,所以最后可以将双头注意力输出加权求和即可得到最终O。
近几年Self-Attention机制风靡全球的一个重要原因无疑是Transformer的巨大影响。Transformer基于Self-Attention机制实现了一个强大的通用AI框架,这里的通用,指的是Transformer最初用于处理NLP问题,但是后续研究证实其可以应用与图像、视频等多个领域,从而实现了文本、图像、视频、语音的多合一,即为通用AI模型。
也许在特定的图像领域Transformer与CNN尚有差距,但是如果考虑通用性,无疑Transformer是首选。而且Transformer性能需求更多的属于工程要求,即提供组合更大的算力与存储,即可得到更好的模型效果,这无疑比“费脑子”提升模型性能简单太多了,而“Simple is good”早已深入人心(* ̄︶ ̄)
Transformer的详细细节可以参考著名的文献《Attention is all you need》,这里我们提供经典的框架图(图示表达能力值得所有科研小伙伴学习,一张好懂的图胜过千言万语),并且指出其中需要注意的几个小细节。
1)自注意力机制中没有考虑序列各部分的顺序或位置信息,因而Transformer中采用三角函数方式生成了相应的位置编码,直接加在输入的嵌入向量上
2)Transformer采用了多头注意力机制,且在注意力模块输出后,运用了残差网络和层归一化(Layer Norm),其中残差网络就是将输入也加在注意力输出上,层归一化则是直接借助向量的样本和标准差进行归一化∽N(0,1)
3)Transformer输出结果时需要逐个输出,且预测时不应看到未来的数据,因而采用了Masked Multi-head Attention屏蔽掉了输出时“未来”的信息
4)Transformer中采用Cross Attention机制综合encoder和decoder的输出
5)最后的结果使用softmax处理,因为其训练时对标的label采用的是One-Hot形式,如此可以计算交叉熵损失
6)训练时Transformer采用正确的过去数据预测未来,实际测试时不能保证过去预测的都正确,因而采用故意引入错误的方式,获得更好的鲁棒性
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。