前言
本章主要讲述了LLM训练数据的预处理、构造、向量化等技术,同时针对数据处理中使用到的工具进行了介绍。
目标
学完本课程后,您将能够:
掌握LLM训练数据预处理流程
了解常用的数据预处理工具
掌握微调数据构造方法
掌握Tokenizer的作用和原理
目录
1.LLM训练数据及预处理流程介绍
2.数据预处理工具
3.微调数据构造
4.掌握Tokenizer的作用和原理
1.LLM训练数据及预处理流程介绍
LLM训练数据介绍(1)
构建一个LLM包含预训练、微调等多个过程,其中预训练过程需要的数据量最大,涉及网页数据、开源数据集等,数据质量参差不齐,需要进行大量数据预处理;微调过程需要的数据量相对较小,但质量要求较高,数据预处理的同时需要通过一定方法生成指令数据。
原始预训练数据
通过:数据预处理
高质量预训练数据
通过:预训练
LLM-Base模型
通过:微调
LLM-行业模型
LLM-Chat模型
————————————
SFT数据
通过:数据预处理
高质量SFT数据
通过:微调
LLM-行业模型
LLM-Chat模型
LLM训练数据介绍(2)
预训练数据
公开数据(Public Data)
网页数据:这类数据的获取最为方便,各个数据相关的公司比如百度,谷歌等每天都会爬取大量的网页存储起来。其特点是量级非常大,比如非盈利性机构构建的CommonCraw数据集是一个海量的、非结构化的、多语言的网页数据集。它包含了超过8年的网络爬虫数据集,包含原始网页数据(WARC)、元数据(WAT)和文本提取(WET),包含数百亿网页,数据量级在PB级规模,可从Amazon S3上免费获取。
开源数据:这类数据包括机构自己制作的数据集、竞赛公开的数据集等,通常需要注册账号后从专门网站下载。
专有数据(Curated High-quality Corpora)
为某一个领域、语言、行业的特有数据。比如对话、书籍、代码、技术报告、论文考试等数据。这类数据比较难获取,如果在中国那么最有代表性的就应该是我们在图书馆、国家数字档案馆、国家数字统计局等机构和地方。现在比较成功的LLM模型都大量使用了高质量书籍数据、社交媒体对话数据等,而这些专业数据是不对公众开放的,其他公司也难以获取。
微调阶段数据
微调数据由人工按照模版编写数据,然后使用方法增强生成更多数据。
LLM训练数据预处理流程
以下为数据预处理的通用流程,不同的LLM实际采用的流程会有所区别。
数据爬取和保存
数据格式规整
过滤及去重
语言检测
模糊重复数据删除
数据滤毒&隐私处理
数据提纯
数据去重
数据分词
数据混合
LLM训练数据预处理方法
数据格式规整:将所有的数据(Web数据、PDF数据、表格数据等)整理为统一的格式(比如JSON),可以输入到同一个模型中;
过滤及去重(粗):对于Web数据,可以采用URL过滤+页面过滤+hash去重,也可针对特定URL的页面进行过滤;
语言检测:企业可根据自己业务需求,基于fastText模型进行语种识别,过滤掉不需要的语种;
模糊重复数据删除:计算n-gram重复率,过滤重复页面;
数据滤毒&隐私处理:匹配敏感词,基于规则识别个人邮箱、电话等隐私数据,进行替换;
数据提纯:正则匹配导航栏关键字,删除无关段落;
数据去重:依据段落及其长度过滤短页面。
网页数据预处理
在大模型预训练阶段,主要采用自回归训练,因此数据无需标注,只需要规范格式、去除无意义标识符、去除重复数据和敏感信息等即可。
爬虫获取的原始网页数据包含了HTML字符,比如div等,需要通过处理得到其中有价值的信息,通常处理过程如下:
1、HTML字符去除:比如lt、& gt、& &转换为”<“
2、解码数据:将信息从复杂符号转换为简单易懂字符,需要区分语言和编码格式;
3、停用词去除:当数据分析需要在字级上进行数据驱动时,应删除通常出现的单词(停用词);
4、删除标点符号:按照优先级删除标点符号,只保留重要标点;
5、格式化数据:如大小转换、首字母大写等;
专有数据预处理
专有数据的格式种类很多,和企业自己的业务相关,接下来介绍一些相对通用的格式。
表格数据
采用Text-To-SQL技术作为人与表格数据沟通的桥梁,把人的自然语言问题转换为数据库SQL语言执行,执行结果再转换为自然语言返回给人;这种方式主要是训练Text-To-SQL的转换模型,数据库里的表格数据本身可能不会全量作为模型训练语料。
采用各种表格序列化技术,将表格转换为平铺文本给自然语言模型进行训练,使模型本身可以学习到表格里的数据,直接和人进行问答。
PDF数据
通过OCR等技术提取文字,但需要考虑排版、图片等内容。
批注:
在诸多表格序列化方式中:将表格序列化为完全通顺的自然语言,更便于模型学习理解表中内容,但会丢失表格的空间结构;将表格以markdown方式表达,能最大程度保留表格的空间结构,但不利于语言模型理解表格内容。我们认为将这两种方式相结合可能是一个不错的选择。
Falcon LLM数据预处理技术
通过使用自定义的数据预处理流程,从CC数据集中过滤提取生成了5万亿的高质量tokens,实现仅用Web数据经过清洗和过滤进行训练,达到超过使用专有数据进行训练的模型效果。
1、URL过滤:基于规则过滤敏感URL
2、文本提取:Traflatura内容检索库+正则表达式进行文本内容提取
3、语言识别:FastText语言分类,根据得分过滤输出
4、文档去重:启发式算法删除任何具有过多行、段落或n-gram重复的文档
5、文档级过滤:质量过滤启发式算法,移除机器生成文档,保留自然语言文本
6、行级过滤:线性校正过滤器,移除正文无关内容
7、模糊去重:MinHash算法删除相似文档
8、精确去重:子字符串绝对匹配去重,删除重复超过50个连续token的段落
9、URL去重:删除跨CC转储重复访问URL
相同计算资源下,利用清洗生成的RefineWeb数据训练模型的效果明显优于其他高质量数据训练的模型,同时效果与GPT3持平。
The RefinedWeb Dataset for Falcon LLM: Outperforming Curated Corpora with Web Data, and Web Data Only
2.数据预处理工具
Data-Juicer:一站式LLM数据处理系统
Data-Juicer是阿里提出的一站式数据处理系统,旨在为大语言模型(LLM)提供更高质量、更丰富、更易“消化”的数据。框架开源在https://github.com/alibaba/data-juicer。
数据预处理流程
1、数据收集:从多个来源收集原始文本数据。
2、精调参数(手动或自动):在数据处理模板中精调参数。
3、数据处理:
统一格式:Formatters将数据转换为统一格式。
文本编辑:Mappers对本文进行必要的编辑和增强。
过滤与去重:Filters筛选重要内容,Deduplicators去除重复数据。
数据混合:将不同数据源混合以增加多样性。
4、质量评估:使用可视化和自动评估工具检查数据质量。
5、模型训练:在处理后的数据上进行LLM预训练。
6、性能评估:训练完成后,评估模型性能并迭代优化数据。
模块化和可扩展:提供数据处理模版流,支持自定义数据处理的算子,支持自由组合和扩展。
数据反馈循环迭代:支持LLM预训练和微调的数据处理反馈循环,有助于用户快速理解数据并进行迭代优化。
系统性能优化:针对大规模数据进行优化,提高了数据处理的效率和可扩展性。
集成生态系统:与Megatron-LM、HELM、Ray无缝集成。
Data-Juicer: A One-Stop Data Processing System for Large Language Models
Jellyfish:用于数据预处理的LLM(1)
Jellyfish提供了一种用于数据预处理的开源LLM大模型,通过指令完成错误检测、实体匹配等多种数据预处理任务,避免当前业界依赖Open-AI chatGPT API进行数据处理带来的数据泄漏问题。
模型在https://huggingface.co/NECOUDBFM/Jellyfish 开源。
Jellyfish的训练包含如下几个模型:
1、预微调基模型
目标:基于LLama2-13B预微调,提升模型逻辑推理能力。
训练数据:FLAN+OpenPlatypus
微调方式:预训练微调
2、Jellyfish-13B
目标:专门为解决数据预处理(DP)任务而训练的模型。
训练数据:DP Tasks数据(ED/DI/SM/EM)
微调方式:指令微调
输出:数据预处理的目标结果
3、Jellyfish-13B-Interpreter
目标:基于Jellyfish-13B训练,解释Jellyfish-13B的输出。
训练数据:DP Tasks数据+GPT4生成的推理结果
微调方式:指令微调+推理训练
输出:数据预处理结果的原因与决策过程
Jellyfish作为数据预处理工具的特点:
自然语言指令交互,无需编程或特定工具。
通用问题解决者,无需人工设计规则。
同时返回处理的结果和原因,具有可解释性。
通过Few-shot提示可自定义预处理任务标准。
Jellyfish:用于数据预处理的LLM(2)
Jellyfish数据预处理流程
1、数据准备:用户准备CVS格式的数据集。
2、Prompt实例构建:
实例序列化:将数据实例转换为模型理解的提示;
知识注入(可选):根据需要向模型注入额外的领域知识。
3、模型推理:输入序列化后的提示到Jellyfish-13B模型,执行预处理任务。
4、结果解释(可选):使用Jellyfish-13B-Interpreter获取模型决策的详细解释。
5、后处理:根据模型输出调整原始数据集。
6、评估与反馈(可选):评估模型性能并根据结果进行调整。
Jellyfish数据预处理效果
1、数据预处理效果评估
已见任务(Seen Tasks),Jellyfish-13B表现与GPT3.5相当,某些任务超过GPT4.
未见任务(UnSeen Tasks),与非LLM方法在各自任务上的表现相当。
2、解释能力评估
GPT4做裁判下,Jellyfish-13B-Interpreter的解释结果比GPT3.5结果更优。
Jellyfish: A Large Language Model for Data Preprocessing
多模态大模型数据预处理技术-Macaw-LLM
Macaw-LLM是腾讯AI Lab发布多模态指令调优语言模型,支持图像、视频、语音、文本四种不同模态。在数据集处理上,Macaw-LLM使用GPT-4生成了大约69,000个基于COCO图像标题和50,000个基于视频标题的指令-响应对。模型开源在https://github.com/lyuchenyang/Macaw-LLM
Macaw-LLM数据预处理流程
1、数据源选择:从MS COCO图像数据集和Charades/AVSD视频数据集中选取带标题的图像和视频。
2、指令生成:使用GPT-4根据图像和视频标题或字幕作为提示,生成指令-响应对(QA Dialogue)。
3、人工验证:对生成的指令-响应对(QA Dialogue)进行人工审核,确保内容质量。
4、数据集构建:将生成的图像和视频指令-响应对与Alpaca文本指令数据集合并,形成最终的多模态训练数据集。
Macaw-LLM: Multi-Modal Language Modeling with Image, Audio, Video, and Text Integration
多模态大模型数据预处理技术-ImageBind
meta-AI提出的ImageBind旨在通过学习一个联合嵌入空间来对不同模态(如图像、文本、音频、深度、热成像和IMU数据)进行对齐。这个框架利用了图像作为中介,通过图像与其他模态的自然对齐特性,来实现不同模态之间的关联和理解。https://github.com/facebookresearch/ImageBind
IMAGEBIND数据处理详情:
图像和文本(Image and Text):
数据集:图像-文本数据对,来源于互联网上的图像和相应的描述性文本。
音频(Audio):
数据集:Audioset数据集(包含10秒视频片段和相应音频)
预处理:音频数据被转换为mel频谱图,时长超过10秒的音频会被分割成多个10秒片段,并通过填充来匹配视频片段的长度。
深度(Depth):
数据集:SUN RGB-D数据集(包含RGB图像和深度图)。
预处理:深度图被填充并转换为视差图以实现尺度不变性。
热成像(Infrared):
数据集:LLVIP数据集(包含RGB图像和红外图像)。
预处理:热成像数据被视为单通道图像,与RGB图像在通道维度上对齐。
IMU(Inertial Measurement Unit):
数据集:Ego4D数据集,(包含视频和IMU数据)。
预处理:IMU数据被采样为5秒的片段,与视频帧对齐,用于场景分类任务。
3.微调数据构造
微调数据集构建
大模型微调为通过大量的指令模板数据集来Finetune模型,使模型去理解指令和正确答案之间的关系;
微调数据集的结构基本为<prompt,response>pair,不同的微调算法在内容形式上会有细微差别;
与预训练数据相比,微调数据所需数据量大大减小,但是质量要求非常高,通常由人工编写或自动构建,无法直接使用网页数据。
大模型的生命周期和数据困境
时间线:
预训练Pre-training:无标注语料
有监督微调SFT:指令数据(QA对)
人类反馈的强化学习RLHF:模型输出排序
推理Inference:
SFT(指令微调)激活了模型预训练阶段注入的知识,使得模型具有遵循用户指令的能力,是大模型实际使用生命周期中不可或缺的一步。但人工书写指令数据耗时耗力,在数据数量、多样性和创造性上都有一定局限性。
ChatGPT对齐(Alignment)技术和原理
SFT和RLHF对模型性能的提升
SFT相对于原始GPT模型,用户偏好比8:2(指令微调学习)
RLHF相对于SFT模型,用户偏好比6.5:3.5(反馈学习)
在加入SFT和RLHF后,即使是1.3B的模型,其性能也强于175B的模型!
[Training language models to follow instructions with human feedback, OpenAI, 2022]
为什么需要微调数据自动构建?
Instruction Learning / Supervised Finetune(指令学习、指令微调)
将海量NLP任务以自然语言指令的形式统一,大幅提升LLM在不同任务之间的泛化能力
学术界NLP任务与实际场景中人类指令有差别,需进一步对齐(OpenAI)
ChatGPT用大量标注人力,指令撰写、回复撰写,提升数据多样性&质量
瓶颈:人工撰写海量高质量指令,管理难度极高!
SELF-INSRUCT
SELF-INSTRUCT概要
需要一定数量的人工书写指令作为种子样例让LLM仿照生成新的指令/问题
由实验得知:对于广义上的分类任务指令,模型总是倾向于生成output为同一标签的input内容,这破坏了数据的多样性和平衡。所以第二步是对指令进行二分类:是否是“分类任务”
对于分类任务指令,先让LLM生成可能的output,再把指令和output拼在一起生成input,对于非分类任务,则按顺序生成input和output
过滤生成的指令数据:主要是基于ROUGE-L去除重复的指令,基于关键词和文本长度去除无效的回答
生成的指令数据放入指令池,下一轮指令生成时,从中采样一定数量的指令,和采样的种子数据一起作为指令生成的样例
SELF-INSTRUCT 流程概览
Self-Instruct: Aligning Language Models with Self-Generated Instructions
Evol-Instruct(WizardLM)
Evol-Instruct概要
Evol-Instruct想要解决的问题是:如何提高生成指令的复杂度,从而构造出一个具有丰富复杂度层次的指令数据集
Evol-Instruct的方法是利用prompt让LLM对一条种子数据(因此也需要预先人工书写一些指令)进行演进(图二):
深度演进:增加限制条件、深入提问、具体化、增加推理步骤和复杂化输入
广度演进:变异,即让LLM基于给定指令发挥创意生成一条全新的指令
有四种情况视为指令演化失败:
相比于原指令没有任何信息增益;
LLM无法回答该指令;
LLM的回答仅包含停用词等;
指令中copy了prompt中的内容
WizardLM: Empowering Large Language Models to Follow Complex Instructions
图一: Evol-Instruct 流程概览
图二:一个 Evol-Instruct 运行例子
SELF-ALIGN
SELF-ALIGN概要
SELF-ALIGN需要大约200条种子数据,16条生成原则,和5个原则示例。不过原则和示例都是固定的,跟论文给出的一样即可
SELG-ALIGN的主要贡献是提升包括“道德”、“有帮助”等方面的生成指令的质量,另外还扩展了SELF-INSTRUCT以生成对抗指令
方法总共四个步骤:
扩展了SELF-INSTRUCT,不仅生成与种子相似的指令问题,还会生成对抗指令(即模型不应能够回答的指令)
在模型回答指令问题时在prompt中增加原则导向,并提供5个原则示例指导LLM生成答案
去除原则和示例微调模型
用微调后的模型重新生成更深入、更具体的指令回答
Principle-Driven Self-Alignment of Language Models from Scratch with Minimal Human Supervision
图一: SELF-ALIGN 流程概览
图二:原则驱动的自对齐和原则“刻印”
SELF-QA
SELF-QA概要
SELF-QA的想法时在垂直领域完全不需要人工种子数据,仅根据无标注语料生成指令数据
生成分为两步:
以一段语料作为背景知识,使用Prompt让LLM根据背景知识生成一系列指令问题
然后以这段语料为背景知识,让LLM做阅读理解,回答上一步提出的问题
根据规则去重和筛选生成的指令数据
图一: SELF-QA 流程概览
SELF-QA: Unsupervised Knowledge Guided Language Model Alignment
Instruction Backtranslation(Humpback)
需要一定数量的人工书写指令作为种子训练初始指令遵循模型和反译模型
假设无标注的原始语料中包含了一些适于作为用户指令回答的段落。将无标注段落作为指令的回答输入生成对应的指令,从而建立候选指令数据集A
用对上一步生成的候选指令数据集中的指令数据进行打分,设定阈值k,筛选出高质量指令数据集
,加上种子数据一起对
进行微调,得到
,再用
对候选数据集做筛选,重复这一过程
Instruction Backtranslation 流程概览
SELF-ALIGNMENT WITH INSTRUCTION BACKTRANSLATION
微调数据自动生成技术总结
算法名称 | 算法价值 | 总结 |
SELF-INSTRUCT | SELF-INSTRUCT是目前最常用的指令数据生成算法,像Alpaca等知名LLM的训练数据中都有它的身影。在它之后的像Evol-Instruct、SELF-ALIGN等工作本质上与SELF-INSTRUCT并无不同,主要是从Prompt工程的角度提升了生成指令数据的复杂度、道德感、有帮助性等方面的质量。 |
在种子数据量足够多且语料库符合关键假设时,Instruction Backtranslation是首选; 当有一定量种子数据时,可以采用SELF-INSTRUCT,并依据具体情况采纳Evol-Instruct等提出的Prompt流优化指令的生成质量; 如果完全没有种子数据,则只能采用SELF-QA。 |
SELF-QA | 当前指令数据生成算法除了SELF-QA外均需要一定数量的人工种子数据来启动算法,因此SELF-QA是最简单经济的方法,但是这种方法的局限性也在于此:没有人工书写的样例仿照,SELF-QA生成的指令问题质量可能很低,尤其在垂直领域,可能并不符合用户的提问方式。 | |
Instruction Backtranslation | Instruction Backtranslation的创新之处在于,不同于SELF-INSTRUCT架构下基于有限数量的示例续写指令问题,而是干脆基于基础大模型训练了一个指令生成模型Myx,因此生成的指令质量比较高,泛化性比较强。使用该方法训练得到的最终模型Humback也是目前各类基于LLaMA的模型中最强的。该方法的问题在于:1.为了训练水平较高的初始和反译模型,需要的种子数据量很大(3200条);2.关键假设之一“无标注的原始语料中包含了一些适于作为用户指令回答的段落”在一些垂直领域的语料库中可能不成立,那么最终的结果质量可能并不如人意。 |
4.Tokenizer
何为Tokenizer?
虽然LLM具备强大的自然语言处理能力,但实际使用中只能接收数字,输出也是数字,存储的权重也全部是数字,这时候就需要tokenization和embedding。
tokenizer.encode将输入token(文本)变成数字输入给模型,模型generate输出数字,tokenizer.decode将输出数字变成token(文本)并返回。
流程:
用户输入(文本)
encode
LLM输入(数字)
LLM推理
LLM输出(数字)
decode
LLM输出(文本)
批注:
首先分词,tokenizer将字符串分为一些sub-word,然后编码/encode,tokenizer从sub-word映射到id,这个id送入模型,将token的one-hot的id编码经过模型的embedding层转换成更稠密的embedding编码进入模型之后,再经过Imhead,输出一个id,这个id就代表一个字。
decode,tokenizer从模型输出的id映射回token。Embedding矩阵的本质就是一个查找表。由于输入向量是one-hot的,embedding矩阵中有且仅有一行被激活。行间互不干扰。这也给我们之后的扩充词表带来了可能。
词粒度
就是把文本分成词,以词为最小粒度。
根据不同规则,产生不同的结果。
词粒度拆分方法
有多种方法可以拆分文本。
例如,python的split()函数,使用空格将文本标记为单词:
词粒度优缺点
优点:
保留了语义独立性
缺点:
例如中文这类语言,会受分词方式的影响。
如果基于此来做词汇表,由于长尾现象的存在,这个词汇表可能会超大,大的词汇表对应模型需要使用很大的embedding层,这既增加了内存,又增加了时间复杂度。
为了平衡2个问题,一般词表不会太大,但是又会带来OOV(Out-of-Vocabulary,词汇库外)问题。
字粒度
基于字符的Tokenizer将文本拆分为字符,然后形成vocabulary dict。
字粒度:
字粒度优缺点
优点:
词表规模相对较少(通常只有几十甚至几百)。
词汇外(未知)标记(token)要少得多,因为每个单词都可以从字符构建。
缺点:
Tokenizer之后得到字符表示,其意义不大:每个字符本身并没有多少语义。例如,学习字母“t”有意义的表述,要比学习单词“today”的表述困难得多。因此,Character-bases Tokenizer往往伴随着性能的损失。
虽然使用基于单词的Tokenizer,单词只会是单个标记,但当转换为字符时,它很容易变成10个或更多的token。
子词粒度(Subword-based Tokenizer)
Subword-based Tokenizer:它是词粒度和字符粒度的折中。
Subword-based Tokenizer算法依赖于这样一个原则:不应将常用词拆分为更小的子词,而应将低频词分解为有意义的子词。这使得我们能够使用较小的词表完成相对较好的覆盖,并且几乎没有unknown token。
例如:“football”可能被认定是一个低频词,可以分解为“foot”和“ball”。而“foot”和“ball”作为独立的子词可能出现得更高频,同时“football”的含义由“foot”和“ball”复合而来。
Subword-based Tokenizer允许模型具有合理的词表规模,同时能够学习有意义的表述。此外,Subword-based Tokenizer通过将单词分解成已知的子词,使模型能够处理以前未见过的单词。
BPE
字节对编码(BPE,Byte Pair Encoder),是一种基于字符的二元编码策略,其基本原理是将连续的字符对进行编码,从而实现对单词的识别和分割。
BPE算法的核心思想是通过对语言中的常见单词进行统计分析,确定出最常见的字符对,然后对这些字符对进行编码,从而实现对单词的分割。
BPE最早是由Sennrich等人于2015年引入到NLP领域并很快得到推广。
该算法简单有效,GPT3使用了该算法。
批注:
Byte Pair Encoding,用于GPT-2
BPE分词流程(1)
词表构建是BPE算法的核心,其是“根据训练语料”来构建BPE算法的词表。算法的整体步骤如下所示:
准备模型的训练语料,确定期望的词表大小。
将训练语料中的所有单词拆分为字符序列,利用这些字符序列构建初始的词表。
统计训练语料中每一个连接字节对出现的频率,选择出现频率最高的字节对合并成新的subword,并更新词表。
重复上一步,直到词表大小达到我们设定的期望或者剩下的字节对出现频率最高为1.
BPE分词流程(2)
构建初始词表
这一步,在每一个单词的后面都加入了一个新的字符<w>来表示这个单词的结束。初始的词表大小为7,其为训练语料中所有出现过的字符数量。
统计词出现的次数
经统计发现lo这个字节对在训练语料中出现频率最高,为3次。更新词表,将lo作为新的子词加入词表,并删除在当前训练语料库中不单独出现的字符l和o。
BPE分词流程(3)
重复上一步操作
low这个字节对在训练语料中出现频率最高,为30次。我们继续组合,将low加入词表中,并删去lo。需要注意的是,由于字符w在单词newer中仍然存在,因此不与删除。
继续循环
继续这个循环过程,在词表中加入er,并删去字符r。
直到词表大小达到我们设定的期望或剩下的字节对出现频率最高为1.
WordPiece
与BPE一样,WordPiece从一个小的词汇表开始,并学习合并规则。
二者之间的区别在于merge的方式不同:WordPiece不是选择最高频的组合,而是通过如下公式计算每个组合的得分:
t1和t2为两个token,t1,2为他们合并后得到的新的token。
frep(t)为token t在语料库中出现的次数。选择score最高的一堆token等价于:
其中N为语料库中token总数。
WordPiece分词示例(1)
1、得到单词及其频次的集合:
(“hug”, 10), (“pug”, 5), (“pun”, 12), (“bun”, 4), (“hugs”, 5)
2、将所有单词拆分到字符:
(“h” “##u” “##g”, 10), (“p” “##u” “##g”, 5), (“p” “##u” “##n”, 12), (“b” “##u” “##n”, 4), (“h” “##u” “##g” “##s”, 5)
WordPiece通过添加前缀(在BERT中是##)来识别子词,这可以识别一个子词是否是单词的开始。这里通过将前缀添加到单词内的每个字符来拆分的,单词的首字符不添加前缀。此时的base vocabulary为:
[“b”, “h”, “p”, “##g”, “##n”, “##s”, “##u”]
WordPiece分词示例(2)
3、计算每个可能的符号对,选择分数最高分的组合。
学到的第一个合并规则是(“##g”, “##s”) -> (“##gs”)。注意,当合并时,需要删除两个token之间的##,所以添加“##gs”到词表中。此时单词及其频次的集合为:
(“h” “##u” “##g”, 10), (“p” “##u” “##g”, 5), (“p” “##u” “##n”, 12), (“b” “##u” “##n”, 4), (“h” “##u” “##gs”, 5)
此时词典为:
[“b”, “h”, “p”, “##g”, “##n”, “##s”, “##u”, “##gs”]
4、继续这样处理,直到达到所需的词汇量。
SentencePiece-Unigram
与BPE和WordPiece相比,Unigram生成一个较大的词汇表,然后从中删除token,直到达到所需的词汇表大小。
有多种选项可用于构建基本词汇表:例如,可以采用预标记化单词中最常见的子词或者在具有大词汇量的初始语料库上应用BPE。
Unigram分词流程(1)
Unigram算法假设每个子词都是独立出现的,因此一个子词序列X=(x1,…,xm)出现的概率是每个子词出现概率的乘积,即:
其中,x为字词,p(x)为字词出现的概率,V为词表。
对于给定的句子X,其最佳的分词为:
S(X)为句子X 的所有候选分词。如果已知词表V 以及每个子词出现的概率p(x) ,则可以通过维特比算法求解得到。
Unigram分词流程(2)
给定一个训练语料库D,如何获得词表V以及每个子词出现的概率p(x)。Unigram利用EM算法来求解如下的边际似然:
其中表示语料库D 中的第s 个句子。
Unigram采用了迭代式算法求解边际似然:
首先,从训练语料库中获取一个足够大的种子词典。一种选择方法是:使用所有字符、以及语料库中最高频的字词。
重复以下步骤,直到词表规模的|V|达到预期的值。
对每个子词xi计算lossi,其中loss/表示当xi从当前词表移除时,似然降低的数值。
根据lossi进行降序排列,保留top n%的子词(例如,80%)。
https://zhuanlan.zhihu.com/p/78311644
Unigram分词示例(1)
假设得到单词及其频次的集合:
(“hug”, 10), (“pug”, 5), (“pun”, 12), (“bun”, 4), (“hugs”, 5)
种子词表采用初始词表的所有严格子字符串(即,不包含它自身):
[“h”, “u”, “g”, “hu”, “ug”, “p”, “pu”, “n”, “un”, “b”, “bu”, “s”, “hug”, “gs”, “ugs”]
(这里的hug不是包含了自身吗?第一个子词就是hug,应该要去掉的吧?)
对于每个单词,考虑分词概率最高的。例如,对于“pug”:
词语切分为[“P”,”u”,”g”]的概率为:
这里210为词表中所有token的频次之和。
词语切分为[“pu”,”g”]的概率为
Unigram分词示例(2)
选择对单词进行切分概率最高的方式:
[“p”, “u”, “g”] : 0.000389,[“p”, “ug”] : 0.0022676,[“pu”, “g”] : 0.0022676
因此,“pug”将被标记为[“p”,”ug”]或者[“pu”,”g”],选择哪种方式,取决于首先遇到哪种方式。当语料库足够大时,概率相等的情况非常小。
利用维特比算法计算得到每个单词的最佳分词方式:
“hug”: [“hug”] (score 0.071428),”pug”: [“pu”, “g”] (score 0.007710)
“pun”: [“pu”, “n”] (score 0.006168),”bun”: [“bu”, “n”] (score 0.001451)
“hugs”: [“hug”, “s”] (score 0.001701)
最后需要计算从词表中删除每个token将如何影响损失。然后我们根据这个损失对token进行排序,选择top n%的token。
思考题
1、为什么需要指令数据集自动构建技术?
人工构建数据集多样性差
人工构建数据集工作量大
本章总结
本章主要介绍了LLM数据处理流程和相关的工具,同时也介绍了微调数据生成技术。
————————————
仅用于本人学习
来源:网络
暂无评论内容