一、介绍
2022到2023年最火AI应用,毋庸置疑当属 OpenAI 的 ChatGPT 。 那么我们不禁要想 ChatGPT 为什么能够做到这些能力,它又是怎么演化而来的。高楼大厦不是瞬间就能建成的,肯定存在一个发展过程。 而且技术是不断的更新迭代的。我们想搞清楚 NLP 领域是怎么一步一步的探索和创新,最终诞生了 ChatGPT 这个具有跨时代意义的模型。 这里技术链条很长,如果从头讲起,我们得从最开始 One-hot 编码开始讲起。NLP 领域是我最近比较关注的领域,也算是对我最新的学习做一个总结和回顾。
阅读注意: 本文涉及很多专业名词,博主尽量用通俗的语言说。但非 AI 领域人士,可能会看不懂。大量学术名词不可避免,如有任何疑问请留言,我会尽量解答。
二、从一张图开始
整理了一下关于整个 NLP 的发展的链路,是怎么发展到 ChatGPT这一步的,见下图
上图每一块其实都是 NLP 领域的一次跃迁。 那么我们最初的 One-hot 编码开始,一步一步去了解每一步都做了哪些改进和优化。
每一块会逐一讲解,但不会深入到算法和实现方式,这样文章长度就不可控了,看起来也会很枯燥,所以我这篇文章只讲用途和缺点,以及后面如何改进。 如果想了解细节,大家可以留言,我再单开文章讲解。
三、One-hot 独热编码
3.1、介绍
在机器学习领域,一切数据都需要向量化,比如在 NLP领域一个中文词或英文单词,如何让机器能够理解他们。 一句话概括:One-hot 编码是将类别变量转换为机器学习算法易于利用的一种形式的过程。
如上图所示,每个单词对应一份单独的编码,这个编码是不重复的,只代表这个单词。为什么采用这种形式呢,而不是直接用数字顺序编码呢(比如,1,2,3,4等这种),神经网络存在大量的加劝平均运算。那么1 + 3 = 4,4 / 2 = 2,这意味着, 变成了另一种单词。毫无疑问,这是一个糟糕的方案。该模型的预测会有大量误差。所以才诞生了 One-hot 编码解决这样的问题。
3.2、问题
当然使用 One-hot 编码也会存在新的问题。即单词与单词是存在相似度的,比如 a , an 等 , 但One-hot 编码并不知道这些,如果采用余弦相似度计算向量间的相似度计算他们两个向量的相似度,可明显得到为0,即任意二者都不相关,也就是说独热表示无法解决词之间的相似性问题。 那怎么解决这个问题呢 ? 这个时候 Word Embedding 出现了。
四、Word Embedding
4.1、介绍
由于 One-hot 编码无法解决词与词之间相似性问题,那么聪明的小伙伴可能想到了,采用深度神经网络学习一个词向量出来。让他可以满足词之间相似性的问题。原理见下图
但还有一些独特优势:
- 他可以将文本通过一个低维向量来表达,不像 one-hot 那么长。
- 语意相似的词在向量空间上也会比较相近。
- 通用性很强,可以用在不同的下游任务中。
4.2、问题
能做到一定的相似性,但效果不理想,性能也不是最优的。所以下面出现了 Word2Vec 来改进这一点。
五、Word2Vec 模型
5.1、介绍
Word2Vec 的网络结构其实和神经网络语言模型(NNLM)是基本类似的。但是他们训练方法不太一样。
Word2Vec 有两种训练方法:
- 第一种叫 CBOW,核心思想是从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词。
- 第二种叫做 Skip-gram,和 CBOW 正好反过来,输入某个单词,要求网络预测它的上下文单词。
而你回头看看,NNLM 是怎么训练的?是输入一个单词的上文,去预测这个单词。这是有显著差异的。
Word2Vec 有以下一些优势:
- 由于 Word2vec 会考虑上下文,跟之前的 Word Embedding 方法相比,效果要更好
- 比之前的 Word Embedding 方法维度更少,所以速度更快
- 通用性很强,可以用在各种 NLP 任务中
5.2、问题
Word2Vec 还是为了解决词之间的相似度的问题。 但是聪明的小伙伴发现了,由于词和向量是一对一的关系,所以多义词的问题无法解决。 比如 bank 这个单词,在不通语言上下文中,是不同的意思。即代表 河岸,也表示银行。
怎么办? 这时候诞生了 ELMo 模型。 但后面先不讲 ELMo 模型, 我们先讲一下,Word2Vec 学好的词向量如何应用到下游任务中? 这里就顺便提一下 RNN 和 LSTM 模型
六、RNN 和 LSTM
6.1、前言
为什么这里插一个 RNN 和 LSTM , 在进行下游任务中(比如续写, 翻译等),我们可以将 Word2Vec 输出的词向量作为 RNN 和 LSTM 的输入。 ELMo 模型 也只是在 LSTM 上的改进,它使用了双向长短期记忆网络(LSTM)。OK, 那么我们先来看看 RNN 是什么。
6.2、介绍 RNN
RNN 是一个非常经典的面向序列的模型,可以对自然语言句子或是其他时序信号进行建模。进一步讲,它只有一个物理RNN单元,但是这个RNN单元可以按照时间步骤进行展开,在每个时间步骤接收当前时间步的输入和上一个时间步的输出,然后进行计算得出本时间步的输出。
传统神经网络的结构比较简单:输入层 – 隐藏层 – 输出层。
RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。
所以RNN 是一种连续的时序模型,它会持续存储上次的模型内容,带入到下次隐藏层,但是这个关系只维持一层,向后传递会前面的信息会越来越弱。聪明的小伙伴可能已经发现问题了。
6.3、RNN 问题
- RNN 只有短期的记忆问题,无法处理很长的输入序列(长序列容易遗忘前面信息)
- RNN 梯度消失和梯度爆炸问题
所以后面要提到 LSTM 来改进这个问题
6.4、什么是 LSTM
长短期记忆网络——通常被称为 LSTM,是一种特殊的 RNN,能够学习长期依赖性。由 Hochreiter 和 Schmidhuber(1997)提出的,并且在接下来的工作中被许多人改进和推广。LSTM 在各种各样的问题上表现非常出色,现在被广泛使用。
LSTM 被明确设计用来避免长期依赖性问题。长时间记住信息实际上是 LSTM 的默认行为,而不是需要努力学习的东西!LSTM 还有一个好处是,只记重要的内容,比如一段文章很长,但正在有价值往往就那么几句关键。
那它是怎么做到的呢?见下图
LSTM 通过各种门来解决问题
- 状态向量ct:它控制着整个LSTM单元的状态或者记忆,它会根据每个时刻的输入进行更新,从而实时保持LSTM单元的记忆。
- 隐状态向量ht:它是当前LSTM单元对外的输出状态,它是实际的工作状态向量,即一般会利用ht来做一些具体的任务。
- 输入门it:控制当前时刻的输入信息需要向状态向量𝑐𝑡ct中注入哪些信息。举个例子,当输入信息是一些没有实际意义的词,比如”的”,可能模型不会让这些信息流入到状态向量中,从而保持模型的语义表达。
- 遗忘门ft:控制前一时刻的状态向量 ct−1需要被屏蔽/遗忘哪些信息。举个例子:昨天我去爬了长城,哦不对是前天, 当模型看到”不对,是前天”的时候,可能就会忘记前边的”昨天”。
- 输出门ot:控制当前时刻的状态向量ct需要对外输出哪些信息,最终输出的信息即为ht。
公示和具体的算法就不写了,我这里只是抛一个砖,大家自行学习,或留言交流。
6.4、LSTM 问题
LSTM 虽然能够解决 RNN 的问题, 但自身也有一些问题,比如复杂度较高,LSTM 有三个不同的门,参数较多,训练起来比较困难。
后面在 2014 年 由Cho, et al在文章《Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation》中提出的 GRU 是对 LSTM 的一个改进版本, GRU只含有两个门控结构,且在超参数全部调优的情况下,二者性能相当,但是GRU结构更为简单,训练样本较少,易实现。
GRU 是在 LSTM 基础上的一个优化, 我这里就不单独讲了。
七 、ELMO 预训练
7.1、介绍
在讲解 Word2vec 时,细心地读者一定已经发现,这些词表示方法本质上是静态的,每一个词都有一个唯一确定的词向量,不能根据句子的不同而改变,无法处理自然语言处理任务中的多义词问题。 所以上面也有提到,ELMO 主要是为了解决单词的多义性的问题。那它是怎么解决的呢
ELMo 的本质思想是:我事先用 Word2vec 模型学好一个单词的词向量,此时多义词无法区分,不过这没关系。在我实际使用 词向量 的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义再去调整单词的词向量表示,这样经过调整后的 词向量 更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。所以 ELMo 本身是个根据当前上下文对词向量动态调整的思路。
ELMo 采用了典型的两阶段过程:
- 第一个阶段是利用语言模型进行预训练;
- 第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的词向量作为新特征补充到下游任务中。
7.2、总结
本质上 ELMo 也是一个预训练模型,输出是特征,ELMo 模型本质是为了提取特征。 只是它输出的向量内容包含单词的多义信息和单词的语义特征,句法特征。(至于为什么会有这个3个特征,我也不清楚,深度学习有时候也挺玄学) 有了这些特征后,就可以更好的喂给下游任务,做目标任务的输出。
7.3、问题
- 训练时间长,性能较差,无法并行化。
- 提取的特征能力不如 Transformer
后面会讲到 Transformer 模型,采用完全不同思路解决之前的问题,ELMo 方法已被淘汰,一直到目前主流还是采用 Transformer 。
八、Attention 和 Transformer
8.1、介绍Attention
Attention 是 Transformer 的一部分,也是非常重要的一部分。 那什么是 Attention ? Attention 顾名思义注意力机制,Attention 也借鉴了人类的视觉注意力。比如人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。类似下图。
Attention 也分很多种, 比如 Self Attention (自注意力) Masked Self-Attention (掩码注意力),如果他们有什么区别,那就要讲到 encoder 和 decoder 。 细节较多。有兴趣可以看这篇文章。
Attention 本质就是通过输入x与随机矩阵相乘得到 Q K V 三个向量, 在实际的应用场景,为了提高计算速度,我们采用的是矩阵的方式,直接计算出Q K V的矩阵,然后把embedding的值与三个矩阵直接相乘,把得到的新矩阵Q与K相乘,乘以一个常数,做softmax操作,最后乘上V矩阵,最终通过 Q 和 K 的相似性程度来确定 V 的权重分布。Attention 通俗来讲它的目的还是为了提取句法特征和语义特征,它的效果要优于 ELMo 模型。
8.2、介绍Transformer
Transformer 简单来讲,就是对 Attention 的应用。 Transformer 简单点看其实就是 self-attention 模型的叠加
,首先我们来看看 Transformer 的整体框架。
上图所示的整体框架乍一眼一看非常复杂,本质来讲它是两块内容构造, 左边是 Encoder(编码器) ,右边是 Decoder(解码器)。每一个encoder和decoder的内部简版结构如下图。
对于encoder,包含两层,一个self-attention层和一个前馈神经网络,self-attention能帮助当前节点不仅仅只关注当前的词,从而能获取到上下文的语义。
decoder也包含encoder提到的两层网络,但是在这两层中间还有一层attention层,帮助当前节点获取到当前需要关注的重点内容。
从我的一张图可以看出,到 Transformer 这里分出了两个模型 GPT 和 Bert ,他们都来自Transformer 。GPT 用了 Decoder , Bert 用了 Encoder。虽然都来自 Transformer 却走了两条不同的路线。一个选择走生成式语言大模型路线( OpenAI 野心很大,想走无监督通用人工智能路线 ),拥有很强预测和生成能力。 Bert 则是选择了强化对语义的理解,对特征的提取能力。本质上两者都是预训练模型都可以做 fine-tuning(微调),只是选择走不同的发展方向。Bert 适合做 文本分类,句子关系判断,命名实体识别,问答等。GPT 适合做 文本生成、文本续写、文本修饰、文本摘要等。
8.3、GPT 和 Bert
简单提一下原理,为什么选择 Decoder 和 Encoder 会有方向不同区别? 回顾我上面提到的,GPT 使用 Transformer 的 Decoder 结构,他是带有掩码的 Mask Multi-Head Attention 。在预测时,GPT 是不知道下文内容是什么的,GPT 模型是利用上文预测下一个单词的,因为 Decoder 使用了 Masked Multi Self-Attention 屏蔽了单词的后面内容,所以 Decoder 是现成的生成式语言模型。所以 GPT 非常适合做生成式任务。
而 Bert 是采用的 Encoder 结构, 训练和预测都是知道整个上下文信息的。所以它能做很强的语义理解类的任务。当然我这里只是浅层的表述,其实有大量的技术细节,我就不详说了。感兴趣可留言。
言归正传,既然我们要讲的是 ChatGPT ,那么我们继续从 GPT 接着讲吧。 Bert 大家可以自行了解。
九、GPT1 和 GPT2 和 GPT3
9.1、介绍
GPT 全称为 Generative Pre-trained Transformer (生成式预训练模型)。OpenAI在2018年发布的第一个预训练语言模型 GPT1,它使用了Transformer架构,并在大量文本数据上进行了预训练。
在GPT1之前的模型,比如 ELMo,它们往往使用大量的数据对有监督的模型进行任务相关的模型训练,但是这种有监督学习的任务存在两个缺点:
- 需要大量的标注数据,高质量的标注数据往往很难获得,因为在很多任务中,图像的标签并不是唯一的或者实例标签并不存在明确的边界;
- 根据一个任务训练的模型很难泛化到其它任务中,这个模型只能叫做“领域专家”而不是真正的理解了NLP。
这里介绍的 GPT1 的思想是先通过在无标签的数据上进行无监督学习,学习一个生成式的语言模型,然后再根据特定热任务进行有监督的 Fine-Tuning(微调)。这些任务包含自然语言推理,问答和常识推理,语义相似度,文本分类。
GPT2 的目标旨在训练一个泛化能力更强的词向量模型,GPT2 并没有对 GPT1 的网络进行过多的结构的创新与设计,只是使用了更多的网络参数和更大的数据集,让整个模型变的更大了。
GPT3 则真的大力出奇迹的产物, 海量的训练数据,仅仅需要 zero-shot 或者 few-shot,GPT-3就可以在下游任务表现的非常好。除了几个常见的NLP任务,GPT-3还在很多非常困难的任务上也有惊艳的表现,例如撰写人类难以判别的文章,甚至编写SQL查询语句,React或者JavaScript代码等。而这些强大能力的能力得意于模型的规模变大( 是GPT1 的10倍规模 ), 1750 亿的模型参数量, 45TB的训练数据。Github的 Copilot 就是基于 GPT3 模型的应用。
这里顺便提一下,GPT 是如何处理多任务的,传统语言模型,每个任务对应一个模型。GPT 提出的MQAN模型可以将机器翻译,自然语言推理,语义分析,关系提取等10类任务统一建模为一个分类任务,而无需再为每一个子任务单独设计一个模型。基于上面的思想,作者认为,当一个语言模型的容量足够大时,它就足以覆盖所有的有监督任务,也就是说所有的有监督学习都是无监督语言模型的一个子集 。例如当模型训练完“麦克乔丹是历史上最好的篮球运动员”语料的语言模型之后,便也学会了(question:“谁是最好的篮球运动员 ?”,answer:“麦克乔丹”)的Q&A任务。所以这也是 GPT 的一个特点。
9.3、问题
但 GPT 本身也存在一些不完善的地方,比如下面这些缺点也是 GPT 需要改进的地方。
- 对于一些命题没有意义的问题,GPT 不会判断命题有效与否,而是拟合一个没有意义的答案出来;
- 由于海量数据的存在,很难保证 GPT3 生成数据的安全性,数据会存在一些非常敏感的内容,比如 Copilot 就把用户真实身份证号码生成出来。数据缺失一定的清洗,甚至包含种族歧视,性别歧视,宗教偏见等。
- 受限于 Transformer 的建模能力,GPT3 并不能保证生成的一篇长文章或者一本书籍的连贯性,存在下文不停重复上文的问题。
那面对这些问题如何改进,这个时候 InstructGPT,特点则是引人了强化学习 PPO。 下面再讲。
十、InstructGPT
10.1、介绍
2022 年初,OpenAI 发布了 InstructGPT,在这项研究中,相比 GPT3 而言,OpenAI 采用对齐研究(alignment research),训练出更真实、更无害,而且更好地遵循用户意图的语言模型 InstructGPT,InstructGPT 是一个经过微调的新版本 GPT3 ,可以将有害的、不安全的数据、不真实的和敏感数据的输出最小化。 那它又是怎么做到这一点的呢?
根据我上面有提到,InstructGPT 引入了监督学习再加上从人类反馈中获得的强化学习。来提高 GPT3 的输出质量。在这种学习中,人类对模型的潜在输出进行排序,强化学习算法则对产生类似于高级输出材料的模型进行奖励。
本质上来说,InstructGPT 是安排人来给 GPT3 生成的内容打分和排序。包括后面会提到的 ChatGPT 也是一样,它同样也是采用 RLHF(从人类反馈中强化学习)训练的,不同之处在于数据是如何设置用于训练(以及收集)的。
**为什么要使用排序方法,而不是直接打分数呢?**这是因为不同的研究人员对同一个句子可能有不一样的评分,这样会导致大量的噪声出现,如果改成排序,则会大大降低噪声。
得到排序结果后,就可以用来训练奖励模型。奖励模型可以利用预训练模型进行初始化,或者也可以进行随机初始化。然后把人工标注的排序结果输入到奖励模型中。这里可以使用类似推荐系统中的“pair-wise”,把两个句子输入进行,奖励模型判别哪个句子较好。
有了这些基础。所以我们 GPT 得回答会越来越符合人的逻辑和思维,就看起来没有那么傻了,这个也是ChatGPT 爆火的原因。
十一、ChatGPT
ChatGPT 的论文还没有发表, 根据 OpenAI 的习惯,可能也是在数月以后。 但我们知道它用方法跟InstructGPT 类似。 但有一些细微的区别,大同小异吧。 这种大模型,也许就算公开方法给你们,一般公司也很难复刻。 GPT3 模型训练一次的花费就是 1200万美金 。可能出一次错都没钱再训练第二次。 还有就是数据,ChatGPT 没有公布他们的训练数据来源, 我猜测肯定也是会涉及到侵权问题的,所以才未公布。 OpenAI 属于创业公司,也有多位金主爸爸撑腰,干也就干了,也没人说啥。毕竟还是有竞争压力的。
ChatGPT 还不是很完美, 有些问题答不上来,可能会强行回答,造成人们的误解。 特别是在专业领域上,创建新的名词,追问过深,就会用套路了,废话文学就来了。 我就不举例,大家可以自行尝试。
据 GPT 创始人说 GPT4 会在今年发布,它能够通过图灵测试,并且能够先进到和人类没有区别。让我敬请期待。
十二、总结
人工智能这个领域还是非常内卷和前端领域有得一拼,好现象,就怕停滞不前。 AI 领域从 Transformer 诞生后,就开始军备竞赛了。Transformer 可以说是统一了语言模型和视觉模型,模型大统一后,基于此发展了各种各样优秀应用,比如今年的AI 绘画领域 Diffusion 模型, 基于视觉和文本的结合的模型CLIP,都是有突飞猛进的进步,未来人工智能将会是一片大好前景,甚至 AI 的崛起,有可能带来第四次工业革命。所以未来押注 AI 这条赛道是没有错,我也是基于兴趣去学这个领域,欢迎小伙伴们一起学习。