本文基于《生成式人工智能》一书阅读摘要。感兴趣的可以去看看原文。 可以说,Transformer已经成为深度学习和深度神经网络技术进步的最亮眼成果之一。Transformer能够催生出像ChatGPT这样的最新人工智能应用成果。
序列到序列(seq2seq)
Transformer能实现的核心功能——从序列到序列,这不是简单的从一个词跳到另一个词,中间需要经过很多道"工序",才能实现想要的效果。序列,指的是文本数据、语音数据、视频数据等一系列具有连续关系的数据。不同于图片数据,不同图片之间往往不具有什么关系,文本、语音和视频这种数据具有连续关系。这些数据在这一时刻的内容,往往与前几个时刻的内容相关,同样也会影响着后续时刻的内容。 在机器学习中,有一类特殊的任务,专门用来处理将一个序列转换成另外一个序列这类问题。例如我们熟知的翻译任务,就是将一种语言的文字序列转换成另一种语言的文字序列。再例如机器人聊天任务,本质上也是将问题对应的文字序列转换成回答对应的文字序列。我们将这种问题称为序列到序列问题,也是Transformer的核心、深度学习最令人着迷的领域之一。
序列到序列任务一般具有以下两个特点:
- 输入输出序列都是不定长的。比如说机器翻译场景下,待翻译的句子和翻译结果的长度都是不确定的。
- 输入输出序列中元素之间是具有顺序关系的。不同的顺序,得到的结果应该是不同的,比如“我不喜欢”和“喜欢我不”这两个短语表达了两种完全不一样的意思。
序列到序列模型一般是由编码器(encoder)和解码器(decoder)组成的。如下是一张标准的编解码机制结构图,其工作流程可以简单描述为,在编码器侧对输入序列进行编码,生成一个中间的语义编码向量,然后在解码器侧对这个中间向量进行解码,得到目标输出序列。以中译英场景为例,编码器侧对应的输入是一段中文序列,解码器侧对应的输出就是翻译出来的英文序列。
在实际应用过程中,序列到序列模型的输入输出数据可以是不同形式的数据,对应的编码器侧和解码器侧采用的模型结构可以是不同的。例如,可以输入一张图片,输出针对图片的一段描述,实现“看图说话”的功能,这时候编码器侧可以采用CNN模型,而解码器侧可以采用RNN模型;反过来,也可以输入一段文字描述,生成一张图片,对应的编码器侧和解码器侧采用的模型也就颠倒过来。利用这样一种机制,编码器—解码器结构几乎可以适配所有序列到序列的问题。 序列到序列模型看似非常完美,但是在实际使用的过程中仍然会遇到一些问题。比如在翻译场景下,如果句子过长,会产生梯度消失的问题。由于解码时使用的是最后一个隐藏层输出的定长向量,那么越靠近末端的单词会被“记忆”得越深刻,而远离末端的单词则会被逐渐稀释掉,最终模型输出的结果也因此不尽如人意。面对这些问题,研究人员也提出了对应的解决方案,比如加入注意力(attention)机制。
注意力机制
传统的编码器—解码器架构对序列长度有限制,本质原因是它无法体现对一个句子序列中不同词语的关注程度。借鉴人类的注意力思维方式:人类从直觉出发,能利用有限的注意力,从大量信息中快速获取最有价值的信息。 注意力机制通过计算编码器端的输出结果中每个向量与解码器端的输出结果中每个向量的相关性,得出若干相关性分数,再进行归一化处理将其转化为相关性权重,用来表征输入序列与输出序列各元素之间的相关性。注意力机制训练的过程中,不断调整、优化这个权重向量,最终目标就是要帮助解码器在生成结果时,对于输入序列中每个元素都能有一个合理的相关性权重参考。 自注意力机制是注意力机制的一种变体。它减少了对外部信息的依赖,在当前上下文中捕捉数据或特征的内部相关性。 自注意力机制能帮助模型更好地挖掘文本内部的前后关联,更符合自然语言处理任务的一般化要求,在性能上更是超过普通序列到序列模型。Transformer就是通过结合多个自注意力机制,来学习内容在不同空间表示里面的特征,从而将“无意”序列转换为“有意”序列。
Transformer
编码器-解码器
Transformer模型在普通的编码器—解码器结构基础上做了升级,它的编码端是由多个编码器串联构成的,而解码端同样由多个解码器构成(如下图)。它同时也在输入编码和自注意力方面做了优化,例如采用多头注意力机制、引入位置编码机制等等,能够识别更复杂的语言情况,从而能够处理更为复杂的任务。
Transformer模型的每个编码器有两个主要部分:自注意力机制和前馈神经网络。自注意力机制通过计算前一个编码器的输入编码之间的相关性权重,来输出新的编码。之后前馈神经网络对每个新的编码进行进一步处理,然后将这些处理后的编码作为下一个编码器或解码器的输入。如下所示:
之后是解码器部分。解码器部分也由多个解码器组成,每个解码器有三个主要部分:自注意力机制、针对编码器的注意力机制和前馈神经网络。可以看到,解码器和编码器类似,但多了一个针对编码器的注意力机制,它从最后一个编码器生成的编码中获取相关信息。最后一个解码器之后一般对接最终的线性变换和归一化层,用于生成最后的序列结果。
注意力机制
注意力方面,Transformer采用的是多头注意力(multi-head attention)。简单点说,不同标记相互之间的注意力通过多个注意力头来实现,而多个注意力头针对标记之间的相关性来计算注意力权重(如下图)。如在一个句子中,某个注意力头主要关注上一个单词和下一个单词的关系,而另一个注意力头就会把关注点放在句子中动词和其对应宾语的关系上。而在实际操作中,这些注意力头的计算都是同步进行的,这样整体反应速度就会加快。这些注意力头的计算完成以后会被拼接在一起,由最终的前馈神经网络层进行处理后输出。
看这样一个例子:“The monkey ate the banana quickly and it looks hungry.”(猴子快速地吃了香蕉,它看起来很饿。)这句话中的“it”指的是什么?是“banana”还是“monkey”?这对人类来说是一个简单的问题,但对模型来说却没有那么简单,即便使用了自注意力机制,也无法避免误差,但是引入多头注意力机制就能很好地解决这个问题。 在多头注意力机制中,其中一个编码器对单词“it”进行编码时,可能更专注于“monkey”,而另一个编码器的结果可能认为“it”和“banana”之间的关联性更强,这种情况下模型最后输出的结果较大可能会出现偏差。这时候多头注意力机制就发挥了作用,有其他更多编码器注意到“hungry”,通过多个编码结果的加权组合,最终单词“hungry”的出现将导致“it”与“monkey”之间产生更大的关联性,也就最大限度上消除了语义理解上的偏差。
GPT系列模型
GPT的“学名”是生成式预训练模型(generative pre-training transformer),这是一种用来分析和预测语言的人工智能模型,它可以帮助我们进行自然语言处理,例如机器翻译、自动文摘和快速问答。GPT的厉害之处是,它可以在文本中自动学习概念性内容,并自动预测下一段内容。也就是说,它可以根据上下文记住概念,并能够在短时间内直接输出相关内容。 GPT背后的基础模型是一种新型的机器学习技术,它可以帮助我们分析大量的自然语言数据。它背靠一个大型神经网络,通过在已有文本库中找到有关自然语言的规律来学习。GPT无须人工设计特定的自然语言处理系统,可以根据已有文本,自动生成语法正确、内容相关的文本。有这样一个“神器”,很多内容就可以借助它的力量来完成了! GPT的发展目前经历了GPT-1、GPT-2、GPT-3、GPT-3.5和GPT-4几个阶段。对于GPT-1模型,我们可以这么理解:先使用海量没有进行标注的语料,预训练出一个语言模型,而后对语言模型进行微调,使之应用于特定的语言任务中。GPT-2则在GPT-1的基础上进行了多任务的训练,使用了更大的数据集,提升了语言处理能力。GPT-3则在训练的参数量、训练数据和训练费用上都高于前两者,能完成更加复杂的任务。 GPT属于典型的“预训练 微调”两阶段模型。一般的神经网络在进行训练时,先对网络中的参数进行随机初始化,再利用算法不断优化模型参数。而GPT的训练方式是,模型参数不再是随机初始化的,而是使用大量通用数据进行“预训练”,得到一套模型参数;然后用这套参数对模型进行初始化,再利用少量特定领域的数据进行训练,这个过程即为“微调”。预训练语言模型把自然语言处理带入了一个新的阶段——通过大数据预训练加小数据微调,自然语言处理任务的解决无须再依赖大量的人工调参。 GPT系列的模型结构秉承了不断堆叠Transformer的思想,将Transformer作为特征抽取器,使用超大的训练语料库、超多的模型参数以及超强的计算资源来进行训练,并通过不断提升训练语料的规模和质量,提升网络的参数数量,完成迭代更新。GPT模型的更新迭代也证明了,通过不断提升模型容量和语料规模,模型的能力是可以不断完善的。 ChatGPT是在GPT-3.5模型基础上的微调模型。在此基础上,ChatGPT采用了全新的训练方式——“从人类反馈中强化学习”。通过这种方式的训练,模型在语义理解方面展现出了前所未有的智能。