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

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.mzph.cn/web/38444.shtml

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

相关文章

Windows10录屏,教你3个方法,简单快速录屏

“我的电脑系统是Windows10的系统,今晚要进行线上开会,但我实在有事没办法参加会议,想把会议的内容录制下来方便我后续观看。但却找不到电脑录屏功能在哪里打开?求助一下,谁能帮帮我?” 在数字化时代&…

mysql 命令 —— 查看表信息(show table status)

查询表信息,如整个表的数据量大小、表的索引占用空间大小等 1、查询某个库下面的所有表信息: SHOW TABLE STATUS FROM your_database_name;2、查询指定的表信息: SHOW TABLE STATUS LIKE your_table_name;如:Data_length 显示表…

闲聊 .NET Standard

前言 有时候,我们从 Nuget 下载第三方包时,会看到这些包的依赖除了要求 .NET FrameWork、.NET Core 等的版本之外,还会要求 .NET Standard 的版本,比如这样: 这个神秘的 .NET Standard 是什么呢? .NET St…

从零开始搭建spring boot多模块项目

一、搭建父级模块 1、打开idea,选择file–new–project 2、选择Spring Initializr,选择相关java版本,点击“Next” 3、填写父级模块信息 选择/填写group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。点击“…

工业触摸一体机优化MES应用开发流程

工业触摸一体机在现代工业生产中扮演着至关重要的角色,它集成了智能触摸屏和工业计算机的功能,广泛应用于各种生产场景中。而制造执行系统(MES)作为工业生产管理的重要工具,对于提高生产效率、降低成本、优化资源利用具…

力扣hot100-普通数组

文章目录 题目:最大子数组和方法1 动态规划方法2 题目:合并区间题解 题目:最大子数组和 原题链接:最大子数组和 方法1 动态规划 public class T53 {//动态规划public static int maxSubArray(int[] nums) {if (nums.length 0…

C++基础知识-编译相关

记录C语言相关的基础知识 1 C源码到可执行文件的四个阶段 预处理(.i)、编译(.s)、汇编(.obj)、链接。 1.1 预处理 预处理阶段,主要完成宏替换、文件展开、注释删除、条件编译展开、添加行号和文件名标识,输出.i/.ii预处理文件。 宏替换,…

【UML用户指南】-26-对高级行为建模-状态图

目录 1、概念 2、组成结构 3、一般用法 4、常用建模技术 4.1、对反应型对象建模 一个状态图显示了一个状态机。在为对象的生命期建模中 活动图展示的是跨过不同的对象从活动到活动的控制流 状态图展示的是单个对象内从状态到状态的控制流。 在UML中,用状态图…

tcpdump命令详解及使用实例

1、抓所有网卡数据包,保存到指定路径 tcpdump -i any -w /oemdata/123.pcap&一、tcpdump简介 tcpdump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来去掉无用的信…

【Python】已解决:SyntaxError: positional argument follows keyword argument

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:SyntaxError: positional argument follows keyword argument 一、分析问题背景 在Python编程中,当我们在调用函数时混合使用位置参数(p…

RabbitMQ进阶篇

文章目录 发送者的可靠性生产者重试机制实现生产者确认 MQ的可靠性数据持久化交换机持久化队列持久化消息持久化 Lazy Queue(可配置~)控制台配置Lazy模式代码配置Lazy模式更新已有队列为lazy模式 消费者的可靠性消费者确认机制失败重试机制失败处理策略 业务幂等性唯一消息ID业…

西部智慧健身小程序+华为运动健康服务

1、 应用介绍 西部智慧健身小程序为用户提供一站式全流程科学健身综合服务。用户通过登录微信小程序,可享用健康筛查、运动风险评估、体质检测评估、运动处方推送、个人运动数据监控与评估等公益服务。 2、 体验介绍西部智慧健身小程序华为运动健康服务核心体验如…

idea xml ctrl+/ 注释格式不对齐

处理前 处理后 解决办法 取消这两个勾选

核方法总结(三)———核主成分(kernel PCA)学习笔记

一、核主成分 1.1 和PCA的区别 PCA (主成分分析)对应一个线性高斯模型(参考书的第二章),其基本假设是数据由一个符合正态分布的隐变量通过一个线性映射得到,因此可很好描述符合高斯分布的数据。然而在很多实…

ViewBinding的使用(因为kotlin-android-extensions插件的淘汰)

书籍: 《第一行代码 Android》第三版 开发环境: Android Studio Jellyfish | 2023.3.1 问题: 3.2.4在Activity中使用Toast章节中使用到了kotlin-android-extensions插件,但是该插件已经淘汰,根据网上了解,目前使用了新的技术VewBinding替…

UE4_材质_材质节点_DepthFade

一、DepthFade参数 DepthFade(深度消退)表达式用来隐藏半透明对象与不透明对象相交时出现的不美观接缝。 项目说明属性消退距离(Fade Distance)这是应该发生消退的全局空间距离。未连接 FadeDistance(FadeDistance&a…

光照老化试验箱:材料耐久性的“时间加速器”

光照老化试验箱:材料耐久性的“时间加速器”概述 光照老化试验箱是一种模拟自然光照条件下材料老化过程的设备,广泛应用于材料科学领域的耐久性能评估。通过模拟日光中的紫外线、热辐射等环境因素,加速材料老化过程,以此来验证材…

redhawk:tech file与lefdef layer name不匹配问题

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 一些工艺厂商给的redhawk tech file是加密的,读完tech file再读lef/def会报错,根本不知道问题在哪,他们一般会搭配给一个layer map&#xff…

分解+降维+预测!多重创新!直接写核心!EMD-KPCA-Transformer多变量时间序列光伏功率预测

分解降维预测!多重创新!直接写核心!EMD-KPCA-Transformer多变量时间序列光伏功率预测 目录 分解降维预测!多重创新!直接写核心!EMD-KPCA-Transformer多变量时间序列光伏功率预测效果一览基本介绍程序设计参…

【简单讲解神经网络训练中batch的作用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…