从零开始实现大语言模型(一):概述

1. 前言

大家好,我是何睿智。我现在在做大语言模型相关工作,我用业余时间写一个专栏,给大家讲讲如何从零开始实现大语言模型。

从零开始实现大语言模型是了解其原理及领域大语言模型实现路径的最好方法,没有之一。已有研究证明,为特定任务定制或使用领域数据训练的大语言模型能在领域相关的评价指标上超过ChatGPT这样的通用大语言模型。

本专栏将从零开始讲解大语言模型理论原理step-by-step,提供一整套工业级文本数据处理,大语言模型构建、预训练、监督微调及指令微调,并行计算与分布式训练代码,并且从零开始解释实现代码line-by-line。

2. 大语言模型的模型结构

2017年,文章Attention is all you need提出了一种用于机器翻译的sequence-to-sequence架构模型Transformer。Transformer包含一个编码器(encoder)和一个解码器(decoder),编码器提取输入文本中的上下文信息,将其转变成多个向量,并传递给解码器。解码器接收编码器生成的向量,生成输出序列。

2018年,文章BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding使用 [MASK] 单词预测任务和句子前后顺序预测任务预训练Transformer模型的编码器,预训练后的模型被称为BERT(Bidirectional Encoder Representations from Transformers)。BERT模型的编码器架构及训练策略,使其非常擅长情感预测、文档分类等文本分类任务。

句子前后顺序预测任务,最初是预测两句话是否在原始预训练语料中相邻,后续改进为原始预训练语料中的两个相邻句子是否被交换顺序。

同年,OpenAI的文章Improving Language Understanding by Generative Pre-Training通过生成式预训练任务(根据一段话的前文预测后文)训练Transformer模型的解码器,预训练后的模型被称为GPT(Generative Pretrained Transformers)。GPT模型的解码器架构及训练策略,使其非常擅长机器翻译、文本摘要、编写计算机代码等文本生成任务。

图一

Transformer、BERT及上述GPT模型网络结构核心是自注意力机制(self-attention)。自注意力机制可以让模型判断输入文本序列中不同token之间的相关性,使模型能够捕获输入文本数据中长距离依赖关系及上下文关系,因而比传统基于RNN等结构的模型具备更强的自然语言理解能力,生成的内容更加连贯且与上下文相关性更强。

token是指对文本分割处理后得到的最小单位,也是模型处理文本时的基本单元。训练数据处理时常提到的tokenization,即把自然语言文本处理成连续的token。Token可以是一个单词,一个字符,一个词组等等,取决于对训练数据做tokenization时采用的方法。

相比较于上面OpenAI的文章介绍的GPT-1模型,GPT-3模型结构没有做任何调整。GPT-3可以视为GPT-1模型的拓展,其模型层数更多,Embedding向量维度更高,参数量更大,并且使用了更大的预训练数据集。ChatGPT是通过OpenAI的InstructGPT论文中的方法在一个大的指令数据集(instruction dataset)上微调GPT-3而产生的。Meta的LLaMA等绝大部分大语言模型结构与GPT基本相同或仅仅做了非常微小的修改。

与Transformer模型相比,大语言模型GPT的结构非常简单,本质上它只是Transformer模型的解码器。但是GPT-3比原始Transformer模型解码器要大的多,原始Transformer模型解码器仅包含6个Transformer Block,但是GPT-3包含96个Transformer Block,共1750亿参数。GPT生成文本时每次仅预测下一个token,因此它也被视为一种自回归模型(autoregressive model)。

图二

尽管GPT只相当于Transformer模型的解码器,而不是像Transformer那样明确被用于解决机器翻译任务的sequence-to-sequence模型,且训练模型的下一个token预测任务也不是专门针对机器翻译的任务,但是它也能够执行机器翻译任务,且大语言模型机器翻译效果比一般机器翻译模型都相对好。

大语言模型这种能够执行没有被明确训练的能力被称为“涌现(emerging property)”。涌现是一种没有使用相同任务明确训练,而是模型在学习了大量各种各样语言的语料之后自然而然出现的能力。大语言模型中的这种涌现现象证明了其具备非常强大的能力,部分专家学者认为其具备一定的通用人工智能雏形,截止目前大家已经发现并认可了大语言模型的广阔应用前景。

3. 大语言模型的训练方法

如下图所示,大语言模型的训练方法通常包含预训练(pretraining)和微调(finetuning)。

预训练是指使用大量无标签的、多样化的文本数据(raw text),通过下一个token预测任务(next token prediction task)训练模型,使模型能够了解自然语言文本中的语法及知识。预训练后的模型被称为基础模型(base model or foundational model),如GPT-3(ChatGPT对应的基础模型)。基础模型一般具有比较强的文本补全(text completion)及小样本学习(few-shot learning)能力。

文本补全是指模型能够根据用户输入的上文,完成相应的下文。小样本学习是指不用大量训练数据训练或微调模型,而是提供几个具体任务的示例,模型也能够输出比较不错的结果。

可以使用针对特定任务或具体领域的小数据集微调模型参数,使基础模型具备如ChatGPT这样的对话能力。最流行的两类微调大语言模型的方法为指令微调(instruction-finetuning)和监督微调(finetuning for classification tasks)。指令微调是指使用如下所示的带标签的(指令-答案)数据集继续训练基础模型,监督微调是指使用(文本-类别标签)这样的带标签数据集继续训练基础模型。

{
    "instruction": "请把下面的中文翻译成英文:\n我爱你。",
    "answer": "I love you."
}

图三

“raw"的意思为"原始的”,是指用于预训练模型的数据不包含任何使用监督学习方法训练传统机器学习模型或深度学习模型时用到的标签信息。预训练大语言模型的方法被称为自监督学习(self-supervised learning),预训练模型的标签数据使用一定的规则从输入文本中自动生成。

使用raw text训练模型并不意味着不对用于预训练的文本数据做任何处理。如在预训练之前,通常会使用一系列文本预处理方法对文本数据进行过滤。已有研究表明,预训练大语言模型的文本质量越高,则模型能力越强。

4. 大语言模型的训练数据

预训练GPT-3的数据来自5个不同的数据集,共包含3000亿tokens。其中CommonCrawl (filtered)是采用一定规则从CommonCrawl数据集过滤得到的一个质量相对高的子集,WebText2是Reddit网站上获得3个及以上点赞的帖子中的外部链接所包含的网页文本(外部链接指向其他网页,WebText2收集了这些链接指向网页的文本内容),Books1可能来自古腾堡计划(Project Gutenberg,古腾堡计划是一个数字化图书馆,致力于向公众提供免费的电子书),Books2可能来自Libgen(Libgen是一个知名的免费图书共享平台,用户可以通过该平台获取各种电子书、学术论文和期刊等资源),Wikipedia数据集由英文维基百科组成。

数据集名称描述token数量在训练数据集中的比例
CommonCrawl (filtered)Web crawl data410 billion60%
WebText2Web crawl data19 billion22%
Books1Internet-based book corpus12 billion8%
Books2Internet-based book corpus55 billion8%
WikipediaHigh-quality text3 billion3%

GPT-3之后的大语言模型进一步拓展了训练模型的数据集,如Meta的LLaMA还使用了Arxiv网站中的论文数据集(92GB)及StackExchange网站中与代码相关的问答数据集(78GB)。国内的大语言模型也针对性地增加了训练集中的中文训练数据占比。

GPT-3论文作者没有公开他们用到的训练数据集,但是有个类似的开源数据集The Pile,该数据集的信息可以点击链接查看详情:https://pile.eleuther.ai/。

训练GPT-3时并没有使用上表提到的5个数据集中的全部数据,而是从每个数据集中抽取了一部分数据,共同组成了训练模型的包含3000亿tokens的训练数据集。抽取数据的原则是:质量越高的数据集采样比例越高,质量越低的数据集采样比例越低。如CommonCrawl数据集共包含4100亿tokens,但是只从中抽取了1800亿tokens,WebText2虽然只包含190亿tokens,但是从中共抽取了660亿tokens,相当于将WebText2数据集重复了3.47遍。

5. 大语言模型的实现流程

从零开始实现大语言的流程共三阶段:构建大语言模型、预训练大语言模型、微调大语言模型。

图四

大语言模型构建部分将详细介绍文本数据处理方法,构建训练大语言模型的DatasetDataLoader;从零开始一步步解释并实现简单自注意力机制(simplified self-attention)、缩放点积注意力机制(scaled dot-product attention)、因果注意力机制(causal attention)、多头注意力机制(multi-head attention);并最终构建出OpenAI的GPT系列大语言模型GPTModel

预训练部分将介绍并行计算与分布式机器学习方法原理,实现使用无标签文本数据训练大语言模型的方法,以及介绍大语言模型效果评估的基本方法。使用GPT-3同量级数据集预训练大语言模型的计算代价非常大,如果换算成相应云计算资源价值,预训练GPT-3大约需耗费460万美元。因此,该部分同时会介绍使用构建好的大语言模型加载开源大语言模型(如GPT-2)权重的方法。

虽然训练GPT-3的计算资源换算成相应云计算资源价值约460万美元,但如果已经具备一个足够大的GPU计算集群,训练GPT-3消耗的电费远远不需要460万美元。

第三阶段分别使用监督微调及指令微调方法,微调基础模型参数,使大语言模型具备文本分类及回答问题能力。

6. 结束语

从零开始实现大语言模型系列专栏旨在详细解释大语言模型的理论原理,并提供一套工业级实践代码。本文从一个高的视角概述了大语言模型的模型结构、训练方法及训练数据,并且介绍了从零开始实现大语言模型的流程。

大语言模型具备强大的自然语言理解及生成能力,短短一年时间,自然语言处理领域已经翻天覆地。实践证明,在大量无标签的自然语言文本上使用简单的生成式预训练任务能够产生强大到不可思议的模型,在大量无标签视频数据上使用生成式预训练任务是否也能够产生非常惊艳的模型呢?

2024年2月16日,OpenAI发布了首个视频生成模型Sora,能生成长达1分钟流畅且连贯的高清视频。看来,大模型要一统天下了!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS中将测绘数据投影坐标(平面坐标)转地理坐标(球面经纬度坐标)

目录 前言1.测绘数据预览1.1 确定带号1.2 为什么是对Y轴分带,而不是对X轴分带? 2 测绘数据转shp2.1 添加数据2.2 显示XY数据2.3 添加经纬度字段2.4 计算经纬度 3.shp数据重投影4.总结 前言 最近在刚好在做一个小功能,将测绘数据转为经纬度坐标…

一些硬件知识(十二)

X电容是接在火线和零线之间,Y电容是接在火零线和地之间。X电容滤除差模干扰,Y电容滤除共模干扰: 高频干扰信号经过X电容后幅度没有变化,相位相差180度: DW01电池管理芯片: M1、M2:这两个为N沟道…

BMA530 运动传感器

型号简介 BMA530是博世(bosch-sensortec)的一款运动传感器。时尚简约的可穿戴设备为功能强大的组件提供了很小的空间。具有先进功能集的下一代加速度计是世界上最小的加速度传感器(1.2 x 0.8 x 0.55 mm)。它专为紧凑型设备而设计&…

本地项目推送到gitlab仓库的保姆级教程

目录 1、安装git (1)Windows系统 (2)Linux系统 2、gitlab创建空白项目 3、创建密钥 4、将密钥添加到gitlab中 5、远程配置 (1)配置全局的用户和邮箱 (2)本地文件夹初始化 …

【代码随想录】【算法训练营】【第52天】 [647]回文子串 [516]最长回文子序列

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 52,周五,开始补作业了~ 题目详情 [647] 回文子串 题目描述 647 回文子串 解题思路 前提:寻找回文子串,子串意味着元素连续 思路:…

Python-Tkinter+Logging+Sqlserver项目结合

参考文章: https://www.jb51.net/article/283745.htm 目录: common(文件夹) – base.py – config_reader.py – dosqlserver.py – log.py txt(空文件夹,后面会自动生成txt文件在该文件夹下面) 1.txt 2.txt env.…

非平稳信号的时频表示-基于本征模态函数(MATLAB)

时频分析思想萌芽于匈牙利物理学家 Gabor 在 1946 年所提出的 Gabor 展开理论,随后以此为基础发展出著名的线性时频变换方法—短时傅里叶变换。短时傅里叶变换假设分析信号在有限时长内具有平稳特性,它首先将时间与频率均为有限支撑的窗函数与分析信号进…

973. 最接近原点的 K 个点-k数组维护+二分查找

973. 最接近原点的 K 个点-k数组维护二分查找 给定一个数组 points ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点,并且是一个整数 k ,返回离原点 (0,0) 最近的 k 个点。 这里,平面上两点之间的距离是 欧几里德距离&#…

Linux修炼之路之进程概念,fork函数,进程状态

目录 一:进程概念 二:Linux中的进程概念 三:用getpid(),getppid()获取该进程的PID,PPID 四:用fork()来创建子进程 五:操作系统学科的进程状态 六:Linux中的进程状态 接下来的日子会顺顺利利&#xf…

【MySQL备份】Percona XtraBackup加密备份实战篇

目录 1.前言 2.准备工作 2.1.环境信息 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 2.4.生成加密密钥 2.5.配置加密密钥文件 3.加密备份 4.优化加密过程 5.解密加密备份 6.准备加密备份 7.恢复加密备份 7.1.使用rsync进行恢复 7.2.使用xtrabackup命令恢…

crewAI实践过程中,memory规避openai的使用方法以及(windows下xinferece框架使用踩过的坑)

问题: 在使用crewAI开发项目的过程中,memory开启后报错:openai key is fake 经代码核查,其默认使用了openai的embedding模型。 解决方法 经查阅资料,可以参考其本地部署llm的方法。 本地部署模型可以使用xinference…

人工智能导论速成笔记

文章目录 前言考试题型第一章、人工智能导引 (10分 )课后习题第二章、Python基础 (10分 )*文件读写NumPy的使用Python绘图基础第三章、机器学习初步(15分 )逻辑回归分类(Logistic Regression)*,3.5线性回归预测(Linear Regression)*,3.6 、3.7、 3.8聚类 3.9第四章、自然语言…

【信息系统项目管理师】常见图表

作文里面的画图题用语言描述画图过程 合同 采购综合评分标准 责任分配矩阵 成本预算表 成本估算 成本管理计划 活动清单 活动属性 变更日志 问题日志 项目章程 自己再添加更多内容 甘特图 甘特图包含以下三个含义: 1、以图形或表格的形式显示活动; 2、…

uniapp封装虚拟列表滚动组件

uniapp封装虚拟列表滚动组件 这里用到一个列表&#xff0c;然后数据可能有很多很多…&#xff0c;一次性全部渲染到dom上会卡顿&#xff0c;很废性能&#xff0c;于是用了这个虚拟列表就变丝滑很多很多。 组件mosoweInventedList 代码&#xff1a; <!-- 虚拟滚动列表组件&a…

常见VPS主机术语有哪些?VPS术语解析

常见VPS主机术语有哪些&#xff1f;本期为大家解析一下我们常见到的听到的VPS专业术语&#xff0c;帮助大家更轻松的了解VPS主机相关知识。 常见VPS主机术语 Apache – 世界上最流行的 Web 服务器软件。 CentOS – 旨在提供基于 Red Hat Enterprise Linux 的企业级操作系统的…

常微分方程算法之编程示例七-两点混合边值问题(打靶法)

目录 一、研究问题 二、C++代码 三、计算结果 一、研究问题 本节我们采用打靶法求解两点混合边值问题,打靶法的原理及推导思路请参考: 常微分方程算法之“两点边值问题”求解-CSDN博客https://blog.csdn.net/L_peanut/article/details/137449287 研究问题为

学习笔记(linux高级编程)9

void pthread_cleanup_push(void (*routine)(void *)&#xff0c; void *arg); 功能&#xff1a;注册一个线程清理函数 参数&#xff0c;routine&#xff0c;线程清理函数的入口 arg&#xff0c;清理函数的参数。 返回值&#xff0c;无 void pthread_cleanup_pop(int execute)…

Node.js学习(一)

Node.js安装与入门案例&#xff1a; 需求&#xff1a;点击按钮&#xff0c;请求本地目录指定文件的内容&#xff0c;并显示在页面上 刚入门肯定想着直接写相对路径请求指定路径数据就行了&#xff0c;可是会发现不行。 网页运行在浏览器端&#xff0c;通常后续要发布&#xf…

大模型应用开发实战基础

大模型应用开发实战基础 1. 背景 大模型如日中天&#xff0c;各行各业都受它影响&#xff0c;但是作为程序员&#xff0c;除了让它翻译代码不知道用它干什么&#xff0c;就像是拿着锤子的木匠&#xff0c;找不到钉子在哪。一边听着别人说2024是AI元年&#xff0c;一边又不知所…

数组-二分查找

二分查找 leetcode704 /*** param {number[]} nums* param {number} target* return {number}*/ var search function(nums, target) {let left 0, right nums.length - 1;while (left < right) {const mid Math.floor((right - left) / 2) left;const num nums[mid]…