AI大模型探索之路-训练篇5:大语言模型预训练数据准备-词元化

news2024/12/23 8:10:48

系列文章目录🚩

AI大模型探索之路-训练篇1:大语言模型微调基础认知
AI大模型探索之路-训练篇2:大语言模型预训练基础认知
AI大模型探索之路-训练篇3:大语言模型全景解读
AI大模型探索之路-训练篇4:大语言模型训练数据集概览


文章目录

  • 系列文章目录🚩
  • 前言
  • 一、概述
  • 二、分词的粒度
  • 三、分词器的类型
  • 四、BPE/BBPE分词
  • 五、WordPiece分词
  • 六、Unigram 分词
  • 七、分词器的选择
  • 八、各大模型的分词效果
  • 九、SentencePiece分词器使用


前言

在自然语言处理领域,大语言模型预训练数据准备是一个重要的环节。其中,词元化(Tokenization)作为预训练前期的关键步骤,旨在将原始文本分割成模型可识别和建模的词元序列,为大语言模型提供输入数据。本文将对词元化技术进行详细介绍,包括分词的粒度、分词器的类型以及各大模型的分词效果等内容。

一、概述

分词(词元化):词元化(Tokenization)是数据预处理中的一个关键步骤,旨在将原始文本分割成模型可识别和建模的词元序列,作为大语言模型的输入数据;形成一个词汇表。
传统自然语言处理研究(如基于条件随机场的序列标注)主要使用基于词汇的分词方法,这种方法更符合人类的语言认知。然而,基于词汇的分词在某些语言(如中文分词)中可能对于相同的输入产生不同的分词结果,导致生成包含海量低频词的庞大词表,还可能存在未登录词(Out-of-vocabulary, OOV)等问题。因此,一些语言模型开始采用字符作为最小单位来分词。其中子词分词器(Subword Tokenizer)被广泛应用于基于 Transformer 的语言模型中,包括 BPE 分词、WordPiece 分词和 Unigram 分词三种常见方法。

二、分词的粒度

从分词的粒度区分,主要包括3种类型,Word 、Subword、Char
在这里插入图片描述

1)Word分词粒度以完整的单词为单位进行分词,能够很好地保留每个词的语义,适合上下文理解和语义分析。然而,它面临着长尾效应和稀有词问题,可能导致词汇表庞大并且出现OOV(Out-of-Vocabulary)问题。

OOV是“Out-Of-Vocabulary”的缩写,直译为“词汇表外的”,在自然语言处理中,表示的是那些在词汇表中没有的单词

2)Char分词粒度则是将文本拆分为字符级别,这样可以解决OOV问题,因为可以处理任何字符,但缺点是可能缺乏明确的语义信息,并且由于粒度过细,会增加后续处理的计算成本和时间。
3)Subword分词粒度介于Word和Char之间,旨在克服两者的缺点,同时保留语义信息并减少OOV问题的发生。Subword分词方法如BPE(Byte Pair Encoding)或WordPiece通过统计学方法切分单词为更小的有意义的单元,这使得它们在处理生僻词和缩写时更为有效。(目前使用比较广泛)

三、分词器的类型

针对Subword常用的分词器有3种:BPE 分词、WordPiece 分词和 Unigram 分词。
在这里插入图片描述

SentencePiece 是一个开源的分词器工具;是由谷歌开发的,旨在提供一种高效的方式来对文本进行分词,尤其适用于处理变长和不规则的文本数据。它通过训练特定领域的模型来代替预训练模型中的词表,从而更有效地处理词汇。常用的BPE、WordPiece、 Unigram分词器都支持。

四、BPE/BBPE分词

1)BPE:从字符级别开始,逐步合并最频繁连续出现的字符或字符组合,形成新的词汇单元。
2)BBPE:字节级别的 BPE(Byte-level BPE, B-BPE)是 BPE 算法的一种拓展。它将字节视为合并操作的基本符号,从而可以实现更细粒度的分割,且解决了未登录词问题。采用这种词元化方法的代表性语言模型包括 GPT-2 、BART 和 LLaMA 。
3)对于英文、拉美体系的语言来说使用BPE分词足以在可接受的词表大小下解决OOV的问题,但面对中文、日文等语言时,其稀有的字符可能会不必要的占用词汇表(词汇表要么巨大要么会OOV),因此考虑使用字节级别byte-level解决不同语言进行分词时OOV的问题。具体的,BBPE将一段文本的UTF-8编码(UTF-8保证任何语言都可以通用)中的一个字节256位不同的编码作为词表的初始化基础Subword。

例如,GPT-2 的词表大小为 50,257 ,包括 256 个字节的基本词元、一个特殊的文末词元以及通过 50,000 次合并学习到的词元。(相当于既有了BPE特性,又兼容了中文)
在这里插入图片描述

BBPE的优点:不会出现 OOV 的情况。不管是怎样的汉字,只要可以用字节表示,就都会存在于初始词表中。
BBPE的缺点:一个汉字由3个字节组成,一个汉字就会被切成多个token,但实际上这多个token没必要进行训练。

BPE词表构建整体流程如下:
在这里插入图片描述

五、WordPiece分词

1)WordPiece 分词和 BPE 分词的想法非常相似,都是通过迭代合并连续的词元,但是合并的选择标准略有不同WordPiece 分词算法并不选择最频繁的词对,而是使用下面的公式为每个词对计算分数
在这里插入图片描述

比如unable,BPE 只关心 token pair 的出现频率,即 freq_of_pair;WordPiece 还考虑了每个 token 的出现频率。即使 unable 出现频率很高,但如果 un 和 able 单个 token 的出现频率都很高,也不会合并它们。

2)WordPiece:就是将所有的「常用字」和「常用词」都存到词表中,当需要切词的时候就从词表里面查找即可。
WordPiece 的方式很有效,但当字词数目过于庞大时这个方式就有点难以实现了。对于一些多语言模型来讲,要想穷举所有语言中的常用词,这个量会非常大(穷举不全会造成 OOV)
在这里插入图片描述

六、Unigram 分词

Unigram分词器与BPE和WordPiece的不同在于它的构建过程。Unigram初始化时会创建一个非常大的词汇表,然后根据一定的标准逐步丢弃较不常用的词汇单元,直到满足限定的词汇表大小(比较适合处理生僻词)

七、分词器的选择

大语言模型通常使用 SentencePiece 代码库为预训练语料训练定制化的分词器(也可以自定义);
这一代码库支持字节级别的 BPE 、 Unigram 、WordPiece分词。为了训练出高效的分词器,通常主要关注以下几个因素。首先,分词器必须具备无损重构的特性,即其分词结果能够准确无误地还原为原始输入文本。其次,分词器应具有高压缩率,即在给定文本数据的情况下,经过分词处理后的词元数量应尽可能少,从而实现更为高效的文本编码和存储。具体来说,压缩比可以通过将原始文本的 UTF-8 字节数除以分词器生成的词元数(即每个词元的平均字节数)来计算:
在这里插入图片描述

例如,给定一段大小为 1MB(1,048,576 字节)的文本,如果它被分词为 200,000
个词元,其压缩率即为 1,048,576/200,000=5.24

八、各大模型的分词效果

分词效果:男儿何不带吴钩,收取关山五十州
在这里插入图片描述

1、LLaMA 词表是最小的,LLaMA 在中英文上的平均 token 数都是最多的,意味 LLaMA 对中英文分词都会比较碎,比较细粒度。
尤其在中文上平均 token 数高达1.45,这意味着 LLaMA 大概率会将中文字符切分为2个以上的 token。
2、Chinese LLaMA 扩展词表后,中文平均 token 数显著降低,会将一个汉字或两个汉字切分为一个 token,提高了中文编码效率。
3、ChatGLM-6B 是平衡中英文分词效果最好的 tokenizer。由于词表比较大,中文处理时间也有增加。
4、BLOOM 虽然是词表最大的,但由于是多语种的,在中英文上分词效率与 ChatGLM-6B 基本相当。
在这里插入图片描述

九、SentencePiece分词器使用

SentencePiece地址:https://github.com/google/sentencepiece
1)安装相关依赖

pip install sentencepiece

2)分词器使用

% spm_train --input=<input> --model_prefix=<model_name> --vocab_size=8000 --character_coverage=1.0 --model_type=<type>

参数说明:

--input:原始语料库文件,可以传递以逗号分隔的文件列表。
--model_prefix:输出的词表名称; 文件格式:<model_name>.model 、 <model_name>.vocab
--vocab_size:设置词表大小,例如 8000、16000 或 32000
--character_coverage:词表对语料库的覆盖率,默认:0.9995 对于具有丰富字符集的语言(如日语或中文)和其他具有小字符集的语言可以设置为1.0 (即对原料库的覆盖率为100%,包含语料库所有的单词)
--model_type:模型类型。unigram (default), bpe, char, or word

🔖更多专栏系列文章:🚩🚩🚩AIGC-AI大模型探索之路

文章若有瑕疵,恳请不吝赐教;若有所触动或助益,还望各位老铁多多关注并给予支持。

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

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

相关文章

什么样的内外网文档摆渡,可以实现安全高效传输?

内外网文档摆渡通常指的是在内网&#xff08;公司或组织的内部网络&#xff09;和外网&#xff08;如互联网&#xff09;之间安全地传输文件的过程。这个过程需要特别注意安全性&#xff0c;因为内网往往包含敏感数据&#xff0c;直接连接内网和外网可能会带来安全风险。因此会…

12.接口自动化学习-Yaml学习

1.配置文件作用 配置文件项目角度&#xff1a; &#xff08;1&#xff09;现成的应用–第三方组件 mysql–数据库–my.conf tomcat–web服务器–server.xml 修改&#xff1a;连接数/端口 redis–缓存服务器–redis.conf 修改配置 jemeter–压测工具–jemeter.properties–修改…

linux支持vGPU方案

1&#xff0c;查询gpu型号&#xff1a;lspci | grep "NVIDIA\|VGA" PCI Devices 2&#xff0c;下载驱动 官方驱动 | NVIDIA 3&#xff0c;安装 sudo sh NVIDIA-Linux-x86_64-440.118.02.run -no-x-check -no-nouveau-check -no-opengl-files参数说明&#xff1a; …

网盘——进入文件夹

本文主要讲解网盘的文件操作中进入文件夹的部分&#xff0c;具体实现步骤如下&#xff1a; 1、具体步骤如下&#xff1a; A、客户端发送进入文件夹的请求&#xff08;该请求包含目录信息以及要进入的文件夹名字&#xff09; B、服务器收到该请求之后&#xff0c;服务器首先判…

基于springboot的考勤管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

C#基础之数组

数组 文章目录 数组1、概念2、数组的声明3、数组的使用思考1 找出随机数中的最大值&#xff0c;最小值思考2 数组值前后交换思考3 输入成绩&#xff0c;比较出最大、最小值思考4 生成一个5X5的花格子 二维数组交错数组 1、概念 数组是存储一组相同类型数据的集合 数组分为一维…

【嵌入式AI开发】轻量级卷积神经网络MobileNetV1网络详解

传统卷积神经网络,内存需求大、运算量大导致无法在移动设备以及嵌入式设备上运行。模型研究得初衷就是服务于社会,应用到实际生活中,让深度学习技术服务于生活。 万物互联时代,智能终端部署模型到本地,不需连接因特网/云服务器,在边缘终端进行边缘计算。保障数据隐私,不…

【数据结构】三、栈和队列:2.顺序栈共享栈(顺序栈的初始化,判空,进栈,出栈,读取栈顶,顺序栈实例)

文章目录 1.顺序栈1.1初始化1.2判空1.3进栈1.4出栈1.5读取栈顶1.6销毁栈❗1.7顺序栈c实例 2.共享栈2.1初始化2.2判满 1.顺序栈 用顺序存储实现的栈 顺序栈的缺点&#xff1a;栈的大小不可变。 #define MaxSize 10 //定义栈中元素的最大个数 typedef struct{ElemType data[…

IDEA 中如何通过连接数据库自动生成代码

目录 1、IDEA 中安装 MyBatisX 插件 2、点击 IDEA 右侧的 database 数据库按钮&#xff0c;点击新建数据源 Data Source 3、编辑数据库连接信息 4、选择你要生成代码的数据库表 5、编辑你代码生成的基本路径以及一些配置项 6、选择annotation&#xff1a;mybatis-plus3&a…

美国洛杉矶站群服务器如何提高网站排名?

美国洛杉矶站群服务器怎么样?美国洛杉矶站群服务器如何提高网站排名?Rak部落小编为您整理发布美国洛杉矶站群服务器如何提高网站排名? 美国洛杉矶站群服务器可以通过以下几种方式帮助提高网站排名&#xff1a; - **提升网站性能**&#xff1a;美国站群服务器通常配备高速CPU…

eclipse导入工程提示Project has no explicit encoding set

eclipse导入工程提示Project has no explicit encoding set 文章目录 eclipse导入工程提示Project has no explicit encoding set一、Eclipse的工程导入二、可能的问题1.在工程名下有黄色叹号 一、Eclipse的工程导入 用Eclipse的导入可以将原有工程导入到新环境中 具体方法是&…

phpstorm 设置变量,自动补全代码

效果 进入设置->实时模板->PHP->添加 添加动态模板->完善写法 定义->选择PHP->应用就行

OpenStack云计算(十四)——综合演练手动部署OpenStack,

本项目的项目实训可以完全参考教材配套讲解的详细步骤实施&#xff0c;总体来说实训工作量较大&#xff0c;可根据需要选做&#xff0c;重点观看配套的微课视频。 项目实训一 【实训题目】 搭建OpenStack云平台基础环境 【实训目的】 掌握OpenStack基础环境的安装和配置方…

mysql8.0免安装版windows

1.下载 MySQL下载链接 2.解压与新建my.ini文件 解压的路径最好不要有中文路径在\mysql-8.0.36-winx64文件夹下新建my.ini文件&#xff0c;不建data文件夹(会自动生成) [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录(尽量用双斜杠\\,单斜杠\可能会报错) basedirD:\…

如何在vue3+vite中优雅的使用iconify图标

前言 从Vue2迁移到Vue3&#xff0c;在使用上有着很大的差别。本文的话主要是针对图标的使用差别上进行分析&#xff0c;同时给出基于iconify图标库中unplugin-icons的用法。这里特殊说明一下&#xff1a;其实element-plus中用到的图标也是基于iconify图标库的&#xff0c;在我们…

mysql中join内外连接查询例子

文章目录 join关键字概要举例using 与 on 区别 join关键字 在MySQL中&#xff0c;JOIN 是一种用于将两个或多个表中的行联合起来的操作。 连接&#xff08;join&#xff09;就是将一张表中的行按照某个条件&#xff08;连接条件&#xff09;与另一张表中的行连接起来形成一个新…

好久没关注uCOS系统的消息了,全家桶免费后,竟一直以全新的名字Flexible Safety RTOS登场,且一直在更新

【视频版】 https://www.bilibili.com/video/BV1Kb421Y7v9 好久没关注uCOS系统的消息了&#xff0c;全家桶免费后&#xff0c;竟一直以全新的名字Flexible Safety RTOS登场&#xff0c;且一直在更新 【前言】 2020年初&#xff0c;uCOS全家桶宣布免费后&#xff0c;其Github上…

paddle ocr模型量化实践

参考&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/blob/main/deploy/slim/quantization/README.md https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/FAQ.md 蒸馏 剪枝 量化 参考&#xff1a;https://blog.csdn.net/mddCSDN/article/de…

医院手术室麻醉信息管理系统源码 自动生成麻醉的各种医疗文书(手术风险评估表、手术安全核查表)

目录 手术风险评估表 一、患者基本信息 二、既往病史 三、手术相关信息 四、风险评估因素 五、风险评估结果 手术安全核查表 一、患者身份与手术信息核对 二、术前准备核查 三、手术团队与职责确认 四、手术物品与设备核查 五、术中关键步骤核查 六、术后核查 七…

星融元加入超以太网联盟(UEC),推动智算网络创新实践

近日&#xff0c;星融元正式加入超以太网联盟(Ultra Ethernet Consortium,UEC)&#xff0c;该联盟是在 Linux 基金会的牵头下由多家全球头部科技企业联合成立&#xff0c;目标是突破传统以太网性能瓶颈&#xff0c;使其适用于人工智能&#xff08;AI&#xff09;和高性能计算&a…