哈喽大家好我是站长,美区火箭apple ID 土耳其apple ID 其他apple ID 账号资源,可加微信: 咨询 公众号:Ai
目录1. 概述2. 内容2.1 原理分析2.1.1 Transformer 模型2.1.2 预训练2.1.3 微调2.2 ChatGPT3. 如何实现这些改进? 4. 实践练习1. 准备数据集2. 数据预处理3. 训练模型4. 生成文本5. 总结
1. 概述 ChatGPT 是自然语言处理领域的重要进展之一。通过预训练和微调,ChatGPT 可以生成高质量的文本,并可应用于多种场景,例如智能客服、聊天机器人、语音助手等。本文将详细介绍 ChatGPT 的原理、实战练习和流程图,帮助读者更好地了解 ChatGPT 技术的应用和优势。
2.内容 在当今快速发展的人工智能领域,自然语言处理(NLP)技术是重要的研究方向之一。NLP技术的目标是帮助计算机更好地理解和处理人类的语言,从而实现人机交互、自然语言搜索、文本摘要、语音识别等应用场景。
ChatGPT 是自然语言处理领域的重要进展之一,可以生成高质量文本,可应用于多种场景,如智能客服、聊天机器人、语音助手等。本文将详细介绍 ChatGPT 的原理、实战练习和流程图,帮助读者更好地了解 ChatGPT 技术的应用和优势。
2.1 原理分析ChatGPT是OpenAI推出的基于Transformer的预训练语言模型。在自然语言处理中,预训练语言模型通常是指使用无标签文本数据训练的模型,目的是提升下游任务(如文本分类、命名实体识别、情感分析等)的性能。ChatGPT是一类采用单向Transformer模型的预训练语言模型,利用大规模文本数据对模型进行预训练,然后在特定任务上进行微调,从而实现高质量的文本生成和自然对话。
现在我们来详细介绍一下ChatGPT的原理。
2.1.1 Transformer模型ChatGPT模型采用单向的Transformer模型,该模型是基于注意力机制的编码解码框架,由Google于2017年提出,是目前自然语言处理中应用最广泛的模型之一,在多种任务上被证明能取得比较好的性能。
Transformer 模型的核心是多头注意力机制,让模型对不同位置的输入信息给予不同的关注,从而提高模型的表达力。同时 Transformer 模型利用残差连接、Layer Normalization 等技术,让模型训练更加稳定,减少梯度消失、梯度爆炸等问题。
在Transformer模型中,输入序列首先经过Embedding层,将每个单词映射成向量表示。然后输入到多层的Transformer Encoder中,每层都包含一个多头注意力机制和一个前向传播网络。在多头注意力机制中,模型会计算每个位置与其他位置的关联度,得到一个权重向量。将此权重向量作用于输入,得到每个位置的加权表示。接下来,模型将每个位置的加权表示与原始输入进行残差连接和Layer Normalization,得到更好的表达。
在ChatGPT模型中,Encoder和Decoder是相同的,因为它是一个单向的模型,只能利用历史信息生成当前的文本,每次生成一个新词时,模型都会以历史文本作为输入,通过Decoder生成下一个单词。
2.1.2 预训练ChatGPT模型的预训练采用大规模无标注文本数据,例如维基百科、网页文本等,这些数据可以包含数十亿甚至数百亿个单词。预训练的目的是让模型学习到文本的语言规则和语义信息,从而提高模型的泛化能力。预训练采用语言建模任务,即给定一部分文本,模型预测下一个单词是什么。预测损失函数采用交叉熵损失函数,通过反向传播和随机梯度下降算法更新模型参数。
2.1.3 微调 ChatGPT 模型的微调是指在特定任务上、针对不同的数据集对预先训练好的模型进行微调。微调的目的是将模型应用到特定的场景中,比如聊天机器人、智能客服等。在微调过程中,我们会给模型添加一些特定的输出层,并根据具体任务调整模型参数。
2.2 ChatGPTChatGPT 是一个通用的自然语言生成模型,也就是 GPT 翻译成中文就是一个生成式的预训练转换模型。这个模型用网上庞大的语料库训练之后,它可以根据你输入的文本内容,生成相应的文本答案。这就是常见的聊天问答模式,比如:
语言模型的工作方式是对语言文本进行概率建模。
它用于预测接下来输出内容的概率,跟我们小时候玩的单词链游戏很像,比如输入内容是hello,模型就会从可能的结果中选择概率最大的一个来生成下一部分内容。
从用户的反馈来看,ChatGPT 与其他聊天机器人相比,在以下方面取得了显著的进步:
首先它对用户实际意图的理解有了显著提升,之前用过类似聊天机器人或者自动客服的朋友应该经常会碰到绕圈子甚至回答没有问的问题的机器人。ChatGPT在这方面做出了显著的提升,大家实际体验之后感受非常明显;其次它有非常强的上下文串联能力,你不仅可以问它一个问题,还可以不断问它,通过不断添加问题来完善回答内容,最终达到用户想要的理想效果。然后它有理解知识和逻辑的能力,当你遇到问题时,它不仅会给出完整的答案,还会回答你问的问题的所有细节。ChatGPT目前还没有看到相关的论文,不过官网上有一个和ChatGPT非常接近的Instruct GPT,官网还指出ChatGPT是InstructGPT的兄弟模型,它经过训练可以按照指令中的说明进行操作,并提供详细的回复。
这里我们可以看出两个模型的训练过程非常相似,文章地址:
://openai.com/blog/chatgpt,ChatGPT训练流程如下:
InstructGPT训练流程如下:
OpenAI 在关于 InstructiGPT 的论文中进行了定量分析,可以发现这些直观的优势。
InstructGPT与上一代GPT3相比:
首先,在71%的情况下,InstructGPT生成的答案比GPT3模型的答案更符合训练者的喜好。这里要提到,GPT3是OpenAI的上一代自然语言生成模型。其次,InstructGPT在如实回答问题方面会更加可靠。当两个模型被问及完全不懂的内容时,InstructGPT只会在21%的情况下编造结果,而GPT3更高,达到了41%。这里我们可以发现,即便是最强大的模型,也有五分之一的概率说胡话;此外,InstructGPT还将生成有毒答案的概率降低了25%。所以,综上所述,InstructGPT能够比上一代模型提供更真实可靠的答案,答案的内容也会远比上一代更符合用户的意愿。
3. 我们是如何实现这些改进的? 要理解 ChatGPT 为何能取得如此出色的成果,我们需要稍微放大一下范围,看看这个模型近年来的发展历史。
ChapGPT 是 OpenAI 的另一个模型,它是 InstructGPT 的兄弟模型,也就是在 InstructGPT 的基础上做了一些调整。InstructGPT 的上一代是 GPT3,上一个版本是 GPT2,再上一个版本是 GPT,再上一个是 Google 关于 transformer 的著名论文(http://arxiv.org/abs/1701.01112)。这里需要提一下,Google 自己的 BERT 架构以及相应的分支也是基于 transformer 结构的。
所以,我们可以得到这样的分支图。
能力有限,没法对每一篇论文进行分析总结,但还是想说说在学习过程中的一些有趣的决定和突破。
首先,BERT 和 GPT 都源自于 transformer 架构。它们之间的一个重大区别来自于它们的 transformers 具体结构的不同。BERT 使用 transformer 的编码器组件,在计算某个位置时,编码器组件会关注其左右两侧的信息,也就是文章的上下文。GPT 使用 transformer 的解码器组件,在计算某个位置时,解码器组件只关注其左侧的信息,也就是文章的上一个上下文。
如果用通俗的比喻来说,BERT 在结构上对上下文的理解更强,更适合做嵌入式的表达,也就是完形填空类型的任务。而 GPT 更适合那些只有前一个上下文,完全不知道后面上下文的任务,而聊天恰好就是这样的场景。
另一个有趣的突破来自模型尺寸的改进。
从 GPT 到 GPT2,再到 GPT3,OpenAI 花了很大力气把模型参数从 1.17 亿增加到 15 亿,之后又进一步暴力增加到 1750 亿,这样一来,GPT3 的参数数量相比以往同类型语言模型增加了 10 倍以上。
与此同时,训练数据量也从 GPT 的 5GB 增加到 GPT2 的 40GB,再到 GPT3 的 45TB。与此相关的是方向()
OpenAI 并没有追求模型在特定类型任务上的表现,而是不断提升模型的泛化能力,同时 GPT3 的训练成本也达到了惊人的 1200 万美元。
下一个有趣的节点是今天的主角 ChatGPT 的兄弟 InstructGPT。从 GPT3 到 InstructGPT 的一个有趣改进来自于引入了人类反馈。根据 OpenAI 论文,在 InstructGPT 之前,大多数大规模语言模型的目标是根据上一个输入段的 token 来推断下一个输入段。
但是这个目标和用户的意图不一致,用户的意图是让语言模型能够有效、安全地按照用户的指令去做,这里的指令就是 InstructGPT 这个名字的由来,当然也呼应了 ChatGPT 如今最大的优势,对用户意图的理解。为了实现这个目标,他们引入了人类老师,也就是标注员,通过标注员的人工标注,来训练一个反馈模型。这个反馈模型其实就是一个模仿偏好的模型,用来给 GPT3 的结果打分,然后用这个反馈模型来训练 GPT3。之前不让标注员直接训练 GPT3 的原因,可能是因为数据量太大了。
因此,这个反馈模型就像是抽象出来的人类意志,可以用来激励 GPT3 的训练,整个训练方式就叫基于人类反馈的强化学习。关于简化版 InstructGPT 的前世今生的介绍就到此结束,我们再来回顾一下 OpenAI 一直在追求的几个特性:
首先,只有上面提到的解码器结构,在这个结构下训练出来的模型,天然适合问答这种交互模式。然后,它是一个通用模型,OpenAI 在早期的架构和训练阶段,始终避免针对某一特定行业进行调优,这也让 GPT3 拥有很强的通用能力。最后,还有海量的数据和庞大的参数,从信息论的角度看,这就像一个深度语言模型,几乎涵盖了人类生活中涉及到的所有自然语言和编程语言。当然,这大大增加了个人或者小公司参与的门槛。既然说到原理,还有一个方面之前没提到过,就是能够进行连续对话。那么,ChatGPT 是如何记住对话上下文的呢?
这种能力其实在 GPT3 时代就已经具备了,具体做法是语言模型根据 token 来生成答案,这里的 token 可以粗略理解为单词。所以 ChatGPT 给你生成答案的时候,其实是从第一个单词开始,反复用你的问题和当前生成的所有内容作为下一个输入,然后生成下一个 token,直到生成完整的答案。
4. 实践练习为了更好地理解ChatGPT模型的实际应用,我们可以尝试使用Hugging Face提供的Transformers库来构建一个聊天机器人模型。
1. 准备数据集 我们可以使用康奈尔电影对话数据集作为ChatGPT模型的训练数据集,康奈尔电影对话数据集包含了超过220579条对话记录,每条对话都有一个问题和一个答案,我们可以将问题和答案组合起来,形成聊天机器人的训练样本。
2. 数据预处理 在训练 ChatGPT 模型之前,我们需要对数据进行预处理,将文本转换为数值表示。我们可以使用 tokenizer 将文本转换为 token,再将 token 转换为数值表示以供模型输入。在使用 Hugging Face 的 Transformers 库中,我们可以使用 AutoTokenizer 根据模型类型和配置自动选择合适的 tokenizer 并初始化。
以下是对电影对话数据集进行预处理的代码:
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained('distilgpt2') pad_token_id = tokenizer.pad_token_id max_length = 512 def preprocess_data(filename): with open(filename, 'r', encoding='iso-8859-1') as f: lines = f.readlines() conversations = [] conversation = [] for line in lines: line = line.strip() if line.startswith('M '): conversation.append(line[2:]) elif line.startswith('E '): conversation.append(line[2:]) if len(conversation) > 1: conversations.append(conversation) conversation = [] questions = [] answers = [] for conversation in conversations: for i in range(len(conversation) - 1): questions.append(conversation[i]) answers.append(conversation[i+1]) inputs = tokenizer(questions, answers, truncation=True, padding=True, max_length=max_length) return inputs, pad_token_id inputs, pad_token_id = preprocess_data('movie_conversations.txt')
上述代码中,我们使用 AutoTokenizer 初始化 tokenizer,并指定最大序列长度为 512。同时,我们还定义了 padding token id,并使用 preprocess_data 函数对康奈尔电影对话数据集进行预处理。在预处理过程中,我们将每个问题和答案组合在一起,使用 tokenizer 将文本转换为 token,再将 token 转换为数值表示。我们还设置了 padding 和 truncation 等参数,使得所有输入序列的长度相同。
3. 训练模型 在对数据集进行预处理后,我们可以使用Hugging Face的Transformers库中提供的GPT2LMHeadModel类来构建ChatGPT模型。GPT2LMHeadModel是一个带有语言模型头的GPT-2模型,用于生成与前一个输入文本相关的下一个单词。
以下是使用 GPT2LMHeadModel 训练 ChatGPT 模型的代码:
from transformers import GPT2LMHeadModel, Trainer, TrainingArguments model = GPT2LMHeadModel.from_pretrained('distilgpt2') model.resize_token_embeddings(len(tokenizer)) training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=4, save_total_limit=2, save_steps=1000, logging_steps=500, evaluation_strategy='steps', eval_steps=1000, load_best_model_at_end=True, ) trainer = Trainer( model=model, args=training_args, train_dataset=inputs['input_ids'], data_collator=lambda data: {'input_ids': torch.stack(data)}, ) trainer.train()
在上面的代码中,我们首先使用 GPT2LMHeadModel 初始化 ChatGPT 模型,并调整 Embedding 层的大小以适应我们的 tokenizer。接下来,我们定义 TrainingArguments 来配置训练参数。这包括训练轮数、每个批次的大小以及保存模型的路径等信息。最后,我们使用 Trainer 类来训练模型。在这里,我们将输入数据传递给 train_dataset 参数,并使用 data_collator 函数将输入数据打包成一个批次。
4.生成文本训练完成后我们就可以使用ChatGPT模型来生成文本了,在Hugging Face的Transformers库中,我们可以使用pipeline来实现文本的生成。
以下是使用 ChatGPT 模型生成文本的代码:
from transformers import pipeline generator = pipeline('text-generation', model=model, tokenizer=tokenizer) def generate_text(prompt): outputs = generator(prompt, max_length=1024, do_sample=True, temperature=0.7) generated_text = outputs[0]['generated_text'] return generated_text generated_text = generate_text('Hello, how are you?') print(generated_text)
上述代码中,我们首先使用pipeline函数初始化一个文本生成器,其中指定了ChatGPT模型和tokenizer。接下来定义generate_text函数使用该生成器生成文本。这里传入一个提示字符串作为生成的起点,使用max_length参数指定生成文本的最大长度,使用do_sample和temperature参数控制文本的随机性和流畅性。
5. 总结 ChatGPT 是一个强大的自然语言生成模型,可用于生成对话、推荐、文本摘要等多种任务。本文我们介绍了 ChatGPT 的原理、实现过程和应用场景,并提供了康奈尔电影对话数据集的预处理和 ChatGPT 模型的训练代码。通过使用 Hugging Face 的 Transformers 库,我们可以轻松构建和训练 ChatGPT 模型并使用管道生成文本。希望本文可以帮助读者更好地理解 ChatGPT 以及如何应用自然语言生成技术解决实际问题。
因为,GPT3 API 在单次交互中最多支持 4,000 个 token()
因此我猜测ChatGPT的上下文也在4000个token左右。
关于基于ChatGPT利用AI实现自然对话的这篇文章就到此结束了,更多相关ChatGPT自然对话内容请搜索往期文章或者继续浏览后面的相关文章,希望大家以后多多支持我!
哈喽大家好我是站长,美区火箭apple ID 土耳其apple ID 其他apple ID 账号资源,可加微信: 咨询 可扫码下方关注公众号获取账号教程资源