大语言模型浅探一

目录

1 前言

2 GPT模型解码

3 InstructGPT

4 基于RWKV微调模型

4.1 RWKV简介

4.2 增量预训练

4.3 SFT微调

4.4 RM和PPO

5 测试

6 总结


1 前言

近来,人工智能异常火热,ChatGPT的出现极大的推动了自然语言处理的发展,在推出仅两个月后,月活跃用户已达1亿,成为历史上增长最快的消费应用。OpenAI一直在研究生成式模型,在2018年6月发布了GPT,在2020年5月发布了GPT3,GPT3的模型参数也达到了1750 亿。但是为什么到现在ChatGPT才突然间火起来呢?

众所周知,模型只有达到一定的参数量才会出现涌现能力,但是两年强模型参数已经达到了1750亿,说明单纯的堆模型参数并不能达到想要的效果。或许在OpenAI的一篇论文InstructGPT(Training language models to follow instructions with human feedback)中可以找到答案。接下来本文会简单介绍InstructGPT,然后基于RWKV去复现,之所以选择RWKV是因为其速度快,占用GPU显存低,便于快速实验。

2 GPT模型解码

这里我感觉有必要把生成式模型的解码输出单独拿出来讲一下,只有理解了答案生成的原理才能更好理解InstructGPT所做的工作。

GPT属于生成式预训练语言模型,只采用了Transformers的Decoder结构,并对Decoder进行了一些改动,去掉了第二个Multi-Head Attention。推理解码过程就是利用当前token和前面输入所有token的状态矩阵去预测下一个token的过程,直到输出位终止符。例如输入tokens序列为[u1,u2,u3,u4,u5],词典大小为20000,则输出

y_{n},state_{n}=f(state_{n-1}, u_{n})

 上面公式中,state为前面输入所有词的状态矩阵,即保存的是每个词的词向量,y_{n}是一个1*20000的矩阵,此时的模型若是没有经过任何微调,此时的分布是比较分散的,如何从20000个词中挑选合适的词有几种方案:

第一种:贪心搜索(greedy search),每次都取概率最大的。贪心搜索是局部最优,但是不能保证全局最优。

第二种:集束搜索(beam search),每次取top-b个得分最高的句子,得分的计算很关键,但是这里不是我要讲的重点,感兴趣的可以自己去了解一下。这种方法比贪心搜索好一点儿。

第三种:随机采样,每次按照概率随机取一个,概率越高越有可能被采到。基于此又有了temperature sampling,top-k sampling和top-p sampling等改进方案。随机采用是目前使用的比较频繁的方式,这里简单说一下。

temperature sampling:设置一个temperature参数来控制概率分布的弥散程度,temperature越接近0,则数值间差异被指数级放大,被采样的数值范围就越小,体现在回答上面就是多次解码结果不会有太大变化。

top-k sampling:取概率最高的top-k个词作为候选采样词,剩余的置为0。

top-p sampling:将词按照概率从大到小排序,从第1个词开始累加,直到累加和大于等于top-p为止,作为候选采样词,剩余的置为0。

随机采用一般是几种方法组合使用,但是有时不管如何组合调整,模型还是会遇到不能生成终止符的情况,即产生一个概率为零的无限长序列,实际上也会添加最长长度限制或者随着输出长度的增加,提高终止符的概率等等。

基于以上问题,学术界一直在探索新的方法可以让正确的答案(人们想要的答案)生成的概率更高,从而更容易被解码出来,而InstructGPT利用人工反馈强化学习进行了探索。

3 InstructGPT

InstructGPT论文的地址:https://arxiv.org/pdf/2203.02155.pdf

总结一下就是:大语言模型可能会生成不真实、有害和对用户没有帮助的简单答案。InstructGPT通过在多种任务上面指令微调以及人类反馈强化学习(RLHF)来降低这种无效输出的概率。

从图中可以看到,两个过程是分三步来进行的。监督微调SFT(supervised fine-tuning),训练reward model(RM)和强化学习(RL)微调。

SFT:也有人把这个阶段叫做指令微调,还有叫做模型精调,不过这都不重要,这个阶段的目的只有一个,就是让模型能识别指令。训练完成后体现在解码上就是指令可能有很多种回答,这些回答的概率都很高,通过多次随机采用解码,每次解码基本上都不一致。若是没有经过微调的模型,只能通过prompt利用语言模型的能力来让模型理解指令,这时答非所问的情况就更容易出现。

RM:训练一个得分模型,即可以对模型的输出打分,便于后面训练PPO。得分模型需要人工标注数据,同一个prompt需要有一条好的回答,一条差的回答构成一条训练语料(也可以理解为一条比另一条好就行)。

r为打分模型,可以在SFT的模型基础之上添加全连接层改造成一个分类器得到,x为prompt,yw和yl为RM模型的两个输出,一个是好的回答,一个是不好的回答,最小化loss即将二者的得分差扩大。人工标注的数据训练,则会让符合人类回答的答案得分更高。

RL:主要采用的是近端策略优化模型( reinforcement learning via proximal policy optimization)。架构图参考ColossalAI。强化学习微调,会让得分高的答案,概率更高,得分低的答案,概率更低,提高差异,采样时即使不怎么调整参数,也会只采样到正确的答案。

4 基于RWKV微调模型

我们基于RWKV1.5B模型作为基模型,使用CSDN博客100W篇和问答30W条数据进行中文垂直领域增量训练,使用BELLE开源的50K指令数据进行指令微调。这里将训练后的模型命名为ChatCSDN,作为入门大模型的Hello World来参考学习使用。

项目地址:https://gitcode.net/csdn/ai/chatcsdn

模型参数地址:zxm2023/ChatCSDN · Hugging Face。

4.1 RWKV简介

RWKV(Receptance Weighted Key Value)的 介绍除了作者的项目外,目前已出,更详细的可以参考论文:https://arxiv.org/pdf/2305.13048.pdf

想了解RWKV必须先看苹果的AFT(An Attention Free Transformer)论文,它和标准的注意力算法结构相同,同样包含QKV结构,K和V首先与一组学习得到的位置偏差(position bias)结合,然后再进行同位元素Q对应相乘(element-wise multiplication)。

 从上图可以看出,QKV的计算转换成了线性计算,速度得到了极大提升。但是wt是一个需要训练的矩阵,大小为ctx_len*ctx_len,即模型的参数量随输入长度的增加而指数级增加,模型能处理的句子长度严重受限。

而RWKV主要是针对AFT进行了改进,从AFT的attention计算公式可以看出,其时间复杂度为O(N^{2}),wt改成了通过公式计算出来,不再是训练得到的,于是时间复杂度就变成了O(N),同时也能扩展到任意长度。主要是引入了Position Matrix、Time-shit、TimeMix和ChannelMix 等结构,相较于原始的GPT结构,RWKV将self-attention替换为Position Encoding和TimeMix,将FFN替换为ChannelMix。

 RWKV项目地址:RWKV-LM/RWKV-v4neo at main · BlinkDL/RWKV-LM · GitHub 

1.5B模型参数地址:BlinkDL/rwkv-4-pile-1b5 · Hugging Face

4.2 增量预训练

RWKV模型基本上都是采用英文进行的训练,这里使用中文的CSDN博客数据和问答数据进行垂直领域增量式训练,同时也会引入部分代码。如果大家也想尝试一下增量式训练,可以参考如下的步骤。

数据预处理。直接参考原作者的数据处理步骤需要按照很多包,这里已经将需要的包都移植到tools里面了。首先使用clean_data.py中的clean_ask_data和clean_blog_data方法可以将从数据仓库中拉取的数据转换成jsonl文件。之后进入tools文件夹下使用如下命令将数据转换成idx和bin文件:

python preprocess_data.py \--input ../data/data.txt \--output-prefix ../data/blog \--vocab ../20B_tokenizer.json \--dataset-impl mmap \--tokenizer-type HFTokenizer \--append-eod

增量预训练。使用前面n-1个词预测第n个词。

x = torch.tensor(dix[:-1], dtype=torch.long)
y = torch.tensor(dix[1:], dtype=torch.long)

从上面断面可以看出x和y只是错开了一个token,例如:原始句子的tokens为[u1,u2,u3,u4,u5,u6],x为[u1,u2,u3,u4,u5],y为[u2,u3,u4,u5,u6]。

loss = F.cross_entropy(logits.view(-1, logits.size(-1)), targets.view(-1))

 使用如上的代码计算loss。

python train.py  --load_model "RWKV-4-Pile-1B5-EngChn-test4-20230115.pth" --wandb "" --proj_dir "out" \
--data_file "data/blog_text_document" --data_type "binidx" --vocab_size 50277 \
--ctx_len 1024 --epoch_steps 200 --epoch_count 1000 --epoch_begin 0 --epoch_save 10 \
--micro_bsz 8 --n_layer 24 --n_embd 2048 --pre_ffn 0 --head_qk 0 \
--lr_init 1e-5 --lr_final 1e-5 --warmup_steps 0 --beta1 0.9 --beta2 0.999 --adam_eps 1e-8 \
--accelerator gpu --devices 1 --precision bf16 --strategy deepspeed_stage_2_offload --grad_cp 1

使用上面的命令开始训练。 load_model代表要加载的模型,data_type是数据类型,data_file是训练数据,precision是数据的精度,epoch_save是多久保存一次,ctx_len是窗口长度,每条数据多少个token,micro_bsz是批大小,gpu显存不够的可以设置的小一些。

4.3 SFT微调

构造训练用的指令数据,这里添加了相应的角色指令。

data_list = []for index, row in pf.iterrows():input = row["input"]target = row["target"]input_instruction = f"Below is an instruction that describes a task. Write a response that appropriately " \f"completes the request.\n\n### Instruction: {input}\n\n### Response:"input_tokens = self.tokenizer.tokenizer.encode(input_instruction)target_tokens = self.tokenizer.tokenizer.encode(target)if len(input_tokens) + len(target_tokens) > self.args.ctx_len:continuedata_list.append((input_tokens, target_tokens))

“### Instruction”和“### Response”问答对话的两个角色。这里写什么后续推理时最好也要用同样的方式构造prompt。

def __getitem__(self, index):ctx_len = self.args.ctx_lenreq_len = ctx_len + 1i = np.random.randint(0, len(self.data))question, answer = self.data[i]text = question + answertext = text[:req_len]text = text + [0] * (req_len - len(text))x = torch.tensor(text[:-1], dtype=torch.long)y = torch.tensor(text[1:], dtype=torch.long)z = [0] * len(question) + [1] * (ctx_len - len(question))z = torch.tensor(z, dtype=torch.long)

构造x,y和z,z代表mask,后面计算loss使用,会将前面的instruction给屏蔽掉。

loss = F.cross_entropy(logits.view(-1, logits.size(-1)), targets.view(-1), reduction='none')
# loss_raw = loss
loss = torch.sum(loss * mask) / sum_mask

4.4 RM和PPO

RM和PPO代码部分已经初步完善,待测试训练。

5 测试

将训练好的模型使用chat.py运行,解码方式采用的是随机采用解码。部分结果如下:

### Instruction: 你好
### Response:Hello! Nice to meet you!### Instruction: 用java实现冒泡排序
### Response:以下是使用Java实现冒泡排序的代码:```java
public void bubbleSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}
```该方法的工作方式是,首先将数组排序,然后比较相邻的两个数字是否相等,如果相等,则交换它们的位置,并重新计算下一个数字的位置### Instruction: +++
### Response:。在实际应用中,您可以将此方法替换为任何其他适用的排序算法,例如快速排序、归并排序或基数排序等。### Instruction: 帮我写一段JavaScript数组去重代码
### Response:```JavaScript
function uniqueArray(arr) {// 去重let unique = [];for (let i = 0; i < arr.length; i++) {if (arr[i] === arr[i]) {unique.push(arr[i]);}}return unique;
}
```此方法将一个数组转化为一个新的数组,在此过程中,会判断每个元素是否已经在原数组中,如果是则不会重复元素,否则则会添加到新数组中去。这样就可以将原始数组转化为新数组,避免重复元素。### Instruction: How about JOYI Sports Company? 翻译成中文
### Response:科基力学(JOYI)是一个怎样的公司?

6 总结

1、rwkv速度已经很快了,单卡可达到450token/s,但是在亿级甚至更大的tokens面前,也显得有点儿力不从心(不,应该叫望洋兴叹更形象)。

2、没有经过强化学习微调的模型,多次随机采用的结果都会不一致,要想得到理想的回答,可能需要多试几次。

3、1.5B受限于语言模型本身的限制,语言能力较弱,用来做大模型的入门学习还是挺不错的。后续我们会将代码和模型参数开源出来供大家一起学习研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20601.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全网多种方法解决com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure的问题

文章目录 1. 复现错误2. 分析错误3. 解决问题4. 解决该错误的其他方法 1. 复现错误 今天在使用knife4j&#xff0c;调用后端接口时&#xff0c;报出如下错误&#xff1a; 于是&#xff0c;赶紧查看控制台的错误信息&#xff0c;错误信息如下所示&#xff1a; com.mysql.cj.jdb…

网文作者:我太监了;GPT-3:我给你接上

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 你是否遇到过网络小说“断更”&#xff0c;或者是作者来一个“陨石遁”&#xff0c;你喜欢的小说就这样没了下文。 现在GPT-3可以治好这些作者的拖延症——以一种“高级代笔”的方式。 最近&#xff0c;一位叫做Liminal Warmth的…

总结了几百个ChatGPT模型的调教经验,确定不来看看?

目录 前言 chatgpt调教指南 提示词 1.清晰的问题或请求&#xff1a; 2.上下文设置&#xff1a; 3.具体的主题或领域&#xff1a; 4.陈述性问题&#xff1a; 5.追问和澄清&#xff1a; 6.限定问题范围&#xff1a; 角色扮演 充当 Linux 终端 担任产品经理 充当 SQL…

AI绘画-Midjourney基础1-突破想象的界限:掌握文本引导的图像生成技巧

Midjourney是一款 AI 绘画工具&#xff0c;可以根据你的提示&#xff08;本文中称为 prompt&#xff09;创作出各种图像。你只需要在Discord上和一个机器人聊天&#xff0c;就可以用简单的命令来控制它。目前已不支持免费试用&#xff0c;可以选择付费计划来获得更多功能和优势…

ChatGPT 与 Midjourney 强强联手,让先秦阿房宫重现辉煌!

Midjourney 是一款非常特殊的 AI 绘画聊天机器人&#xff0c;它并不是软件&#xff0c;也不用安装&#xff0c;而是直接搭载在 Discord 平台之上&#xff0c;所有的功能都是通过调用 Discord 的聊天机器人程序实现的。要想使用 Midjourney&#xff0c;只能进入他们的 Discord 服…

玩转ChatGPT:名单排序

一、写在前面 最近在文秘工作中&#xff0c;碰到一个名字排序的问题&#xff0c;大概的规则&#xff1a; &#xff08;1&#xff09;按照第一个汉字的首字母的英文单词排序&#xff0c;从A-Z&#xff1b; &#xff08;2&#xff09;若第一个字的首字母一致&#xff0c;则比较…

【NLP】ChatGPT 的议论文究竟写的怎么样?111 位高中教师告诉你答案

夕小瑶科技说 原创 作者 | 小戏、Python 在 OpenAI GPT-4 发布时发布的《GPT-4 Technical Report》中&#xff0c;其中很吸引人眼球的一部分是 GPT-4 应用于教育领域的出色表现&#xff0c;通过让 GPT-4 去完成美国的 AP 课程及考试&#xff0c;来评估 GPT-4 在多个学科中的性…

ChatGPT:在商业领域的广泛应用|小智AI

ChatGPT丨小智ai丨chatgpt丨人工智能丨OpenAI丨聊天机器人丨AI语音助手丨GPT-3.5丨OpenAI ChatGPT|GPT-4|GPT-3|人机对话|ChatGPT应用|小智ai|小智ai|小智ai|小智ai|小智AI|chatgpt小智AI 人工智能技术在商业领域的应用正日益普及&#xff0c;而ChatGPT作为下一代智能对话模型…

chatgpt赋能python:用Python办公自动化轻松完成繁琐重复的工作

用Python办公自动化轻松完成繁琐重复的工作 随着科技的进步&#xff0c;许多传统工作已经被自动化取代。而在许多职业中&#xff0c;办公自动化通常被认为是节省时间和减少错误的最佳方法。对于那些使用Microsoft Office&#xff0c;例如Excel、Word和PowerPoint等应用程序的用…

基于用户评论情感分析详细设计与技术实现

基于用户评论情感分析详细设计与技术实现 文章目录 基于用户评论情感分析详细设计与技术实现前言一、技术架构二、分析服务器构建1.1 创建flask项目1.2 编写数据库连接脚本&#xff0c;获取用户评论数据&#xff1b;1.2.1 引入库1.2.2 连接数据库获取数据1.2.3 测试 1.3 编写情…

情感分析的分类,情感分析模型有哪些,情感分析的应用场景,情感分析的发展趋势

1.情感分析的分类&#xff1a; &#xff08;1&#xff09;基于情感极性的分类&#xff1a;将文本的情感分为正向、负向和中性三类。 &#xff08;2&#xff09;基于情感维度的分类&#xff1a;将文本的情感分为喜欢、愤怒、悲伤、惊喜等多个情感维度。 2.情感分析模型&#x…

基于Twitter数据的情感预测与案例分析

导读 本次分享的是关于文本分析中的情感预测分析和主题分析的一个小科研项目&#xff0c;数据爬取自Twitter&#xff0c;主要内容分为3部分&#xff1a; 1.情感预测机器学习模型选择及建立 2.情感预测深度学习模型LSTM的介绍和建立 3.主题分析模型简介 01 # 情感预测机器学习…

CDGP认证|ChatGPT的出现,对数据治理行业冲击如何?

ChatGPT的出现对数据治理有很多好处&#xff0c;其中最明显的是提供了更高效、更准确和更自动化的数据处理和分析服务,可以帮助企业和组织更好地管理和利用数据资源&#xff0c;提高数据质量和决策效率。此外&#xff0c;ChatGPT还能够发现隐藏在大量数据中的信息和趋势&#x…

chatgpt赋能python:Python报错大全

Python报错大全 作为Python程序员&#xff0c;报错是我们经常遇到的一件事情。报错可以帮助我们定位和解决问题&#xff0c;但有时候错误信息并不直观&#xff0c;所以我们需要查找信息来帮助我们解决问题。在这篇文章中&#xff0c;我们将介绍常见的Python报错以及如何解决它…

GitHub开源神器,已获3k star!让你的 ChatGPT 不再报错!感受丝滑般体验!

点击上方“Github爱好者社区”&#xff0c;选择星标 回复“资料”&#xff0c;获取小编整理的一份资料 作者&#xff1a;GG哥 来源&#xff1a;GitHub爱好者社区&#xff08;github_shequ&#xff09; 这是GitHub爱好者社区第 71 篇原创文章 Hello&#xff0c;大家好&#xff0…

登高望远,一文解答 2023 年你最关心的前端热点问题

动手点关注 干货不迷路 本文预计阅读 25 min&#xff0c;建议先收藏后观看~ 一、刀光剑影的 2022 时光荏苒&#xff0c;这绝不平淡的 2022 年已经走上历史的黄页&#xff0c;新的一年也逐渐看不到故人回首的光影。感谢你对前端技术领域持续关注&#xff0c;我们一直在这里等你。…

千模大战鏖战正酣,大模型能否帮360重回巅峰?

ChatGPT问世后&#xff0c;互联网终于看到了变革的曙光。 回望互联网的征程&#xff0c;几乎每十年左右&#xff0c;就会因产品和技术的变革&#xff0c;而催生出全新的应用场景。 00年代&#xff0c;随着PC产品的逐渐成熟&#xff0c;桌面互联网成为时代的“主旋律”。在此背…

司马阅(SmartRead),最好用的中国PDF智能阅读工具!

在数字化时代&#xff0c;大量的信息以PDF&#xff08;便携式文档格式&#xff09;的形式存在。 处理和提取PDF文件中的信息可能是一项繁琐的任务&#xff0c;但现在有了司马阅(SmartRead)&#xff0c;一款能够与PDF进行对话的智能工具&#xff0c;这一切变得更加简单和高效。…

国产开源大模型: 百亿参数“伶荔”,填补中文基础模型空白!

Datawhale开源 团队&#xff1a;深圳大学沈琳琳教授团队 Linly 伶荔说 中文语言大模型来啦&#xff01; 大数据系统计算技术国家工程实验室副主任、深圳大学计算机与软件学院沈琳琳教授团队主持的人工智能项目“伶荔(Linly)”于今天隆重推出“伶荔说”系列中文语言大模型。 该…

Google 中文名发布 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 12 日&#xff0c;每年的这一天是世界航天日&#xff0c;全名载人空间飞行国际日&#xff1b;在 1961 年的 4 月 12 日&#xff0c;苏联空军飞行员尤里加加…