江山代有才人出,各领风骚数百年。这句话无论是放在古往今来的人类身上,还是放在当今人工智能领域的大模型之上,都是最贴切不过的。无论是一个时代的伟人,还是统治一个领域的技术,最终都会有新的挑战者将其替代。Transformer作为大模型的统治者,自从出现之后,就以其强大的语言理解能力击败了RNN模型,迅速占据了NLP领域的榜首,之后又是抢占了CNN主导的图像领域,成为了整个领域的王者,在之后很长一段时间内地位都稳固如初。
不过随着终端应用领域的细分,对大模型各方面的要求也越来越具体化,比如对于开发成本的考虑,和对终端响应效率的需求等。这些都倒逼着底层模型的革新必要,随着各领域的研究深入,逐渐发现Transformer模型本身的问题已经成为技术进一步发展的阻拦,想要提高应用层面的体验,就必须解决这些问题,而底层架构是首当其冲的。
一、Transformer的封神之路
自2017年Transformer模型被提出来之前,语言模型领域还在被以RNN为主的LSTM、GRU、SRU等模型统治,注意力机制也是以普通的交叉注意力为主。而Transformer的出现,彻底打破了这个局面,首先以RNN为主的循环神经网络被替换成了传统的前馈神经网络-FNN(也称为多层感知机-MLP),也就是模型中的全连接层,这种稠密的网络连接能够为网络提供更多的参数,可以有效的学习自然语言文本中的信息。
在此之前,前馈神经网络没有被应用在语言模型的任务中,其主要原因之一就是普通的前馈神经网络在处理自然语言信息时无法为输入的词向量提供准确的位置信息,我们都知道,自然语言文本信息的处理是一个具有先后顺序的序列任务,也就是说语言是有先手顺序的,RNN天生就具备“记忆”功能,本身就是为处理序列任务而设计的模型,而FNN(前馈神经网络)对于输入的数据,不会记住具体的位置信息。
在Transformer模型中,对这一问题的处理方法是通过加入额外的位置向量来确定位置,具体操作是在处理输入数据的时候对每一个输入的数据向量都加入一个位置向量即可,这样就可以让模型“记住”每一个输入数据的具体位置了,模型也就具备了处理序列问题的能力。后面无论每个输入向量学习到了什么信息,都能够通过位置向量回溯到模型中的具体位置,也就为后面的输出提供了可参考的依据。
使用FNN替代RNN有个好处就是可以避免参数稀疏化,我们都知道CNN和RNN都是具备参数共享功能的,这种参数共享在处理简单任务的时候,可能具备一定的好处,但是在处理复杂任务的时候,参数的共享可能不会带来优势,反而是稠密连接的FNN有更大的优势,稠密连接意味着参数量的增加,而参数量的增加,至少可以让模型可承载的信息量变大。
虽然RNN的模型设计更符合人类大脑的思考机制,但是对于普通的RNN来说,FNN的稠密参数设计和并行计算优势更符合硬件的计算机制,对于GPU的利用率也会更高,这一切优势都使得FNN在之前大模型的发展中有着更好的应用性。对比CNN模型提供的稀疏矩阵计算形式,FNN的稠密矩阵计算形式则具有更高的精度和更低的延迟性。
想要把一个简单的FNN改造成合格的序列任务处理模型,最主要的还是要让输入模型的所有数据之间都能够根据具体任务需求而产生强关联,简单来说,就是让输入的每个数据之间都能够表示某种关系,比如输入一段话,让模型能够处理这段话的每个字或者每个词之间的关系,也就是让模型处理这段话之间的稠密向量连接。
当然,这种字词之间的稠密连接还需要有一定的放矢,并不是说每个字词之间直接稠密连接就能解决问题,有的字词之间的关系更加紧密,有的字词之间的关系没有那么重要。这个时候就需要根据实际任务情况对字词之间进行注意力的学习,比如前一个字和后一个字之间的注意力分配,前一个字和后两个字之间的注意力分配等。注意力越强就说明字词之间的关系更紧密,反之亦然。
这种在整个输入数据中做注意力的方法被称作为自注意力机制,和普通交叉注意力的区别就是普通交叉注意力的Q(Query)、K(Key)、V(Value)来由编码器和解码器共同的数据而产生,而自注意力的Q(Query)、K(Key)、V(Value)要么仅来自于编码器的输入,要么仅来自于解码器的输入。
可见,交叉注意力主要用于处理两个不同序列之间的关系,而自注意力主要用于处理单个序列内的元素之间的关系。在自注意力机制中,序列中的每个元素都可以与序列中的其他元素建立关联,包括与自身的关联。自注意力机制通过模型在输入序列中的不同位置之间建立动态的关联,能够使模型更好地捕捉序列中的重要信息。
Transformer是如何让模型获得更大的容量,装载更多的文本语义信息的呢?它的方法简单粗暴,那就是通过堆叠模型的层数来加大模型可学习的参数量,让更多的参数来承载文本中深层次的信息。如果要处理的文本内容太多,注意力的能力有限,还可以将注意力增加成多头的形式来加强文本向量之间的注意力关系。除此之外,Transformer模型中还应用了LayerNormalization和残差连接等设计方法来提高模型的整体表示能力。