微信扫码
与创始人交个朋友
我要投稿
前言
亲爱的卷友们,大家早上好,过了五一又要开始学习了!在大语言模型(LLM)爆火的时代,相信很多读者小伙伴们都好奇为什么LLM可以有如何强大的能力,笔者将带领大家对LLM一探究竟。首先,今天要谈的是打造一个LLM的第一步,即预训练。预训练的目的是教会LLM具备“说话”的能力,让LLM具备丰富的“知识”。同时,预训练阶段很大程度上影响了LLM在下游任务上的泛化性能,不仅可以帮助模型在SFT阶段更快得拟合数据,同时,好的预训练可以让LLM“不说假话”,即缓解模型幻觉。
LLM预训练的方法很简单,就是将负对数似然损失作为目标函数训练模型基于上文的token对下一个token进行预测。预训练数据的构造对于模型性能的影响至关重要,接下来,本文主要从预训练数据的构成和处理两方面进行讲解。
数据来源
一般来说,LLM预训练所需要的数据来源大体上分为通用数据和专业数据。通用数据包括网页、图书、新闻、对话文本等。通用数据具有规模大,多样性和容易获取等特点,因此对于LLM的语言建模和泛化能力有重要的支持作用。而专业数据包括多语言数据,科学文本数据,代码以及特定领域的数据等。在预训练阶段引入专业数据可以有效地提升LLM解决不同任务的能力。下图[1]为不同的LLM所使用的数据类型占比情况,可以看到不同的LLM在训练数据类型分布上的差异很大,但至于什么样的数据分布比较好,目前还没有达成共识。
1. 通用数据
通用数据在LLM的训练数据中占比非常高,主要包含网页、书籍、对话数据等不同类型的数据,为LLM提供了大规模且多样的训练数据。
网页数据:网页数据是通用数据中数量最多的一类,网页数据包含的海量内容,使LLM能够获得多样化的语言知识并增强其泛化能力。虽然从网上爬取的网络数据包含大量高质量的文本(比如维基百科),但同时也包含非常多的低质量文本(比如垃圾邮件),因此,过滤并处理网页数据以提高数据质量对LLM的训练非常重要。
书籍数据:书籍通常包含广泛的词汇,比如专业术语、文学表达以及各种主题词汇等。利用书籍数据进行训练,LLM可以接触多样化的词汇,从而提高其对不同领域和主题的理解能力。同时,书籍数据可以说是唯一的长文本书面语的数据来源,书籍提供了完整的句子和段落,使得LLM可以学习到上下文之间的联系。
2. 专业数据
专业数据相对于通用数据来说占比比较低,但是其可以很大程度上提升LLM在下游任务上的特定任务解决能力。
多语言数据:多语言数据对于增强LLM的语言理解和生成多语言能力具有至关重要的作用。当前的LLM训练除了需要目标语言中的文本,通常还需要整合多语言数据,通过多语言数据的混合训练,LLM可以在一定程度上自动构建多种语言之间的语义关联。因此,多语言数据混合训练,可以有效提升机器翻译、多语言摘要和多语言问答等任务的能力。
科学文本:科学文本通常包含论文、百科以及其他相关数据资源。这些数据对于提升LLM在理解科学知识方面具有重要作用。然而,科学文本数据涉及众多专业领域且数据形式复杂,通常还需要对公式、化学式、蛋白质序列等特定符号标记进行预处理。例如,公式可以用LaTeX语法表示。这样可以将不同形式的数据转换为统一的形式,使LLM更好地处理和分析科学文本数据。
代码:代码是进行程序生成任务所必须的训练数据。代码不仅包含代码本身,还包含大量的注释信息,与自然语言文本相比,代码具有显著的不同,代码是一种格式化语言,它对应着长程依赖和准确的执行逻辑。代码的语法结构、关键词和特定的编程范式都对其含义和功能起着重要的作用。代码的主要来源有编程问答社区(例如Stack Exchange)和公共软件仓库(例如Github)。
数据处理
收集好数据之后,就需要对数据进行处理。很多研究都表明,数据质量对于LLM的影响非常大。包括笔者在工作中训练LLM时,都能深刻地感受到数据质量的重要性。数据处理步骤通常包含去除低质量数据、重复数据、有害信息、个人隐私等内容。下图[1]为常见的数据流程。
1. 质量过滤
LLM训练中所使用的低质量数据过滤方法可以分为两类:基于分类器的方法和基于启发式的方法。
基于分类器的方法:基于分类器的方法的目标是训练文本质量判别模型,利用该模型识别并过滤低质量数据。例如GPT-3[2],PaLM[3]和GLaM[4]等模型在构造训练数据时都使用了该方法。GLaM采用了基于线性特征哈希的线性分类器,可以非常高效地完整文本质量的判断。该分类器使用一组精选文本进行训练,目标是给与训练数据类似的网页较高的分数。
基于启发式的方法:基于启发式的方法通过一组精心设计的规则来消除低质量的文本,BLOOM[5]和Gopher[6]采用了此方法。一些规则包含:
语言过滤:如果只关注一种或者几种语言,则可以大幅过滤数据中其他语言的文本。
指标过滤:利用评测指标过滤低质量的文本。
统计特征过滤:针对文本可以计算包括标点符号分布、符号占比、句子长度在内的统计特征,利用这些特征过滤低质量数据。
关键词过滤:根据特定的关键词集,可以识别并删除文本中有噪声或者无用的元素。
2. 冗余去除
训练数据中存在的重复数据会降低LLM的多样性,并可能导致训练过程不稳定,从而影响模型性能,因此需要对预训练数据中的重复数据进行处理,去除冗余部分。冗余去除就是在不同的粒度上去除重复的内容,包括句子、文档和数据集等粒度。
句子级别:有相关研究指出,重复单词或短语的句子可能造成语言建模中引入重复的模式,使LLM在预测时容易陷入重复循环。句子级别的过滤方法包含对文档中超过一定长度的相同字符串进行提取并过滤等。
文档级别:大部分LLM都依靠文档之间的表面特征相似度(例如n-gram重叠比例)来进行检测并删除重复文档。
数据集级别:由于很多LLM在预训练时都会包含Github、维基百科等数据,因此也需要注意从数据集层面去除冗余数据。
3. 隐私消除
由于绝大多数预训练数据都来源于互联网,因此不可避免地会包含涉及敏感或个人信息,这可能会增加隐私泄露的风险。例如,LLM可能会在预测的时候补全姓名、电子邮件、电话号码等信息。因此。非常有必要从预训练数据中删除包含个人身份信息的内容。
删除隐私数据最直接的方法就是基于规则的方法。例如可以使用基于命名实体识别的方法,利用命名实体识别算法检测姓名、地址、电话号码等个人信息内容并进行删除和替换。
4. 词元切分
我们都知道,NLP领域想要对单词进行计算,都需要提前构建一个词典,并根据词典将单词转换成embedding,如果遇到词表中不存在的未登录词,则给予其一个默认的通用表示,一般而言,都会在词表中预置一个[UNK],表示未知词,并在训练中将[UNK]的向量作为词表示矩阵的一部分一起训练。而词表大小对于模型的性能影响非常大,当词表过小时,未登录词的比例比较高,影响模型的性能;当词表比较大时,大量低频词出现在词表中,这些词向量很难得到充分的学习。
为了解决未登录词的问题,一些工作通过利用亚词级别的信息构建词表示向量。例如BPE[7]是一种常见的子词词元算法。该算法采用的词表包含最常见的单词以及高频出现的子词。使用时,常见词通常位于BPE词表中,而罕见词通常能被分解为若干个包含在BPE词表中的词元,从而大幅减小未登录词的比例。除此之外,WordPiece[8]也是一种常见的次元分析算法,与BPE有非常相似的思想。
总结
对LLM比较熟悉的朋友们可能知道,现有的大模型在结构上其实都大差不差,基本上都是Decoder-only类型的结构,或者引入MoE结构,也就是说修改模型结构对于模型性能的提升性价比并不是最高的。而在训练过程中,数据准备和处理是工程量最大且花费人力最多的部分。而随着最近不同开源模型新的版本发布,例如LLaMA-3,可以发现一个点,就是对于相同参数的模型来说,更多高质量的数据对提升模型的性能是非常显著的。因此无论是在学术研究还是工业界应用中,对数据进行研究无疑是一个最直接,并且性价比非常高的解决方案。
预训练是一个让LLM掌握“知识”的阶段,而如何让LLM听懂人类的自然语言指令,帮助我们去完成一些特定的任务,这就需要对LLM进行有监督微调(SFT)以及人类反馈强化学习(RLHF)等。后续,笔者将带着大家继续对LLM的训练过程进行学习,对SFT,RLHF等知识进行讲解。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-05-14
2024-04-25
2024-07-18
2024-04-26
2024-05-06
2024-12-22
2024-12-21
2024-12-21
2024-12-21
2024-12-21
2024-12-20
2024-12-20
2024-12-19