AI - 自然语言处理(NLP) - part 3 - 语言模型
目录
- NLP(Natural Language Processing,自然语言处理)
- LM(Language Model,语言模型)
- 核心能力
- 层次一:基础核心能力
- 1 概率计算与评估
- 2 文本生成
- 层次二:进阶语义能力
- 3 语义理解与表示
- 4 上下文建模
- 层次三:高级涌现能力
- 5 指令遵循与任务泛化
- 6 思维链推理
- 7 工具使用与外部知识整合
- 总结
- 演进路线
- N-Gram
- NPLM(神经概率语言模型)
- RNN(Recurrent Neural Network,循环神经网络)
- 时间步
- Seq2Seq架构
- Attention Mechanism(注意力机制)
- 基于Transformer架构的预训练模型
- Transformer
- 预训练(Pre-trained)
- 微调(Fine-tuning)
- 提示/指令(Prompt/Instruct)
- BERT(Bidirectional Encoder Representations from Transformers)
- GPT(Generative Pre-trained Transformer)
- 生成式自回归模型
- BERT和 GPT的区别
- GPT演进历程
- ChatGPT
- RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)
NLP(Natural Language Processing,自然语言处理)
自然语言处理是人工智能的一个子领域,关注计算机如何理解、解释和生成人类语言。
NLP的核心任务就是为人类的语言编码并解码,是人类与计算机沟通的桥梁。
在上一篇文章中探讨了词向量,下面来看语言模型。
LM(Language Model,语言模型)
语言模型是一种用于计算和预测自然语言序列概率分布的模型,它通过分析大量的语言数据,基于自然语言上下文相关的特性建立数学模型来推断和预测语言现象。简单地说,它可以根据给定的上下文,预测接下来出现的单词。
语言模型可以预测单词,但更严谨地说,言模型就是一个用来估计文本概率分布的数学模型,它可以帮助我们了解某个文本序列在自然语言中出现的概率,因此也就能够根据给定的文本,预测下一个最可能出现的单词。语言模型关注的是一段上下文中单词之间的相关性,以保证模型所生成的文本序列是合理的语句。
语言模型被广泛应用于机器翻译、语音识别、文本生成、对话系统等多个NLP领域。
核心能力
层次一:基础核心能力
1 概率计算与评估
这是语言模型最原始、最核心的能力。
- 它是什么:模型可以为任何一个词序列(一个句子、一段话)分配一个概率值,这个值代表了“这句话在训练数据所代表的世界里,有多大的可能性是合理的”。
- 例子:
“我今天吃了一个苹果” → 概率高(合理、通顺)
“苹果吃了一个我今天” → 概率低(不合语法、混乱) - 应用:在机器翻译、语音识别中,用于从多个候选结果中选出最合理的一个。比如,语音识别听到“jīntiān hěn rè”,它需要判断是输出“今天很热”(高概率)还是“金天很热”(低概率)。
2 文本生成
这是概率计算能力的自然延伸。
- 它是什么:基于已有的上文,自动地、连续地预测下一个(或下几个)最可能的词,从而像“完形填空”一样生成完整的文本。
- 机制:这是一个自回归的过程。
输入: “人工智能是...”
预测: “一门” (概率最高)
新输入: “人工智能是一门...”
预测: “技术” (概率最高)
继续: “人工智能是一门技术...”
...直到生成结束符。
- 应用:所有需要自动产生文本的地方,如智能写作、对话系统、代码补全。
层次二:进阶语义能力
3 语义理解与表示
语言模型在训练过程中,为了更好地预测下一个词,必须理解上文的意思。
-
它是什么:模型将词汇、句子映射到高维向量空间,在这个空间里,语义相似的词或句子的位置也相近。
-
例子:
向量 King - Man + Woman ≈ Queen
句子 “如何做西红柿炒蛋?” 和 “西红柿炒蛋的制作步骤?” 的向量表示会非常接近。 -
应用:这是搜索引擎、推荐系统、文本分类的情感分析等任务的底层支撑。模型能理解你的查询意图,并找到语义相关的内容。
4 上下文建模
这是区分现代语言模型(如Transformer)与早期模型的关键能力。
-
它是什么:模型能够记住并利用整个上文窗口中的所有信息来理解当前词的含义,而不是只看邻近的几个词。
-
例子:
上文:“小明把蛋糕从冰箱里拿出来,因为它太硬了。”
问题:“‘它’指的是什么?”
模型需要联系整个上下文,才能知道“它”指的是“蛋糕”(因为蛋糕在冰箱里会变硬)。 -
应用:使模型能够处理长文档、进行多轮对话、理解复杂的指代和逻辑关系。
层次三:高级涌现能力
这些能力在模型规模(数据、参数)达到一定程度后自动出现,并非被直接编程。
5 指令遵循与任务泛化
这是大语言模型最革命性的能力之一。
- 它是什么:模型能够理解用自然语言描述的指令,并执行该指令所对应的任务,即使它从未在特定任务上被专门训练过。
- 例子:
指令:“把‘Hello World’翻译成中文。” → 输出:“你好,世界”
指令:“为‘碳中和’这个概念写一个简单的定义。” → 输出定义。
指令:“用Python写一个函数计算斐波那契数列。” → 输出代码。 - 意义:这意味着我们不再需要为每个新任务训练一个专用模型,一个模型可以应对万变。
6 思维链推理
- 它是什么:当面临复杂问题时,模型能够生成一系列中间推理步骤,最终得出答案,而不是直接“蒙”一个答案。
- 例子:
- 问题:“一个房间里有两个桌子,第一个桌子有4个苹果,第二个桌子有2个苹果,我吃掉了1个,还剩几个?”
直接回答:“5个” (错误)
思维链:“第一个桌子4个,第二个桌子2个,所以总共有4+2=6个。吃掉了1个,所以还剩6-1=5个。答案是5。” (正确) - 意义:极大地提升了模型解决复杂数学、逻辑问题的能力,并且让模型的思考过程对用户变得透明、可追溯。
7 工具使用与外部知识整合
-
它是什么:模型能够识别出自己无法独立完成的任务(如实时信息获取、精确计算等),并主动调用外部工具(如搜索引擎、计算器、代码解释器)来协助完成。
-
例子:
用户:“今天纽约的天气怎么样?”
模型思考:“我没有实时天气信息,需要调用搜索工具。”
模型行动:[调用搜索API] → [获取结果:纽约今天晴,25度] → 回答用户:“纽约今天晴天,气温25摄氏度。”
意义:突破了模型在训练数据、实时性和精确计算方面的局限,使其能力边界无限扩展。
总结
语言模型的核心能力从一个简单的概率预测器出发,通过架构创新和数据 scaling,演化成了一个能够理解语义、联系上下文、遵循指令、进行逻辑推理的通用任务解决系统。
- 基础能力(概率、生成) 是其躯体。
- 进阶能力(理解、上下文) 是其大脑。
- 高级涌现能力(推理、指令遵循) 则使其成为一个可以与世界灵活交互的智能体。
理解这些核心能力,是理解当今所有AI应用(如ChatGPT、Copilot等)为何如此强大的关键。
演进路线
目前流行的语言模型都属于统计语言模型,其演进演进路线为:
- N-Gram模型
- 循环神经网络(RNN)模型
- 长短期记忆网络(LSTM)模型
- 现在非常流行的基于Transformer架构的预训练语言模型(Pre-trained Language Model,PLM),如BERT、GPT系列等,还有ChatGPT。这就是熟知的大语言模型(Large Language Model,LLM)
大语言模型(LLM)发展历程:
N-Gram
N-Gram是一种用于语言建模的技术,它用来估计文本中词序列的概率分布。
“N”就是将文本分割成连续N个词的组合的一个2-Gram表示两个相邻的词组成的序列,例如“我爱学习”分成“我爱” “爱学”和“学习”;而一个3-Gram表示三个相邻的词组成的序列,例如“我爱学习”分成“我爱学”和“爱学习”。以此类推,还可以有4-Gram、5-Gram。
什么是词?
“Gram”这个词来源于希腊语的词根,意为“字母”或“写作”。在N-Gram模型中,它表示文本中的一个元素,“N-Gram”指长度为N的连续元素序列。
这里的“元素”在英文中可以指单词,也可以指字符,有时还可以指“子词”(Subword);而在中文中,可以指词或者短语,也可以指字。
如何分词?
那么在实际应用中,到底应该把语料库拆分成什么元素呢?是字还是词?
如何分词需要具体情况具体分析。在自然语言处理中,一个非常关键的预处理环节就是按照需要对语料库,也就是自然语言数据集中的句子进行分词,分词之后,文本序列就形成了可以输入语言模型的一个个“元素”(或者称为“单元”),这个元素的英文名叫作“Token”。Token翻译成中文,常常词不达意。有人叫它“令牌”,有人叫它“子词”或者“分词”。总而言之,当你看到Token,就应该知道,我们已经通过分词工具,把语料,也就是一个个句子,切成了能够被语言模型读取并处理的一个个元素。
语料库
语料库是一个按照特定标准收集和组织的、电子形式的、海量文本或语音数据的集合。您可以把它想象成一个为语言研究或模型训练而专门建立的 “语言数据库” 或 “语言素材仓库”。
语料库的关键特征
- 电子化:必须是计算机可读的格式(如 .txt, .jsonl, .xml 等),便于机器处理。
- 代表性:语料库的构建通常有明确目的,其内容需要代表某一特定语言、领域或文体(如新闻语料库、学术论文语料库、口语对话语料库)。
- 规模性:通常容量巨大,从数百万到数千亿甚至万亿个词汇,为大语言模型提供充足的学习素材。
- 结构化:原始的纯文本只是基础。高质量的语料库通常包含元数据 和标注,使其更具价值。
- 元数据:描述数据本身的数据,如文本来源、作者、出版日期、语言、领域等。
- 标注:对文本内容进行的额外加工,如词性标注、语法结构分析、实体识别等。
语料库的来源与类型
类型 描述 示例 网页内容 最大的来源,通过爬虫获取,内容多样但质量参差不齐。 Common Crawl(一个公开的网页爬虫数据集) 书籍与期刊 质量高,语言规范,逻辑性强,是深层次知识的重要来源。 Google Books, 学术论文库 百科全书 事实准确,结构化程度高。 维基百科 代码仓库 用于训练模型的代码理解和生成能力。 GitHub 上的公开代码 对话与社交数据 帮助模型学习日常、口语化的表达方式。 Reddit, 论坛帖子,客服对话记录(需脱敏) 新闻文章 语言规范,时效性强。 各大新闻网站的存档 语料库是大语言模型的 “教科书” 和 “训练食粮”。没有海量、高质量的语料库,就不可能训练出强大的大语言模型。
语料库 是现代自然语言处理和人工智能的基石。它不仅是大语言模型学习和获取知识的唯一源泉,其规模、质量和多样性也直接决定了模型能力的天花板。我们与AI的每一次对话,背后都是它对浩瀚语料库中学习到的模式和知识的综合运用。
标签
在传统监督学习中,标签 是数据集中每个样本的“正确答案”或“预期输出”。它是由人类专家或明确规则预先定义好的,用于指导模型学习输入与输出之间的映射关系。
例如:
输入:一篇新闻文章
标签:[“政治”, “经济”]
大语言模型主要采用自监督学习,标签是从文本自身生成的。
大语言模型中的“标签”主要包括:
- 自监督标签:从文本自身生成的下一个词
- 元数据标签:描述数据来源和质量
- 指令标签:用于对齐微调的问答对
- 安全标签:内容过滤和安全性控制
- 质量标签:用于数据清洗和加权训练
这些标签共同确保了模型训练的数据质量、安全性和有效性。
N-Gram模型的构建过程如下:
- 将给定文本分割成连续的N个词(Gram)的组合
例如文本“我爱学习”,如果按照2-Gram来分词,结果是:“我爱”,“爱学”,“学习”,每一个词长度都是2 - 统计词频:每个词在语料库中出现的次数
如果“我爱”在语料库中出现了20次,词频就是20 - 统计一个词在给定上下文中出现的概率:概率=词频/前缀词频
如果前缀“我”在语料库中出现了100次,那么下一个字是“爱”的概率就是20/100=20% - 预测下一个次出现的可能性。选择概率最高的词。
如果给出第一个字“我”,并且“我爱”的概率20是最高,那预测的结果就是“我爱”
N-Gram模型将文本看作一个由词序列构成的随机过程,根据已有的文本数据,计算出词序列出现的概率。因此,N-Gram主要用于语言建模、文本生成、语音识别等自然语言处理任务中。
- N-Gram是一种基于连续词序列的文本表示方法。它将文本分割成由连续的N个词组成的片段,从而捕捉局部语序信息。
- N-Gram可以根据不同的N值捕捉不同程度的上下文信息。例如,1-Gram(Unigram)仅关注单个词,而2-Gram(Bigram)关注相邻的两个词的组合,以以类推。
- 随着N的增加,模型可能会遇到数据稀疏性问题,导致模型性能下降。
NPLM(神经概率语言模型)
词向量模型只关注的局部语义信息,无法捕捉到句子级别的语义信息。而且,它们无法解决一词多义的问题。同一个词在不同的语境中可能有不同的含义,但WordZVec只能为每个词分配一个固定的向量表示,而无法捕捉这种多义性。每一个单词的具体语义,都和上下文息息相关,变化十分细微。因此,尽管有了词向量这种单词的表征
在很长的一段时间内,研究自然语言处理的学者们还是无法做出能够真正理解人类语言的模型。而另外一个问题是,Word2Vec这类词向量模型是以已知词汇表为基础学习的,它们无法处理未见过的词(即词汇表外的词),不能为未知词生成合适的词向量。
正是由于这个局限,NLP迟迟没有在具体下游任务的处理上实现突破。因此,如何让NLP技术真正落地,真正解决实际问题,成了NLP学者们最头疼的问题。
神经概率语言模型(Neural Probabilistic Language Model, NPLM)将神经网络用于语言模型。在NPLM之前,传统的语言模型主要依赖于最基本的N-Gram技术,通过统计词汇的共现频率来计算词汇组合的概率。然而,这种方法在处理稀疏数据和长距离依赖时遇到了困难。
NPLM是一种将词汇映射到连续向量空间的方法,其核心思想是利用神经网络学习词汇的概率分布。和N-Gram一样,NPLM通过利用前N-1个词来预测第N个词,但是NPLM构建了一个基于神经网络的语言模型。与传统的N-Gram语言模型相比,NPLM优化参数和预测第N个词的方法更加复杂。
得益于神经网络的强大表达能力,NPLM能够更有效地处理稀疏数据和长距离依赖问题。这意味着,NPLM在面对罕见词汇和捕捉距离较远的词之间的依赖关系时表现得更加出色,相较于传统的N-Gram语言模型有着显著的优势。
NPLM是一种基于神经网络的语言模型,用于估计语言序列的概率分布。它通过学习上下文中的词来预测下一个词,其主要思想是将单词转换为向量形式,并使用这些向量来训练一个神经网络。NPLM基于神经网络,因此它可以通过深度学习的技术,例如卷积神经网络和循环神经网络等来具体实现。
Word2Vec是一种将单词表示为向量的词向量学习算法。它有两种不同的实现方式:CBOW模型和Skip-Gram模型。CBOW模型的思想是基于上下文预测目标单词,而Skip-Gram模型则是基于目标单词预测上下文。早期的Word2Vec使用的是一种浅层神经网络模型,称为嵌入层,它将单词映射到向量空间中。
NPLM的结构包括3个主要部分:
- 输入层
输入层将词汇映射到连续的词向量空间 - 隐藏层
隐藏层通过非线性激活函数学习词与词之间的复杂关系 - 输出层
输出层通过softmax函数产生下一个单词的概率分布
优势 | 缺陷 |
---|---|
可以自动学习复杂的特征表示,减少了手工特征工程的需求 | 模型结构简单:NPLM使用了较少的线性层和激活的数,神经网络的层数不够深,这使得模型的表达能力受到限制。对于复杂的语言模式和长距离依赖关系,NPLM可能无法捕捉到足够的信息。 |
可以对大量数据进行高效的处理,使得模型能通过大规模语料库更好地学习与词之间的语义和语法关系 | 窗口大小固定:NPLM使用窗口大小固定的输入序列,这限制了模型处理不同长度上下文的能力。在实际应用中,语言模型通常需要处理长度可变的文本数据 |
具有强大的拟合能力,可以捕捉到语言数据中的复杂结构和模式 | 缺乏长距离依赖捕捉:由于窗口大小固定,NPLM无法捕捉长距离依赖。在许多NLP 任务中,捕捉长距离依赖关系对于理解句子结构和语义具有重要意义。 |
具体到NPLM本身来说,它也存在一些明显的不足之处 | 训练效率低:NPLM的训练过程中,全连接层的输出大小等于词汇表的大小。当词汇表非常大时,计算量会变得非常大,导致训练效率降低。 |
词汇表固定:NPLM在训练时使用固定词汇表,这意味着模型无法处理训练集中未出现的词汇(未登录词)。这限制了模型在现实应用中的泛化能力。 |
为了解决这些问题,研究人员提出了一些更先进的神经网络语言模型,如循环神经网络、长短期记忆网络、门控循环单元(GRU)和Transformer等。这些模型能够捕捉长距离依赖,处理变长序列,同时具有更强的表达能力和泛化能力。LSTM和GRU都是广义上的循环神经网络。
RNN(Recurrent Neural Network,循环神经网络)
RNN的核心思想是利用“循环”的机制,将网络的输出反馈到输入,这使得它能够在处理数据时保留前面的信息,从而捕获序列中的长距离依赖关系,在处理序列数据,如文本、语音和时间序列时具有明显的优势。
简单来说,RNN可以看作一个具有“记忆”的神经网络。RNN的基本原理是通过循环来传递隐藏状态信息,从而实现对序列数据的建模。一个简单的RNN包在输入层、隐藏层和输出层。在每个时间步(可理解为每次循环的过程),RNN会读取当前输入,并结合前一个时间步的隐藏状态来更新当前的隐藏状态。然后,这个隐藏状态会被用于生成输出和更新下一个时间步的隐藏状态。通过这种方式,RNN可以捕获序列中的依赖关系。最后,输出层根据隐藏层的信息产生预测。
通过在每个时间步共享权重(即在处理各个token时使用相同的RNN),RNN能够处理不同长度的输入序列。这种权重共享机制使得RNN具有很大的灵活性,因为它可以适应各种长度的序列,在处理自然语言和其他可变长度序列数据时更具优势,而不像 NPLM 那样受到窗口大小固定的限制。
时间步
时间步 就是神经网络处理这类序列数据的基本单位。它定义了模型在处理序列时,一次看多少数据,以及如何按顺序推进。
- 一个时间步 = 模型的一个“观察时刻”。
- 在每个时间步,模型会接收一个或一组输入,进行思考,并可能产生一个输出。
- 然后,模型会移动到下一个时间步,处理序列中的下一个数据点,同时它会记住(或参考)之前时间步的信息。
一个生动的例子:预测一句话的下一个词
假设我们要让一个循环神经网络(RNN)来补全这句话:“猫坐在___”。
这句话是一个序列,由4个词组成:[“猫”, “坐”, “在”] -> 目标:预测下一个词(比如“地上”)。
- 时间步 1:
输入:词 “猫”
模型状态:初始状态(一片空白)。
输出/隐藏状态:模型接收到“猫”,更新其内部状态,可能表示“主题是猫”。此时可能还不足以做出预测。 - 时间步 2:
输入:词 “坐”
模型状态:来自时间步1的状态(知道主题是“猫”)。
输出/隐藏状态:结合新词“坐”和之前的状态,更新为“猫在做一个动作:坐”。 - 时间步 3:
输入:词 “在”
模型状态:来自时间步2的状态(“猫在坐”)。
输出/隐藏状态:结合新词“在”,状态更新为“猫坐在某个地方”,并且模型已经积累了足够的信息。
预测:在这个时间步,模型可能会输出它的预测,比如“地上”的概率最高。
在这个例子中:
- 序列长度是3(有3个词需要输入)。
- 我们一共处理了3个时间步。
- 每个时间步处理序列中的一个元素(一个词)。
- 模型通过其隐藏状态 将前面时间步的信息传递到后面,从而理解了上下文。
在不同领域的体现
时间步的概念根据数据类型有不同的体现:
领域 | 序列数据 | 一个时间步通常代表 |
---|---|---|
自然语言处理 | 一个句子 | 处理一个词或一个字符 |
语音识别 | 一段音频 | 处理一帧或几毫秒的音频信号 |
股票预测 | 股价历史 | 处理一天或一小时的股价数据 |
视频分析 | 一段视频 | 处理一帧画面 |
为什么时间步如此重要?
传统神经网络(如前馈神经网络)假设所有输入是相互独立的。但现实中很多数据(语言、语音、视频)是连续的,其顺序至关重要。
时间步的引入,使得模型(尤其是RNN、LSTM、Transformer等)能够:
- 捕捉时间依赖性:理解“因”和“果”,知道什么信息出现在前面,什么出现在后面。
- 处理可变长度输入:无论句子是短是长,模型都可以通过逐个时间步处理来完成工作。
- 拥有“记忆”:通过隐藏状态等机制,将过去时间步的信息传递到未来,形成一种上下文理解能力。
总结
时间步是序列模型处理数据时,在时间维度上的一个切片或一个步骤。它让模型能够按顺序“阅读”序列,并利用历史上下文来理解当前信息并做出智能决策。 它是理解RNN、LSTM乃至Transformer等现代序列模型的基础。
Seq2Seq架构
NLP的很多任务,比如语言翻译,比如内容摘要,再比如对话系统,其实都是一个信息编码、再解码的过程。本质上,这些都是序列到序列的问题。语言的编码是一个序列,叫作输入序列;解码又是一个序列,叫作输出序列。
起初,人们尝试使用一个独立的RNN来解决这种序列到序列的NLP任务,但发现效果并不理想。这是因为RNN在同时处理输入和输出序列(既负责编码又负责解码)时,容易出现信息损失。而Seq2Seq架构通过编码器(Encoder)和解码器(Decoder)来分离对输入和输出序列的处理,即在编码器和解码器中,分别嵌入相互独立的RNN(见下页图),这样就有效地解决了编解码过程中的信息损失问题。
损失
损失的核心特性
它是一个数字:损失最终被计算成一个具体的数值(例如:0.5, 2.1, 10.0)。
它衡量“错误”:这个数值越大,说明模型的预测错得越离谱;数值越小,说明预测得越准确。理想情况下,我们追求损失为零,这意味着预测完全正确。
它是模型学习的核心驱动力:模型学习的唯一目标就是想方设法最小化这个损失值。
Seq2Seq架构的全名是“Sequence-to-Sequence”,简称S2S,意为将一个序列映射到另一个序列。这也是Transformer的基础架构。
Seq2Seq架构是一个用于处理输入序列和生成输出序列的神经网络模型,由一个编码器和一个解码器组成。从直观上理解,这种架构就是将输入序列转换成一个固定大小的向量表示,然后将该向量表示转换成输出序列。
下面来看模型中的两个主要组件。
- 编码器(Encoder):编码器负责将输入序列(例如源语言的文本)转换为固定大小的向量表示。编码器通常采用RNN、LSTM或GRU等模型。编码器会逐个处理输入序列中的元素(例如单词或字符),在每个时间步更新其隐藏状 态。最后,编码器会生成一个上下文向量,它包含了整个输入序列的信息。
- 解码器(Decoder):解码器负责将编码器生成的上下文向量转换为输出序列(例如目标语言的文本)。解码器通常也采用RNN、LSTM或GRU等模型。解码器使用来自编码器的上下文向量作为其初始隐藏状态,并逐个生成输 出序列中的元素。在每个时间步,解码器根据当前隐藏状态、生成的上一个输出元素(如单词)及其他可能的信息(例如注意力机制)、来生成下一个输出 元素。
Seq2Seq架构的核心思想是将输入序列压缩成一个向量,再将该向量作为解码器的输入,生成输出序列。可以说,Seq2Seq架构的本质是一种对输入序列的压缩和对输出序列的解压缩过程。而这个压缩和解压缩的过程,可以通过RNN等序列建模方法来实现。编码器使用RNN来处理输入序列,生成向量表示;解码器也使用RNN来处理向量表示,生成输出序列。
从NPLM到Seq2Seq,NLP研究人员不断探索更有效的建模方法来捕捉自然语言的复杂性。
NPLM使用神经网络来学习词嵌入表示,并预测给定上文的下一个词。NPLM用连续向量表示词,捕捉到了单词之间的语义和语法关系。尽管NPLM性能有所提高,但仍然存在一些局限性,例如上下文窗口的大小是固定的。
为了解决上下文窗口大小固定的问题,研究人员开始使用RNN来处理可变长度的序列。RNN可以在处理序列时保持内部状态,从而捕捉长距离依赖关系。然而,RNN在训练中容易出现梯度消失和梯度爆炸问题。
上下文窗口
指的是一个语言模型在生成下一个词时,能够看到和参考的之前文本(包括Tokens)的最大数量。
它是一个固定的大小,通常以 Token数量 来衡量(Token可以粗略地理解为词或字片段)。例如,一个模型的上下文窗口可能是 4K (4096)、8K (8192)、16K、128K 甚至更大。
它是如何工作的?
当您向模型输入一段文本(即提示)时,会发生以下过程:
- 文本转换为Tokens:您的输入被切分成一个个Token。
- 填入窗口:这些Tokens被放入模型的上下文窗口中。
- 生成与参考:当模型开始生成回复时,它只能基于这个窗口内的所有Tokens来预测下一个最可能的词。它会不断地将新生成的词也加入到窗口内,并基于整个窗口内容继续生成。
- 窗口限制:如果对话(输入提示 + 模型输出)的长度超过了上下文窗口的限制,最早的信息会被“挤出去”,模型将彻底忘记它们,无法再将其作为参考。
一个具体的例子
假设一个模型的上下文窗口是 5个Tokens(实际中很小,仅为示例)。
- 您的输入(提示):“中国的首都是”(4个Tokens)
- 模型的上下文窗口:[“中国”, “的”, “首都”, “是”]
- 模型生成:模型基于窗口内的所有信息,计算出下一个最可能的Token是“北京”。于是输出“北京”。
- 更新后的窗口:现在窗口变成了 [“的”, “首都”, “是”, “北京”]。
- 您继续问:“它以什么闻名?”(3个Tokens)
- 更新后的窗口:由于窗口只有5个位置,最早的一个Token “中国” 被挤出去了。窗口现在是 [“是”, “北京”, “它”, “以”, “什么”]。
- 注意:此时模型已经忘记了“中国”这个词!它只知道当前在谈论“北京”,但可能不记得北京是中国的首都这个上下文了。这会导致回答不准确。
为什么上下文窗口如此重要?
- 决定模型的理解能力:窗口越大,模型能“看到”的上下文就越多,理解长文档、进行长对话的能力就越强。它可以记住更早的指令、参考更多的文档内容。
- 处理长文本任务的关键:对于总结长篇文章、编写长代码、进行一本书的对话等任务,大上下文窗口是必不可少的。
- 限制模型的“记忆”:这是模型最主要的限制之一。它无法记住超出窗口范围外的任何信息。
技术上的挑战与演进
- 挑战:扩大上下文窗口在技术上非常困难,不仅需要更多的计算资源,还对模型架构(特别是注意力机制)提出了巨大挑战。
- 演进:早期的模型(如GPT-2)窗口可能只有1K左右。如今,像GPT-4、Claude等先进模型的窗口已经达到了128K甚至更大,这意味着它们可以一次性处理相当于一本300页书籍的内容。
总结
上下文窗口是语言模型在生成文本时,能够考虑和利用的先前文本的最大范围。它就像是模型的“工作记忆区”,决定了模型在单次交互中能记住多少信息。窗口越大,模型的理解和生成能力在长文本场景下就越强、越连贯。
为了解决梯度消失和梯度爆炸问题,LSTM和GRU等门控循环单元被提出。它们引入了门控机制,可以学习长距离依赖关系,同时缓解梯度消失和梯度爆炸问题。
在此之后,又出现了Seq2Seq这种序列到序列的编码器-解码器架构,渐渐取代了单一的RNN。编码器将输入序列编码成一个固定大小的向量,解码器则解码该向量,从而生成输出序列。Seq2Seq架构可以处理不等长的输入和输出序列,因此在机器翻译、文本摘要等任务中表现出色。
基于RNN的Seq2Seq架构存在一些缺点,例如难以处理长序列(长输入序列可能导致信息损失)和复杂的上下文相关性等。具体来讲,在一个长序列中,一些重要的上下文信息可能会被编码成一个固定长度的向量,因此在解码过程中,模型难以正确地关注到所有重要信息。为了提高Seq2Seq架构的性能,研究人员发现向编码器-解码器架构间引入注意力机制,可以帮助Seq2Seq架构更好地处理长序列和上下文相关性。通过给予不同时间步(也就是token)的输入不同的注意力权重,可以让模型更加关注与当前时间步(也就是当前token)相关的信息。这就是我们下面即将介绍的内容。
Attention Mechanism(注意力机制)
Seq2Seq架构通常使用编码器将输入序列编码为固定长度的向量,并使用解码器解码该向量,从而生成输出序列。这种方法的问题在于,如果编码器无法动态地捕捉到所输入的每个单词的上下文信息,就无法正确地对与上下文相关的单词进行编码。
通过引入注意力机制,模型可以在每个时间步中为输入序列中不同位置的词分配不同的注意力权重。这使得模型能够更加灵活地有选择地关注输入序列中的重要分,从而更好地捕捉上下文相关性,模型的性能也会因此而提高。
注意力有很多种实现方式(也称实现机制),最简单的注意力机制是点积注意力。注意力机制是一种常用于 Seq2Seq模型中的技术,用来对输入序列中不同位数信息进行加权处理,从而提高模型对输入序列中关键信息的关注度。
点积
向量点积,也称为数量积或内积,是向量运算中一种非常重要的运算。它的结果是一个标量(一个数字),而不是一个向量。
点积有两种主要的定义方式:代数定义和几何定义 。它们是等价的,但分别从不同角度帮助我们理解点积。
代数定义
对于两个n维向量,它们的点积是各对应分量乘积之和。
二维向量:
a⃗⋅b⃗=a1b1+a2b2\vec{a} \cdot \vec{b} = a_1 b_1 + a_2 b_2a⋅b=a1b1+a2b2
三维向量:
a⃗⋅b⃗=a1b1+a2b2+a3b3\vec{a} \cdot \vec{b} = a_1 b_1 + a_2 b_2 + a_3 b_3a⋅b=a1b1+a2b2+a3b3
n维向量
a⃗⋅b⃗=∑i=1naibi=a1b1+a2b2+⋯+anbn\vec{a} \cdot \vec{b} = \sum_{i=1}^{n} a_i b_i = a_1 b_1 + a_2 b_2 + \cdots + a_n b_na⋅b=∑i=1naibi=a1b1+a2b2+⋯+anbn
几何定义
从几何角度看,点积描述了两个向量在方向上的相似程度。
给定两个向量 a⃗\vec{a}a 和 b⃗\vec{b}b,它们的夹角为 θ,则点积定义为:
a⃗⋅b⃗=∣a⃗∣∣b⃗∣cosθ\vec{a} \cdot \vec{b} = |\vec{a}| |\vec{b}| \cos\thetaa⋅b=∣a∣∣b∣cosθ
具体而言,注意力机制允许模型在解码时,根据当前时间步的解码器状态,计一个注意力的输出向量,它将输入序列中不同位置的信息加权相加,得到一个加权和量,这个加权和向量会在解码器中与当前时间步的解码器状态进行融合,生成最终的出。这种机制让模型更加灵活地、有选择地关注到输入序列中的重要部分,提高了模的性能。
具体来说,要得到 x1对x2 的点积注意力,我们可以按照以下步骤进行操作。
- 创建两个形状分别为(batch_size,seq_len1,feature_dim)和(batchsize,seq_len2,feature_dim)的张量x1 和 x2.
- 将x1中的每个元素和 x2 中的每个元素进行点积,得到形状为(batch_size,seq_len1,seq_len2)的原始权重raw_weights。
- 用softmax函数对原始权重进行归一化,得到归一化后的注意力权重attn_weights(注意力权重的值在0和1之间,且每一行的和为1),形状仍为(batch_size,seq_len1,seq_len2)。
- 用注意力权重 attn_weights 对 x2 中的元素进行加权求和(与 x2相乘),得到输出张量 y,形状为(batch_size,seq_len1,feature_dim)。这就是x1对x2的点积注意力。
张量
张量就是维数组,是向量和矩阵的泛化,可以拥有任意数量的维度。
- 0维张量 = 标量:就是一个单一的数字。例如:5
- 1维张量 = 向量:就是我们上面讲的向量。例如:[1, 2, 3]
- 2维张量 = 矩阵:一个二维的数字网格(有行和列)。例如:
[[1, 2, 3], [4, 5, 6]]这是一个2x3的矩阵(2行,3列)。- 3维张量及更高维:可以理解为数字构成的“立方体”或更高维度的结构。
在深度学习和AI中的具体应用
张量是深度学习框架(如PyTorch, TensorFlow)中的基本数据单位,所有数据最终都以张量的形式流动。
来看一些具体的例子,理解为什么需要高维张量
- 一个灰度图像(2D张量):
图像是一个像素网格。每个像素是一个亮度值(一个数字)。
所以,一张 64x64 的灰度图就是一个 64 x 64 的 2D张量(矩阵)。- 一个彩色图像批次(4D张量):
一张彩色图像有高度、宽度和颜色通道(红、绿、蓝)。所以是 [高度, 宽度, 通道数=3] 的 3D张量。
在训练时,我们不会一次只处理一张图片,而是会处理一个批次(比如32张图)。
所以,这个批次的数据就是一个 [批次大小=32, 高度, 宽度, 通道数=3] 的 4D张量。
名称 维度 别名 示例 AI中的典型用途 标量 0 单个数字 5 学习率、损失值 向量 1 一维数组 [1, 2, 3] 单个数据点的特征 矩阵 2 二维数组 [[1,2], [3,4]] 整个数据集(样本×特征) 张量 >=3 多维数组 [[[1,2], [3,4]]] 图像批次、文本序列等复杂数据
在 Seq2Seq架构中,点积注意力通常用于将编码器的隐藏状态与解码器的隐藏态联系起来。在这种情况下,x1和x2对应的内容分别如下。
- x1:这是解码器在各个时间步的隐藏状态,形状为(batch_size,seg_len1feature_dim)。其中,seq_len1是解码器序列的长度,feature_dim是隐幕状态的维度。
- x2:这是编码器在各个时间步的隐藏状态,形状为(batch
size,seg_len2feature_dim)。其中,seq_len2是编码器序列的长度,feature dim 是隐藏状态的维度。
此处是解码器需要对编码器进行注意,因此也有人把编码器一解码器注意力称为解码器-编码器注意力,觉得这样说更为严谨。
当我们应用点积注意力时,解码器的每个时间步都会根据编码器的隐藏状态计算一个注意力权重,然后将这些权重应用于编码器隐藏状态,以生成一个上下文向量(编码器-解码器注意力的输出)。这个上下文向量将包含关于编码器输入序列的有用信息解码器可以利用这个信息生成更准确的输出序列。
常见的注意力机制包括全局注意力、局部注意力和自注意力。全局注意力会对输入序列中所有位置的信息进行加权计算,而局部注意力和自注意力则会在一定范围内或自身序列中计算注意力向量,以更加高效地处理长序列。
注意力机制可以帮助模型更好地处理长输入序列和复杂的上下文相关性,因此在讯多 NLP 任务(比如机器翻译、文本摘要等)中都发挥着重要作用。通过引入注意力机制,我们可以提高基于 Seq2Seq架构的语言模型的性能和效果,更为重要的是,注意力机制还将为即将到来的 Transformer 时代开启了新的篇章。
基于Transformer架构的预训练模型
Transformer是几乎所有预训练模型的核心底层架构。
下面是各种预训练模型:
编号 | 模型名称 | 发布年份 | 描述 | 特性 |
---|---|---|---|---|
1 | ELMo | 2018 | 基于双向长短期记忆网络(BiLSTM)的词嵌入方法 | 学习文本中的上下文信息,生成动态的词向量表示(非Transformer架构) |
2 | GPT | 2018 | OpenAl开发的生成式预训练模型 | 单向Transformer架构,关注预测下一个词的任务 |
3 | BERT | 2018 | 基于 Transformer的预训练模型 | 同时学习文本的上下文信息,深入理解句子结构 |
4 | GPT-2 | 2019 | GPT的改进版本 | 使用更大的模型和更多的数据进行预训练 |
5 | RoBERTa | 2019 | 在BERT基础上进行优化的预训练模型 | 调整训练策略、数据处理和模型架构,提高训练速度和性能 |
6 | ALBERT | 2019 | 轻量级 BERT | 减少参数数量和计算成本,保持高性能 |
7 | T5 | 2019 | 文本到文本迁移 Transformer | 将所有NLP任务视为文本到文本的问题,进行端到端的训练和微调 |
8 | Grover | 2019 | 生成式预训练模型 | 目标是检测和生成新闻文章中的虚假信息,学习了大量新闻的编写方式和结构 |
9 | ELECTRA | 2020 | 高效学习精确分类代币替换的编码器 | 使用生成-判别框架进行预训练,提高训练效率 |
10 | GPT-3 | 2020 | 第三代生成式预训练Transformer | 更大的模型和更多的数据,具有强大的生成能力和零样本学习能力 |
11 | BART | 2020 | 双向自回归 Transformer | 结合了编码器-解码器结构和自回归预训练,适用于生成任务和其他NLP任务 |
12 | MedBERT/ | 2020 | 针对医学和科学领域的 BERT变体 | 使用领域专业语料库进行预训练,以提高完成特定领域任务的性能 |
13 | DeB<RTa | 2021 | 带有解耦注意力的解码增强REBT | 凭借解耦注意力和相对位置编码提高性能 |
14 | ChatGPT | 2022 | 基于GPT-3的聊天机器人 | 在GPT-3的基础上进行了额外的微调,以便更好地处理聊天场景 |
15 | GPT-4 | 2023 | 是GPT系列的最新一代模型 | 具有更大的模型容量和更多的数据,以及更强的生成和推理能力 |
Transformer
是由阿希什·瓦斯瓦尼(Ashish Vaswani)等人在2017年的论文《你只需要注意力》(Attention Is All You Need)中提出的一种神经网络结构。Transformer 引入了自注意力(Self-Attention)机制,摒弃了传统的循环神经网络和卷积神经网络结构,从而大幅提高了训练速度和处理长序列的能力,成为后续很多先进模型的基础架构。
在Transformer出现之前,RNN和LSTM是自然语言处理领域的主流技术。然而,这些网络结存在计算效率低、难以捕捉长距离依赖、信息传递时的梯度消失和梯度爆炸等问题。些问题在序列类型的神经网络系统中长期存在着,让学者们很头疼。因此,NLP的应也不能像 CV应用一样直接落地。为了解决这些问题,瓦斯瓦尼等人提出了一个全新的架构–Transformer。
Transformer的核心是自注意力机制,它能够为输入序列中的每个元素分配不同的权重,从而更好地捕捉序列内部的依赖关系。与此同时,Transformer摒弃了RNN和LSTM 中的循环结构,采用了全新的编码器-解码器架构。这种设计使得模型可以并行处理输入数据,进一步加速训练过程,提高计算效率。
自Transformer问世以来,它在自然语言处理领域取得了巨大成功,提升了各种任务的性能。随后,基于Transformer的 BERT、GPT等预训练模型也相继出现,进一步拓展了其在各种 NLP 任务中的应用。如今,Transformer已经成为 NLP 领域的代表性技术,并在计算机视觉、语音识别等其他人工智能领域也取得了显著的成果。
Transformer的架构图:
架构图组件详解
上图清晰地展示了数据在Transformer中的流动过程。以下是每个核心组件的说明:
- 输入处理 (Input Processing)
Input Embedding:将输入的单词(如"I", “love”, “NLU”)转换为向量。
Positional Encoding:为每个向量添加位置信息,因为Transformer本身不包含循环或卷积,无法感知词序。
- 编码器 (Encoder)
多头自注意力 (Multi-Head Attention):让每个词同时关注输入序列中的所有其他词,捕捉上下文信息。
加与归一化 (Add & Norm):
Add (残差连接):将子层的输入与其输出相加,防止梯度消失。
Norm (层归一化):稳定训练过程,加速收敛。
前馈网络 (Feed Forward):一个简单的全连接网络,对每个位置的表示进行独立变换。
- 解码器 (Decoder)
掩码多头自注意力 (Masked Multi-Head Attention):确保在预测第t个词时,只能看到前t-1个词,防止信息泄露。
编码-解码注意力 (Multi-Head Attention):
Query 来自解码器上一层的输出。
Key 和 Value 来自编码器的最终输出。
这使得解码器在生成每个词时,可以聚焦于输入序列中最相关的部分。
前馈网络与归一化:与编码器中的结构相同。
- 输出处理 (Output Processing)
线性层 (Linear):将解码器输出的高维向量映射到词汇表大小的维度。
Softmax:将线性层的输出转换为概率分布,从中选择最有可能的下一个词(例如,“I” -> “love”)。
核心工作流程
编码:输入序列经过编码器栈,被转换为一系列富含上下文信息的表示。
解码:解码器从标志开始,结合编码器的输出,依次生成输出序列的每一个词。
迭代:将新生成的词作为下一步的输入,重复步骤2,直到生成标志为止。
这个架构通过完全基于注意力机制的设计,实现了高度的并行化训练,并在捕捉长距离依赖关系上表现卓越,成为了当今大语言模型(如GPT、BERT等)的基石。
大类 | 组件名称 | 主要功能 |
---|---|---|
整体架构 | 编码器栈 | 将输入序列编码为上下文表示 |
解码器栈 | 根据编码器输出和已生成结果生成目标序列 | |
编码器层 | 多头自注意力 | 捕捉输入序列内部的全局依赖关系 |
前馈神经网络 | 进行非线性变换 | |
残差连接 & 层归一化 | 稳定训练,加深网络 | |
解码器层 | 掩码多头自注意力 | 防止信息泄露,确保自回归 |
多头编码器-解码器注意力 | 连接源序列与目标序列 | |
前馈神经网络 | 进行非线性变换 | |
残差连接 & 层归一化 | 稳定训练,加深网络 | |
输入/输出 | 嵌入层 | 将离散符号转换为连续向量 |
位置编码 | 为模型提供序列的顺序信息 | |
输出层 | 线性层 | 将解码输出映射到词汇表维度 |
Softmax 层 | 生成下一个词的概率分布 |
这种高度模块化的组件设计,使得 Transformer 不仅强大,而且非常灵活,成为了当今大语言模型不可或缺的基石。
预训练(Pre-trained)
在预训练范式普及之前,特定任务训练是主流的AI模型构建方法。它的核心思想是:为一个特定的任务,从零开始设计和训练一个模型。这个模型只擅长这一件事。
例如你想做一个垃圾邮件过滤器,你需要收集大量的邮件,并人工标注哪些是垃圾邮件,哪些不是。然后,你选择一个模型(比如逻辑回归、支持向量机等),只用这个标注好的数据集来训练它。训练完成后,这个模型就是一个专业的“垃圾邮件判别器”。你让它写首诗?它做不到。你让它做翻译?它也做不到。
而预训练是在一个巨大的、无标注的数据集上,通过自监督学习的方式,训练一个模型,让它掌握语言的通用规律和世界知识。
预训练的核心是自监督学习。数据没有标签,那怎么学习呢?关键在于“自造”标签。
最经典的方法是 “掩码语言模型”。如随机遮盖住一句话中的某个词(比如“今天天气真[MASK]”),然后让模型根据上下文来预测被遮盖的词是什么(“好”)。通过亿万次这样的练习,模型学会了词语之间的关联、语法结构和语义信息。
特性 | 特定任务训练(旧范式) | 预训练 + 微调(新范式) |
---|---|---|
比喻 | 培养专才:直接招聘一个毕业生,只培训他做一件具体工作(如只核对发票)。 | 培养通才再专才:先让一个聪明人博览群书(预训练),再短期培训他做具体工作(微调)。 |
数据 | 需要大量高质量标注数据,每个任务独立。 | 预训练需要海量无标注数据;微调只需少量标注数据。 |
知识 | 知识孤立,无法在不同任务间共享。 | 知识通用,底层语言和世界知识在所有任务间共享。 |
灵活性 | 差。一个模型一个任务。 | 极强。一个基础模型,通过不同微调,可适应无数下游任务。 |
成本效率 | 低(每个任务都需高昂标注和算力)。 | 高(预训练成本虽高,但可被无数任务分摊)。 |
预训练所得的大规模语言模型也被叫作基础模型(Foundation Model或Base Model)。在预训练过程中,模型学习了词汇、语法、句子结构及上下文信息等丰富的语言知识。这种在大量数据中学到的知识为后续的下游任务(如情感分析、文本分类、命名实体识别、问答系统等)提供了一个通用的、丰富的语言表示基础,为解决许多复杂的 NLP 问题提供了可能。
微调(Fine-tuning)
预训练得到的模型是一个“通才”,它知识渊博,但还不擅长具体的任务。这时就需要微调。微调过程相对于从头训练一个模型要快得多,且需要的数据量也要少得多,这使得NLP应用人员能够更高效地开发和部署各种NLP解决方案。
微调就像是专业培训,拿预训练好的“通才”模型作为基础。在一个特定任务的小规模、有标注的数据集上继续训练。例如,用1万条已标注的电影评论(正面/负面)来微调模型,它就能成为一个出色的情感分析专家。
提示/指令(Prompt/Instruct)
“预训练+微调大模型”的使用模式有被一种称为“提示”(Prompt)或者说“指令”(Instruct)的使用模式所取代的趋势。
大模型本身就是知识库,里面蕴含了你所需要的信息。不一定非得微调才能解决问题,但是你得知道怎么才能把它里面的知识“调”出来,还可以通过以Prompt/Instruct(提示/指令)模式直接使用大模型。
Prompt 模式和Instruct模式都基于这样一种思想:在训练阶段,这些模型通过学习大量的文本数据,掌握了语言的结构、语法和一定程度的语义知识。那么,在应用阶段,通过在输入中提供恰当的信息和指导,可以引导大型预训练模型(如GPT-3)生成相关性更强且更有用的输出。这种方法可以看作与模型进行一种“对话”,用户提供输入(Prompt或Instruct),然后模型根据输入生成相应的输出。
- Prompt模式:输入通常是一个词或短语,模型需要根据这个提示生成自然且
连贯的文本。这种方式适用于生成式任务,如文本生成、文章摘要等。 - lnstruct模式:输入是一条明确的指令,要求模型完成特定任务。这种方式适
用于那些需要明确指示的任务,如回答问题、解释概念等。
特点 | “预训练+微调大模型”模式 | Prompt/Instruct模式 |
---|---|---|
微调过程 | 在下游任务上进行微调以适应需求 | 不经过微调,设计合适的提示或指令生成输出 |
学习方式 | 在有标注数据集上进行有监督学习 | 通常不需要有标注数据 |
任务适应性 | 通过微调实现较高的任务适应性 | 依赖提示,任务适应性可能较低 |
灵活性 | 需要针对每个任务进行微调 | 灵活性更高,不需要微调,可能需要尝试和纠错 |
BERT(Bidirectional Encoder Representations from Transformers)
在对 BERT 做无监督的预训练时,研究人员设计了两个目标任务:一个是将输入的文本中 k% 的单词遮住,然后让它预测被遮住的是什么单词,这个目标任务叫作掩码语吉模型(Masked Language Model,MLM);另一个是预测一个句子是否会紧挨着另一个旬子出现,这个目标任务叫作下一句预测(Next Sentence Prediction,NSP)。这两个任务在预训练时,数据集都是通过现成的语料文本构建的,标签也是原始语料自带的,所以属于无监督的预训练。其实,从模型参数优化的角度来讲,是有标签导的。
GPT(Generative Pre-trained Transformer)
GPT也是一种基于Transformer 架构的自然语言处理模型,但它与BERT有一些不同之处。
- 首先,GPT在训练时采用的是单向语境,也就是从左到右的顺序。而BERT则采用了双向的方式,即同时考虑上下文信息。这使得GPT在生成文本时更擅长保持连贯性,但可能在理解某些上下文时不如 BERT。
- 其次,在预训练任务上,GPT的主要任务是基于给定的上下文,预测出现的下一个词。这个任务就是我们之前反复介绍过的语言模型,也被称为语言建模(Language Modeling)。由于GPT的预训练任务更简单,因此,它在生成文本方面通常表现得更好。
在实际应用中,GPT经过预训练后,可被用于解决各种下游任务,例如文本生成、文本分类、问答系统等,尤其是生成性问题。与BERT一样,GPT的预训练模型可以在大量文本数据上进行训练,然后根据特定任务进行微调,从而解决各种实际问题。
总之,GPT与 BERT都是基于Transformer架构的 NLP 模型,但在文本理解方式和预训练任务上有所不同。GPT采用单向语境和语言建模任务,而BERT采用双向语境和掩码语言建模及句子预测任务。在实际应用中,它们都可以通过预训练和微调的
BERT整体处理整个序列,既能够关注前面的信息,也能够关注后面的情。所以是双向编码。在训练过程中,每个位置的向量表示都通过左右两侧的、文信息一起学习,这样能更好地捕捉句子的语义。
GPT的理念就很不相同了。它是通过语言模型的思想,最大化语句序列出概率。你不是让我预测吗?那我只能翻来覆去看问题,不能先看答案啊!这是生成式模型和填空式模型的不同。
具体来说,GPT是在解码器的每个自注意力子层中引入了一个掩码(掩蔽)机制以防止当前位置的注意力权重分配到后续位置。这样,我们就可以确保在解码器的每个位置/,预测仅依赖于已知输出位置之前位置上的信息。
换句话说就是,在每个时间步只能看到当前的输入和已经生成的部分,然后生成下一个词,看不见你还没有回答的信息。等你回答的词越来越多,你能看到的信息也就越来越多,但是这些信息有很多是 GPT自己生成的,这就是自回归机制。
生成式自回归模型
自回归(Autoregressive)是自然语言处理模型的一种训练方法,其核心思想是基于已有的序列(词或字符)来预测下一个元素。在GPT中,这意味着模型会根据给定的上文来生成下一个词。
在GPT模型的训练和推理这两个相互独立的过程中,“自回归”的含义是不同的。
- 训练过程中的“自回归”:在训练阶段,GPT通过大量文本数据进行学习。模型会接收一个词序列作为输入,然后预测下一个词。损失函数主要用于衡量模型预测与实际词之间的差异。在训练过程中,型将不断调整其参数,以最化损失函数。这个过程会持续进行,直到模型在预测任务上达到一定的性能。训练过程中也常常使用教师强制来加快模型的收敛速度。
- 推理过程中的“自回归”:在推理阶段,我们利用训练好的 GPT模型来生成文本。首先,我们提供一个初始的种子文本(即提示或指令),然后模型会根据这个种子文本生成下一个词。生成的词将被添加到文本中,继续输入模型,模型会接着生成下一个词,以此类推。这个过程会一直进行,直到生成一定长度的文本或遇到特定的结束符。
在生成文本时,GPT通常会根据词的概率分布来选择下一个词。这可以通过多策略实现,如贪婪搜索-一总是造择概率最高的词,集東搜索一-同时考虑多个可能词序列,采样方法–根据词的概率分布随机选择词等。
自回归模型(Autoregressive Model)是生成式模型的一种特例,它预测的新目标值是基于前面若千个已生成值的。自回归模型在时间序列分析、语音信号处理、自然语言处理等领域有广泛应用。在序列生成问题中,自回归模型特别重要,比如在机器译、文本生成、语音合成等任务中,Transformer的解码器、GPT等模型就是基于自回归原理的。
BERT和 GPT的区别
所以,总结一下,上面我们讲了 BERT和 GPT的两个主要区别。
- BERT 是掩码语言模型;GPT 是生成式语言模型。我们这门课程一路以来讲的N-Gram、Word2Vec、NPLM和Seg2Seg预测的都是下一个词,其本质都是生成式语言模型。因此,生成式语言模型是语言模型的原始状而 BERT 的掩码语言模型“猜词”,是创新。
- BERT是双向语言模型,每个位置的向量表示都通过上下文信息来一起学习;GPT 是单向语言模型,在解码器的每个自注意力子层中引入了一个掩码(掩蔽)机制,以防止当前位置的注意力权重分配到后续位置。
这两个模型恰好都只采用了“一半的”Transformer 架构。BERT只使用编码器架构;而GPT只使用解码器架构。
编码器的双向模型结构使得 BERT能够充分利用上下文信息,因此BERT更适用于理解任务,如文本分类、命名实体识别和问答等,因为它可以同时关注输入序列中的所有单词,而不仅仅是一个方向的信息。
只有解码器架构的 GPT是一个单向模型,具有自回归的特点。在训练过程中GPT模型通过后续注意力掩码,确保每个位置只能看到当前位置之前的信息,这使得GPT非常适合完成生成任务,如文本生成、文章摘要等。当生成一个序列时,GPT会根据之前生成的上下文信息生成下一个单词。
这两个模型的架构差异(见下表)使它们在不同类型的NLP 任务中各有优势。BERT因其双向上下文关注和编码器架构在理解任务上表现出色,而GPT因其单向自回归特性和解码器架构在生成任务上具有较好的性能。
BERT | GPT |
---|---|
双向(关注上文和下文) | 单向(仅关注上文) |
仅使用编码器架构 | 仅使用解码器架构 |
掩码语言模型(自编码) | 生成式语自模型(自回归) |
面向理解任务(如文本分类、命名实体识别、问答系统等) | 面向生成任务(如文本生成、文章摘要等) |
掩码部分输入单词以预测被掩盖的单词 | 使用紧跟在输入后的特殊符号开始生成文本 |
需要在特定任务上进行微调以获得最佳性能 | 无须微调便可生成连贯文本 |
GPT演进历程
模型 | 核心特点 |
---|---|
GPT-1 | 奠定了预训练+微调的范式,12层解码器。 |
GPT-2 | 更大规模(48层),更多数据,强调零样本学习能力,移除了微调层。 |
GPT-3 | 巨大飞跃(1750亿参数,96层),展示了强大的少样本/提示学习能力。 |
GPT-4 | 规模更大,支持多模态(图像+文本),训练策略更先进,推理能力更强。 |
ChatGPT
ChatGPT 是基于 GPT(Generative Pre-trained Transformer)架构的一种大规模语言模型,由OpenAl开发,其首席科学家正是曾经参与开发AlexNet 的伊利亚· 苏茨克维。
ChatGPT究竟是如何利用人类反馈进行强化学习的呢?
实际操作中,首先会收集一些原始版本的ChatGPT与人类的对话数据,然后人工对ChatGPT的回答给出反馈(奖励信号)。接着使用这些数据来训练一个模型,这个模型可以评估在给定的对话上,人类可能给出的奖励信号。最后,利用这个预测奖励的复杂模型对原始版本ChatGPT进行微调,以使它能更好地满足人类的需求。
ChatGPT 是 GPT 模型在聊天机器人任务上的应用,是在 GPT-3.5 模型上进行优化后得到的产物。作为 GPT 系列的第三代,它是在万亿词汇量的通用文字数据集上训练完成的。另外一个类似的模型,InstructGPT,也是建立在 GPT-3.5 之上的。为了使 ChatGPT 在聊天机器人任务上表现出色,OpenAl 对预训练数据集进行了微调从而使 ChatGPT 能够更好地处理对话中的上下文、情感和逻辑,这个过程,也被称为对预训练大模型的指令调优(InstructionTuning)的过程。
而且,ChatGPT也应用了基于人类反馈的强化学习,也就是RLHF 技术,我们接下来会讲到这个技术。而 ChatGPT 在 InstructGPT 基础上还加入了安全性和乡规性的考量,以免产生危害公众安全的回答。这个过程被称为对齐(Alignment),推让 A1的目标与人类的目标一致,这包括让 A!理解人类价值观和道德规则,避免产生不利于人类的行为。
从 GPT到 ChatGPT 和 GPT-4 的演进过程中,涌现出了很多关键技术,总结如下:
技术 | 说明 |
---|---|
超大规模预训练模型 | ChatGPT基于GPT-3的底层架构,拥有大量的参数。研究者发现,随着模型参数对数级的增长,模型的能力也在不断提升,尤其在参数数量超过600亿时,推理能力得以显现 |
提示/指令模式(Prompt/Instruct Learning ) | 在ChatGPT中,各种自然语言处理任务都被统一为提示形式。通过提示工程,ChatGPT采用了更加精确的提示来引导模型生成期望的回答,提高了模型在特定场景下的准确性和可靠性。通过指令学习,研究人员提高了模型在零样本任务处理方面的能力研究表明,通过使用代码数据进行训练,语言模型可以获得推理能力。 |
思维链(Chain of Thought) | 这可能是因为代码(包括注释)通常具有很强的逻辑性,使模型学到了处理问题的逻辑能力 |
基于人类反馈的强化学习(Reinforcement Learning from Human Feedback,RLHF ) | 相较于GPT-3,ChatGPT在对话友好性方面有所提升。研究人员利用人类对答案的排序、标注,通过强化学习将这种“人类偏好”融入ChatGPT中,使模型的输出更加友好和安全 |
控制性能(Controllability) | 相较于GPT-3,通过有针对性地微调,ChatGPT在生成过程中能够更好地控制生成文本的长度、风格、内容等,使其在处理聊天场景的任务上表现得更好 |
安全性和道德责任 | 从GPT-3到ChatGPT,OpenAl开始关注模型的安全性和道德责任问题。为了减少模型产生的不当或具有偏见的回复,OpenAl在模型微调过程中增加了特定的安全性和道德约束 |
RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)
chatGPT之所以成为 ChatGPT,基于人类反馈的强化学习(RLHF)是其中重要的一环。ChatGPT的训练工程称得上是复杂而又神秘的,迄今为止,OpenA!也没有开源它的训练及调优的细节。
OpenAI已经公开的一部分信息推知,ChatGPT的训练主要由三个步骤组成:
- 第1步,先使用大量数据(从Prompt数据库中抽样)通过监督学习在预训练的GPT-3.5 基础上微调模型,得到一个初始模型,就是监督学习微调模型(SupervisedFine-Tune Model,SFT)–暂且把它命名为“弱弱的 ChatGPT”.
- 第2步,请标注人员为初始模型“弱弱的 ChatGPT”对同一问题给出的不同答案排序,评估这些答案的质量,并为它们分配一个分数。然后使用这些数据训练出一个具有人类偏好的奖励模型(Reward Model,RM)–这个奖励模型能够代替人类评估ChatGPT的回答大概会得到多少奖励。
- 第3步,初始化“弱弱的ChatGPT”模型,从Prompt数据库中抽样,与模型进行对话。然后使用奖励模型对“弱弱的ChatGPT”模型的输出进行打分。再将结果反馈给“弱弱的 ChatGPT”模型,通过近端策略优化(Proximal Policy Optimization,PPO)算法进一步优化模型。
不过,这还没完,此时ChatGPT模型经过优化,能生成更高质量的回答,那么再回到第1步用优化后的 ChatGPT初始化模型,就得到更好的 SFT 模型;用更好。SFT在第2步中取样,又得到更好的回答;对更高质量的回答进行排序、评分后,训练出更好的奖励模型,于是获得更好的反馈……这样不断循环,chatGPT载一步着一步,在接受人类的反馈的同时,不断自我优化,像周伯通一样左右手互搏,一波接着一波,越变越强,走上了“机器生”的巅峰,也震惊了世界。