大语言模型训练数据常见的4种处理方法

本文分享自华为云社区《浅谈如何处理大语言模型训练数据之一常见的数据处理方法》,作者: 码上开花_Lancer。

大语言模型训练需要数万亿的各类型数据。如何构造海量“高质量”数据对于大语言模型的训练具有至关重要的作用。虽然,截止到2023 年9 月为止,还没有非常好的大模型的理论分析和解释,也缺乏对语言模型训练数据的严格说明和定义。但是,大多数研究人员都普遍认为训练数据是影响大语言模型效果以及样本泛化能力的关键因素之一。

从此前的研究来看,预训练数据需要涵盖各种类型,包括网络数据、图书、论文、百科和社交媒体等,还需要覆盖尽可能多的领域、语言、文化和视角,从而提高大语言模型的泛化能力和适应性。本文将介绍当前常见的大语言模型训练数据的来源、处理方法、预训练数据对大语言模型影响的分析以及常见开源数据集合等。

一、数据来源

有论文专门 介绍了OpenAI 训练GPT-3 所使用的主要数据来源,包含经过过滤的CommonCrawl数据集、WebText2、Books1、Books2 以及英文Wikipedia 等数据集合。其中CommonCrawl 的原始数据有45TB,进行过滤后仅保留了570GB 的数据。通过词元方式对上述语料进行切分,大约一共包含5000 亿词元。为了保证模型使用更多高质量数据进行训练,在GPT-3 训练时,根据语料来源的不同,设置不同的采样权重。在完成3000 亿词元训练时,英文Wikipedia 的语料平均训练轮数为3.4 次,而CommonCrawl 和Books 2 仅有0.44 次和0.43 次。由于CommonCrawl 数据集合的过滤过程繁琐复杂,Meta 公司的研究人员在训练OP 模型时则采用了混合RoBERTa、Pile[68] 和PushShift.io Reddit 数据的方法。由于这些数据集合中包含的绝大部分都是英文数据,因此OPT 也从CommonCrawl 数据集中抽取了部分非英文数据加入训练语料。大语言模型训练所需的数据来源大体上可以分为通用数据和专业数据两大类。通用数据(GeneralData)包括网页、图书、新闻、对话文本等内容。通用数据具有规模大、多样性和易获取等特点,因此可以支持大语言模型的构建语言建模和泛化能力。专业数据(Specialized Data)包括多语言数据、科学数据、代码以及领域特有资料等数据。通过在预训练阶段引入专业数据可以有效提供大语言模型的任务解决能力。图3.1给出了一些典型大语言模型所使用数量类型的分布情况。可以看到不同的大语言模型在训练类型分布上的差距很大,截止2023 年9 月为止,还没有得到广泛认可数据类型分布比例。

cke_133.png

典型大语言模型所使用数量类型的分布

1.1 通用数据

通用数据在大模型训练数据中占比通常非常高,主要包括网页、书籍、对话文本等类型,为大模型提供了大规模且多样的训练数据。网页(Webpages)是通用数据中数量最大的一类。随着互联网的大规模普及,人们通过网站、论坛、博客、APP 等各种类型网站和应用,创造了海量的数据。根据2016 年Google 公开的数据,其搜索引擎索处理了超过130 万亿网页。网页数据所包含的海量内容,使得语言模型能够获得多样化的语言知识并增强其泛化能力。爬取和处理这些海量网页内容并不是一件容易的事情,因此一些研究人员构建了包括ClueWeb09[70]、ClueWeb12、SogouT-16、CommonCrawl 等在内的开源网页数据集。但是,这些爬取的网络数据虽然包含大量高质量的文本,如维基百科,但也包含非常多的低质量的文本,如垃圾邮件等。因此,如何过滤和处理网页以提高质量数据对与大语言模型训练来说非常重要。对话数据(Conversation Text)是指包含两个或更多参与者之间交流的文本内容。对话数据包含书面形式的对话、聊天记录、论坛帖子、社交媒体评论等。当前的一些研究也表明,对话数据可以有效增强语言模型的对话能力,并潜在地提高其在多种问答任务上的表现。对话数据可以通过收集、清洗、归并等过程从社会媒体、论坛、邮件组等构建。相较于网页数据,对话数据收集和处理更加困难,数据数量也相对少非常多。常见的对话数据集包括PushShift.io Reddit、Ubuntu Dialogue Corpus、Douban Conversation Corpus、Chromium Conversations Corpus 等。此外,文献[75] 也提出了如何使用大语言模型自动生成对话数据的UltraChat 方法。书籍(Book)是人类知识的主要积累方式之一,从古代经典著作到现代学术著述,书籍承载了丰富多样的人类思想。书籍通常包含广泛的词汇,包括专业术语、文学表达以及各种主题词汇。

利用书籍数据进行训练,语言模型可以接触到多样化的词汇,从而提高其对不同领域和主题的理解能力。相较于其他语料库,书籍也是最重要的,甚至是唯一的长文本书面语的数据来源。书籍提供了完整的句子和段落,使得语言模型可以学习到上下文之间的联系。这对于模型理解句子中的复杂结构、逻辑关系和语义连贯性非常重要。书籍涵盖了各种文体和风格,包括小说、科学著作、历史记录等等。通过使用书籍数据训练语言模型,可以使模型学习到不同的写作风格和表达方式,提高大语言模型在各种文本类型上的能力。由于版权因素,开源书籍数据集合很少,现有的开源大语言模型研究通常采用Pile 数据集[68] 中提供的Books3 和Bookcorpus2 数据集。

2.1 专业数据

专业数据在通用大语言模型中所占比例通常较低,但是专业数据对于改进大语言模型在下游任务上的特定能力有着非常重要的作用。专业数据有非常多的种类,我总结了当前大语言模型使用的三类专业数据,包括多语言数据、科学文本以及代码。

多语言数据(Multilingual Text)对于增强大语言模型语言理解和生成多语言能力具有至关重要的作用。当前的大语言模型训练除了需要目标语言中的文本之外,通常还要整合多语言语料库。

例如,BLOO的预训练语料中包含46 种语言,而PaLM[的训练语料中甚至高达122 种语言的数据。此前的研究发现,通过多语言混合训练,预训练模型中可以在一定程度上自动构建多语言之间的语义关联。因此,多语言数据混合训练,可以有效提升翻译、多语言摘要和多语言问答等任务能力。此外,由于不同语言中不同类型的知识获取难度不同,多语言数据还可以有效增加数据的多样性和知识的丰富性。

科学文本(Scientific Text)包括教材、论文、百科以及其他相关资源。这些数据对于提升大型语言模型在理解科学知识方面具有重要作用。科学文本数据的来源主要包括arXiv 论文、PubMed 论文、教材、课件和教学网页等。由于科学领域涉及众多专业领域且数据形式复杂,通常还需要对公式、化学式、蛋白质序列等采用特定的符号标记进行预处理。例如,公式可以使用LaTeX 语法进行表示,化学结构可以使用SMILES(Simplified Molecular Input Line Entry System)表示,蛋白质序列可以使用单字母代码或三字母代码。这样可以将不同格式的数据转换为统一的形式,使得语言模型更好地处理和分析科学文本数据。

代码(Code)数据是进行程序生成任务所必须的训练数据。最近的研究和ChatGPT 的结果表明,通过在大量代码上进行预训练,大语言模型可以有效提升代码生成的效果。代码数据不仅包含程序代码本身,还包含大量的注释信息。与自然语言文本相比,代码数据具有一些显著的区别。代码是一种格式化语言,它对应着长程依赖和准确的执行逻辑。代码的语法结构、关键字和特定的编程范式都对其含义和功能起着重要的作用。代码数据的主要来源是编程问答社区(如Stack Exchange)和公共软件仓库(如GitHub)。编程问答社区中的数据包含了开发者提出的问题、其他开发者的回答以及相关代码示例。这些数据提供了丰富的语境和真实世界中的代码使用场景。公共软件仓库中的数据则包含了大量的开源代码,涵盖了各种编程语言和领域。这些代码库中的很多代码经过了严格的代码评审和实际的使用测试,因此具有一定的质量和可靠性。

二、数据处理

大语言模型的相关研究表明,数据质量对于模型的影响非常大。因此在收集到各类型数据之后,需要对数据进行处理,去除低质量数据、重复数据、有害信息、个人隐私等内容[14, 85]。典型的数据处理过程如图3.1所示,主要包含质量过滤、冗余去除、隐私消除、词元切分等几个步骤。本节将依次介绍上述内容。

cke_134.png

图2.1 典型大语言模型数据处理流程图

1. 低质过滤

互联网上的数据质量参差不齐,无论是OpenAI 联合创始人Andrej Karpathy 在微软Build 2023的报告,还是当前的一些研究都表明,训练数据的质量对于大语言模型效果具有非常重要的影响。因此,如何从收集到的数据中删除低质量数据成为大语言模型训练中的重要步骤。大语言模型训练中所使用的低质量数据过滤方法可以大致分为两类:基于分类器的方法和基于启发式的方法。基于分类器的方法目标是训练文本质量判断模型,并利用该模型识别并过滤低质量数据。GPT-3、PALM 以及GLam模型在训练数据构造时都使用了基于分类器的方法。 采用基于特征哈希的线性分类器(Feature Hash Based Linear Classifier),可以非常高效地完成文本质量判断。该分类器使用一组精选文本(维基百科、书籍和一些选定的网站)进行训练,目标是将与训练数据类似的网页给定较高分数。利用这个分类器可以评估网页的内容质量。在实际应用中,还可以通过使用Pareto 分布对网页进行采样,根据其得分选择合适的阈值,从而选定合适的数据集合。但是,一些研究也发现,基于分类器的方法可能会删除包含方言或者口语的高质量文本,从而损失一定的多样性。基于启发式的方法则通过一组精心设计的规则来消除低质量文本,BLOOM 和Gopher采用了基于启发式的方法。这些启发式规则主要包括:

• 语言过滤:如果一个大语言模型仅关注一种或者几种语言,那么就可以大幅度的过滤掉数据中其他语言的文本。

• 指标过滤:利用评测指标也可以过滤低质量文本。例如,可以使用语言模型对于给定文本的困惑度(Perplexity)进行计算,利用该值可以过滤掉非自然的句子。

• 统计特征过滤:针对文本内容可以计算包括标点符号分布、符号字比(Symbol-to-Word Ratio)、句子长度等等在内的统计特征,利用这些特征过滤低质量数据。

• 关键词过滤:根据特定的关键词集,可以识别和删除文本中的噪声或无用元素,例如,HTML标签、超链接以及冒犯性词语等。

在大语言模型出现之前,在自然语言处理领域已经开展了很多文章质量判断(Text Quality Evaluation)相关研究,主要应用于搜索引擎、社会媒体、推荐系统、广告排序以及作文评分等任务中。

在搜索和推荐系统中,结果的内容质量是影响用户体验的的重要因素之一,因此,此前很多工作都是针对用户生成内容(User-Generated Content,UGC)质量进行判断。自动作文评分也是文章质量判断领域的一个重要子任务,自1998 年文献[87] 提出了使用贝叶斯分类器进行作文评分预测以来,基于SVM[88]、CNN-RNN[89]、BERT[90, 91] 等方法的作文评分算法也相继提出,并取得了较大的进展。这些方法也都可以应用于大语言模型预训练数据过滤中。但是由于预训练数据量非常大,并且对于质量判断的准确率并不要求非常高,因此一些基于深度学习以及基于预训练的方法还没有应用于低质过滤过滤中。

2.冗余去除

文献指出大语言模型训练语料库中的重复数据,会降低语言模型的多样性,并可能导致训练过程不稳定,从而影响模型性能。因此,需要对预训练语料库中的重复进行处理,去除其中的冗余部分。文本冗余发现(Text Duplicate Detection)也称为文本重复检测,是自然语言处理和信息检索中的基础任务之一,其目标是发现不同粒度上的文本重复,包括句子、段落以及文档等不同级别。冗余去除就是在不同的粒度上进行去除重复内容,包括句子、文档和数据集等粒度的重复。在句子级别上,文献 指出,包含重复单词或短语的句子很可能造成语言建模中引入重复的模式。这对语言模型来说会产生非常严重的影响,使得模型在预测时容易陷入重复循环(RepetitionLoops)。例如,使用GPT-2 模型,对于给定的上下文:“In a shocking finding, scientist discovereda herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Evenmore surprising to the researchers was the fact that the unicorns spoke perfect English.”。如果使用束搜索(Beam Search),在设置b = 32 时,模型就会产生如下输出,进入了重复循环模式。“Thestudy, published in the Proceedings of the National Academy of Sciences of the United States of America(PNAS), was conducted by researchers from the Universidad Nacional Autónoma de México (UNAM)and the Universidad Nacional Autónoma de México (UNAM/Universidad Nacional Autónoma de México/ Universidad Nacional Autónoma de México/Universidad Nacional Autónoma de México/Universidad Nacional Autónoma de ...”。由于重复循环对于语言模型生成的文本质量有非常大的影响,因此在预训练语料中需要删除这些包含大量重复单词或者短语的句子。

RefinedWeb 构造过程中也进行了句子级别的过滤。使用了文献所提出的过滤方法,提取并过滤文档间超过一定长度的相同字符串。给定两个文档xi 和xj,其中存在长度为k 的公共子串xa...a+ki = xb...b+kj 。当k ⩾ 50 时,就将其中一个子串过滤。公共子串匹配的关键是如何高效完成字符串匹配,文献[64] 将整个文档D 转换为一个超长的字符串序列S,之后构造序列S 的后缀数组(Suffix Array)A。

该数组包含在该序列中的所有后缀的按字典顺序排列的列表。具体而言,后缀数组A是一个整数数组,其中每个元素表示S 中的一个后缀的起始位置。按照字典顺序,A中的元素按照后缀的字典顺序排列。例如,序列“banana”的后缀包括“banana”,“anana”,“nana”,“ana”,“na”和“a”,对应的后缀数组A 为[6, 4, 2, 1, 5, 3]。根据数组A,可以很容易的找出相同的子串。如果S i..i+|s| = S j..j+|s|,那么i 和j 在数组A 中一定在紧邻的位置上。

文献 中设计了并行的后缀数组构造方法,针对Wiki-40B 训练语料(约包含4GB 文本内容),使用拥有96 核CPU 以及768GB 内存的服务器,可以在2.3 分钟内完成计算。对于包含350GB 文本的C4 数据集合,仅需要12 小时可以完成后缀数组构造。在文档级别上,大部分大语言模型都是依靠文档之间的表面特征相似度(例如n-gram 重叠比例)进行检测并删除重复文档[33, 37, 64, 94]。

LLaMA 采用CCNet的处理模式,首先将文档拆分为段落,并把所有字符转换为小写字符、将数字替换为占位符,以及删除所有Unicode 标点符号和重音符号来对每个段落进行规范化处理。然后,使用为SHA-1 方法为每个段落计算一个哈希码(Hash Code),并使用前64 位数字作为键。最后,利用每个段落的键进行重复判断。RefinedWeb[64]首先去除掉页面中菜单、标题、页脚、广告等内容,仅抽取页面中的主要内容。在此基础上,在文档级别进行过滤,采用与文献提到类似的方法,使用n-gram 重叠程度来衡量句子、段落以及文档的相似度。如果重复程度超过预先设定的阈值,则会过滤掉重复段落或文档。

此外,数据集层面也可能存在一定数量的重复情况,比如很多大语言模型预训练集合都会包含GitHub、Wikipedia、C4 等数据集。还需要特别注意的是,预训练语料中混入测试语料,从而造成数据集污染的情况。在实际产生预训练数据时,需要从数据集、文档以及句子三个级别去除重复,这对于改善语言模型的训练具有重要的作用[14, 96]

3.隐私消除

由于绝大多数预训练数据源于互联网,因此不可避免地会包含涉及敏感或个人信息(PersonallyIdentifiable Information,PII)的用户生成内容,这可能会增加隐私泄露的风险。如图2.2所示,输入前缀词“East Stroudsburg Stroudsburg”,语言模型在此基础上补全了姓名、电子邮件地址、电话号码、传真号码以及实际地址。这些信息都是模型从预训练语料中学习得到的。因此,有非常必要从预训练语料库中删除包含个人身份信息的内容。

删除隐私数据最直接的方法是采用基于规则的算法,BigScience ROOTS Corpus 构建过程从大语言模型中获得隐私数据的例子中就是采用了基于命名实体识别的方法,利用命名实体识别算法检测姓名、地址和电话号码等个人信息内容并进行删除或者替换。该方法使用了基于Transformer 的模型,并结合机器翻译技术,可以处理超过100 种语言的文本,消除其中的隐私信息。该算法被集成在muliwai 类库中。

cke_135.png

图2.2 从大语言模型中获得隐私数据的例子

4 词元切分

传统的自然语言处理通常以单词为基本处理单元,模型都依赖预先确定的词表V,在编码输入词序列时,这些词表示模型只能处理词表中存在的词。因此,在使用中,如果遇到不在词表中的未登录词,模型无法为其生成对应的表示,只能给予这些未登录词(Out-of-vocabulary,OOV)一个默认的通用表示。在深度学习模型中,词表示模型会预先在词表中加入一个默认的“[UNK]”(unknown)标识,表示未知词,并在训练的过程中将[UNK] 的向量作为词表示矩阵的一部分一起训练,通过引入某些相应机制来更新[UNK] 向量的参数。在使用时,对于全部的未登录词,都使用[UNK] 的向量作为这些词的表示向量。此外,基于固定词表的词表示模型对词表大小的选择比较敏感。当词表大小过小时,未登录词的比例较高,影响模型性能。而当词表大小过大时,大量低频词出现在词表中,而这些词的词向量很难得到充分学习。理想模式下,词表示模型应能覆盖绝大部分的输入词,并避免词表过大所造成的数据稀疏问题。

为了缓解未登录词问题,一些工作通过利用亚词级别的信息构造词表示向量。一种直接的解决思路是为输入建立字符级别表示,并通过字符向量的组合来获得每个单词的表示,以解决数据稀疏问题。然而,单词中的词根、词缀等构词模式往往跨越多个字符,基于字符表示的方法很难学习跨度较大的模式。为了充分学习这些构词模式,研究人员们提出了子词词元化(Subword Tokenization)方法,试图缓解上文介绍的未登录词问题。词元表示模型会维护一个词元词表,其中既存在完整的单词,也存在形如“c”, “re”, “ing”等单词部分信息,称为子词。词元表示模型对词表中的每个词元计算一个定长向量表示,供下游模型使用。对于输入的词序列,词元表示模型将每个词拆分为词表内的词元。例如,将单词“reborn”拆分为“re”和“born”。模型随后查询每个词元的表示,将输入重新组成为词元表示序列。当下游模型需要计算一个单词或词组的表示时,可以将对应范围内的词元表示合成为需要的表示。因此,词元表示模型能够较好地解决自然语言处理系统中未登录词的问题。词元分析(Tokenization)目标是将原始文本分割成由词元(Token)序列的过程。词元切分也是数据预处理中至关重要的一步。

字节对编码(Byte Pair Encoding,BPE)模型[99] 是一种常见的子词词元模型。该模型所采用的词表包含最常见的单词以及高频出现的子词。在使用中,常见词通常本身位于BPE 词表中,而罕见词通常能被分解为若干个包含在BPE 词表中的词元,从而大幅度降低未登录词的比例。BPE算法包括两个部分:(1)词元词表的确定;(2)全词切分为词元以及词元合并为全词的方法。计算过程如图4所示。

首先,确定语料库中全词的词表和词频,然后将每个单词切分为单个字符的序列,并在序列最后添加符号“</w>”作为单词结尾的标识。比如单词“low”被切分为序列“l␣o␣w␣</w>”。所切分出的序列元素称为字节,即每个单词都切分为字节的序列。之后,按照每个字节序列的相邻字节对和单词的词频,统计每个相邻字节对的出现频率,合并出现频率最高的字节对,将其作为新的词元加入词表,并将全部单词中的该字节对合并为新的单一字节。如图4所示,在第一次迭代时,出现频率最高的字节对是(e,s),故将“es”作为词元加入词表,并将全部序列中相邻的(e,s)字节对合并为es 字节。重复这一步骤,直至BPE 词元词表的大小达到指定的预设值,或没有可合并的字节对为止。

在词元词表确定之后,对于输入词序列中未在词表中的全词进行切分,BPE 算法对词表中的词元按从长到短的顺序进行遍历,用每一个词元和当前序列中的全词或未完全切分为词元的部分进行匹配,将其切分为该词元和剩余部分的序列。例如,对于单词“lowest</w>”,首先通过匹配词元“est</w>”将其切分为“low”, “est</w>”的序列,再通过匹配词元“low”,确定其最终切分结果为“low”, “est</w>”的序列。通过这样的过程,BPE 尽量将序列中的词切分成已知的词元。在遍历词元词表后,对于切分得到的词元序列,为每个词元查询词元表示,构成词元表示序列。若出现未登录词元,即未出现在BPE 词表中的词元,则采取和未登录词类似的方式,为其赋予相同的表示,最终获得输入的词元表示序列。

此外,字节级(Byte-level)BPE 通过将字节视为合并的基本符号,用来改善多语言语料库(例如包含非ASCII 字符的文本)的分词质量。GPT-2、BART 和LLaMA 等大语言模型都采用了这种分词方法。原始LLaMA 的词表大小是32K,并且主要根据英文进行训练,因此,很多汉字都没有直接出现在词表中,需要字节来支持所有的中文字符,由2 个或者3 个Byte Token 才能拼成一个完整的汉字。

对于使用了字节对编码的大语言模型,其输出序列也是词元序列。对于原始输出,根据终结语符</w> 的位置确定每个单词的范围,合并范围内的词元,将输出重新组合为词序列,作为最终的结果。WordPiece也是一种常见的词元分析算法,最初应用于语音搜索系统。此后,该算法做为BERT 的分词器。WordPiece 与BPE 有非常相似的思想,都是通过迭代地合并连续的词元,但在合并的选择标准上略有不同。为了进行合并,WordPiece 需要首先训练一个语言模型,并用该语言模型对所有可能的词元对进行评分。在每次合并时,选择使得训练数据似然概率增加最多的词元对。

cke_136.png

图4 BPE 模型中词元词表的计算过程

由于Google 并没有发布其WordPiece 算法的官方实现,HuggingFace 在其在线NLP 课程中提供了一种更直观的选择度量方法:一个词元对的评分是根据训练语料库中两个词元的共现计数除以它们各自的出现计数的乘积。计算公式如下所示:

cke_137.png

Unigram 词元分析 是另外一种应用于大语言模型的词元分析方法,T5 和mBART 采用该方法构建词元分析器。不同于BPE 和WordPiece,Unigram 词元分析从一个足够大的可能词元集合开始,然后迭代地从当前列表中删除词元,直到达到预期的词汇表大小为止。基于训练好的Unigram语言模型,使用从当前词汇表中删除某个字词后,训练语料库似然性的增加量作为选择标准。为了估计一元语言(Unigram)模型,采用了期望最大化(Expectation–Maximization,EM)算法:每次迭代中,首先根据旧的语言模型找到当前最佳的单词切分方式,然后重新估计一元语言单元概率以更新语言模型。在这个过程中,使用动态规划算法(如维特比算法)来高效地找到给定语言模型时单词的最佳分解方式。以HuggingFace NLP 课程中介绍的Byte Pair Encoding 代码为例,介绍BPE 方法的构建和使用,代码实现如下所示:

from transformers import AutoTokenizer

from collections import defaultdict

corpus = [

"This is the Hugging Face Course.",

"This chapter is about tokenization.",

"This section shows several tokenizer algorithms.",

"Hopefully, you will be able to understand how they are trained and generate tokens.",

]

# 使用GPT-2 tokenizer 将输入分解为单词:

tokenizer = AutoTokenizer.from_pretrained("gpt2")

word_freqs = defaultdict(int)

for text in corpus:

words_with_offsets = tokenizer.backend_tokenizer.pre_tokenizer.pre_tokenize_str(text)

new_words = [word for word, offset in words_with_offsets]

for word in new_words:

word_freqs[word] += 1

# 计算基础词典, 这里使用语料库中的所有字符:

alphabet = []

for word in word_freqs.keys():

for letter in word:

if letter not in alphabet:

alphabet.append(letter)

alphabet.sort()

# 增加特殊Token 在字典的开头,GPT-2 中仅有一个特殊Token``<|endoftext|>''表示文本结束

vocab = ["<|endoftext|>"] + alphabet.copy()

# 将单词切分为字符

splits = {word: [c for c in word] for word in word_freqs.keys()}

#compute_pair_freqs 函数用于计算字典中所有词元对的频率

def compute_pair_freqs(splits):

pair_freqs = defaultdict(int)

for word, freq in word_freqs.items():

split = splits[word]

if len(split) == 1:

continue

for i in range(len(split) - 1):

pair = (split[i], split[i + 1])

pair_freqs[pair] += freq

return pair_freqs

#merge_pair 函数用于合并词元对

def merge_pair(a, b, splits):

for word in word_freqs:

split = splits[word]

if len(split) == 1:

continue

i = 0

while i < len(split) - 1:

if split[i] == a and split[i + 1] == b:

split = split[:i] + [a + b] + split[i + 2 :]

else:

i += 1

splits[word] = split

return splits

# 迭代训练,每次选取得分最高词元对进行合并,直到字典大小达到设置目标为止:

vocab_size = 50

while len(vocab) < vocab_size:

pair_freqs = compute_pair_freqs(splits)

best_pair = ""

max_freq = None

for pair, freq in pair_freqs.items():

if max_freq is None or max_freq < freq:

best_pair = pair

max_freq = freq

splits = merge_pair(*best_pair, splits)

merges[best_pair] = best_pair[0] + best_pair[1]

vocab.append(best_pair[0] + best_pair[1])

# 训练完成后,tokenize 函数用于给定文本进行词元切分

def tokenize(text):

pre_tokenize_result = tokenizer._tokenizer.pre_tokenizer.pre_tokenize_str(text)

pre_tokenized_text = [word for word, offset in pre_tokenize_result]

splits = [[l for l in word] for word in pre_tokenized_text]

for pair, merge in merges.items():

for idx, split in enumerate(splits):

i = 0

while i < len(split) - 1:

if split[i] == pair[0] and split[i + 1] == pair[1]:

split = split[:i] + [merge] + split[i + 2 :]

else:

i += 1

splits[idx] = split

return sum(splits, [])

tokenize("This is not a token.")

 Huggingface 的transformer 类中已经集成了很多分词器,可以直接使用。例如,利用BERT 分词器获得输入“I have a new GPU!”的词元代码如下所示:

>>> from transformers import BertTokenizer

>>> tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

>>> tokenizer.tokenize("I have a new GPU!")

["i", "have", "a", "new", "gp", "##u", "!"]

好了,上面就是关于大语言模型训练数据常见的处理方法,大家如果还想了解更多关于大语言模型的干货,可以持续关注我!

点击关注,第一时间了解华为云新鲜技术~

相关推荐

LakeAgent:DWS数据仓库的第二大脑,告别 “翻译式运维”,迈入智能自治时代

和普通 SQL 改写工具不同,LakeAgent 自动做多方案代价对比,主动规避负优化陷阱:补充分区键过滤实现剪枝,扫描分区由 37 收敛至 1,执行代价从 758.28 降至 113.74;未来的数据仓库,将不止能算、能存,更能看懂自己、诊断自己、理解自己。长久以来,数仓的智能都依附于人:信号需要人解读,瓶颈需要人研判,经验困在个体里,无法随底座永续生长。CPU 高、CPU 告警、CPU 诊断、CPU 使用率过高、CPU 满。语法、错误码、计费、性能调优、最佳实践、故障处置等全场景内容。

华为云官方博客 483

如何使用RDS Supabase后端BaaS能力:文件存储(File Storage)

• product-images(公开桶,允许公共读取):策略名称"Public read for product-images",允许SELECT,目标角色anon,策略定义bucket_id = 'product-images'。上传/删除需另配INSERT/DELETE策略,详见SQL。• product-specs(私有桶,仅认证用户访问自己的文件夹):建议拆为上传、读取、删除三条策略,策略定义均为 bucket_id = 'product-specs' 且仅限本人文件夹(详见下文 SQL)。

华为云官方博客 424

如何使用RDS Supabase后端BaaS能力:实时订阅与推送(Realtime)

Realtime 把数据库的每次变更同步到客户端:表里增、删、改一行,订阅者无需刷新页面或主动请求即可秒级收到。三大能力各司其职:• Postgres Changes — 监听表的 INSERT/UPDATE/DELETE,变化即通知• Broadcast — 客户端之间直接互发,适合瞬时通知、协同编辑• Presence — 跟踪频道里“谁在线”典型场景有实时数据展示(订单、库存、监控指标即时刷新)、即时通讯(消息收发、在线名单、“对方正在输入”)、协同编辑与实时通知。

华为云官方博客 412

AI Agent如何通过MCP连接到华为云RDS Supabase应用平台

Schema元数据列出所有可访问的表(按schema分组)。Schema元数据列出表的列及元数据(类型/默认值/约束)。Schema元数据列出所有约束(PK/FK/UNIQUE/CHECK/EXCLUDE)。可按schema/表/类型过滤。Schema元数据列出所有外键关系。可按schema/表过滤。Schema元数据列出所有索引及定义和大小。可按schema/表过滤。Schema元数据列出已应用的数据库迁移记录。Schema元数据列出已安装的PostgreSQL扩展。

华为云官方博客 430

华为大数据Flink让每一 CU 算力,跑出开源 5.74 倍的性能

1. 开源Apache Flink 已成为业界流计算事实标准,但在极端重负载场景下存在性能瓶颈。2. 华为大数据Flink通过多项自研深度优化,在执行计划、算子执行、状态存储三个层面构建协同的优化体系。3. Nexmark Benchmark 测试结果:整体性能提升 5.74 倍,极端重负载场景性能领先最高 18.3 倍。4. 100% 兼容 Apache Flink 1.20,业务代码零改造,无缝迁移。

华为云官方博客 346

LakeAgent实战 | 业务分析篇从一句提问到业务分析

本文以“订单金额变化”分析为例,展示LakeAgent如何通过自然语言提问,结合DataArtsStudio的数据资产与专业技能,帮助业务人员快速定位数据、生成SQL、追踪血缘、生成报告。从问题出发,逐步实现数据发现、变化洞察、原因追溯与团队协作,最终形成可复用的分析流程与企业规则,显著提升数据分析效率与一致性。

华为云官方博客 351

华为云RDS Supabase AI应用已开放公测 :30分钟搭建AI应用后端

认证、存储、实时推送、数据库API——4个后端模块,传统开发需要数周。今天,你只需要30分钟。AI创业公司的全栈开发工程师。上周老板说"下周要上线的AI对话应用,后端你来搞"——认证鉴权、数据库接口、文件存储、实时推送,每一个模块都需要数周搭建,而市场不会等你。小张打开华为云RDS Supabase,30分钟搭好认证、数据库API、对象存储,剩下的时间全用来打磨AI交互体验。基于开源Supabase+华为云RDS PostgreSQL全托管能力,为开发者提供。

华为云官方博客 349

如何使用RDS Supabase后端BaaS能力:数据库函数(Database Function)

上一篇介绍了 Database Data API——建表即自动生成增删改查接口,解决单表读写,但聚合统计、跨表事务、字段自动维护等逻辑已超出其能力边界。本篇推进到数据库函数(Database Function):把业务逻辑封装进数据库,前端通过 .rpc() 调用,由触发器自动响应数据变更。上一篇中,小张基于 Data API 完成了产品目录的建表与基础读写。但新需求随之而来:按分类统计产品数与价格区间、上架新品同时写产品表与定价表、产品修改后自动刷新更新时间。

华为云官方博客 436

如何使用RDS Supabase后端BaaS能力:创表即生成API(Database Data API)

认证、存储、实时推送、数据库API——4个后端模块,传统开发要数周。本系列逐个拆解,首篇聚焦数据库API(Database Data API):建表即得 API,无需手写后端。小张,AI创业公司的全栈工程师。老板让他做个产品目录页,展示产品与价格、支持上下架。传统做法要搭后端、写接口、配权限,工期少说1-2周;而在华为云RDS Supabase,建两张表、应用 SDK 直连,几分钟增删改查全跑通。

华为云官方博客 450

从一句话到一个能出去的链接,AI开发者空间做了什么

自行搭建的 Agent、正在使用的开源项目、团队既有的工具,都可以接入,可以通过AI创建或者手动搭建环境;华为云 AI开发者空间——面向开发者的云端一站式开发平台,做的就是把这段路接上:环境免安装,浏览器打开即为完整的 Linux 运行环境,预置的 AI 智能体开箱即用。第一个任务建议选能出结果的:做一个游戏、生成一个页面、创建一台实例,从需求走到可访问的链接,一次就能看清这个环境在做什么。沙箱是一个完整的 Linux 环境,依赖、服务、端口都是真实的,不是模拟。环境释放后,权限随之失效。

华为云官方博客 405

华为云码道配置自定义大模型,四种方式完整实操

案例介绍。

华为云官方博客 594

图数据库:实现穿透式监管的数据基座

穿透式监管标志着国企监管从“管企业”向“管资本”转型过程中的关键一跃。而图数据库正是这一跃的技术支点。从股权穿透到资金链穿透,从供应链穿透到数据穿透,华为GES图数据库正在将“穿透式监管”从理念变为可落地、可操作的实践。无论是天眼查式的全量链路查询,还是某集团财经的税务规则判断,抑或是芯片供应链式的部件风险分析,乃至通过Palantir构建决策知识图谱,其底层逻辑都是一致的——用图的力量,穿透一切形式的“隔离层”,直抵风险本质与责任核心。

华为云官方博客 647

《公共云三十问》正式收官,奔赴企业AI百场景新征程

今年6月底,公共云产业联盟重点推出《公共云三十问》专栏,以每周三问的节奏,连载十周,解读《先进公共云》白皮书,分享国计民生系列案例,旨在凝聚共识、推动落地实践。同时,专栏分析公共云在产业升级、民生福祉、科技创新、全球发展等方面的作用,梳理中国特色公共云发展路径:以普惠云拓展用云广度,以智算云提升用云深度,以自主云夯实用云厚度,以全球云打开用云跨度。这十问从专属云、行业云切入,深入政务、金融、交通、电力、钢铁、化工、油气、制造等国计民生场景,回答公共云“怎么用”。

华为云官方博客 461

开发者小技巧|IAM配置,让码道代码智能体连续30天免登录

案例介绍。

华为云官方博客 636

码道深度对接CodeArts,让需求自动落地为代码

案例介绍。

华为云官方博客 707

【公共云三十问 之三十】拥抱AI,企业如何建设面向智能体的专属云?

企业可分阶段建设覆盖开发、运行、运营及安全的一体化智能体平台——从构建一站式、高低码协同的智能体开发平台,到打造高性能、极致弹性的运行时环境,再到搭建AgentOps驱动的持续运营与运维体系,同时构建端到端、多层次的全链路安全防护体系。在数据湖建设方面,遵循“存量复用、平滑演进、AI导向、分步迭代”原则,分三阶段推进——打造AI多模数据湖核心能力、完成存算分离与统一元数据管理、实现闭环赋能全面支撑智能体规模化落地,在保护既有投资的前提下将传统数据平台转型为AI数据专属供给平台。

华为云官方博客 815

【公共云三十问 之二十九】国计民生之制造:制造云如何重塑数智时代的新质生产力?

平台打通软件交付的完整路径,覆盖需求管理、代码托管、代码检查、编译构建、制品仓库、部署、测试等关键环节,支持大模型能力融入研发全流程,实现从需求到交付的端到端管理。通过构建“研发一朵云”,方案打破地域与组织壁垒,实现跨团队协同开发,有效缩短软件交付周期,助力工业制造企业从“传统研发”走向“敏捷研发”,加速数智化转型进程。当制造云真正成为数据流通的平台、AI创新的底座,公共云的社会价值将从基础设施层向生产场景层持续延伸,为新型工业化建设和制造强国战略注入源源不断的动力,重塑数智时代的中国制造新质生产力。

华为云官方博客 782

告别重复手工迁仓,码道MCP+Skill实现仓库批量迁移

案例介绍。

华为云官方博客 778

【公共云三十问 之二十八】国计民生之油气:智算云如何叩响数智时代的“地心蓝金”?

西南油气田以“向地球深部要资源”为战略方向,联合以华为云Stack为代表的公共云服务商共同打造统一算力底座,建设西南区域数据湖与通用技术平台,构建“勘探开发工程技术、天然气生产过程管控、天然气产运储销”等三个一体化协同应用场景,支撑油气勘探、开发生产、管输储运等全业务链的数智化转型。当智算云真正成为数据流通的平台、AI创新的底座,油气田得以将算力效能、数据价值与智能技术深度融入勘探开发全链条,将“看不见的算力”转化为“摸得着的储量”,以智能化手段持续降低勘探风险、缩短发现周期、提高采收效率,确保生产安全。

华为云官方博客 611

【公共云三十问 之二十七】国计民生之化工:数智云如何重塑传统化工新范式?

在架构方面,方案构建云边协同的统一体系,涵盖AI协同、数据协同与运营协同三大维度——总部集中训练大模型,边缘节点负责推理执行,云边持续迭代,实现“边用边学”的智能闭环,模型平均精度提升20%以上。此外,方案提供一站式企业级工业物联网平台、数据湖与数据治理平台,覆盖工业数据分析“采、存、算、管、用”全流程,打通生产现场与管理系统间的数据壁垒,有效消除数据孤岛。层面,方案充分发挥软硬协同优势,实现计算、存储、网络与云平台的深度协同,训练线性度超95%,为大模型训练推理提供强劲算力支撑。▲化工“数智”新模式。

华为云官方博客 660

【公共云三十问 之二十六】国计民生之钢铁:数智云如何淬炼中国钢铁新力量?

同时,构建云边端协同的统一架构,支撑集团总部与各生产基地两级协同发展——总部集中训练大模型,边缘节点负责推理执行,云边持续迭代,实现训推一体化的资源调度与高效协同,为钢铁行业的数智化转型构建了坚实的算力底座。层面,方案构建覆盖“工业数采→边缘IT/OT融合→统一数据湖→数据治理平台→数据应用”全链路的一站式数据治理与流通平台,打通生产现场与管理系统间的数据壁垒,让数据“采得到、流得动、用得好”,加速数据价值从生产现场向经营决策层流动释放。湘潭钢铁集团的钢铁数智云,是钢铁工业智能云建设的标杆案例。

华为云官方博客 520

LakeWatch——MRS 智能运维Agent

从资源池、队列、作业等多个维度,对集群CPU与内存资源进行精细化分析与对比,直观呈现不同时间段的空闲、满载等使用状态,识别资源浪费,指导治理优化,为扩缩容决策提供数据支撑。对HDFS存储进行多维度深度分析(目录、用户、用户组等),涵盖使用量、增量、文件大小分布及数据热度等指标,帮助快速识别增长较快的目录、长期未访问的文件,统计目录文件数量与小文件占比,评估HDFS总存储量与扩缩容需求,为存储治理与资源规划提供全面数据支撑。Agent主动巡检,识别异常趋势并提前预警,让运维从"事后处理"转向"事前预防"。

华为云官方博客 509

华为云专题文档发布:丰富的AI案例、选型指导和概念解读

发布 “云服务选型”、“云计算概念”专题,提供云服务选型指导,助您选择匹配业务的云服务,解读云计算相关概念,开启云上学习之路。开发者工具和文档专区上线,提供从学习、实践到反馈的全链路支持。帮助中心新增100余篇AI案例。

华为云官方博客 284

一个人,也能用AI做点“星东西”

华为云星耀创想者大赛-2026华为云OPC创意大赛等你来~

华为云官方博客 286

从需求到可执行工作项:MCP+Skill 让智能体规划真正落地

回顾整个体验,以前让智能体帮我拆需求,它是洋洋洒洒给我列了一大篇 Markdown,看着挺像那么回事,但最后还是得我一条条往 CodeArts Req 里搬,搬完再手动挂父子关系、排日期,拆需求五分钟,搬运两小时。现在好了,MCP 给智能体接上了"手",Skill 给它装上了"项目经理的脑子",一句话下去,34 个工作项连带排期、层级关系全给我建好了,甘特图一拉,齐刷刷都在两周内,节省了多少工作量啊,美滋滋。本次实操在码道代码智能体基础上,构建了一套"需求→可执行工作项"的自动化规划方案。

华为云官方博客 557

华为云码道「码力续航计划」更新!

✅上新GLM‑5.3‑Flash,高速响应,代码生成、工程解析、Agent调试高效输出。新增GLM‑5.3‑Flash福利模型,每日解锁1000万免费Tokens。● 本次活动共发放总量价值100万元Tokens,发完即止!把耗算力的编码重活,交给华为云码道代码智能体🚀🚀。● 每日额度准时刷新,当日清零、次日满血重置。✅复杂算法、大项目解析、批量代码生成随便跑。✅不用抠额度、不用算消耗,放开调试大胆迭代。✅无需额外操作,登录即送,直接切换模型使用。● 把算力交给码道,让撸码不再内耗👏🏻。

华为云官方博客 669

【公共云三十问 之二十四】国计民生之交通:交通云如何铺就数智通衢新坦途?

交通行业作为支撑实体经济的关键基础设施,涵盖公路、铁路、机场、港口、地铁等众多子领域,其中,公路网络作为综合交通运输体系的基础骨架,承担着全国超过70%的客货运量,其数字化、智能化转型的需求尤为迫切。方面,提供Agent开发框架、知识库管理、RAG工程、意图识别、静态应用编排及模型评测等能力,支持客户将行业知识、业务流程与AI能力深度融合,快速构建面向收费稽核、路网调度、应急处置等场景的智能应用。开发并实现落地应用,全面覆盖建设、管理、养护、运营、服务、安全、办公七大业务领域。

华为云官方博客 458

【公共云三十问 之二十五】国计民生之电力:电力云如何点亮数智电力新引擎?

方案构建了覆盖数据获取、质量评估到标准化处理的全链路能力。基于公共云服务商智算底座及气象大模型,通过时空图神经网络重新建模产流机制,中国华电建成超50TB多源融合数据集,突破时空建模与机理融合等五大关键技术,短期径流预测精度较传统机理模型提升5个百分点以上,实现15天中期径流预测精度超85%,推理效率达秒级。基于气象大模型的基础架构与预训练能力,客户可直接在大模型之上开展增量训练与微调,充分利用场站所在区域的高精度历史数据(如3公里、1公里分辨率),针对不同场站和区域的地形地貌与气候特征进行模型调优。

华为云官方博客 377

邀请函|第三届“兴智杯”全国人工智能创新应用大赛开幕式,期待您现场莅临

AI 算法工程师、大模型应用开发、智能编码、国产软硬件栈开发者、开源开发者。大赛官方参赛对象就包含企事业单位开发者团队、个人开发者中华人民共...诉求:了解本届赛题方向、对接算力 / 技术资源、认识同行、获取参赛信息。意向参赛团队、往届参赛选手、技术团队负责人、个人独立开发者。

华为云官方博客 472

码道LSP:打通“最后一公里”,让AI真正懂你的项目

用AI代码智能体分析项目时,您是否遇到过这样的困境:查询方法调用链、字段改动影响范围,返回一堆杂乱文本,夹杂注释、日志、无关代码,需要人工逐一筛选复核。根源在于传统方案只会文本检索,大模型拿到的是原始源码文本,缺少代码语义信息。华为云码道CodeArts代码智能体接入LSP能力,尝试解决这个开发痛点。

华为云官方博客 547
上一篇: 玩转Sermant开发,开发者能力机制解析
下一篇: 详解ZooKeeper在微服务注册中心的应用
华为云开发者联盟
华为云开发者联盟 企业官方账号 企业官方账号
博客等级 码龄10年 72万+粉丝 5983原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值