随着ChatGPT在全球范围内的普及,生成式人工智能已经成为人们日常生活中不可或缺的一部分。AIGC(Artificial Intelligence Generated Content,人工智能生成内容)因其独特的创造力而备受瞩目,用户只需提供提示词,背后的人工智能服务便能够生成符合用户需求的文本、图像、音频和视频等多样化内容。这种技术正在以前所未有的方式改变着我们的生产和生活。
大语言模型(或称“大模型”)是指能够处理和生成自然语言文本的、参数规模很大的人工智能模型。这种模型基于深度学习技术并经过海量语料训练,利用大量的计算资源来学习大规模文本数据的统计规律,以捕捉自然语言的语法、语义和上下文信息。大语言模型被广泛应用于文本生成、机器翻译、对话系统等自然语言处理场景中,正在不断推动这些领域的发展和创新。
GPT(Generative Pre-Trained Transformer,生成式预训练Transformer )是大语言模型的一种具体实现,由OpenAI提出,基于Transformer架构,采用了自注意力机制和多头注意力机制,可有效地处理长距离依赖关系和上下文信息。Transformer架构是目前大语言模型的主要技术体系,自2017年由Google的翻译团队提出后迅速流行开来,促进了大语言模型的快速发展。基于Transformer架构涌现出很多模型,如OpenAI的GPT-3.5、GPT-4,Anthropic的Claude3,以及Meta开源的LLaMA2等,其中也有一些优秀的开源国产模型,如智谱华章ChatGLM、通义千问、百川等,用户可以下载并免费使用这些模型。
本章介绍大语言模型的基本概念、基本原理、应用开发技术和训练方法,以便读者全面了解大语言模型的基础知识。
自然语言处理是研究如何利用机器来处理和理解人类语言的理论及技术领域。作为人工智能的一个重要分支和计算语言学的子领域,自然语言处理的目标是使机器真正理解人类语言,解决在计算机处理过程中出现的各种语言相关问题,实现人机交互,并以人类可以理解的方式进行反馈。自然语言处理涉及多个研究方向,包括语音识别、自然语言理解、对话系统、机器翻译等。近年来,随着深度学习在自然语言处理领域的广泛应用,该领域取得了巨大的进展。
大语言模型是自然语言处理的一种技术方向。与传统的专用“小”模型不同,大语言模型凭借“大”语料、“大”算力和“大”参数取得优势。当规模达到一定程度时,模型会展现出涌现能力(Emergent Ability),即从原始训练数据中自动学习并发现新的、更高层次的特征和模式的能力。简而言之,大语言模型具有触类旁通的能力,其知识不仅来源于原始语料,还能够创造性地生成,这是小模型难以达到的。
大语言模型在自然语言处理领域具有广泛的应用,涵盖了许多子领域。以下是大语言模型的一些应用场景。
①自然语言生成:模型的自然语言生成能力使其成为生成文章、源程序、故事、新闻报道、营销文案等文本内容的理想工具。这些生成的文本通常都是合理、流畅并且符合语法规则的。
②自动问答系统:回答用户提出的问题,如智能客服、知识库增强检索等。这类系统可以暂存用户的问答历史记录,进行多轮关联问答对话。
③对话系统:以Chat方式与用户进行交流,如智能助手、聊天机器人等。这类系统可以根据用户的提问或指令生成语义正确、语气自然、逻辑合理的回答或响应。
④文本摘要:提取文本中的关键信息,生成摘要或总结,如论文的摘要书写、医疗文书的结构化信息生成等。
⑤机器翻译:利用大语言模型的上下文理解能力、长距离依赖建模和多语言支持等特性,改进语言翻译效果。
⑥代码生成:生成代码片段或程序代码,如自动化编程、代码补全等。
大语言模型的起源可以追溯到早期的自然语言处理研究,包括基于规则的方法和基于统计的方法。基于规则的方法由于灵活性不足,发展缓慢;而基于统计的方法从20世纪90年代至今,取得了长足的发展。通过学习大量来自互联网的语料取得“经验”、提升能力,大语言模型在翻译领域的应用非常成功,其主流的技术是卷积神经网络(CNN)、循环神经网络(RNN)以及Word2Vec词嵌入技术等。
大语言模型的突破性发展出现在2017年,随着Google机器翻译团队那篇著名的论文“Attention is All You Need” 的发表,采用注意力(Attention)机制的Transformer架构开始大行其道。2018年OpenAI推出了GPT系列模型,包括GPT-1和GPT-2,这些模型都使用了Transformer架构,并收集了大量的语料库进行训练,从而实现了对长序列文本的处理和生成。
OpenAI的GPT-2可称得上是一个划时代的模型。以现在的技术来看,GPT-2参数量较少,基本上用于推理和文本补全场合,其知名度与GPT-4相去甚远。但实际上它已基本上具备了大语言模型在训练、语义理解、推理生成等方面的大部分特性,这几年在文本生成和分析场景中的应用非常广泛。
随着模型开发技术的进步、算力的提升,大语言模型的参数规模也在不断地扩大。2020年,OpenAI推出了GPT-3,该模型拥有1750亿个参数。基于GPT-3的现象级应用是OpenAI和GitHub联合推出的Copilt辅助代码补全工具。同期,Google推出了BERT模型,它使用双向Transformer架构,在多个NLP任务中取得了显著成果。
在基于GPT-3.5的ChatGPT面世之前,大语言模型虽然发展迅速,但依然是应用在比较专业的领域,如机器翻译、代码书写、文本推理生成等。直到2022年11月OpenAI发布了ChatGPT,大语言模型从推理、预测这些相对专业的技术应用转变为人性化的聊天应用,进入大众的日常生活。之后,同类大模型层出不穷,国产模型也不断涌现,形成“百模大战”的态势。
大语言模型的技术方向和发展历程由Mooler0410整理,在https://github.com/Mooler0410/LLMsPracticalGuide上可以查阅,进化树见图1-1。
(1)从发布年份来看(下面对年份进行了夸张描述,实际上只有短短6年的时间),主要的大语言模型如下。
❍ “史前”:Word2Vec。
❍ “远古”:BERT、GPT-1。
❍ “近古”:GPT-2、XLNet。
❍ “近代”:GPT-3、T5、GLM。
❍ “现代”:GPT-4、LLaMA2、Gemma、Claude3。
(2)从厂商来看,主要的大语言模型如下。
❍ Google:BERT、T5、Gemma。
❍ OpenAI:GPT-2、GPT-3、GPT-4。
❍ Claude:Claude2、Claude3。
❍ Meta(Facebook):LLaMA2。
❍ 国产:GLM。
图1-1 大语言模型进化树
(3)从架构来看(Encoder和Decoder是Transformer的组成部分),主要的大语言模型如下。
❍ Encoder-only(仅编码器):BERT。
❍ Encoder-Decoder(编码器-解码器):GLM、T5。
❍ Decoder-only(仅解码器):GPT、LLaMA、Claude、Gemma。
大语言模型处于高速发展阶段,但依然处于OpenAI的GPT系列一骑绝尘、其他公司努力追赶的态势。Anthropic推出了Claude3,可能对GPT的地位构成一定威胁。Meta的LLaMA出现在ChatGPT之后,但其开源生态对业界的推动非常大,涌现出一批基于LLaMA架构的国内外开源模型,满足了使用者在文本方面的大部分需求。Google的Gemma推出时间不长,但起点比较高。国内的模型除商业化运转的文心一言、讯飞星火外,还有一些开源的模型,如ChatGLM、阿里通义千问等,为用户提供了更多选择。整体而言,大语言模型领域的竞争日益激烈,各家厂商都在不断努力创新,为用户带来更优质的文本处理体验。
除了模型厂家推出的Chat类应用外,对开源大语言模型进行微调并将其应用于垂直专业领域也是大语言模型应用的重要发展方向。金融、医疗、编程等领域的专用大模型正在迅速发展。类似的定制化模型在不同行业中发挥着越来越重要的作用,为专业领域的用户提供了更加精准、高效的文本处理和分析工具。随着这些应用的不断完善和普及,开源大语言模型在专业垂直领域的应用前景将会更加广阔,为各行各业带来更多创新和便利。
从技术方面看,基于Transformer的Decoder-only架构是大语言模型的主流,各种模型表现出一定的技术趋同性。大部分开源的大模型都托管到huggingface.co网站,用户可以使用Hugging Face的Transformers库 (Package )进行装载、推理、微调等。
首先,大语言模型在文本方面的能力已相当成熟,即使是具有2B(20亿)参数规模的较小模型,在大部分日常与文本相关的生产生活场景中,也表现得比较出色。其次,在多模态领域,大语言模型在理解图像、生成图像方面也逐渐走向成熟,文本生成图像(文生图)和图像生成图像(图生图)的应用越来越完善。另外,近期OpenAI发布的人工智能文生视频大模型Sora代表着一个全新的方向,开辟了多模态智能应用的新的可能性。
模型的小型化是另一个重要的应用发展趋势。大语言模型是将自然语言问题转化为数字计算的应用,因此GPU算力是大模型的主要运行资源。在实践中,对数值的计算可以容忍一定的精度下降而对结果无显著影响,基于这一前提,发展出了大语言模型的量化应用,即将模型中的权重(Weight)从高精度格式转换成低精度格式,如将32位浮点数转换成8位整数INT8的格式,期望量化后的模型在准确率上与量化前相近。经过量化处理的模型,可以脱离GPU而被移植到CPU上运行,甚至可以部署在Android手机上运行。这样的端侧部署方案在一些安全性要求高的环境、垂直专业领域、离线应用场景有一定的发展潜力。
大语言模型首先在大规模的无标注语料上进行自监督预训练,通过掩码语言模型、下一句预测等任务,学习语言统计规律,之后针对下游NLP任务进行微调,以适应特定任务。例如,将基础模型微调后得到Chat模型,以便模型在对话任务中工作得更好。这种无标注语料的方法减少了模型对大量标注数据的依赖,使其可进行自回归生成,逐词预测下一个最可能的token 。
在文本生成过程中,模型学习如何连贯、流畅地产生由token组成的语言序列。这种生成机制模拟了人类语言的产生过程。大语言模型的参数量通常在十亿级甚至千亿级,这使其可以学习大量的语言知识,拟合训练语料的分布,理解语义信息,显示出强大的语言生成能力。
大语言模型通常采用Transformer或其优化版本作为骨干架构。Transformer是一种基于自注意力(Self-attention)机制的深度学习模型架构,由Google翻译团队的Ashish Vaswani等人在2017年提出,主要用于处理序列数据。而在自然语言处理任务中,文本序列经过词汇表索引等方式转换为数字序列的形式,这一步骤是将语言处理转化为数学计算的关键环节。
Transformer的核心是自注意力机制,能够在一个文本序列中的不同位置之间建立关联,从而更好地捕捉序列中的长距离依赖关系。通过自注意力机制,Transformer能够并行处理输入序列中的不同位置信息,使其在处理长序列时具有更好的性能。在Transformer中,输入序列经过多层的注意力机制和前馈神经网络处理,最终输出表示序列的向量。基于Transformer的模型结构包括Encoder(编码器)和Decoder(解码器)两部分,Encoder用于将输入序列编码为隐藏表示,Decoder则用于根据Encoder的输出生成目标序列。Transformer能够通过编码器-解码器结构、多头自注意力机制以及前馈全连接神经网络,学习语言中的长距离依赖关系,理解语义信息。由于Transformer具有并行计算能力和良好的建模能力,它在机器翻译、文本生成和问答系统等任务中表现出色。其架构如图1-2所示。
图1-2 Transformer架构示意
在Transformer中,输入序列首先通过一个编码器进行编码,然后通过一个解码器进行解码,最终输出目标序列。编码器和解码器并不总是成对出现,在近几年的发展中,大语言模型对Transformer架构的使用分化为三个技术流派:Encoder-only、Encoder-Decoder和Decoder-only。目前来看,Decoder-only方向是主流。
Transformer的编码器和解码器由多个相同的层堆叠而成。每个层包含两个子层:多头自注意力机制(Multi-Head Self-Attention)层和前馈全连接神经网络(Feed-Forward Fully Connected Neural Network)层。在每个子层之间还加入了残差连接和层归一化操作,有助于缓解梯度消失问题,加速训练过程。
Transformer由6层编码器和6层解码器组成,每一层编码器的输入是前一层编码器的输出,而每一层解码器的输入不仅是其前一层解码器的输出,还包括了整个编码部分的输出。原始的文字通过编码和解码过程,最终形成目标文本。其结构如图1-3所示。
图1-3 Transformer分层结构
自注意力机制是一种用于计算序列数据中不同位置之间依赖关系的方法。在自注意力机制中,每个输入位置都会与其他位置进行交互,以便根据它们之间的关系来调整其表示。自注意力机制允许模型查看输入序列中的其他token,以便更好地理解序列中的某个token。
如图1-4所示,在“大”“模”“型”三个token之间,“型”与“大”的关系最密切,与“模”的关系次之。
注意力函数用于计算输入序列中每个位置与其他位置之间的注意力权重,可以描述为将一个查询和一组键值对映射到输出,其中查询( Q )、键( K )、值( V )和输出都是向量,输入乘以三个不同的权重矩阵分别得到 Q 、 K 、 V ,如图1-5所示。
图1-4 自注意力机制示意
Q 乘以 K T 得到一个3×3矩阵,分别表示一个token内各元素之间的注意力值(相关性),见图1-6。
d k 是缩放系数,默认值为64,可以使结果不至于过大或过小,避免经过softmax函数计算之后的结果非0即1。softmax是归一化函数,可以将数值向量转换为概率分布,即将向量与向量之间的相关性通过概率分布的形式表现出来。softmax函数计算过程如图1-7所示。
图1-5 自注意力中的 Q 、 K 、 V
图1-6 注意力计算过程示意
图1-7 softmax函数计算过程
在Transformer架构中,注意力模块会并行地重复计算多次。其中的每一次计算被称为一个注意力头(Attention Head)。注意力模块将 Q 、 K 和 V 分成多份,然后将每一份独立地通过一个单独的注意力头进行处理。这些注意力计算结果最终被融合在一起,形成注意力分数,这种机制被称为多头注意力,能使得Transformer更好地捕捉每个单词之间的多重关系和细微差别。自注意力关注序列内每个位置对其他所有位置的重要性,而多头注意力则通过在多个子空间中并行计算注意力,使模型能够同时捕获和整合不同方面的上下文信息,从而增强了对复杂数据内在结构的分析能力。
Python是一种高级编程语言,由Guido van Rossum在1989年首次发布。Python代码可读性高、便于维护、语法简洁,且Python是面向对象编程,被广泛用于数据科学、机器学习、人工智能、Web开发、自动化脚本和游戏开发等领域。
随着人工智能和自然语言处理领域的不断发展,Python在GPT应用开发中扮演着越来越重要的角色,并且得到了持续的更新。PyTorch、TensorFlow、NumPy和Transformers这些库提供了构建和训练GPT模型所需的工具与资源,开发人员可以利用Python的简洁语法和强大的库来快速实现各种GPT应用。在本书中,后台应用都采用了Python来进行编写,仅使用100行以内的代码就可以实现复杂、功能强大的应用。
下面介绍一下书中涉及的两个最主要的库:PyTorch和Transformers。
PyTorch是Torch的Python版本。Torch是一个开源的机器学习库,最初由Facebook(Meta)开发,提供了许多用于构建深度学习模型的工具和算法。Torch使用Lua编程语言,提供了一个灵活的张量库,可以在GPU上高效地运行。PyTorch提供了与Torch类似的功能,它使用Python作为主要编程语言,提供了许多方便的工具和接口,使得构建和训练深度学习模型更加简单、直观。
Transformers库与Transformer有关。Transformer是大语言模型开发中使用的一种深度学习架构,而Transformers是Hugging Face开发的一个开源的自然语言处理库,支持许多预训练Transformer模型(如BERT、GPT、LLaMA),提供了方便的API和工具,使开发者使用这些预训练模型变得更加简单和高效。开发者可以轻松地加载、微调和使用这些模型,从而快速构建和训练自己的NLP模型应用。
React.js是一种用于构建用户界面的JavaScript库,由Facebook(Meta)开发,使用组件化的方式来构建UI,使开发人员能够更加高效地构建复杂的Web应用程序。在本书提供的开发案例中,除个别应用以命令行模式运行或以Python构建Web应用外,其他的都需要开发客户端,本书选用React.js演示客户端开发,主要是考虑到了React.js的以下优势。
❍ 组件化UI:React.js使用组件来构建UI,使开发人员能够更加清晰地组织代码,并且能够更好地维护代码。本书中经常使用的客户端Chat组件,就是使用了开源软件ChatUI 定制的。
❍ 动态性:React.js支持动态渲染,能够实时地更新UI,使应用程序更加响应式。
❍ 热更新:React.js支持热更新,能够实时地更新UI,这样修改源代码的结果会立刻反映到浏览器里,不需要重启服务,也不需要刷新网页,应用程序开发效率更高。
❍ Node.js支持:React.js应用程序在开发过程中,需要Node.js环境的支持,而大语言模型提供了OpenAI的兼容推理接口,这样客户端就可以使用openai-node组件调用大模型服务。从客户端的角度来看,统一的接口消除了访问不同大模型方法的差异。
本书所涉及的大语言模型大多是预训练模型。在相关语境中,训练(Training)和微调(Fine-Tuning)这两个概念的界限比较模糊,提及“训练”时往往指的是“微调”。但预训练(Pre-training)和微调则完全不同,预训练是指训练出一个已经掌握了各种语言特征规律及人类知识的模型,并且用参数来固定这些已学到的知识。而微调是指调整大语言模型的参数以适应特定任务的过程,是通过在与任务相关的数据集上训练模型来完成的。微调的基本原理是在训练开始时对预训练模型中的权重进行初始化,然后在训练过程中逐步调整这些权重,以适应新的下游任务,如对话、翻译、文本分类、写摘要等。举例来说,ChatGPT使用的模型是在基础模型davinc上微调形成的,GLM基础模型在微调后生成对话模型ChatGLM。
微调过程虽然复杂,但相对于训练一个全新模型而言,它只涉及对参数进行细微调整。此外,微调所使用的数据集通常相对较小。目前主流的微调方法有FFT、RLHF、P-Tuning和LoRA等。与训练一个预训练模型需要海量的语料不同,微调的数据量较小,一般由52000个任务数据组成。
FFT(Full Fine Tuning,全量微调)是一种对整个预训练模型的所有参数进行微调的方法,预训练模型的所有层和参数都可能会被更新和优化,以适应新加入的语料。这种微调方法通常适用于微调任务和预训练模型之间存在很大差异的情况。比如,预训练模型是一个基础模型,只包含常规的知识和语法结构,而微调的目标是让其能用于金融服务。全微调需要较多的算力资源和时间,但可以获得比较好的效果。
RLHF是Reinforcement Learning from Human Feedback(人类反馈强化学习)的缩写,是指基于人类反馈对大语言模型进行强化学习,让大模型生成的结果更符合人类的期望。RLHF是ChatGPT模型训练的手段之一。RLHF训练流程分为以下三步。
❍ 监督微调(Supervised Fine-Tuning,SFT):使用人工精选的问题与答案,对预训练的语言模型进行微调,形成多个预选模型。
❍ 奖励模型微调(Reward Model Fine-Tuning,RW):用多个模型(初始模型、微调模型)给出问题的多个回答,然后人工对这些问答按一些标准(可读性、无害、正确性)进行排序,训练一个奖励模型/偏好模型来进行打分。
❍ RLHF训练:利用近端策略优化(Proximal Policy Optimization,PPO)算法,根据RW模型的奖励反馈进一步微调S F T模型。
实践RLHF微调并不需要很高的算力,可以在消费级的推理卡上进行,Deepspeed-chat 给出了完整的RLHF三阶段微调方法和示例。
P-Tuning是ChatGLM模型专用的微调方式,是在微调方法的基础上进行改进而形成的一种参数高效的微调方法。P-Tuning过程中只有少量参数参与微调,训练计算复杂度相对较小,其原理是将人工提示词模板转换成可学习的连续向量,通过学习下游任务来优化这些向量,从而自动生成效果良好的自动提示模板。P-Tuning v2对该方法进行了适当优化,使其在各种规模的模型中普遍有效。优化后的提示调整策略在中小型模型和序列标注任务上实现了与传统微调相当的性能。
LoRA (Low-Rank Adaptation of large language model,大语言模型的低秩适配)的基本原理是冻结预训练好的模型权重参数,在冻结原模型参数的基础上向模型中加入额外的网络层,并只训练这些新增的网络层参数。由于这些新增参数的数量较少,这样不仅微调的成本显著下降,还能获得和全模型参数参与微调类似的效果。在实践过程中,经过LoRA微调的模型,对新加入的语料知识进行学习的效果显著,是一种低算力、低成本但效果较好的微调方法。
大语言模型应用领域经常会出现一些“非专业术语”,描述一些现象,在这里我们做一下详细说明。
大模型幻觉(Hallucination)指大模型在面对某些输入时,产生不准确、不完整或误导性的输出,即“一本正经地说胡话”,比如输出不准确的回答、不存在的参考文献、对最近新闻的不合理评论等。幻觉的形成原因有很多,如模型参数太少、语料时效性差、语料数量或训练不足。总之,因为大语言模型的强大能力,人们误认为它能回答一切问题,实际上这是不可能的。模型为了避免自身知识储备不足导致“拒绝回答”造成用户不信任,会生成语义正确但逻辑错误的答案。这种情况被称为“幻觉”,但该现象名称的诗意实际上无法掩盖问题的严重性。
灾难性遗忘(Catastrophic Forgetting)通常发生在大语言模型进行参数微调后,学习新知识的过程会迅速破坏之前获得的信息。简单来说,微调过程中大语言模型的参数发生变化,模型将原来学到的知识“忘记”,输出效果还不如原始模型,原因多是语料质量差、训练不够、噪声干扰、过度拟合微调数据集等。
涌现是指模型未经直接训练,突然而不可预测地展现出的能力。例如,在用大量自然语言文本训练后突然能够回答并未见过的问题,总结段落或文章的内容,解答数学题并达到较高的准确率。这个能力是在模型参数达到一定规模或训练到一定阶段突然出现的非线性增长,见图1-8。
图1-8 涌现示意
但对于是否真的存在这种难以解释的涌现情况,业界目前有两种观点。
1)确实存在涌现:随着参数量和训练数据增加,规模较大的模型确实会突然具备规模较小的模型所不具备的能力,而且不能从规模较小的模型的表现推导出在什么规模条件下新能力会出现。
2)不存在涌现:这是不完善的评估方法造成的错觉,使用非线性或不连续的评估标准会造成涌现的假象,而通过线性或连续的评估标准可以相当好地预测大语言模型的能力。
随着大模型开始从事语言理解和内容生成工作,人们需要面对一个非常有挑战性的问题:如何让大模型的能力和行为跟人类的价值观、真实意图和伦理原则保持一致?这个问题被称为“价值对齐”(Value Alignment)。价值对齐是AI安全的一个核心议题,一个没有价值对齐的大语言模型,可能输出含有种族歧视、性别歧视、违法或不良倾向的内容。对此,人类反馈强化学习(RLHF)被证明是一个有效解决价值对齐问题的方法,它通过少量的人类反馈数据就可能实现比较好的对齐效果。模型的对齐步骤必不可少,但如果开发并运营一个基于大语言模型的产品,只进行模型对齐是不够的,还要在应用端做大量的信息处理工作,拦截明显不符合人类价值观的问题和答案。