高效又稳定的ChatGPT大模型训练技巧总结,让训练事半功倍!

news2024/10/1 17:29:31

100e11be9949c1050e4056bc0cf40688.png

文|python

前言

近期,ChatGPT成为了全网热议的话题。ChatGPT是一种基于大规模语言模型技术(LLM, large language model)实现的人机对话工具。现在主流的大规模语言模型都采用Transformer网络,通过极大规模的数据进行自监督训练。但是,如何构建自监督训练数据?在基础的Transformer结构上,大家又做了哪些创新呢?为了保证训练过程高效且稳定,又有哪些黑科技呢?今天给大家介绍一篇来自人民大学的综述论文,为大家解密这些大模型的训练技巧。

论文地址:
https://arxiv.org/pdf/2303.18223.pdf

训练数据的收集与处理

大规模语言模型对训练数据的规模与质量都有更高的要求。那现在的大模型都用了什么语料?这些语料都发挥着怎样的作用?如何对语料做清洗和预处理?大模型还有什么特殊的细节需要我们去处理?

数据来源

数据来源上,大规模语言模型的训练数据可以一般性语料与特殊语料。一般性语料,如网页、书籍、对话文本,占比较大,可以在各种话题上为模型提供语言知识;而特殊语料,如多语言数据、科技语料、代码等,可以为模型带来解决特定任务的能力。现有的大模型训练语料的成分比例如下图所示:

712311f797e63a7133d72ef9e4687762.png

一般性语料中,网页语料规模较大,但其中包含Wikipedia等高质量语料的同时,还包含垃圾邮件等低质量语料,一般需要过滤处理。问答语料,如Reddit等社交媒体平台,可以潜在地提高模型回答问题的能力。社交媒体通常涉及多人对话,对话语料可以根据回复关系整理成树状结构,从而每一条支路都是一段完整的对话内容。书籍语料是少有的书面语长文本,可以帮助模型学习严谨的语言学知识,建模长距离依赖,提高生成内容的连贯性。

特殊语料中,多语言语料可以提升模型在翻译,多语言摘要、问答等任务上的能力。科技语料通过获取arXiv论文、教科书、数学网络社区等内容,可以帮助模型理解特殊符号、术语和表达式,提高模型在科技任务与推理上的表现。代码语料主要来自Stack Exchange等问答社区以及GitHub上的开源项目,包含代码、注释和文档。最近研究表明,代码语料可以提升模型复杂推理的能力(chain-of-thought),因其具有的长距离依赖以及内在精密的逻辑。

目前一些开源的语料的获取地址,可以参考我们以前的推送:训练ChatGPT的必备资源:语料、模型和代码库完全指南。

清洗与预处理

f2b8ff4f3f2827ef3d836afe8c8ff425.png

得到语料之后,一般人们通过上图的流程来清洗、预处理语料,提升质量。

具体而言,在第一步的语料清洗中,可以利用Wikipedia等样本作为正例训练一个二分类器筛选高质量语料。不过最近的研究表明,这一筛选方式可能带来偏见。所以现在更推荐使用启发式规则来筛选,比如剔除非目标任务语言、丢弃低perplexity数据、删去标点/符号过多或过长过短的句子、删除具有某些特定词汇(如html标签、链接、脏话、敏感词)的句子。

第二步是去重。包含大量重复词汇或短语的句子可以删掉;重复率(词/n-grams共现)过高的段落可以删掉;删除训练集中可能与测试集相关度过高的内容。这样可以提高训练集质量,缓解语言模型生成内容重复的问题,避免测试集泄露带来的过拟合问题。

第三步是通过关键词等方式剔除用户隐私信息(姓名、地址、电话等)

最后,三步清洗完毕,就可以上分词、准备训练了。分词方面,并没有什么黑科技。要么直接使用GPT-2等现成的分词器,要么对训练语料构建基于SentencePiece、Byte Pair Encoding等算法的分词方式。

一些注意细节

大模型的特点,导致在处理预训练语料时,需要注意一些特殊的细节:

  • 需要调节不同来源的语料的混合比例,不能直接基于语料规模。均衡的语料比例有助于提高模型的泛化能力,特定类型的语料可以提升模型特定的能力。

  • 语料规模要与模型的参数规模相配合。经验表明,给定算力,语料的token数与模型的参数个数相当时,模型的表现相对更好。所以不要一味地追求大语料,控制规模、提高质量、训练充分,也很重要。

  • 语料质量很重要(再次强调)。实验表明,大模型训练时,低质量的语料不用都比用了好。过多的重复数据甚至会让训练过程失效(崩溃或陷入无意义的局部最优)。

模型结构与任务

主流的大规模语言模型都是基于Transformers结构。从下图中可以看出,绝大多数模型均基于Casual decoder结构,即仅使用解码器(单向注意力遮掩)处理输入和输出内容。小编猜测是因为GPT-3展现了Casual decoder很强的能力之后,结合上该结构上的scaling law等研究,人们已经丧失了调研其他结构的兴趣。

另外两种大语言模型的结构,Encoder-decoder结构和最初做机器翻译的模型类似,采用两个不共享参数上的组件分别处理输入和输出内容。而Prefix decoder 和 Casual decoder很像,但是在输入部分内不采用单向注意力遮掩,而允许双向注意力。有点像是共享参数的Encoder-decoder结构。

0f883dd49efffe5b200198f9480f3cb6.png

除了Transformer的结构选取。上表还展示一些模型设计细节。具体包括以下几点:

  • Layer Normalization(层归一化)是确保模型收敛,缓解训练崩溃问题的重要手段。具体而言,经典的Pre Norm在每个多头注意力层与前馈网络层前加层归一化。Pre RMS Norm在Pre Norm的基础上,去掉了归一化中的均值部分,即仅就标准差做尺度缩放,让优化过程更平滑,是现在的主流推荐方法。此外,在Embedding后加Norm,虽然会让优化更平滑,但却会明显降低模型表现,所以现在一般不再使用。

  • 激活函数方面,传统的ReLU一般是不够看的。现在认为,SwiGLU 和 GeGLU 可以带来更好的表现,但相对于GeLU等激活函数而言,会带来更多的参数。

  • 位置信息编码,传统的有习得的绝对位置编码(Learned)与针对相对距离的相对位置编码(Relative)。后者针对测试时的更长语料时具有更好的外推性。最近,RoPE使用较为广泛,特点在于使用类似于核函数、三角旋转的方式,给query和key向量带上绝对位置编码,从而使得其内积中带有表达相对位置信息的项。

除此之外,上表中还汇总了部分超参数信息,如#L层数、#H头数、隐层规模、MCL最大上下文长度。

相较模型结构细节,预训练任务上的设计就很朴实无华了。最常见的预训练任务就是自回归语言模型,让语言模型逐一地根据输入历史预测下一个词,广泛地被GPT-3等语言模型所采纳。而像T5 和 GLM-130B 引入了降噪自编码训练目标,让模型还原输入内容中被遮掩的语段。

优化设置与技巧

大规模语言模型为了使训练过程更加高效、平稳,在训练过程中还有一系列的“黑科技”。具体而言,这些技巧可以:1、提升模型最终表现;2、提升模型收敛速度;3、避免模型收敛到loss很高的局部最优,或者不收敛;4、避免训练过程崩溃。现有的大模型公开的优化设置与技巧如下表所示。

4ecead5726945a3417bf4a0d700daad4.png

batch-size一般设置较大,为了更好地利用大规模训练数据,让模型训练过程更加稳定。比如使用8196的batch-size(每个batch处理1.6M个token输入)。GPT-3使用动态调整Batch-size的方式,使其处理的Token数从32K逐渐增大到3.2M。

学习率 一般较小,且包含warm up设置,以确保训练平稳。比如在前0.1%~0.5%的训练步骤中,设置一个线性的学习率递增。峰值学习率一般在 以下,比如GPT-3的学习率是。之后,会采用cosine decay strategy,逐渐减小学习率,在收敛前将学习率再下降10%左右。

优化器一般采用Adam、AdamW、以及Adafactor。其中,Adafactor是Adam的一个节约显存的变体。

其它稳定训练过程的技巧包括梯度裁剪(gradient clipping),以1.0为阈值;weight decay(类似于L2正则)率为0.1。即使如此,大模型的训练过程依然经常崩溃。PaLM 和 OPT 提出,在发生崩溃时可以从之前的一个中间节点开始继续训练,并且跳过之前那段导致崩溃的训练数据。GLM 发现embedding层经常有异常梯度,需要适当调整。

数据并行(Data parallelism) 是最常用的一种多卡训练方式。将训练数据分配到多块显卡上,分别计算前向和反向传播之后,再汇总梯度,更新参数,同步模型。该方法可以解决单卡batch过小的问题。

流水线并行(Pipeline parallelism) 在一块显卡上只存储、计算一些相邻的层。为了缓解时序操作等待带来的低效问题,GPipe 和 PipeDream 等工具提出在流水线中集合多个batch的数据,并异步更新参数。该方法可以缓解单卡跑不动batch-size为1的情况。

张量并行(Tensor parallelism) 对大矩阵乘法运算:中的A矩阵做拆分,从而使该运算转化成两个较小的矩阵的乘法结果的拼接:,而两个较小的矩阵乘法可以放在两块显卡上进行。该方法被 Megatron-LM、Colossal-AI等工具实现,可以缓解单一大矩阵乘法显存占用过高的问题,同时也会带来一定的通讯成本。

混合精度训练 使用半精度浮点计算来代替训练过程的部分参数(特别是前向传播部分),从而起到降低显存提升速度的作用。A100等显卡对半精度浮点计算做了优化,从而使混合精度训练更加有效。最近也有提出用Brain Floating Point (BF16)取代传统的FP16,增加指数位,减少有效数字。不过,虽然混合精度计算提速明显,但经验表明还是会降低准确度与模型表现。

01db6aa770ab32dbc2cf8e2fa3bc6e47.png

ZeRO 是DeepSpeed提出进一步优化数据并行的一个方案,用于提高模型参数之外的显存空间并行性。上图的混合精度计算流程就非常明显,有大量参数之外的储存资源消耗。事实上,1.5B参数的半精度GPT-2储存空间只有3GB,却无法在32GB的显卡上训练,就是这个原因。ZeRO主要思想包括,将梯度、动量等更新相关的信息也分布式地储存在每块卡上,这样汇总更新时每块卡分别更新对应位置的参数再同步即可;在更新梯度后释放梯度相关的显存等。由于该方法比较复杂,我们这里就不详述了。PyTorch的DeepSpeed和FSDP工具均支持ZeRO。

在实际使用中,上述优化设置通常组合使用。比如BLOOM模型的384块A100采用了8路数据并行,4路张量并行和12路流水线并行,并采用了基于BF16的混合精度训练策略。DeepSpeed, Colossal-AI,Alpa 等开源工具支持并行相关的功能。

除此之外,为了减少试错成本,GPT-4还提出了predictable scaling,通过较小的神经网络模型来预测大模型设置的可能表现。PyTorch的FSDP还支持让CPU分担部分计算压力。

结束语

大规模语言模型的训练已经不仅仅是一个科学问题,同时也是一个复杂的工程问题。科学家和工程师们必须携手合作,才能有效推动大模型的发展。各种训练技巧有助于提高大模型的训练效率和稳定性。然而,相关的工程细节仅通过论文只能了解皮毛。真正深入掌握,还需要仔细阅读开源项目代码并尝试运行。

b7b5fad571e6378e21517b6b63ac6cf9.jpeg后台回复关键词【入群

加入卖萌屋NLP、CV、搜推广与求职讨论群

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day941.仓库版本管理 -系统重构实战

仓库&版本管理 Hi,我是阿昌,今天学习记录的是关于仓库&版本管理的内容。 当代码以及团队达到一定的规模以后,这会给项目仓库和版本的管理带来诸多问题。 一张常见问题的表格,不妨“对号入座”,看看项目有没…

【常见CSS扫盲雪碧图】从源码细看CSS雪碧图原理及实现,千字详解【附源码demo下载】

【写在前面】其实估计很多人都听过雪碧图,或者是CSS-Sprite,在很多门户网站就会经常有用到的,之所有引出雪碧图这个概念还得从前端加载多个图片时候页面闪了一下说起,这样给人的视觉效果体验很差,也就借此机会和大家说…

Linux查看串行端口

查看串口驱动 cat /proc/tty/driver/serial查看串口设备 dmesg | grep ttyS*[rootlocalhost driver]# cat /proc/tty/driver/serial serinfo:1.0 driver revision: 0: uart:16550A port:000003F8 irq:4 tx:0 rx:0 1: uart:16550A port:000002F8 irq:3 tx:0 rx:0 CTS|DSR|CD 2:…

攻防世界-inget(简单的SQL注入、万能密码)

目录 1、手工注入(万能密码原理) 2、sqlmap实现 3、常用参数 1、手工注入(万能密码原理) 打开链接,提示输入id并尝试绕过 尝试一下万能密码,使用逻辑语句使结果返回 构造payload /?id or 我们这里是…

Java虚拟机内存区域

Java虚拟机所管理的内存将会包括以下几个运行时数据区域 程序计数器 是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要通过更改这个计数器的值来改变下一条需要执行的字节码。 由于各个线…

DAY 35 sed文本编辑器

文本三剑客:都是按行读取后处理。 grep 过滤行内容 awk 过滤字段 sed 过滤行内容;修改行内容 sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流 sed编辑器可以根据命令来处理数据流中的…

Shell编程(二)

上一章: Shell编程_做测试的喵酱的博客-CSDN博客 七、ping shell脚本,是一个面向过程的编程语言,没有类和对象的概念。用的最多的就是函数。 查看当前服务,是否能ping通baidu ping www.baidu.com [rootecs-39233 dev]# ping ww…

眺望2023:房企“三大护法”如何助力穿越周期?

2022 年的地产行业尤为艰难,土地和商品房成交量明显下滑,许多房企的业绩都呈现收缩态势。 不过,今年以来房地产市场似乎出现企稳信号。国家统计局数据显示,今年1~2月全国商品房销售面积和销售额的下跌幅度明显收窄,住…

18-java单列集合

java单列集合1.集合体系结构1.1 单列集合1.2 双列集合2. 单列集合体系结构3.Collection集合顶层接口3.1 Collection的遍历方法3.1.1 迭代器遍历3.1.2 增强for遍历3.1.3 Lambda表达式4. List单列集合4.1 List4.1.1 List集合特点4.1.2 List集合的特有方法4.1.3 List集合遍历方法4…

计算机组成原理实验三-----系统总线和具有基本输入输出功能的总线接口实验

总线是计算机中连接各个功能部件的纽带,是计算机各部件之间进行信息传输的公共通路。 总线不只是一组简单的信号传输线,它还是一组协议。他有两大特征 分时: 同一总线在同一时刻,只能有一个部件占领总线发送信息,其他部件要发送信…

游戏基础—Android平台进程模块信息获取

记得学习编程时的第一个helloworld程序&#xff1a; #include<stdio.h> Int main(int argc, char **argv) { printf(“Hello World”); return 0; } 打印” Hello World”&#xff0c;使用的是printf函数。但是&#xff0c;我们并没有去实现printf函数的功能&#xff0…

javascrip语法

JavaScript 语法涉及到很多方面&#xff0c;以下是常见的详细语法&#xff1a; 1. 变量 变量用于存放值&#xff0c;关键字 var 可以定义变量。 // javascript var x 5; // 定义变量 x&#xff0c;并赋值为 52. 数据类型 JavaScript 中有多种数据类型&#xff0c;包括&…

iOS 紧急通知

一般通知 关于通知的各种配置和开发&#xff0c;可以参考推送通知教程&#xff1a;入门 – Kodeco&#xff0c;具有详细步骤。 紧急通知表现 紧急通知不受免打扰模式和静音模式约束。当紧急通知到达时&#xff0c;会有短暂提示音量和抖动&#xff08;约2s&#xff09;。未锁…

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

目录 前言 一、用户画像概述 1.用户画像 2.为何用聚类算法作用户画像 二、数据质量校验 1.数据背景 2.数据说明 三、数据预处理 1.数据空缺值检验 2.数据归一化 四、K-means聚类 step1:选取K值 手肘法 step2:计算初始化K点 step3:迭代计算重新划分 五.画像分析 …

【LeetCode:221. 最大正方形 | 暴力递归=>记忆化搜索=>动态规划 | 二维dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Flutter - 实现防抖和节流

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 什么是防抖和节流&#xff1f; 函数节流&#xff08;throttle&#xff09;与 函数防抖&#xff08;debounce&#xff09;都是为了限制函数的执行频次&#xff0c;以…

AgentGPT,免费易用的 Auto-GPT 平替

你问 ChatGPT 答&#xff0c;属于单线问答式交互。但如果你问Auto-GPT&#xff0c;他会分解成N个任务&#xff0c;并且在遇到任务无法完成后&#xff0c;会尝试其它的方式来完成任务&#xff0c;很像老板交待你一个任务&#xff0c;中间的过程他不过问&#xff0c;遇到问题你自…

性能测评:腾讯云轻量服务器4核8G12M带宽流量CPU主频型号

腾讯云轻量4核8G12M应用服务器带宽&#xff0c;12M公网带宽下载速度峰值可达1536KB/秒&#xff0c;折合1.5M/s&#xff0c;每月2000GB月流量&#xff0c;折合每天66GB&#xff0c;系统盘为180GB SSD盘&#xff0c;地域节点可选上海、广州或北京&#xff0c;4核8G服务器网来详细…

【LeetCode】917. 仅仅反转字母、387. 字符串中的第一个唯一字符

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 917. 仅仅反转字母 387. 字符串中的第一个唯一字符 917. 仅仅反转字母 917. 仅仅反转字母…

光栅和矢量图像处理SDK:Graphics Mill 11.7Crack

Graphics Mill 是适用于 .NET 和 ASP.NET 开发人员的最强大的成像工具集。它允许用户轻松地向 .NET 应用程序添加复杂的光栅和矢量图像处理功能。 光栅图形 加载和保存 JPEG、PNG PSD 和其他 8 种图像格式 调整大小、裁剪、自动修复、色度键和 30 多种其他图像处理 使用任何维度…