大语言模型从零开始训练全面指南:预训练、Tokenizer训练、指令微调、奖励模型、强化学习

实现mini智能助理—模型训练 1.介绍了预训练大模型的训练流程是怎么样的 2.介绍了常用的训练手段 3.详细介绍了两种主流的预训练手段原理:promt、delta 4.给了一个multi-gpu chatglm训练的例子 阅读详情
AI摘要

本文详细介绍了LLM训练的完整流程,包括预训练、指令微调、奖励模型和强化学习等关键环节,深入探讨了每一步的技术细节和注意事项。

在这篇文章中,我们将尽可能详细地梳理一个完整的 LLM 训练流程。包括模型预训练(Pretrain)、Tokenizer 训练、指令微调(Instruction Tuning)、奖励模型(Reward Model)和强化学习(RLHF)等环节。

1. 预训练阶段(Pretraining Stage)

工欲善其事,必先利其器。

当前,不少工作选择在一个较强的基座模型上进行微调,且通常效果不错(如:[alpaca]、[vicuna] 等)。

这种成功的前提在于:预训练模型和下游任务的差距不大,预训练模型中通常已经包含微调任务中所需要的知识。

但在实际情况中,我们通常会遇到一些问题,使得我们无法直接使用一些开源 backbone:

  1. 语言不匹配:大多数开源基座对中文的支持都不太友好,例如:[Llama]、[mpt]、[falcon] 等,这些模型在英文上效果都很优秀,但在中文上却差强人意。
续写任务测试LLaMAMPT
杭州西湖是杭州西湖是杭州的一个静静的一个游泳池,游泳池是杭州西湖的一个游泳池,游泳池是杭州西湖的一个游泳池,游泳池是杭州西湖的一个游泳池,�杭州西湖是中国最大的湖泊,是中国最大的湖泊,是中国最大的湖泊,是中国最大的湖泊,是中国最大的湖泊,是中国最大的湖泊,是中国最大的湖泊,
琅琊榜的导演是琅琊榜的导演是很多的人都不知道,因为他的父亲是一位杰作家,他的父亲的杰作家是一位杰作家,琅琊榜的导演是谁?Who are the directors of the Rolling Stone?琅琊榜的导演是谁?Who are the
  1. 专业知识不足:当我们需要一个专业领域的 LLM 时,预训练模型中的知识就尤为重要。由于大多数预训练模型都是在通用训练语料上进行学习,对于一些特殊领域(金融、法律等)中的概念和名词无法具备很好的理解。我们通常需要在训练语料中加入一些领域数据(如:[xuanyuan 2.0]),以帮助模型在指定领域内获得更好的效果。

轩辕 2.0(金融对话模型)论文中所提及的训练语料分布,其中 Financial Pretraining 为金融语料

基于上述原因,我们在进行 SFT 步骤之前,先来看看预训练任务是如何做的。

1.1 Tokenizer Training

在进行预训练之前,我们需要先选择一个预训练的模型基座。

一个较为普遍的问题是:大部分优秀的语言模型都没有进行充分的中文预训练,

因此,许多工作都尝试将在英语上表现比较优秀的模型用中文语料进行二次预训练,期望其能够将英语上的优秀能力迁移到中文任务中来。

已经有许多优秀的仓库做过这件事情,比如:[Chinese-LLaMA-Alpaca]。

但在进行正式的训练之前,我们还有一步很重要的事情去做:词表扩充。

通俗来讲,tokenizer 的目的就是将一句话进行切词,并将切好词的列表喂给模型进行训练。

例如:

输入句子 >>> 你好世界  
切词结果 >>> ['你', '好', '世', '界']

通常,tokenizer 有 2 种常用形式:WordPiece 和 BPE。

  • WordPiece

WordPiece 很好理解,就是将所有的「常用字」和「常用词」都存到词表中,

当需要切词的时候就从词表里面查找即可。

bert-base-chinese tokenizer 可视化

上述图片来自可视化工具 [tokenizer_viewer]。

如上图所示,大名鼎鼎的 BERT 就使用的这种切词法。

当我们输入句子:你好世界,

BERT 就会依次查找词表中对应的字,并将句子切成词的组合。

BERT 切词测试图

当遇到词表中不存在的字词时,tokenizer 会将其标记为特殊的字符 [UNK]:

Out of Vocabulary(OOV)情况

  • Byte-level BPE(BBPE)

感谢评论区指正,有关 BBPE 的原理可以参考 [这里]。

WordPiece 的方式很有效,但当字词数目过于庞大时这个方式就有点难以实现了。

对于一些多语言模型来讲,要想穷举所有语言中的常用词(穷举不全会造成 OOV),

既费人力又费词表大小,为此,人们引入另一种方法:BBPE。

BPE 不是按照中文字词为最小单位,而是按照 unicode 编码 作为最小粒度。

对于中文来讲,一个汉字是由 3 个 unicode 编码组成的,

因为平时我们不会拆开来看(毕竟中文汉字是不可拆分的),所以我一开始对这个概念也不太熟悉。

我们来看看 LLaMA 的 tokenizer 对中文是如何进行 encode 的:

LLaMa tokenizer 中文测试

上述图片来自可视化工具 [tokenizer_viewer]。

可以看到,「编码」两个字能够被正常切成 2 个字,

但「待」却被切成了 3 个 token,这里的每个 token 就是 1 个 unicode 编码。

LLaMA tokenizer 查找结果,「待」不在词表中,「编」「码」在词表中

通过 token 查找功能,我们可以发现「编」「码」在词表中,但「待」不在词表中。

但任何 1 个汉字都是可以由 unicode 表示(只是组合顺序不同),因此「待」就被切成了 3 个 token。

BBPE 的优势不会出现 OOV 的情况。不管是怎样的汉字,只要可以用 unicode 表示,就都会存在于词表中。
BBPE 的劣势模型训练起来将会更吃力一些。毕竟像「待」这样的汉字特定 unicode 组合其实是不需要模型学习的,但模型却需要通过学习来知道合法的 unicode 序列。

通常在模型训练不够充足的时候,模型会输出一些乱码(不合法的 unicode 序列):

游泳池是杭州西湖的一个游泳池,���
  • 词表扩充

为了降低模型的训练难度,人们通常会考虑在原来的词表上进行「词表扩充」,

也就是将一些常见的汉字 token 手动添加到原来的 tokenizer 中,从而降低模型的训练难度。

我们对比 [Chinese-LLaMA] 和 [LLaMA] 之间的 tokenizer 的区别:

Chinese LLaMA 和 原始LLaMA 之间 tokenizer 的区别

上述图片来自可视化工具 [tokenizer_viewer]。

我们可以发现:Chinese LLaMA 在原始 tokenizer 上新增了17953 个 tokens,且加入 token 的大部分为汉字。

而在 [BELLE] 中也有同样的做法:

在 120w 行中文文本上训练出一个 5w 规模的 token 集合,

并将这部分 token 集合与原来的 LLaMA 词表做合并,

最后再在 3.2B 的中文语料上对这部分新扩展的 token embedding 做二次预训练。

《Towards Better Instruction Following Language Models for Chinese》 Page-4

1.2 Language Model PreTraining

在扩充完 tokenizer 后,我们就可以开始正式进行模型的预训练步骤了。

Pretraining 的思路很简单,就是输入一堆文本,让模型做 Next Token Prediction 的任务,这个很好理解。

我们主要来讨论几种预训练过程中所用到的方法:数据源采样、数据预处理、模型结构。

  • 数据源采样

在 [gpt3] 的训练过程中,存在多个训练数据源,论文中提到:对不同的数据源会选择不同采样比例:

在这里插入图片描述

GPT3 Paper Page-9

通过「数据源」采样的方式,能够缓解模型在训练的时候受到「数据集规模大小」的影响。

从上图中可以看到,相对较大的数据集(Common Crawl)会使用相对较大的采样比例(60%),

这个比例远远小于该数据集在整体数据集中所占的规模(410 / 499 = 82.1%),

因此,CC 数据集最终实际上只被训练了 0.44(0.6 / 0.82 * (300 / 499))个 epoch。

而对于规模比较小的数据集(Wikipedia),则将多被训练几次(3.4 个 epoch)。

这样一来就能使得模型不会太偏向于规模较大的数据集,从而失去对规模小但作用大的数据集上的学习信息。

  • 数据预处理

数据预处理主要指如何将「文档」进行向量化。

通常来讲,在 Finetune 任务中,我们通常会直接使用 truncation 将超过阈值(2048)的文本给截断,

但在 Pretrain 任务中,这种方式显得有些浪费。

以书籍数据为例,一本书的内容肯定远远多余 2048 个 token,但如果采用头部截断的方式,

则每本书永远只能够学习到开头的 2048 tokens 的内容(连序章都不一定能看完)。

因此,最好的方式是将长文章按照 seq_len(2048)作分割,将切割后的向量喂给模型做训练。

  • 模型结构

为了加快模型的训练速度,通常会在 decoder 模型中加入一些 tricks 来缩短模型训练周期。

目前大部分加速 tricks 都集中在 Attention 计算上(如:MQA 和 Flash Attention [falcon] 等);

此外,为了让模型能够在不同长度的样本上都具备较好的推理能力,

通常也会在 Position Embedding 上进行些处理,选用 ALiBi([Bloom])或 RoPE([GLM-130B])等。

  • Warmup & Learning Ratio 设置

在继续预训练中,我们通常会使用 warmup 策略,此时我们按照 2 种不同情况划分:

  1. 当训练资源充足时,应尽可能选择较大的学习率以更好的适配下游任务;

  2. 当资源不充足时,更小的学习率和更长的预热步数或许是个更好的选择。

1.3 数据集清理

中文预训练数据集可以使用 [悟道],数据集分布如下(主要以百科、博客为主):

悟道-数据分布图

但开源数据集可以用于实验,如果想突破性能,则需要我们自己进行数据集构建。

在 [falcon paper] 中提到,

仅使用「清洗后的互联网数据」就能够让模型比在「精心构建的数据集」上有更好的效果,

一些已有的数据集和它们的处理方法如下:

各种数据源 & 数据清理方法

1.4 模型效果评测

关于 Language Modeling 的量化指标,较为普遍的有 [PPL],[BPC] 等,

可以简单理解为在生成结果和目标文本之间的 Cross Entropy Loss 上做了一些处理。

这种方式可以用来评估模型对「语言模板」的拟合程度,

即给定一段话,预测后面可能出现哪些合法的、通顺的字词。

但仅仅是「生成通顺句子」的能力现在已经很难满足现在人们的需求,

大部分 LLM 都具备生成流畅和通顺语句能力,很难比较哪个好,哪个更好。

为此,我们需要能够评估另外一个大模型的重要能力 —— 知识蕴含能力。

  • C-Eval

一个很好的中文知识能力测试数据集是 [C-Eval],涵盖1.4w 道选择题,共 52 个学科。

覆盖学科如下:

c-eval 数据集覆盖学科图

由于是选择题的形式,我们可以通过将题目写进 prompt 中,

并让模型续写 1 个 token,判断这个续写 token 的答案是不是正确答案即可。

但大部分没有精调过的预训练模型可能无法续写出「A B C D」这样的选项答案,

因此,官方推荐使用 5-shot 的方式来让模型知道如何输出答案:

以下是中国关于会计考试的单项选择题,请选出其中的正确答案。  
  
下列关于税法基本原则的表述中,不正确的是____。  
A. 税收法定原则包括税收要件法定原则和税务合法性原则  
B. 税收公平原则源于法律上的平等性原则  
C. 税收效率原则包含经济效率和行政效率两个方面  
D. 税务机关按法定程序依法征税,可以自由做出减征、停征或免征税款的决定  
答案:D  
  
甲公司是国内一家领先的新媒体、通信及移动增值服务公司,由于遭受世界金融危机,甲公司经济利润严重下滑,经营面临困境,但为了稳定职工队伍,公司并未进行裁员,而是实行高层管理人员减薪措施。甲公司此举采用的收缩战略方式是____。  
A. 转向战略  
B. 放弃战略  
C. 紧缩与集中战略  
D. 稳定战略  
答案:C  
  
...             # 第 3, 4, 5 道样例题  
  
下列各项中,不能增加企业核心竞争力的是____。  
A. 产品差异化  
B. 购买生产专利权  
C. 创新生产技术  
D. 聘用生产外包商  
答案:

通过前面的样例后,模型能够知道在「答案:」后面应该输出选项字母。

于是,我们获得模型续写后的第一个 token 的概率分布(logits),

并取出「A B C D」这 4 个字母的概率,通过 softmax 进行归一化:

probs = (  
    torch.nn.functional.softmax(  
        torch.tensor(  
            [  
                logits[self.tokenizer.encode(  
                    "A", bos=False, eos=False)[0]],  
                logits[self.tokenizer.encode(  
                    "B", bos=False, eos=False)[0]],  
                logits[self.tokenizer.encode(  
                    "C", bos=False, eos=False)[0]],  
                logits[self.tokenizer.encode(  
                    "D", bos=False, eos=False)[0]],  
            ]  
        ),  
        dim=0,  
    ).detach().cpu().numpy()  
)  
pred = {0: "A", 1: "B", 2: "C", 3: "D"}[np.argmax(probs)]           # 将概率最大的选项作为模型输出的答案

C-Eval 通过这种方式测出了许多模型在中文知识上的效果,

由于是 4 选项问题,所以基线(随机选择)的正确率是 25%。

C-Eval 也再一次证明了 GPT-4 是个多么强大的知识模型:

各模型在 5-shot 下的得分排名

2. 指令微调阶段(Instruction Tuning Stage)

在完成第一阶段的预训练后,就可以开始进到指令微调阶段了。

由于预训练任务的本质在于「续写」,而「续写」的方式并一定能够很好的回答用户的问题。

例如:

用户问题用户预期回答模型续写结果
《无间道》的主演有哪些?刘德华、梁朝伟《无间道》的主演有哪些?不少观众期待看到阵容公告,今天小编…

因为训练大多来自互联网中的数据,我们无法保证数据中只存在存在规范的「一问一答」格式,

这就会造成预训练模型通常无法直接给出人们想要的答案。

但是,这并不代表预训练模型「无知」,只是需要我们用一些巧妙的「技巧」来引导出答案:

用户问题用户预期回答模型续写结果
《无间道》的主演有刘德华、梁朝伟《无间道》的主演有刘德华、梁朝伟和黄秋生,而这部电影也是香港警匪片的代表作之一。

不过,这种需要用户精心设计从而去「套」答案的方式,显然没有那么优雅。

既然模型知道这些知识,只是不符合我们人类的对话习惯,那么我们只要再去教会模型「如何对话」就好了。

这就是 Instruction Tuning 要做的事情,即指令对齐。

OpenAI 在 [instruction-following] 中展示了 GPT-3 和经过指令微调前后模型的区别:

GPT-3 只是在做续写任务,InstructGPT 则能够回答正确内容

2.1 Self Instruction

既然我们需要去「教会模型说人话」,

那么我们就需要去精心编写各式各样人们在对话中可能询问的问题,以及问题的答案。

在 [InstructGPT Paper] 中,使用了 1.3w 的数据来对 GPT-3.5 进行监督学习(下图中左 SFT Data):

InstructGPT Paper 训练数据集预览

可以观察到,数据集中人工标注(labeler)占大头,

这还仅仅只是 InstructGPT,和 ChatGPT 远远不是一个量级。

可见,使用人工标注是一件成本巨大的事情,

除了找到足够的人数,还需要保持团队中每个人的「专业」且「认知一致」。

如果这件事从头开始做自然很难(OpenAI 确实厉害),但今天我们已经有了 ChatGPT 了,

我们让 ChatGPT 来教我们自己的模型不就好了吗?

这就是 Self Instruction 的思路,即通过 ChatGPT 的输入输出来蒸馏自己的模型。

一个非常出名的项目是 [stanford_alpaca]。

如果从 ChatGPT 「套」数据,那么我们至少需要「套」哪些数据。

Instruction Tuning 中的「输入」(问题)和「输出」(答案)是训练模型的关键,

答案很好得到,喂给 ChatGPT 问题根据返回结果就能获得,

但「问题」从哪里获得呢?

(靠人想太累了,屏幕前的你不妨试试,看看短时间内能想出多少有价值的问题)

Alpaca 则是使用「种子指令(seed)」,使得 ChatGPT 既生成「问题」又生成「答案」。

由于 Alpaca 是英文项目,为了便于理解,我们使用相同思路的中文项目 [BELLE] 作为例子。

通俗来讲,就是人为的先给一些「训练数据样例」让 ChatGPT 看,

紧接着利用 ChatGPT 的续写功能,让其不断地举一反三出新的训练数据集:

你被要求提供10个多样化的任务指令。这些任务指令将被提供给GPT模型,我们将评估GPT模型完成指令的能力。  
以下是你提供指令需要满足的要求:  
1.尽量不要在每个指令中重复动词,要最大化指令的多样性。  
2.使用指令的语气也应该多样化。例如,将问题与祈使句结合起来。  
3.指令类型应该是多样化的,包括各种类型的任务,类别种类例如:brainstorming,open QA,closed QA,rewrite,extract,generation,classification,chat,summarization。  
4.GPT语言模型应该能够完成这些指令。例如,不要要求助手创建任何视觉或音频输出。例如,不要要求助手在下午5点叫醒你或设置提醒,因为它无法执行任何操作。例如,指令不应该和音频、视频、图片、链接相关,因为GPT模型无法执行这个操作。  
5.指令用中文书写,指令应该是1到2个句子,允许使用祈使句或问句。  
6.你应该给指令生成适当的输入,输入字段应包含为指令提供的具体示例,它应该涉及现实数据,不应包含简单的占位符。输入应提供充实的内容,使指令具有挑战性。  
7.并非所有指令都需要输入。例如,当指令询问一些常识信息,比如“世界上最高的山峰是什么”,不需要提供具体的上下文。在这种情况下,我们只需在输入字段中放置“<无输入>”。当输入需要提供一些文本素材(例如文章,文章链接)时,就在输入部分直接提供一些样例。当输入需要提供音频、图片、视频或者链接时,则不是满足要求的指令。  
8.输出应该是针对指令和输入的恰当回答。   
下面是10个任务指令的列表:  
###  
1. 指令: 在面试中如何回答这个问题?  
1. 输入:当你在车里独处时,你会想些什么?  
1. 输出:如果是在晚上,我通常会考虑我今天所取得的进步,如果是在早上,我会思考如何做到最好。我也会尝试练习感恩和活在当下的状态,以避免分心驾驶。  
###  
2. 指令: 按人口对这些国家进行排名。  
2. 输入:巴西,中国,美国,日本,加拿大,澳大利亚  
2. 输出:中国,美国,巴西,日本,加拿大,澳大利亚  
###  
3. 指令:

如上述例子所示,我们先给出 2 个样例,并让 ChatGPT 进行续写:

ChatGPT 续写结果

2.2 开源数据集整理

在这一章中,我们将梳理一些开源的 Instruction Tuning 的数据集,

除了直接拿来用以外,我们期望通过分析这些已有数据集,从而学习如何构建一个指令数据集。

  • Alpaca

[stanford_alpaca] 采用上述的 self instruction 的方式采集了 5200 条指令训练数据集。

数据样例如下:

{  
    "instruction": "Arrange the words in the given sentence to form a grammatically correct sentence.",  
    "input": "quickly the brown fox jumped",  
    "output": "The quick brown fox jumped quickly."  
}

其中,instruction 代表要求模型做的任务,input 代表用户输入, output 代表喂给模型的 label。

Alpaca 覆盖了多种类型的指令,其数据分布如下:

Alpaca 数据分布图

包含写作、描述、分类、摘要等多种类型的任务集合。

  • BELLE

BELLE 开放了好几种规模的数据集,[100万]、[200万]、[350万] 等。

训练数据集样例如下:

{  
    "instruction": "判断给定的文章是否符合语法规则。如果不符合,请提供修改建议。下面是一篇文章的开头: ‘为了探讨这个主题,本文将提供一系列数据和实例,以证明这一观点。’",  
    "input": "",  
    "output": "这个开头符合语法规则。"  
}

由于数据量很大,我们无法统计出训练数据集中各任务的真实占比,

但从 [1000条评测集] 数据分布可以推测出,训练数据集中同样包含:摘要、问答、分类等任务。

BELLE - 评测集分布

我们按照类别对评测数据进行采样,结果如下:

任务名称例子
文本生成为一种智能手表编写用户手册,包括详细的使用说明和操作步骤。
头脑风暴针对给定的主题,进行头脑风暴并记录所有想法。
如何提高公司的销售额?
开放域问答用一两句话描述著名的尼罗河是如何形成的。
封闭域问答从以下选项中选择正确的词汇填空以完整下面的句子。他喜欢去_______看电影。A) 邮局 B)超市 C)电影院 D)音乐会
分类请将以下这篇文章分类为新闻报道、科学文章或社论。
据媒体新闻援引美国福克斯新闻网报道,美国伯克希尔哈撒韦公司首席执行官、著名投资人巴菲特近日就美国银行业危机与总统拜登的团队进行对话。
抽取基于以下表格,请问张三的考勤情况
员工姓名,日期,上班时间,下班时间,是否迟到,是否早退,是否请假
张三,1月1日,8:30,17:30,否,否,否
李四,1月1日,9:00,18:00,是,否,否
王五,1月1日,8:00,16:30,否,是,否
赵六,1月1日,8:30,17:00,否,否,是
张三,1月2日,8:00,17:00,否,否,否
李四,1月2日,8:30,17:30,否,否,否
王五,1月2日,9:00,18:00,是,否,否
赵六,1月2日,8:30,17:00,否,否,是
重写根据提供的文本重写其中的一段,使之更加简明扼要,同时不丢失原文本的主要信息。
纽约市,简称“纽约”,通常被称为“大苹果”,是美国最大的城市,也是全世界最大的城市之一。位于美国东海岸,东北部边界是大西洋,在新泽西州的东南部。
摘要基于下面的这个故事,总结其中最重要的三个事件。
小明是一个好学生,每天早上都要起得很早去上学。有一天,他迟到了,因为他的家里来了一个客人。晚上,他参加了一次班级会议,会议主题是如何提高学习效率。回到家后,他又花了一些时间复习功课。
Code & Math按照以下要求,写一个SQL查询语句:从表中查找所有性别为女性的学生的姓名和学号。
SELECT name, id FROM students WHERE gender = ‘女性’
  • Vicuna

  • BAIZE

2.3 模型的评测方法

比起预训练(Pretrain)环节里相对明确的评价指标(如PPL、NLL等),

Instruction 环节中的评价指标比较令人头疼。

鉴于语言生成模型的发展速度,BLEU 和 ROUGH 这样的指标已经不再客观。

一种比较流行的方式是像 [FastChat] 中一样,利用 GPT-4 为模型的生成结果打分,

我们也尝试使用同样的 Prompt 对 3 种开源模型:OpenLlama、ChatGLM、BELLE 进行测试。

注意:下面的测试结果仅源自我们自己的实验,不具备任何权威性。

对于每一个问题,我们先获得 ChatGPT 的回复,以及另外 3 种模型的回复,

接着我们将 「ChatGPT 答案 - 候选模型答案」这样的 pair 喂给 GPT-4 打分(满分为 10 分)。

得到的结果如下:

测试结果 & 测试 prompt

我们对每个任务单独进行了统计,并在最后一列求得平均值。

GPT-4 会对每一条测试样本的 2 个答案分别进行打分,并给出打分理由:

GPT-Review 的结果

但是,我们发现,GPT-4 打出的分数和给出理由并不一定正确。

如上图所示,GPT-4 为右边模型的答案打出了更高的分数,给出的理由是:

将「最长时期」改为了「最长时期之一」会更准确。

但事实上,Instruction 中明确设定就是「最长时期」,

这种「给高分」的理由其实是不正确的。

此外,我们还发现,仅仅调换句子顺序也会对最后打分结果产生影响,

针对这个问题,我们考虑「调换句子顺序并求和平均」来缓解。

但不管怎么样,GPT-4 给出的分数或许并没有我们想象中的那么靠谱,

为此,我们通过人工的 Review 的方式对每个答案进行了一次回扫,得到的结果和标准如下:

再次重申:我们只是期望指出 GPT-4 打分可能会和实际产生偏差的问题,这里排名不具备任何权威性。

人工 Review 结果 & 打分原则

我们可以看到,

在 GPT-4 打分的结果中,已经有模型的效果甚至超过了 ChatGPT(分数为 1.02),

但再经过人工 Review 后,ChatGPT 的答案是我们认为更合理一些的。

当然,最近陆陆续续的推出了许多新的评测方法,如:[PandaLM],

以及许多比较有影响力的评测集,如:[C-Eval]、[open_llm_leaderboard] 等,

我们或许会在后续的整理中更新。

3. 奖励模型(Reward Model)

我们在很早以前写过一篇 reward model 相关的文章,

解释了 reward model 的基本原理和一些实验代码(包括 rank_list 的标注平台):

rank list 标注平台

但开源代码中是使用 encoder 作为训练基座的,

3.1 奖励模型(Reward Model)的必要性

其实,当我们在做完 SFT 后,我们大概率已经能得到一个还不错的模型。

但我们回想一下 SFT 的整个过程:

我们一直都在告诉模型什么是「好」的数据,却没有给出「不好」的数据。

我们更倾向于 SFT 的目的只是将 Pretrained Model 中的知识给引导出来的一种手段,

而在SFT 数据有限的情况下,我们对模型的「引导能力」就是有限的。

这将导致预训练模型中原先「错误」或「有害」的知识没能在 SFT 数据中被纠正,

从而出现「有害性」或「幻觉」的问题。

为此,一些让模型脱离昂贵标注数据,自我进行迭代的方法被提出,比如:[RLHF],[DPO],

但无论是 RL 还是 DPO,我们都需要让告知模型什么是「好的数据」,什么是「不好的数据」。

RL 是直接告诉模型当前样本的(好坏)得分,DPO 是同时给模型一条好的样本和一条坏的样本。

而判断样本数据的「好坏」除了昂贵的人工标注之外,

那就是 Reward Model 大显身手的时候了。

3.2 利用偏序对训练奖励模型

在 OpenAI 的 [Summarization] 和 [InstructGPT] 的论文中,都使用了「偏序对」来训练模型。

偏序对是指:不直接为每一个样本直接打分,而是标注这些样本的好坏顺序。

直接打分:A句子(5分),B句子(3分)
偏序对标注:A > B

模型通过尝试最大化「好句子得分和坏句子得分之间的分差」,从而学会自动给每一个句子判分。

为什么要使用偏序对而不是直接打分可以看上面给出的文章链接。

我们可以来做一个简单实验,我们构造一批如下数据:

{  
    "prompt": "下面是一条正面的评论:",  
    "selected": "屯了一大堆,今年过年的话蛮富足的!到货很快的!",  
    "rejected": "对商品谈不上满意,但是你们店的信誉极度不满意,买了件衣服取消了订单,要求退款,结果退款过程进行一半就不进行了,真是因小失大啊"  
}

其中,prompt 是要求模型续写一条好评,selected 是一条好的回答(A),rejected 是一条不好的回答(B)。

我们使用 [llama-2-7b] 作为基座模型训练,期望模型对于 A 回答能够给尽可能高的分,B 回答则尽可能低。

RM Loss Function

我们将训练过程中的「分差变化」绘制出来,

伴随着 loss 的降低,我们发现分差的均值和方差都呈上升的趋势:

Note:这里的分差是指 r(好答案) - r(坏答案) 的分差。

Reward Model 训练日志

我们进一步的绘制出在 100 个评测样本的分差分布:

在 step 0(未训练)时,模型打出来的分差是一个近似均值为 0,方差为 0.1 的正态分布,

这说明初始模型无法区分数据的好坏(好数据 - 坏数据的得分有正有负)。

随着模型训练,分布均值从 0 开始逐渐增长,这证明模型开始逐渐让「好数据」 - 「坏数据」的分差越来越大。

到第 60 个 step 之后,分布的均值和方差开始趋于稳定。

分差进化图

至此,我们已经让 RM 学会了给「正向评论」打分更高,给「负向评论」打分更低。

但是由于偏序对本身「过于粗糙」,会导致 RM 的打分并不足够精准,

后续一些工作在标注偏序的时候不仅标注了 A 好于 B,还同时标注了 A 比 B 好多少。

3.3 使用多少数据能够训练好一个RM?

在 OpenAI Summarize 的任务中,使用了 [6.4w 条] 偏序对进行训练。

在 InstructGPT 任务中,使用了 3.2w 条 [4~9] 偏序对进行训练。

InstructGPT page 33

在 [StackLlama] 任务中,使用了 10w 条 [Stack Exchange] 偏序对进行训练。

从上述工作中,我们仍无法总结出一个稳定模型需要的最小量级,这取决于具体任务。

但至少看起来,5w 以上的偏序对可能是一个相对保险的量级。

3.4 RM 模型的大小限制?

Reward Model 的作用本质是给生成模型的生成内容进行打分,所以 Reward Model 只要能理解生成内容即可。

关于 RM 的规模选择上,目前没有一个明确的限制:

Summarize 使用了 6B 的 RM,6B 的 LM。

InstructGPT 使用了 6B 的 RM,175B 的 LM。

DeepMind 使用了 70B 的 RM,70B LM。

不过,一种直觉的理解是:判分任务要比生成认为简单一些,因此可以用稍小一点的模型来作为 RM。

4. 强化学习(Reinforcement Learning,PPO)

在获得了一个 Reward Model 后,我们便可以利用这个 RM 来进化我们的模型。

目前比较主流的优化方式有 3 种:BON,DPO 和 PPO。

4.1 Best-of-N(BON)

BON 也叫 reject sampling,是指我们通过设置 temperature 值让同一个模型生成若干回复,

接着,使用 Reward Model 挑出这些回复中得分较高的回复并再次训练原本的模型。

在 [Llama2 Paper] 中使用了这种方法,由于这是一个循环迭代的过程(Sample -> SFT -> Sample -> …),

论文中指出:在进行 SFT 时,应当使用之前所有策略下的 Good Samples(而非仅是最近一次策略模型 Sample 出的样本),以提高模型的泛化性。

“我们将之前每一个 stage 中优秀样本都汇聚到一起进行训练,这使得最后的效果显著提升”

BON 和 RL 的区别主要有以下 2 点:

  • 探索广度:对同一个 prompt,BON 一次会进行 N 次采样,但 PPO 每次只会采样 1 个答案。

  • 进化深度:BON 的方法只会进行一次模型的「采样-迭代」,而 PPO 会重复进行「采样-进化-采样-进化」。但我们同样可以持续做多个轮回的 BON,这种情况下这 2 种方法的差别就不那么大。

在这一篇 [OpenAI Paper] 中对比了 BON & RL 在训练效果上的区别,

相比于 RL,BON 的训练曲线要更稳定(不那么容易崩),但从最终效果来看 RL 的上限会更高一些:

图左为 BON 训练 Reward 曲线,图右为 RL 训练 Reward 曲线

4.2 Direct Preference Optimisatio(DPO)

[DPO] 是一种不需要 Reward Model 的训练方法,它可以用训练 RM 的偏序对来直接训练模型本身。

具体来讲,DPO 借鉴了对比学习的思路,

其目标是:对于同一个 prompt,尽可能大的拉开 selected 答案和 rejected 答案之间的生成概率。

DPO Loss 的实现公式

上述公式源自 [这篇 paper],代码中实现也普遍采样该公式。

以下是 [trl] 中对 DPO 中的 loss 实现方式:

def dpo_loss(  
    self,  
    policy_chosen_logps: torch.FloatTensor,  
    policy_rejected_logps: torch.FloatTensor,  
    reference_chosen_logps: torch.FloatTensor,  
    reference_rejected_logps: torch.FloatTensor,  
    reference_free: bool = False,  
) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]:  
    pi_logratios = policy_chosen_logps - policy_rejected_logps              # 当前模型的 good/bad sample 的概率差  
    ref_logratios = reference_chosen_logps - reference_rejected_logps       # Ref模型的 good/bad sample 的概率差  
  
    if reference_free:  
        ref_logratios = 0  
  
    logits = pi_logratios - ref_logratios                       # 如果 ref model 对这两个样本差异也很大,则不要拉的太猛(防止训飞了)  
  
    if self.loss_type == "sigmoid":  
        losses = -F.logsigmoid(self.beta * logits)              # 最大化 good/bad sample 的概率差  
    elif self.loss_type == "hinge":  
        losses = torch.relu(1 - self.beta * logits)  
    else:  
        raise ValueError(f"Unknown loss type: {self.loss_type}. Should be one of ['sigmoid', 'hinge']")  
  
    chosen_rewards = self.beta * (policy_chosen_logps - reference_chosen_logps).detach()  
    rejected_rewards = self.beta * (policy_rejected_logps - reference_rejected_logps).detach()  
  
    return losses, chosen_rewards, rejected_rewards

4.3 Proximal Policy Optimization(PPO)

[PPO] 是强化学习中一种基于AC架构(Actor-Critic)的优化方法,其前身是TRPO,

PPO通过引入重要性采样(Importance Sampling)来缓解 on policy 模型一次采样数据只能更新一次模型的问题,提升了数据利用率和模型训练速度。

在 LLM 的训练中,使用 PPO 需要同时载入 4 个模型:

  • Actor Model:用于进化训练的生成模型

  • Critic Model:用于进化训练的评判模型

  • Ref Model:参照模型,通过 KL 来限制 Actor 模型的训练方向

  • Reward Model:奖励模型,用于指导 Actor 进化

为了节省显存,通常会将 actor / critic 共享一个 backbone,这样只用同时载入 3 个模型。

注:这也是 RL 非常耗卡的一个重要原因。

PPO 以其「训练过程不稳定」和「效果不稳定」著称,这里我们通过列出一些具体的 case 来说明。

4.3.1 训练过程不稳定

由于 PPO 对超参非常敏感,不合理的超参搭配很有可能使得模型训练过程中 Reward 剧烈抖动:

图中蓝色折线为 actor 的 reward 曲线,粉红色折线为 ref_model(不参与训练)的 reward 曲线

从上图中可以看出,模型在训练过程中奖励曲线抖动的非常剧烈,

经过实验,我们发现存在几个因素与此有关:

  • KL Penalty:适当调大 KL可以帮助稳定训练(可使用动态调整 KL 系数策略)。

  • Reward Model:使用一个更稳定的 RM 能够有效缓解这种问题。

  • Reward Scaling:reward 的归一化对训练稳定有着很重要的作用。

  • Batch Size:适当增大 batch_size 有助于训练稳定。

4.3.2 训练结果不稳定

当你看到一条比较平稳且漂亮的 Reward 折线时 —— 也不要高兴的太早,

因为 reward 的提升并不代表模型真的表现的更好。

如下图所示:

一条看起来很完美的训练曲线,图中右下角为 reward 分布,橙色为当前模型的 reward 分布(集中在高分区域)

这次看起来非常完美的训练,当模型最终生成的结果却如下所示:

以「情绪识别模型」作为 RM,目标为生成更优情绪的答案

我们发现,模型的输出都是一些乱码,

之所以生成这种结果,是因为 Reward Model 对于这类「乱码」打分很高(最后一列为 RM 打出的分数)。

这种通过找到 shortcut 形成 reward 提升的现象又称为 reward hacking。

对于这种情况,除了提升 RM 本身的能力以外,我们还可以通过 Combine 多个 RM 以防止这种情况出现。

如 Llama 2 中同时使用了 2 个 RM(Safety + Helpful)来进行打分,不过论文中给出的理由是 Safety 和 Helpful 这两个任务目标之间可能存在冲突,但使用多个 RM 来综合打分同时也能较好的防止模型训到天上去。

最终的训练结果如下:

使用多个混合RM策略进行训练的结果

通过使用多种策略进行混合,最终模型能够获得较为稳定的分数增长,输出模型也不再崩溃。
​

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

从零开始:AI模型训练入门概念 AI模型训练是指通过给定的数据集,让模型自动学习数据中的规律,从而使其具备处理实际问题的能力。训练过程中,模型会不断调整内部参数,以期在输入相似数据时给出正确的输出。 阅读详情

相关推荐

详解大模型PPO、DPO的训练过程

AI因你而升温,记得加个星标哦!大家好,我是泰哥。距离上次写技术贴已经1年有余,这一年当中算法技术的发展可以说是日新月异。今天和大家聊聊大模型的训练的三个阶段,分别为有监督学习(SFT)、奖励模型训练(RW)与强化学习(PPO)阶段,我对以上的训练过程会加上一些自己的理解。GPT使用Transformer decoder部分作为语言模型的框架,并将decoder中的Multi-head Attention层删除,其结构和计算过程如上图。

Antai_ZHU的博客 1万+

从零开始训练大模型

我们更倾向于 SFT 的目的只是将 Pretrained Model 中的知识给引导出来的一种手段,而在SFT 数据有限的情况下,我们对模型的「引导能力」就是有限的。这将导致预训练模型中原先「错误」或「有害」的知识没能在 SFT 数据中被纠正,从而出现「有害性」或「幻觉」的问题。为此,一些让模型脱离昂贵标注数据,自我进行迭代的方法被提出,比如:[

太阳当空照,花儿对我笑,微风轻轻拂,心情无限好。 7263

大语言模型三根主干:预训练、微调与RLHF全解析

大语言模型(LLM)并非黑箱工具,其能力根基源于三大核心技术环节:预训练构建通用语义理解,微调实现领域任务适配,人类反馈强化学习(RLHF)赋予价值对齐与交互可信度。预训练通过自监督学习从海量文本中提炼世界关系图谱,决定模型的认知广度;微调则以监督数据加载业务逻辑,完成从‘知识库’到‘办事员’的身份转换;RLHF借助多维人类反馈信号,校准模型输出在专业性、可操作性与共情力之间的动态平衡。这三者构成不可割裂的协同闭环——缺失任一环节,模型即面临知识失焦、指令失灵或信任崩塌。本文聚焦非技术视角,揭示大模型落地背

weixin_30732487的博客 481

深度学习大模型学习100tips

通过深入了解这些细节,并在实际项目中应用相关的知识,将能够更好地理解和利用大模型的潜力,不仅在学术研究中,也在工程实践中。通过不断探索新方法、参与项目和保持热情,并将其应用于各种领域,从自然语言处理到计算机视觉和自动驾驶。通过不断学习、实践和探索,可以不断提升自己在深度学习领域的技能和洞察力,同时也能为社会和行业带来创新和改进。从小规模的项目和模型开始,逐渐迭代和扩展到更大的模型,逐步积累经验,最终能够处理大模型和复杂任务。分享您的研究成果和代码,以获得反馈和建立声誉。

xw555666的博客 2万+

大模型全流程实战:从预训练、SFT、RLHF到端侧部署的完整指南

大语言模型(LLM)作为人工智能领域的核心技术,其构建与部署是一个复杂的系统工程。其核心原理是通过海量无标注文本的预训练,让模型学习语言的统计规律和世界知识,形成强大的语义理解基座。为了使其行为可控且有用,需通过监督微调(SFT)教会模型遵循人类指令,再借助基于人类反馈的强化学习(RLHF)将模型输出与人类偏好对齐,提升回答的安全性、有用性和无害性。这一系列技术的最终价值在于将强大的模型能力落地到实际应用中。在资源受限的移动端场景,模型压缩技术(如量化与知识蒸馏)至关重要,它们能大幅减少模型体积和计算需求,

weixin_34406086的博客 487

PostgreSQL向量数据插件--pgvector安装(附PostgreSQL安装)

本文为本人在安装pgvector中踩过的坑,已找到解决方法,现向大家分享。

m0_62627802的博客 2万+

大模型训练全指南:预训练、指令微调、奖励模型、强化学习从零开始

本文详细梳理了大语言模型(LLM)的全流程训练方法,涵盖预训练、Tokenizer训练、指令微调、奖励模型和强化学习(RLHF)等核心环节。首先探讨预训练阶段的数据处理、模型选择和评测方法,强调中文适配与领域知识增强的重要性。其次介绍指令微调的自生成数据策略和开源数据集整理,并分析模型评测指标。最后解析奖励模型的训练数据需求、模型规模限制,以及强化学习中的PPO、DPO等技术,探讨训练稳定性问题。文末附赠AI大模型学习资料包,助力开发者高效掌握相关技术。

2401_84204413的博客 2186

【Qualcomm高通音频】音效调试_录音文件播放有杂音,如何定位原因?

一、录音播放数据处理过程介绍 (1)TX方向 麦克风(硅麦克风或者主机体麦克风)采集模拟音频信号,经过内部CODEC芯片中的adc转换为数字信号,在经过高通音频DSP处理音效后编码为wav/aac/amr/mp3等格式文件。 (2)RX方向 音频文件经过解码、重采样还原为pcm数据,经过DSP处理音效后送到内部CODEC,然后经过DAC转换为模拟信号,送到喇叭。 二、分析步骤 1...

crow_ch的博客 5971

大语言模型从零开始训练全面指南:预训练、Tokenizer训练

同时课程详细介绍了。

2401_85116933的博客 839

编程小白的自学笔记四(正则表达式模块search函数)

本文仅仅简单介绍了search的使用,供小白学习探讨。

m0_49914128的博客 2322

AI Agent评估:指标、策略与最佳实践

AI智能体正逐渐融入到各个领域,从日常的对话助手到复杂的工作流程自动化,其应用范围不断拓展。然而,确保这些智能体能够可靠、高效地完成任务至关重要,这就使得AI智能体评估成为了人工智能发展过程中不可或缺的一环。本文将深入探讨AI智能体评估的指标、策略以及最佳实践,为读者全面解读这一关键领域。

llm_way的博客 3498

从零开始构建大语言模型:LLM训练全流程技术解析

本文深度解析大语言模型(LLM)的完整构建路径,从核心能力涌现机制到三阶段训练范式(Pretrain-SFT-RLHF),详解分布式训练框架、显存优化策略及Tokenizer设计原理。适合具备深度学习基础、希望系统掌握LLM工程实践的开发者阅读。

模界 | AI工程化实践者 906

阿里云搭建vps服务器的过程

最近突发奇想想要搭建一个阿里云的的vps服务器,下面是搭建的过程: 首先,登录阿里云网站: 搜索,esc控制台: 点击创建实例: 选择地区: 选择实例规格: 选择镜像: 将存储规格改成100G(40G可能不够用) 点击下一步: 这里面不需要更改,点击下一步 设置连接密码即可 创建成功后点击启动 点击远程连接,然后立即登录,在弹出的框里面输入之前设置的密码即可 登录成功:

zhanchulan的博客 3373

从零复现ChatGPT技术栈:预训练、指令微调与RLHF全流程实践

大语言模型(LLM)的核心在于通过海量数据学习通用语言表示,其技术栈通常遵循预训练、指令微调与基于人类反馈的强化学习(RLHF)的递进路径。预训练赋予模型基础语言能力,指令微调使其学会遵循人类指令,而RLHF则进一步将模型输出与人类偏好对齐,这是提升对话质量的关键。在工程实践中,数据质量、模型架构与训练策略共同决定了最终效果。本文以开源项目Zero-Chatgpt为例,详细拆解了如何利用LLaMA架构、DeepSpeed框架,在有限算力下完整实践这一技术链路,并深入探讨了指令微调数据构建与RLHF奖励模型训

weixin_30482181的博客 603

Wi-Fi物理帧间隔概念简介

物理帧间隔概念简介。

1042484520@qq.com(邮箱) 1778

【01】总目录——软件设计师50讲通关地图|从零基础到工程师职称

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏的01篇总目录,系统梳理了50篇博文的完整架构与核心逻辑。专栏覆盖软考软件设计师(中级)全部考点,分为导学规划、基础知识、设计模式、下午题专项、算法实战、冲刺模拟、收官进阶七大模块,既兼顾上午题75道单选题的理论攻坚,也聚焦下午题案例分析的解题能力提升。每篇博文均包含考点精讲、真题解析、实战技巧与速记方法,配套可运行代码、解题模板及备考资源。无论你是零基础转行、在校学生还是在职程序员,都能通过这份学习地图明确进度、精准定位薄弱环节,高效搭建知识体系

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1280

26备战秋招day16——大模型

这篇博客详细介绍了大规模语言模型(LLM)的训练流程,包括预训练、指令微调、奖励模型(RM)和强化学习(RLHF)。预训练阶段通过大量文本数据学习语言结构,指令微调使模型能根据具体任务生成响应。奖励模型评估生成质量,而强化学习进一步优化模型生成策略。各个阶段结合起来,逐步提升模型的任务执行能力,使其能够生成高质量的、符合人类期望的输出。

weixin_43784706的博客 1238

逻辑判断1-逻辑基础知识

判断推理学习笔记

小y的学习笔记 2132

大模型训练全流程解析:从GPT到Llama的实战指南

Transformer架构作为现代大语言模型(LLM)的核心基础,通过自注意力机制实现了对长距离依赖的高效建模。其技术价值在于将预训练与微调范式标准化,使得模型能够通过海量无标注数据学习通用表征,再通过监督学习适应具体任务。在工程实践中,数据清洗、分词器训练和分布式训练等技术环节直接影响最终模型性能。以GPT和Llama为代表的两种技术路线,分别体现了效果优先和效率优先的设计哲学,适用于企业级定制和开源社区等不同应用场景。掌握大模型训练全流程对故障排查、成本优化和效果调优具有关键意义,特别是在当前模型微调已

weixin_34258838的博客 345

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LLM - Qwen-72B LoRA 训练与推理实战

LLM Qwen-72B 简介与 LoRA 微调、推理。

BITDDD小栈 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

大语言模型全流程实战:从预训练到手机部署的完整指南

大语言模型(LLM)作为人工智能领域的核心技术,其构建与部署涉及一系列复杂且相互关联的工程环节。其核心原理是通过海量数据预训练构建基础语言能力,再通过监督微调(SFT)和基于人类反馈的强化学习(RLHF)等技术,使模型与人类指令和价值观对齐。这一过程的技术价值在于,能将通用的“知识库”转化为可安全、高效执行特定任务的智能体。在应用场景上,为了在资源受限的边缘设备(如手机)上运行,量化与模型蒸馏成为关键步骤,它们能显著压缩模型体积并提升推理速度。本文正是围绕如何系统性地完成从模型训练、对齐到轻量化部署的全流程

weixin_34122810的博客 664

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【值得收藏】大模型技术详解:从聊天原理到训练进阶之路

图片来源输入文本tokens,token向量化,自注意、多头注意,前馈神经网络,循环自注意、多头注意,前馈神经网络,输出文本token,自回归解码,追加到输入tokens,循环上述过程。展开一些就是下面的过程:再展开可以看大模型可视化。

python12345_的博客 1255
上一篇: 一位美国的PM分享:AI产品经理的10大技能
下一篇: 值得细读的8个视觉大模型生成式预训练方法
AI程序猿人
博客等级 码龄3年 6517粉丝 561原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值