自然语言处理: 第八章chatGPT的搭建

2023-11-11

理论基础

Transformer 大模型家族可以分成三类, 至于三者的区别可以参考上一章:

  • Encoder-only,
  • Decoder-only, 只需要Pre_train
  • Encoder-decoder , 可以在一些任务上无需进行fine_tune

必须要在下游任务进行微调比如Bert , Bart 。 T5 这种无需要微调就能完成一些任务 。最后GPT从3开始,只需要预训练就能适应很多任务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EO295wD2-1692024764313)(image/09_chatGPT/1691416067253.png)]



关于现在ChatgGPT的训练方法主要分为三步:

  1. Pre-Training, 这些就是从大量的文本中作问答的无监督的预训练,这个过程可以参考上一章内容,这一部分基本大家都一样,通过大量文本的无监督的学习,大模型就逐渐拥有了文本的理解能力,这种大模型由于参数超过一定数量级后(million级),就拥有了涌现能力(拥有few-shot 或者zero-shot的能力)
  2. Instruction Tuning, SFT(supervised Fine-tuning)通过特定的指令调优,进行监督学习,使得生成的内容类似你问我答。
  3. Alignment, RLHF(Reinforcement Learning human feedback)经过人类的输入的强化学习从而得到更好的结果,生成的内容就更像对话

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nossRgZR-1692024764313)(image/09_chatGPT/1691589194128.png)]



In - context Tuning(上下文调优)

由于预训练的文本不全是对话的数据集,所以为了让GPT更适合作为聊天机器人,所以利用对话内容作为数据,对GPT进行tuning,也就是给机器例子,从而让机器学会你的例子模板去回答。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQdzJqQK-1692024764314)(image/09_chatGPT/1691589966907.png)]


下面的数据来自于Larger language models do in-context learning differently , 作者对in-context learning进行了研究,主要工作是对in-context learning的数据集给标记错误的lable后,再让不同大小的模型去学习这些错误的label,最后作者发现,其实in-context learning是有学习到知识的,而不是只是通过这些例子去学习到对话(或者激活某种任务的能力),从下面从左至右模型大小逐渐减少,可以看到这个在in-context learning的能力只有在大模型的基础上才能实现,具体可以参考上面这一篇论文。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynhm1qIF-1692024764314)(image/08_ChatGPT/1691990780419.png)]



Instruction Tuning(指令调优)

通过添加一些明确的指令(Prompt)从而使得模型不仅仅会对话,而且能通过prompt暗示得到人类最想要的结果,这也是为什么prompt工程师诞生的原因。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXqWTdQN-1692024764314)(image/09_chatGPT/1691590080891.png)]

Scaling Instruction-Finetuned Language Models 在这篇文章中以PaLM为例验证了instruction tuning的有效性,如下图,可以看到随着instruction tuning的任务量增多,模型在不同任务的准确性也越来越好。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WWFBIPf-1692024764315)(image/08_ChatGPT/1692007589972.png)]

最近刷到了李宏毅老师教材,这里也解释了上文中in - context learning 和 instruction learning 的区别,对应的题目描述就是instruction , 而下面的例子就是in-content learning。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xGJgyeFJ-1692024764315)(image/08_ChatGPT/1691935401894.png)]




Alignment Training

在GPT -> instructGPT之后,为了让模型更像人类的行为,因此引入了对齐训练。OPENAI使用的是RLHF(Reinforcement Learning human feedback),简单的理解就是他在训练的时候引入了人类的打分机制,由于GPT生成模型其每次对于同样的问题回答都不一样,而人类根据GPT的回答进行打分,然后将这个分数去训练一个回归判分模型,训练完成之后这个打分模型能根据GPT的回答自动打分。拥有了这个打分模型之后,就可以在instructGPT模型不断生成答案,通过训练好的打分模型去打分,得到的分数再去优化instructGPT 使得优化后的GPT的得分越来越高。最后不断的重复这个过程最终可以使得GPT的回答与人类的回答对齐

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J5G1MG7E-1692024764315)(image/09_chatGPT/1691590504242.png)]


  1. 通过大量的文本作预训练,使得GPT拥有涌现能力
  2. 通过SFT得到InstructionGPT,教会GPT拥有对话的能力,并且通过特殊的prompt得到对应的回答(对应下图step1)
  3. 创建强化学习的奖励模型(对应下图step2)
  4. 利用奖励模型,使用近端策略优化微调模型(PPO),可以参考这一篇知乎Proximal Policy Optimization (PPO) 算法理解:从策略梯度开始
    (对应下图step3)


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-imGHge9b-1692024764315)(image/09_chatGPT/1691594172958.png)]




代码实现

SFT(Supervised Fine-tuning)

这里展示了一个简易代码,也就是在读取了做完无监督的预训练模型,利用一些加入了prompt的对话文本去作tuning,使得整个模型具备能根据prompt得到对应的贴合人类的回答,从而实现聊天机器人的功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRxu1poG-1692024764316)(image/09_chatGPT/1691595292946.png)]

Reward-model

根据人为的打分去训练一个判分模型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-myMs93wh-1692024764316)(image/09_chatGPT/1691595555964.png)]

PPO

利用step2训练好的打分模型,对经过SFT模型生成的答案进行打分,然后将这个分数的奖励进行最大化最终去优化整个instructGPT,不断的循环最终得到chatGPT

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MGauY2j6-1692024764316)(image/09_chatGPT/1691596150299.png)]




结果

这里展示的一个任务是在之前WiKi数据集上做完预训练之后得到的WikiGPT模型,这个模型已经具备一定的文本生成和理解能力了。再在Movie对白数据集进行的In-context tuning,使得其具有对话的能力,令其生成的内容更像对话,而不是生硬的文本。(PS: 如果想使得自己的模型进行prompt tuning, 目前比较常见的方法是利用特定的prompt 生成一段指令,然后将文本输入给GPT的API作生成回答,便可以快速得到一定量的问答数据,但是这样的话模型能力肯定是比GPT的能力低的,但是比自己找人生成对话数据成本更低时间更快,适用于小的垂直领域)

import torch
from GPT_Model_with_Decode import GPT
from CorpusLoader import MovieCorpus
from Utilities import read_data
from ModelTrainer import Trainer
import datetime

device = "cuda" if torch.cuda.is_available() else "cpu"
# 加载 MovieCorpus 数据  
dialog_corpus = MovieCorpus(read_data('cornell movie-dialogs corpus/processed_movie_lines.txt'))
chat_gpt = GPT(dialog_corpus).to(device)
chat_gpt.load_state_dict(torch.load('99_TrainedModel/WikiGPT_0.01_200_20230620_111344.pth'))
# chat_gpt.eval()

# 微调 ChatGPT 模型
trainer = Trainer(chat_gpt, dialog_corpus, learning_rate=0.001, epochs=200)
trainer.train()

# 保存微调后的模型
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") # 获取当前时戳
model_save_path = f'99_TrainedModel/miniChatGPT_{trainer.lr}_{trainer.epochs}_{timestamp}.pth'
torch.save(chat_gpt.state_dict(), model_save_path)

# 测试微调后的模型
input_str = "how are you ?"
greedy_output = chat_gpt.decode(input_str, strategy='greedy', max_len=50)
beam_search_output = chat_gpt.decode(input_str, strategy='beam_search', max_len=50, beam_width=5, repetition_penalty=1.2)

print("Input text:", input_str)
# print("Greedy search output:", greedy_output)
print("Beam search output:", beam_search_output)

如同上面代码,数据集采用的是电影对白的形式,一问一答。首先读取之前预训练好的WikiGPT,然后直接在MovieCorpus作训练就好了,因为数据的格式也是一问一答,所以代码与上一章的内容基本一致。这样训练好的之后的MiniGPT的文本生成能力就会更像人类的对话功能靠齐。

最终的效果如下:可以看到可能还是因为数据太小,或者训练的问题,整个生成的文本还是不能练成一句话,但是看上去也比较像对话了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jeVigeG2-1692024764317)(image/09_chatGPT/1691658273867.png)]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自然语言处理: 第八章chatGPT的搭建 的相关文章

随机推荐

  • 快速掌握 Android Studio 中 Gradle 的使用方法

    Gradle是可以用于Android开发的新一代的 Build System 也是 Android Studio默认的build工具 Gradle脚本是基于一种JVM语言 Groovy 再加上DSL 领域特定语言 组成的 因为Groovy是
  • 81. Search in Rotated Sorted Array II

    31 Search in Rotated Sorted Array ll 描述不包含相同的元素情况 Input nums 4 5 6 7 0 1 2 target 0 Output 4 对有序数组进行一定的旋转 进行查找 二分查找and双指
  • VMware player桥接模式不能联网的解决方法

    VMware虚拟机下主要使用两种网络连接方式 桥接模式 NAT模式 桥接模式 直接连接网络 虚拟机独立IP 并与宿主机处于同一网段内 相当于虚拟机是局域网内独立的一台电脑 使用起来较为方便 NAT模式 网络地址转换 借由宿主机的IP访问网络
  • linux进程间的通信(详细且有demo)

    目录 1 进程间通信常用的几种方式 2 无名管道 1 管道的概念 2 管道的原理 3 管道的局限性 4 创建匿名管道 5 demo 6 父子进程使用管道通信 7 管道的读写行为 8 查看管道缓冲区大小 3 有名管道 1 特点 2使用场景 3
  • VsCode中书写markdown文档快速插入图片

    文章目录 安装插件 插入图片 效果预览 安装插件 搜索 markdown image 安装这个插件 插入图片 首先复制图片 将图片保存在剪贴板中 在需要插入的地址点击鼠标右键 选择粘贴图片 粘贴图片后 会在文件 根路径 下生成一个 imag
  • redis内存数据库C客户端hiredis API 中文说明

    A 编译安装 make make install usr local make install PREFIX HOME progs 可以自由指定安装路径 B 同步的API接口 redisContext redisConnect const
  • 二十一、java版 SpringCloud分布式微服务云架构之Java 继承

    继承的概念 继承是java面向对象编程技术的一块基石 因为它允许创建分等级层次的类 继承就是子类继承父类的特征和行为 使得子类对象 实例 具有父类的实例域和方法 或子类从父类继承方法 使得子类具有父类相同的行为 生活中的继承 兔子和羊属于食
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • python库之execjs使用方法

    一 execjs使用方法 import execjs def encrypt c1 c2 with open encrypt js encoding utf 8 as f jscode f read txt execjs compile j
  • Vmware vSphere 5.0系列教程之五 存储简介及配置openfiler存储

    转载至 http andygao blog 51cto com 323260 822152 从前面的vSwitch 我们知道 vSphere的高级功能的实现 必须通过多片物理网卡来实现 不过 这仅仅是一方面 更重要的是 我们需要独立的共享存
  • Flink学习6-自定义分区器介绍

    背景说明 我们都知道自定义source是可以自定义并行度的 数据读写有几个并行度就意味着有几个分区 那么怎么控制我想要的数据流入到指定分区呢 flink1 12官方文档给我们提供了一下几种方式 接下来我们分别进行讨论 partitionCu
  • C#开发(1) 判断字符串是否为GUID的函数

    bool IsGuid string strToValidate private bool IsGuid string strToValidate bool isGuid false string strRegexPatten 0 1 0
  • 个人收藏的网页特效应用(电脑新建一个文本文档复制粘贴改后缀名为.html就能用)

    1 樱花
  • 设置浏览器不能登录http://burp

    文章目录 前言 一 浏览器能登录http burp 二 设置 三 浏览器不能登录http burp 前言 设置浏览器不能登录http burp 一 浏览器能登录http burp 二 设置 Proxy gt Option gt Miscel
  • 【Rust日报】2023-04-05 基于 Rust 的 DNS 客户端、服务器和解析器 trust-dns

    基于 Rust 的 DNS 客户端 服务器和解析器 trust dns trust dns 的目标是构建具有现代功能的安全可靠的 DNS 服务器和客户端 仅使用安全的 Rust 构建 并通过适当的错误处理避免所有恐慌 其功能设计在一定程度上
  • Spring AOP与拦截器的区别

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 作用层面 拦截器只对action负责 作用层面一般位于Controller层 Spring AOP主要是拦截对Spring管理的Bean的访问 一般作用与Service
  • ZooKeeper基础

    目录 ZooKeeper重要概念解读 Data model 数据模型 znode 数据节点 znode 4种类型 znode数据结构 版本version ACL 权限控制 Watcher 事件监听器 会话 session ZooKeeper
  • 华为OD机试 - 计算最大乘积(Java & JS & Python)

    题目描述 给定一个元素类型为小写字符串的数组 请计算两个没有相同字符的元素长度乘积的最大值 如果没有符合条件的两个元素 返回0 输入描述 输入为一个半角逗号分隔的小写字符串的数组 2 lt 数组长度 lt 100 0 lt 字符串长度 lt
  • 小熊派BearPi-HM nano开发板 -- 编译环境搭建

    课前准备 安装教程 开发环境搭建 复杂 编译环境搭建 哔哩哔哩 bilibilihttps www bilibili com video BV1tv411b7SA p 3 vd source 3912c2f79aa8597d06f883aa
  • 自然语言处理: 第八章chatGPT的搭建

    理论基础 Transformer 大模型家族可以分成三类 至于三者的区别可以参考上一章 Encoder only Decoder only 只需要Pre train Encoder decoder 可以在一些任务上无需进行fine tune