聊聊Transformer和GPT模型

聊聊,transformer,gpt,模型 · 浏览次数 : 109

小编点评

生成内容时需要带简单的排版。 文本中的“it”指的是香蕉。由于模型无法直接从文本中识别“it”的具体语义,所以它最终输出的结果是“hungry”。

正文

本文基于《生成式人工智能》一书阅读摘要。感兴趣的可以去看看原文。
可以说,Transformer已经成为深度学习和深度神经网络技术进步的最亮眼成果之一。Transformer能够催生出像ChatGPT这样的最新人工智能应用成果。

序列到序列(seq2seq)

Transformer能实现的核心功能——从序列到序列,这不是简单的从一个词跳到另一个词,中间需要经过很多道"工序",才能实现想要的效果。序列,指的是文本数据、语音数据、视频数据等一系列具有连续关系的数据。不同于图片数据,不同图片之间往往不具有什么关系,文本、语音和视频这种数据具有连续关系。这些数据在这一时刻的内容,往往与前几个时刻的内容相关,同样也会影响着后续时刻的内容。
在机器学习中,有一类特殊的任务,专门用来处理将一个序列转换成另外一个序列这类问题。例如我们熟知的翻译任务,就是将一种语言的文字序列转换成另一种语言的文字序列。再例如机器人聊天任务,本质上也是将问题对应的文字序列转换成回答对应的文字序列。我们将这种问题称为序列到序列问题,也是Transformer的核心、深度学习最令人着迷的领域之一。
image.png
序列到序列任务一般具有以下两个特点:

  1. 输入输出序列都是不定长的。比如说机器翻译场景下,待翻译的句子和翻译结果的长度都是不确定的。
  2. 输入输出序列中元素之间是具有顺序关系的。不同的顺序,得到的结果应该是不同的,比如“我不喜欢”和“喜欢我不”这两个短语表达了两种完全不一样的意思。

序列到序列模型一般是由编码器(encoder)和解码器(decoder)组成的。如下是一张标准的编解码机制结构图,其工作流程可以简单描述为,在编码器侧对输入序列进行编码,生成一个中间的语义编码向量,然后在解码器侧对这个中间向量进行解码,得到目标输出序列。以中译英场景为例,编码器侧对应的输入是一段中文序列,解码器侧对应的输出就是翻译出来的英文序列。
image.png
在实际应用过程中,序列到序列模型的输入输出数据可以是不同形式的数据,对应的编码器侧和解码器侧采用的模型结构可以是不同的。例如,可以输入一张图片,输出针对图片的一段描述,实现“看图说话”的功能,这时候编码器侧可以采用CNN模型,而解码器侧可以采用RNN模型;反过来,也可以输入一段文字描述,生成一张图片,对应的编码器侧和解码器侧采用的模型也就颠倒过来。利用这样一种机制,编码器—解码器结构几乎可以适配所有序列到序列的问题。
序列到序列模型看似非常完美,但是在实际使用的过程中仍然会遇到一些问题。比如在翻译场景下,如果句子过长,会产生梯度消失的问题。由于解码时使用的是最后一个隐藏层输出的定长向量,那么越靠近末端的单词会被“记忆”得越深刻,而远离末端的单词则会被逐渐稀释掉,最终模型输出的结果也因此不尽如人意。面对这些问题,研究人员也提出了对应的解决方案,比如加入注意力(attention)机制。

注意力机制

传统的编码器—解码器架构对序列长度有限制,本质原因是它无法体现对一个句子序列中不同词语的关注程度。借鉴人类的注意力思维方式:人类从直觉出发,能利用有限的注意力,从大量信息中快速获取最有价值的信息。
注意力机制通过计算编码器端的输出结果中每个向量与解码器端的输出结果中每个向量的相关性,得出若干相关性分数,再进行归一化处理将其转化为相关性权重,用来表征输入序列与输出序列各元素之间的相关性。注意力机制训练的过程中,不断调整、优化这个权重向量,最终目标就是要帮助解码器在生成结果时,对于输入序列中每个元素都能有一个合理的相关性权重参考。
自注意力机制是注意力机制的一种变体。它减少了对外部信息的依赖,在当前上下文中捕捉数据或特征的内部相关性。
自注意力机制能帮助模型更好地挖掘文本内部的前后关联,更符合自然语言处理任务的一般化要求,在性能上更是超过普通序列到序列模型。Transformer就是通过结合多个自注意力机制,来学习内容在不同空间表示里面的特征,从而将“无意”序列转换为“有意”序列。

Transformer

编码器-解码器

Transformer模型在普通的编码器—解码器结构基础上做了升级,它的编码端是由多个编码器串联构成的,而解码端同样由多个解码器构成(如下图)。它同时也在输入编码和自注意力方面做了优化,例如采用多头注意力机制、引入位置编码机制等等,能够识别更复杂的语言情况,从而能够处理更为复杂的任务。
image.png
Transformer模型的每个编码器有两个主要部分:自注意力机制和前馈神经网络。自注意力机制通过计算前一个编码器的输入编码之间的相关性权重,来输出新的编码。之后前馈神经网络对每个新的编码进行进一步处理,然后将这些处理后的编码作为下一个编码器或解码器的输入。如下所示:
image.png
之后是解码器部分。解码器部分也由多个解码器组成,每个解码器有三个主要部分:自注意力机制、针对编码器的注意力机制和前馈神经网络。可以看到,解码器和编码器类似,但多了一个针对编码器的注意力机制,它从最后一个编码器生成的编码中获取相关信息。最后一个解码器之后一般对接最终的线性变换和归一化层,用于生成最后的序列结果。

注意力机制

注意力方面,Transformer采用的是多头注意力(multi-head attention)。简单点说,不同标记相互之间的注意力通过多个注意力头来实现,而多个注意力头针对标记之间的相关性来计算注意力权重(如下图)。如在一个句子中,某个注意力头主要关注上一个单词和下一个单词的关系,而另一个注意力头就会把关注点放在句子中动词和其对应宾语的关系上。而在实际操作中,这些注意力头的计算都是同步进行的,这样整体反应速度就会加快。这些注意力头的计算完成以后会被拼接在一起,由最终的前馈神经网络层进行处理后输出。
image.png
看这样一个例子:“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采用了全新的训练方式——“从人类反馈中强化学习”。通过这种方式的训练,模型在语义理解方面展现出了前所未有的智能。

与聊聊Transformer和GPT模型相似的内容:

聊聊Transformer和GPT模型

本文基于《生成式人工智能》一书阅读摘要。感兴趣的可以去看看原文。 可以说,Transformer已经成为深度学习和深度神经网络技术进步的最亮眼成果之一。Transformer能够催生出像ChatGPT这样的最新人工智能应用成果。 ## 序列到序列(seq2seq) Transformer能实现的核心

[转帖]聊聊Chat GPT-1到GPT-4的发展历程

http://blog.itpub.net/69925873/viewspace-2935360/ OpenAI的Generative Pre-trained Transformer(GPT)模型通过引入非常强大的语言模型,在自然语言处理(NLP)领域引起了巨大震动。这些模型可以执行各种NLP任务,

聊聊HuggingFace Transformer

## 概述 参见:[聊聊HuggingFace](https://www.cnblogs.com/zhiyong-ITNote/p/17640835.html) ## 项目组件 一个完整的transformer模型主要包含三部分:Config、Tokenizer、Model。 ### Config

聊聊GLM-4-9B开源模型的微调loss计算

概述 Github官方地址:GLM-4 网上已经有很多关于微调的文章,介绍各种方式下的使用,这里不会赘述。我个人比较关心的是微调时的loss计算逻辑,这点在很多的文章都不会有相关的描述,因为大多数人都是关心如何使用之类的应用层,而不是其具体的底层逻辑,当然咱也说不清太底层的计算。 可了解其它loss

聊聊一个差点被放弃的项目以及近期的开源计划

前言 自从 StarBlog 和 SiteDirectory 之后,我还没写新的关于开源项目的系列,最近又积累了很多想法,正好写一篇博客来总结一下。 关于差点被放弃的项目,就是最近一直在做的单点认证(IdentityServerLite) IdentityServerLite 开发这个项目的起因,是

聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用

哈喽大家好,我是咸鱼。 最近写的一个 Python 项目用到了 jwcrypto 这个库,这个库是专门用来处理 JWT 的,JWT 全称是 JSON Web Token ,JSON 格式的 Token。 今天就来简单入门一下 JWT。 官方介绍:https://jwt.io/introduction

聊聊MySQL是如何处理排序的

在MySQL的查询中常常会用到 order by 和 group by 这两个关键字,它们的相同点是都会对字段进行排序,那查询语句中的排序是如何实现的呢?

聊聊 Linux iowait

哈喽大家好,我是咸鱼。 我们在使用 top 命令来查看 Linux 系统整体 CPU 使用情况的时候,往往看的是下面这一列: %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 68.0 wa, 0.0 hi, 0.0 si, 0.0 st 其中,man 手册解释 w

聊聊Mybatis框架原理

好久没有写博客了。最近工作中封装了一个类似ORM框架的东西。大概的原理就是将Excel数据初始化到本地sqlite数据库后,通过json配置文件,对数据库的数据做增删改查等操作。 其实大概的思考了下,就是半ORM框架mybatis的逻辑,只是我们自己封装的简陋蛮多。想想有现成的轮子没用,反而是自己写

聊聊Spring的工厂方法与FactoryBean

概述 工厂方法是比较常见,常用的一种设计模式。FactoryBean是Spring提供的一种Bean注入IOC容器的方式。 工厂方法 在做日常开发时,一般都会避免直接new对象,而且将new的操作丢给IOC容器,但对于第三方系统的集成,我们不太好直接丢给IOC容器,此时可以通过工厂模式, 提供一个工