AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


训练数据集的准备:训练翻译器
发布日期:2024-05-08 04:50:32 浏览次数: 1859


在上一篇中,我们介绍了数据清洗对大语言模型如RAG的帮助:

数据清洗技术-大语言模型

在本篇中,我们将介绍如何为一个一起学习模型准备训练数据集。

无论是机器学习还是深度学习,训练时数据集的准备十分关键,高质量的数据才能训练出精度高的模型。对于企业而言,不同的训练任务用的数据集差别很大,数据准备的步骤区别也会很大。本文仅以训练一个机器学习翻译器为例,介绍准备数据集的大致思路。

一、机器翻译系统数据准备准测

机器翻译系统的数据处理流程:

  1. 训练阶段: 要求大量数据,以训练神经网络模型,这是成本最高的步骤。

  2. 验证阶段: 利用验证集监控模型性能,性能未提升时考虑停止训练,选择表现最佳的模型。

  3. 评估阶段: 评估模型在接近实际应用的数据集上的表现,如果结果满意,则部署模型;否则,需要重新训练。

数据集的关键要素:

  • 平行语料库: 包含源语言和目标语言的配对文本,最好是针对特定领域。

  • 源语言: 待翻译的文本语言。

  • 目标语言: 翻译后的语言。

  • 目标领域: 数据应尽量贴近系统部署后的实际应用场景。

数据集的质量要求:

  • 准确性: 翻译应准确无误,最好由专业翻译人员制作。

  • 对齐: 确保数据中的句子或段落正确对齐。

  • 原创性: 源端文本应为原创,非其他语言的翻译。

  • 领域相关性: 数据应尽可能属于目标领域。

  • 原始性: 数据应保持原始状态,避免过度预处理。

数据量的重要性:

  • 训练数据: 在保质的前提下,数据越多越好。

  • 验证和评估数据: 质量比数量更重要,通常几千个平行语段即可。

单语数据的应用:

  • 单语数据容易获取,可用于生成合成平行数据,增强训练效果。

防止数据泄漏:

  • 确保训练数据与验证/评估数据之间无重叠,避免评估结果不真实。

翻译质量的考量:

  • 理想情况下,源语文本应由母语者撰写,目标语译文由目标语母语者翻译。

获取平行语料库:

  • OPUS: 提供丰富的多语言平行语料库资源。

  • Hugging Face 数据集: 包含大量标记为“翻译”的平行语料库。

二、制作数据集的步骤

我们使用OPUS上的数据集作为基础数据。

2.1 获取基础数据集

访问https://opus.nlpl.eu/results/zh-CN&en/corpus-result-table网址,选择选择目标端的语言。

选择KED4、moses格式、多语言包,

#wget https://object.pouta.csc.fi/OPUS-KDE4/v2/moses/en-zh_CN.txt.zip

解压缩下载文件包。 

#unzip en-zh_CN.txt.zip

查看初始的中英文文件内容:

#cat KDE4.en-zh_CN.en

#cat KDE4.en-zh_CN.zh_CN

2.2 取前10万行

分别取两个文件的前10万行,生成train.cn和train.en文件。

root@david1a100:~/trans# head -n 100000  KDE4.en-zh_CN.zh_CN > train.cn

root@david1a100:~/trans#  head -n 100000  KDE4.en-zh_CN.en >train.en

2.3 对齐数据集

调用clean-corpus-n.perl脚本(github moses-smt/mosesdecoder)。

下面的命令调用了clean-corpus-n.perl脚本,并传递了一些参数。下面是这些参数的作用:

  • -max-word-length 50: 设置单词的最大长度为50个字符。如果任何行中包含长度超过50个字符的单词,那么这一行将被丢弃。

  • train: 这是输入文件的前缀。脚本将会处理名为train.cn和train.en的文件。

  • cn: 这是第一种语言的语言代码,表示脚本将处理名为train.cn的文件。

  • en: 这是第二种语言的语言代码,表示脚本将处理名为train.en的文件。

  • train.clean: 这是输出文件的前缀。经过清洗的语料库将被保存为train.clean.cn和train.clean.en。

  • 0: 这是最小句子长度。脚本将丢弃长度小于0个单词的句子,实际上这意味着不会因为长度过短而丢弃任何句子。

  • 150: 这是最大句子长度。脚本将丢弃长度超过150个单词的句子。


上所述,执行这个命令将会对名为train.cn和train.en的文件进行以下处理:

  1. 读取两个平行文件,每个文件中的每一行都是对应的翻译句子。

  2. 处理句子对,移除空格和不必要的字符。

  3. 丢弃单词长度超过50个字符的句子。

  4. 丢弃单词数量少于0或多于150个的句子。

  5. 计算句子对中每个句子的单词数量,丢弃单词数量比例超出默认值9(没有通过命令行参数改变)的句子。

  6. 将清洗后的语料库保存到train.clean.cn和train.clean.en文件中。


root@david1a100:~/trans# perl clean-corpus-n.perl -max-word-length 50 train cn en train.clean 0 150

clean-corpus.perl: processing train.cn & .en to train.clean, cutoff 0-150, ratio 9

..........(100000)

Input sentences: 100000  Output sentences:  98922

生成后的文件是:train.clean.cn和train.clean.en。

查看两个对齐后文件的长度:

root@david1a100:~/trans# wc -l train.clean.cn train.clean.en

  98922 train.clean.cn

  98922 train.clean.en

 197844 total

2.4 清洗数据

simple_cleaning 是 preprocess.git 项目中的一个工具,它用于对文本数据进行清洗。这个工具主要执行以下几个操作:

  1. 移除包含无效 UTF-8 编码的行:这一步确保所有的文本都可以被正确地读取和处理,不会因为编码错误而引起程序错误。

  2. 移除包含控制字符的行(除了制表符和换行符):控制字符通常不可见,且可能会干扰文本处理和分析。

  3. 移除包含过多通用和继承的 Unicode 脚本字符的行(如数字):这些字符可能会对文本分析造成干扰。

  4. 移除包含过多或过少标点符号的行:这有助于去除格式不正确或不规范的文本。

  5. 移除与预期脚本相差太大的行(例如,移除英文数据中的中文句子):这有助于保持数据的一致性,确保语料库中的文本符合预期的语言。

simple_cleaning 通常用于处理双语平行语料库,它会同时处理两个相关联的文件(源语言和目标语言),并确保清洗操作在两种语言之间保持一致性。这样处理后的数据会被保存在新的文件中,例如在提供的文本中,清洗后的数据被保存在了 train.clean.pp.es 和 train.clean.pp.en 文件中。

#sudoapt-get update

#sudoapt-get install libboost-all-dev

git clone https://github.com/kpu/preprocess.git
cd preprocess
mkdir build
cd build
cmake ..

make -j4

root@david1a100:~/trans# preprocess/build/bin/dedupe -p train.clean.pp.cn train.clean.pp.en train.clean.pp.dedup.cn trai

n.clean.pp.dedup.en

Reading train.clean.pp.cn

----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100

****************************************************************************************************

Kept 6758 / 6933 = 0.974758

root@david1a100:~/trans#

2.5 Normalization正常化

sacremoses normalize 的作用是将文本数据中的各种符号标准化,确保不同的数据集中使用相同的符号,比如标点符号、数字和空格,并且这些符号都使用相同的UTF-8编码。这个步骤的目的是为了消除数据集中的不一致性,这可能是由于不同的语言习惯、排版规则或数据源造成的。

标准化可以包括以下操作:

  1. 将不同风格的引号统一为标准形式。例如,将不同语言中的单引号(‘)、法语引号(«)和中文书名号(《)等统一为标准的双引号(“)。

  2. 减少词汇表的大小,即不同标记类型的数量,通过将具有相似角色或含义的符号映射到同一个符号。

  3. 保证机器翻译系统不会生成具有不同标点风格的翻译,如果这个步骤应用于训练数据的目标侧。

  4. 如果还标准化了训练数据的目标侧,我们需要确保映射到期望的字符。例如,如果目标语言使用特定类型的引号,我们应该执行不同的映射。

sacremoses 是一个用Python实现的工具,它基于Moses项目中的normalize-punctuation.perl脚本。通过sacremoses提供的命令行界面(CLI),可以方便地对数据进行标准化处理。例如,使用以下命令:

sacremoses normalize < input_file > output_file

这个命令会读取input_file中的文本,对其进行标准化处理,并将结果输出到output_file。这个过程有助于确保后续处理步骤(如分词、训练机器翻译模型等)的一致性和准确性。

我们看实际操作命令:

#pip install sacremoses

root@david1a100:~/trans# sacremoses normalize < train.clean.pp.dedup.cn > train.clean.pp.dedup.norm.cn

root@david1a100:~/trans# sacremoses normalize < train.clean.pp.dedup.en > train.clean.pp.dedup.norm.en

2.6 分词与数值化

SentencePiece 是一个文本处理工具,专门用于对文本数据进行分词(tokenization)。它的主要作用和特点如下:

  1. 语言无关性:SentencePiece 可以用于任何语言的文本,包括那些不使用空格作为单词分隔符的语言,如日语、中文和泰语。

  2. 不需要预先分词:与传统的基于规则的分词器不同,SentencePiece 不需要先对文本进行传统的分词处理。它可以直接处理原始文本,将连续的字符序列分割成有意义的子单元(subtokens)。

  3. 子词分词(Subword Tokenization):SentencePiece 实现了子词分词算法,如Byte-Pair Encoding (BPE) 或 Unigram。这些算法可以将罕见的或未知的单词分解成更小的、更常见的片段,从而减少模型需要处理的词汇表大小,并增加模型对未知单词的泛化能力。

  4. 自定义词汇表大小:用户可以指定词汇表的大小,SentencePiece 将基于这个大小训练一个模型,以最佳方式覆盖训练数据中的字符序列。

  5. 适用于神经网络模型:传统的分词器可能会产生大量罕见的标记,这些标记对于神经网络模型来说难以有效表示和处理。SentencePiece 通过生成更规范的、可预测的标记集,帮助神经网络模型更好地学习和泛化。

  6. 简化预处理流程:由于不需要传统的分词步骤,SentencePiece 简化了文本预处理流程,减少了潜在的错误和问题。

在机器翻译和其他自然语言处理任务中,SentencePiece 被广泛用于准备训练数据和处理新的输入文本。它特别适合用于大型语言模型,如 T5 或 FLAN 系列模型,这些模型通常需要处理多种语言和大量的文本数据。通过使用 SentencePiece,研究人员和开发人员能够为这些模型提供一致和优化的输入,从而提高模型的性能和效率。

我们查看具体的命令:

root@david1a100:~/trans# pip install sentencepiece

root@david1a100:~/trans# cat train.clean.pp.dedup.norm.cn train.clean.pp.dedup.norm.en > train.clean.pp.dedup.norm.cn-en

root@david1a100:~/trans# spm_train -input=train.clean.pp.dedup.norm.cn-en -model_prefix=cn-en.8kspm -vocab_size=8000

上面这三条命令是用于安装SentencePiece库、准备用于训练SentencePiece模型的数据集,以及训练SentencePiece模型的步骤。下面是每条命令的具体作用:

  1. pip install sentencepiece:这条命令用于安装SentencePiece库。SentencePiece是一个用于文本分词和数值化的库,它可以处理包括中文和英文在内的多种语言,并支持不同的分词算法,如Byte-Pair Encoding (BPE) 和 Unigram。

  2. cat train.clean.pp.dedup.norm.cn train.clean.pp.dedup.norm.en > train.clean.pp.dedup.norm.cn-en:这条命令使用cat(concatenate)命令将中文和英文的清洗、去重、规范化后的文本文件合并成一个文件。这个合并后的文件train.clean.pp.dedup.norm.cn-en将包含两种语言的文本,用于训练一个双语的SentencePiece模型。

  3. spm_train -input=train.clean.pp.dedup.norm.cn-en -model_prefix=cn-en.8kspm -vocab_size=8000:这条命令使用SentencePiece的spm_train工具来训练一个新的分词模型。这里指定了输入文件train.clean.pp.dedup.norm.cn-en,这是上一步创建的合并语料文件。model_prefix参数设置了模型文件的前缀为cn-en.8kspm,意味着生成的模型文件将以这个前缀开始,后缀为.model(完整的模型文件名将是cn-en.8kspm.model)。vocab_size=8000参数设置了模型的词汇表大小为8000个最常见的标记。

这三条命令的目的是为了训练一个SentencePiece模型,该模型将用于将中英文本转换为机器学习模型可以处理的数值ID形式。这是机器翻译或其他NLP任务中数据预处理的重要步骤。


root@david1a100:~/trans# spm_encode -model=cn-en.8kspm.model < train.clean.pp.dedup.norm.cn > train.clean.pp.dedup.norm.spm8k.cn

root@david1a100:~/trans# spm_encode -model=cn-en.8kspm.model < train.clean.pp.dedup.norm.en > train.clean.pp.dedup.norm.spm8k.en

这两条命令使用训练好的SentencePiece模型来对中文和英文的文本文件进行分词和数值化处理:

  1. spm_encode -model=cn-en.8kspm.model < train.clean.pp.dedup.norm.cn > train.clean.pp.dedup.norm.spm8k.cn:这条命令使用spm_encode工具和训练好的模型cn-en.8kspm.model来处理文件train.clean.pp.dedup.norm.cn,这是一个包含规范化后的中文文本的文件。命令将分词和数值化后的中文文本输出到新文件train.clean.pp.dedup.norm.spm8k.cn中。

  2. spm_encode -model=cn-en.8kspm.model < train.clean.pp.dedup.norm.en > train.clean.pp.dedup.norm.spm8k.en:这条命令的作用与第一条相似,不过是针对英文文本文件train.clean.pp.dedup.norm.en。处理后的英文文本会输出到新文件train.clean.pp.dedup.norm.spm8k.en中。

这两个新文件(.spm8k.cn和.spm8k.en)包含了分词和数值化后的文本,这意味着原始文本中的每个标记(单词或子词)已经被转换成了一个数值ID。这些数值ID文件可以直接用于训练机器翻译模型,因为神经网络模型无法直接处理原始文本,而需要数值形式的输入。


最终处理好两个数据集,一个英文的,一个中文的,两者相互对应,各取10行进行对照验证:

root@david1a100:~/trans# head train.clean.pp.dedup.norm.spm8k.en

▁& ▁Oliv ier . ▁Goffart ; ▁& ▁Oliv ier . ▁Goffart . ▁mail ;▁& ▁Charles . ▁Connell ; ▁& ▁Charles . ▁Connell . ▁mail ;▁The ▁& ▁c ryptography ; ▁plugin ▁allow s ▁you ▁to ▁send ▁and ▁re c ie ve ▁encrypted ▁and / ▁or ▁signed ▁messages .▁C ryptography ▁can ▁use ▁the ▁public ▁keys ▁stored ▁in ▁your ▁& ▁kde ; ▁address ▁book ▁for ▁each ▁contact . ▁However , ▁it ▁mus t ▁be ▁ able ▁to ▁know ▁which ▁address ▁book ▁entry ▁is ▁associat ed ▁with ▁which ▁meta - contact . ▁To ▁provide ▁this ▁information , ▁choose ▁Properties ▁from ▁the ▁meta - contact ▁context ▁menu , ▁and ▁then ▁set ▁the ▁Address ▁ Book ▁Link . ▁C ryptography ▁can ▁also ▁export ▁public ▁keys ▁that ▁you ▁have ▁set ▁to ▁your ▁address ▁book . ▁If ▁a ▁meta - contact ▁has ▁an ▁address ▁book ▁link , ▁then ▁the ▁key ▁will ▁go ▁in ▁the ▁correct ▁address ▁book ▁entry , ▁replac ing ▁an ▁exist ing ▁one . ▁If ▁no ▁link ▁exists ▁( possibl y ▁be cause ▁no ▁address ▁book ▁entry ▁exists ▁for ▁the ▁individual ▁in ▁question ) , ▁a ▁new ▁entry ▁will ▁be ▁created . ▁This ▁entry ▁will ▁have ▁two ▁fields ▁filled : ▁the ▁public ▁key ▁from ▁& ▁k opete ; ▁and ▁the ▁meta - contact ' s ▁display ▁name .▁Documentation ▁c opyright ▁& ▁copy ; ▁& ▁Oliv ier . ▁Goffart ; ▁& ▁Oliv ier . ▁Goffart . ▁mail ; ▁and ▁& ▁copy ; ▁2007 ▁& ▁Charles . ▁Connell ; ▁& ▁Charles . ▁Connell . ▁mail ;▁& ▁P ame la . ▁Ro ber t s ; ▁& ▁P ame la . ▁Ro ber t s . ▁mail ;▁& ▁konqueror ; ▁is ▁& ▁kde ; ▁' s ▁a dvanced ▁File ▁Manager , ▁Web ▁Browse r ▁and ▁Uni ver s al ▁View ing ▁Application .▁& ▁konqueror ; ▁is ▁part ▁of ▁the ▁kde base ▁package ▁which ▁an ▁essential ▁part ▁of ▁& ▁kde ; .▁For ▁instructions ▁on ▁acquir ing ▁& ▁kde ; ▁please ▁see ▁http : ▁/ ▁/ w ww . ▁kde . ▁org .▁For ▁further ▁information ▁about ▁& ▁konqueror ; ▁you ▁might ▁like ▁to ▁visit ▁http : ▁/ ▁/ w ww . ▁konqueror . ▁org .

root@david1a100:~/trans# head train.clean.pp.dedup.norm.spm8k.cn

▁& ▁Oliv ier . ▁Goffart ; ▁& ▁Oliv ier . ▁Goffart . ▁mail ;▁& ▁Charles . ▁Connell ; ▁& ▁Charles . ▁Connell . ▁mail ;▁& ▁c ryptography ; ▁插件 允许您 传送 和 接受 加密 或 签 署 过 的信息 ▁。▁C ryptography ▁ 可以使用 您的 ▁& ▁kde ; ▁ 地址簿 中 存放 的 每个 联系人 的 公 钥 。▁然而 , ▁它 必须 知道 哪个 地址 条目 与 哪个 ▁meta - ▁contact ▁ 相 关联 。▁要 提供 此信息 , ▁从 菜单中选择 ▁meta - ▁contact ▁属性 , ▁然后 设置 地址簿 链接 。▁C ryptography ▁也可以 导出 设置 在您 地址簿 中 存放 的 公 钥 。▁如果 一个 ▁meta - ▁contact ▁ 对应 一个 地址簿 链接 , ▁那么 密钥 将会在 正确的 地址簿 生效 而 替 代 原 有 的 。▁如果没有 已存在 的链接 ▁( 可能是 因为 没有 实际 存在 的 地址簿 项目 ) ▁ , ▁一个 全 新的 条目 将会被 建立 。▁这个 条目 将会 有 两个 已 填写 的 域 : ▁ 来自 于 ▁& ▁k opete ; ▁的 公 钥 和 ▁meta - ▁contact ▁上的 显示 名称 ▁。▁文档 版 权 ▁& ▁copy ; ▁& ▁Oliv ier . ▁Goffart ; ▁& ▁Oliv ier . ▁Goffart . ▁mail ; ▁和 ▁& ▁copy ; ▁2007 ▁& ▁Charles . ▁Connell ; ▁& ▁Charles . ▁Connell . ▁mail ;▁& ▁P ame la . ▁Ro ber t s ; ▁& ▁P ame la . ▁Ro ber t s . ▁mail ;▁& ▁konqueror ; ▁是 ▁& ▁kde ; ▁的 高级 文件管理器 、 ▁Web ▁ 浏览器 和 通用 查看 应用程序 ▁。▁& ▁konqueror ; ▁是 ▁& ▁kde ; ▁的 核心 部件 ▁kde base ▁软件包 的一部分 ▁ ,▁要获得关于 如何 获取 ▁& ▁kde ; ▁的 指示 , ▁请参见 ▁http : ▁/ / ▁w ww . ▁kde . ▁org ▁。▁要获得关于 ▁& ▁konqueror ; ▁ 的更多信息 , ▁您可能 想要 浏览 ▁http : ▁/ / ▁w ww . ▁konqueror . ▁org ▁。

我们也可以对数据集进行token和数值化一起处理:

下面是使用SentencePiece进行文本与数值ID相互转换的四个命令行接口(CLI)命令。前两个cli用于ID转化,后两个cli用于转化回去进行验证。

首先,确保使用的是相同的SentencePiece模型文件进行编码和解码。

将中文文本转换为数值ID:

spm_encode --model=cn-en.8kspm.model --output_format=id < train.clean.pp.dedup.norm.cn > train.clean.pp.dedup.norm.spm8k.cn.ids

将英文文本转换为数值ID:

spm_encode --model=cn-en.8kspm.model --output_format=id < train.clean.pp.dedup.norm.en > train.clean.pp.dedup.norm.spm8k.en.ids

接下来,使用相同的模型文件将数值ID解码回文本:

1. 将中文数值ID解码为文本:

spm_decode --model=cn-en.8kspm.model --input_format=id < train.clean.pp.dedup.norm.spm8k.cn.ids > train.clean.pp.dedup.norm.decoded.cn

2.将英文数值ID解码为文本:

spm_decode --model=cn-en.8kspm.model --input_format=id < train.clean.pp.dedup.norm.spm8k.en.ids > train.clean.pp.dedup.norm.decoded.en

在训练神经网络模型进行机器翻译任务时,通常不需要将SentencePiece模型(如cn-en.8kspm.model)直接传递给神经网络。神经网络通过嵌入层(embedding layer)来学习如何将数值ID映射到高维空间中的向量表示,这些向量捕捉了词汇的语义信息。

嵌入层的权重在训练过程中自动学习,不需要显式地知道每个ID对应的文本。模型关注的是如何最有效地利用这些ID来预测正确的输出,而不是ID的具体含义。

在预处理和数据准备阶段,需要使用SentencePiece模型来将文本转换为数值ID,以及在推理(inference)阶段将生成的数值ID序列解码回文本。这样,模型才能够处理数值数据,并且能够理解模型的输出。

总结来说,在训练神经网络模型时:

  • 预处理阶段:使用SentencePiece模型将原始文本转换为数值ID序列。

  • 训练阶段:神经网络使用数值ID序列进行训练,学习如何将ID映射到嵌入向量,并在模型的其余部分使用这些向量来执行翻译任务。

  • 推理阶段:将模型输出的数值ID序列解码回文本,以便人类可以理解,这一步骤需要再次使用SentencePiece模型。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询