河套 IT TALK 94:(原创)GPT技术揭秘:探索生成式模型的训练之道

河套 IT TALK 94:(原创)GPT技术揭秘:探索生成式模型的训练之道

1. 引言

人工智能和机器学习,都是由场景和需求驱动的。找不到运用场景的机器学习技术,也没有生命力。越有挑战性的场景,越能激发人们用机器学习寻找解决方案的激情和动力。人们总是在问题中寻找解决方案,砥砺前行。

最近在尝试梳理机器学习的相关内容,发现知识量巨大,信息庞杂,需要梳理一个主线,才能更好理解相关概念。所以很多研究机器学习的技术,都是顺着如下的脉络来展开的:

1. 我们准备解决什么问题?

2. 我们准备按照什么方式进行训练学习?

3. 我们准备选定什么样的模型来应对?

4. 针对模型,我们应该采取什么样特定架构或网络?

5. 针对这个模型和网络,我们将采用什么样的算法?

6. 这个算法有什么优势和劣势?

这几个维度的问题解答,相信能涵盖绝大多数人对机器学习某些特定场景的技术和知识领域的理解。近期看了很多关于机器学习、自然语言处理以及GPT相关技术的文章,有一些心得体会,今天准备按照上述问题的脉络,分享给大家,希望能有所帮助。

2. 自然语言处理NLP(Natural Language Processing)

人类,作为智能生物,交流是离不开自然语言的。如何让机器理解人的语言,并能正常和人类进行语言互动,就成为迫切需要解决的重要问题。不管是文字类,还是语音类,都会存在所谓的语义分析理解、情感分析、机器翻译问题。从自然语言处理的过程来看,不免要经历:分词和词性标注、词法分析、句法分析、实体识别、语义角色标注、句法语义分析、情感分析、语法归纳和机器翻译等等。人类差不多有7000种活跃的语言,其中有文字支撑的,特别是在很多消费电子产品里能正常切换使用的,不过百种。不过这也足够给自然语言处理带来巨大的挑战。不同文化背景,可能意味着完全不同的词语分割、模糊和引发歧义的语义、或严格或宽松的语法灵活性,以及俗语、谚语等等,甚至会牵扯到各种图形学和图像识别的技术。

3. 大模型(Large language model)

既然是自然语言处理,就一定离不开语言模型。我们现在听的很多的所谓大模型,就是大型语言模型的简称,英文是LLM,也就是 Large language model的缩写。大模型也没有什么神秘的,无非就是“大”。目前对于这个多“大”才算是大模型,还没有一个官方权威的界定。但经验上来讲,大模型通常指的是至少具有数百万参数的深度学习模型。而类似GPT-4的参数已经达到了170万亿的量级。下图是近年来已有的大模型LLM(大于100亿参数)的时间线。黄色标记此大模型已经开源。

大模型一般是通用模型,在广泛任务中表现出色,而且通常大模型已经在大型语料库上进行了“预训练”。

只要是语言模型,不管是大还是小,其实都是一个基于统计学的模型。不管人们怎么去包装,把这个说成是“推理”,但目前的技术就是建立在概率基础上的。无非就是根据给定的输入文本,预测下一个可能的单词或字符序列。通过分析大量的文本数据,学习词汇的出现概率和上下文之间的关系,从而能够生成连贯的文本或评估给定文本的合理性。

4. 大模型的最小单元Token

语言模型最基础的模型是词袋模型(Bag-of-Words Model)。作为一种简化的文本表示方法,将文本看作是一个袋子(或集合)中的词语的无序集合,忽略了词语的顺序和语法结构。在词袋模型中,每个文档或句子被表示为一个向量,向量的每个维度对应一个词语,维度的值表示该词语在文档中出现的次数或其他统计信息。词袋模型假设词语的出现是独立的,只关注词语的频率和出现情况,忽略了词语之间的顺序和上下文信息。这种模型简化了文本的表示和处理,常用于文本分类、信息检索等任务。但是对于自然语言生成就无能为力了。在此基础上将连续的文本流切分成有意义的单元,以便于模型对其进行处理和理解,这就是Token化(Tokenization)。”token”是指文本中的最小单位或基本元素。它可以是一个单词、一个字、一个字符或其他语言单位,根据任务和需求而定。下图就是GPT-3的标记化(Tokenization)示例:

在大模型中,token 的选择和处理方式往往是根据具体任务和训练数据来确定的。在训练一个通用模型时,可以使用更粗粒度的 tokenization 方法,如将单词作为 token。而在某些特定任务,如命名实体识别(Named Entity Recognition)或语言翻译(Machine Translation)中,可能需要更细粒度的 tokenization,以便更好地捕捉特定领域或语言的信息。

不同语言的Token也会有很大差别。拿英文和汉语为例,在英语中,通常将单词作为 token,而在汉语中,单个汉字级别的 tokenization 更为常见。汉语中的词汇通常没有复数形式、时态变化或进行时等形态变化,因此,对于一些任务,如词性标注或命名实体识别,将单个词作为 token 可能更加合适。而在英语中,单词的不同形式(如单数和复数、时态等)可能被视为不同的 token。汉语中的合成词较为常见,可以通过将多个单字组合而成。因此,在处理汉语时,可能需要将合成词进行拆分,将其组成部分作为单独的 token 进行处理。而在英语中,合成词的形式较少,单词本身就可以作为一个独立的 token。在英语中,单词之间由空格或标点符号分隔,因此可以相对容易地进行单词级别的 tokenization。而在汉语中,字词之间没有明确的分隔符,需要进行中文分词来将连续的汉字序列划分为有意义的词汇。所以在汉字处理上,比英文多了分词这个步骤。

5. 无监督学习(Unsupervised learning)

有了模型,我们接下来思考的就是,应该用什么方式进行训练?语言模型带有很强的内容生成属性和灵活性,也就是不存在唯一解。这种模型,就绝对不能采用老是想着最优策略的强化学习方式。而且,训练这种语言模型,也不适合用通过使用标记的训练数据来学习从输入到输出的映射关系的监督学习(Supervised learning),因为人类语言信息量太大,标记不过来。而最理想的方式就是从未标记的数据中学习数据的隐藏结构、模式或分布的无监督学习(Unsupervised learning)。当然,也不排除所谓的同时利用有标签和无标签的数据来进行学习的半监督学习(Semi-supervised learning),或者从无监督任务中自动生成标签来进行学习。通过设计任务或目标函数,利用数据样本中的已知信息进行预测或重构的自我监督学习(Self-supervised learning)。

既然是无监督学习为主,那么应该采用什么样的网络架构来学习合适呢?

6. 反馈神经网络(Feedback Neural Networks)

当然是神经网络。最早人们想到的用于语言模型处理的神经网络是反馈神经网络(Feedback Neural Networks)。存在反馈连接,信息可以从后续时间步骤传递回前面的时间步骤。可以对动态系统的行为进行建模和预测,如控制系统、运动轨迹预测等。我们必须承认,在处理时序任务方面反馈神经网络着实表现出色,如语音识别、自然语言处理中的语言模型、机器翻译等。

大家一般会想到的反馈神经网络就是循环神经网络(Recurrent Neural Networks,RNN),是一类具有循环连接的神经网络,能够保留先前状态的信息,主要由循环层和激活函数组成。作为一种递归的神经网络,适用于处理序列数据的任务,如自然语言处理、语音识别、时间序列分析等。如果用于处理文本,它的核心思想是在处理每个输入时,将前一个时刻的隐藏状态传递给当前时刻,并结合当前输入进行计算。这种递归的结构使得RNN能够捕捉到序列中的上下文信息。

然而,传统的RNN在处理长序列时会面临梯度消失(Vanishing Gradient)和梯度爆炸(Exploding Gradient)的问题。梯度消失指的是在深层神经网络中,反向传播过程中梯度逐渐变小,并最终变得非常接近于零的现象。当网络层数较多时,梯度在每一层中都会乘以网络参数的权重,因此,如果权重小于1,则梯度会指数级地逐渐减小,导致在浅层网络中梯度无法有效传递到较深的层,从而使得较深层的参数更新缓慢或停止更新,影响网络的训练效果。梯度爆炸指的是在深层神经网络中,反向传播过程中梯度逐渐增大,并最终变得非常大的现象。当网络层数较多时,梯度在每一层中都会乘以网络参数的权重,如果权重大于1,则梯度会指数级地逐渐增大,导致在浅层网络中梯度变得非常大,进而导致网络参数更新过大,使得网络无法收敛。不管是梯度消失,还是梯度爆炸问题,都会导致深层神经网络的训练变得困难,甚至无法收敛到有效的结果。

于是人们又改进了循环神经网络,设计了一个变体长短期记忆网络(Long Short-Term Memory,LSTM),用于解决传统RNN在处理长期依赖问题上的挑战。LSTM通过引入门控单元结构,可以更有效地处理和记忆长期依赖关系。LSTM通过引入门控机制来解决梯度消失和梯度爆炸的问题。LSTM单元包含遗忘门(forget gate)、输入门(input gate)和输出门(output gate)。LSTM通过这些门的控制,可以有选择性地遗忘和更新信息,能够更好地捕捉长期依赖关系,有助于控制信息的流动和记忆的更新,从而解决了梯度消失和梯度爆炸的问题。

7. Transformer转换器

上述的LSTM看似完美,其实也有硬伤。传统的循环神经网络(RNN)或长短期记忆网络(LSTM)都属于反馈神经网络(Feedback Neural Networks),在处理序列数据时是逐步进行的,每个时间步依赖于前一个时间步的计算结果。这种顺序计算导致了计算的串行性,无法同时进行多个计算。而且这种局部信息交互的方式可能无法充分利用整个序列中的上下文信息。尽管LSTM缓解了梯度消失或梯度爆炸的问题,但仍然存在一定的限制。

而新的技术Transformer又打破了僵局。Transformer是前馈神经网络(Feedforward Neural Networks)。前馈神经网络中,信息只沿着前向的方向传递,没有循环连接。适用于各种监督学习和无监督学习任务,如分类、回归、特征提取等。Transformer作为一种基于自注意力机制的模型,用于处理序列数据,能够在每个位置对输入序列的所有位置进行注意力计算。这使得模型能够根据输入序列的不同部分自适应地分配注意力权重,能够在一个序列中捕捉到不同位置之间的依赖关系,更加灵活地捕捉关键信息。由于Transformer是基于注意力机制的前馈神经网络,可以在一次前向传播中同时处理整个序列,因此可以进行更有效的并行计算。这使得Transformer摒弃了传统的递归结构,而是采用了并行计算的方式,在处理长序列时更为高效。Transformer由编码器和解码器组成,编码器负责将输入序列编码成一系列特征表示,解码器则根据这些特征表示生成目标序列,Transformer通过注意力机制使每个位置都能够在编码和解码阶段获得序列中所有位置的信息,实现了全局的信息交互,能够更好地捕捉上下文关系。使得它可以广泛应用于机器翻译和生成式任务中。

8. 生成式预训练转换器GPT(Generative Pre-trained Transformer)

而大家熟知的GPT正是使用了最后这个Transformer技术。其实这也是GPT名字的由来。GPT是生成式预训练转换器(Generative Pre-trained Transformer)的缩写。GPT通过对提出的问题进行预测来生成一篇回答。GPT不是在一次预测中输出整篇回答,而是首先预测回答的第一个字,然后将预测的第一个字与问题连接起来,形成一个延长一个字的输入句子,并再次输入给GPT。GPT进行第二次预测,得到回答的第二个字,然后将这个字续在输入句子后,再次输入给GPT,以此类推。这个过程一直重复进行,直到GPT预测出”结束符”(或达到约定的最大长度,此时回答过程结束,GPT生成了一篇完整的回答。这种逐步地一个字一个字生成整篇回答的过程被称为”自回归”—— Auto-Regression。在自回归过程中,GPT进行多次预测而不仅仅是一次预测。因此,使用过ChatGPT的用户可能会发现它在回答问题时逐字逐字地产生输出,速度较慢。这是因为大型的GPT模型进行一次预测(输出一个字)本身就需要一定的时间。

9. 转换器(Transformer)与注意力(Attention)

从内部实现细节来看,输入句子首先通过一系列堆叠在一起的Transformer组件。下一层Transformer的输出作为上一层Transformer的输入。GPT看到的”字”是数值化的表示,即一组向量。整个语言中有V个字(字表)。GPT为每个字分配一个向量,这些向量也是GPT的参数。输入句子中的每个字向量被传递给第一个Transformer,它对每个字生成一个向量。可以将这个过程看作是Transformer对每个字向量进行了”变形”。下一层Transformer将其输出的字向量传递给上一层Transformer,直到最顶层的Transformer为句子中的每个字生成一个向量。通过多层Transformer的处理,字向量在传递过程中发生了变化,这些变化可以视为Transformer对字向量进行了”变形”。更重要的是,在这个变形的过程中,每个字的向量融合了上下文中所有字的信息。这就是Transformer中的Attention(注意力)组件的作用。Attention首先利用每个字的向量计算出query向量、key向量和value向量。query向量和key向量指示了这个字与其他字(包括自身)如何相关联,而value向量则包含了字本身的含义信息。Attention使用query向量和所有字的key向量计算出对应的注意力得分,这个得分表示这个字在多大程度上将注意力分配给其他字。然后,Attention使用这些注意力得分对所有字的value向量进行加权求和,得到对于该字的输出向量。可以认为,Attention改变了该字的向量,使得变化后的向量通过不同的注意力权重融合了上下文中所有字的信息。

GPT的全部参数包括:

  • N个Transformer中组合多个Attention头的输出矩阵,以及全连接神经网络的参数(包括多个权重矩阵和偏置向量);
  • 每个Transformer中H个Attention头的Q、K和V矩阵;
  • 预测下一个字的全连接神经网络的参数(包括多个权重矩阵和偏置向量); 
  • 初始的字向量。

正是这些参数使得GPT模型具有我们希望它具备的行为。例如,一个Attention头的Q、K和V矩阵,其中V矩阵对输入给Attention的字向量进行线性变换,得到该字的value向量,这种线性变换在某种程度上表达了该字某个方面的含义(抽象)。Q和K矩阵分别对字向量进行线性变换,得到该字的query和key向量,也编码了该字与其他字相关联的信息。再例如,位于Transformer之上的预测神经网络,其参数编码了如何根据句子的表示(即最后一个字的向量)来预测下一个字的信息。

10. GPT是如何训练出来的?

所有这些参数都是通过“训练”得到的。一开始,这些参数被初始化为随机值,此时它们没有任何含义和功能,GPT也无法很好地预测下一个字。训练者准备了一个庞大的语料库,其中包含许多合法的句子。从合法句子中随机选择一部分作为训练样本,以最后一个字作为标签,将前面的字作为输入,从而构造了一个训练样本。许多这样的训练样本构成了训练集。

将训练样本的句子输入到GPT中,GPT将预测下一个字,准确地说是生成字表中所有字的概率分布。然后将正确的下一个字(标签)与GPT的输出进行比较,计算出误差(交叉熵损失)。接下来,在GPT模型上执行反向传播,使用梯度下降法或其变体更新GPT的所有参数。

通过逐个样本地(实际上是一批样本)进行这一过程的迭代,即“计算误差+反向传播+更新参数”,最终调整GPT的参数使误差最小化。此时,GPT能够很好地预测句子的下一个字,训练完成。

通过对GPT技术的揭秘,今天我们深入了解了生成式模型的训练之道。相信大家能清晰看到从自然语言处理(NLP)到生成式与训练转换器(GPT)的技术发展脉络。随着技术的不断进步,人们对大模型的期望也在增加。特别是如何处理不同语言和文化背景下的多样性,克服词语分割、语义模糊和语法灵活性等挑战,以实现全球范围内的语言处理能力。同时,这种大模型的能力如何扩展到多媒体,多模态领域以及如何在各种专业领域发挥更好的作用,让人们产生更多的期待。

相信,通过不断的研究和探索,AIGC大模型将在自然语言处理领域发挥越来越重要的作用,为人们提供更好的语言交流和理解体验,进而推动人工智能的发展迈上新的台阶。