在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 Hugging Face 微调转换器语言模型以实现语言多样性。 垂直搜索。 哎。

在 Amazon SageMaker 上使用 Hugging Face 微调转换器语言模型以实现语言多样性

今天大约有 7,000 种语言在使用。 尽管在 19 世纪后期试图发明诸如沃拉普克语或世界语这样的人工语言,但没有统一的迹象。 人们仍然选择创造新的语言(想想你最喜欢的说克林贡语、多斯拉克语或精灵语的电影角色)。

如今,自然语言处理 (NLP) 示例以英语为主,仅 5% 的人口使用母语,只有 17% 的人会说英语。

数字鸿沟 被定义为可以访问数字技术的人和不能访问数字技术的人之间的差距。 由于语言障碍而缺乏获取知识或教育的机会也造成了数字鸿沟,不仅在不会说英语的人之间,而且对于无法访问非英语内容的说英语的人来说,减少思想和知识的多样性。 有很多东西要相互学习。

在这篇文章中,我们总结了低资源语言的挑战,并在 Amazon SageMaker 上使用 Hugging Face 转换器尝试了涵盖 100 多种语言的不同解决方案方法。

我们为问答任务微调了各种预训练的基于转换器的语言模型。 我们在示例中使用土耳其语,但您可以将此方法应用于其他受支持的语言。 我们的重点是 BERT [1] 变体, 因为 BERT 的一大特点是其跨不同任务的统一架构。

我们展示了使用 Hugging Face 转换器的几个好处 亚马逊SageMaker,例如大规模的培训和实验,以及提高生产力和成本效益。

自然语言处理概述

自 2017 年以来,NLP 取得了几项重大发展。诸如 Transformer [2] 等深度学习架构的出现、在超大型数据集上训练此类模型的无监督学习技术以及迁移学习显着改善了当前状态自然语言理解中的艺术。 预训练模型中心的到来进一步使 NLP 社区集体知识的获取更加民主化,不再需要从头开始。

语言模型是一种 NLP 模型,它学习预测序列中的下一个单词(或任何掩码单词)。 作为起点的语言模型的真正魅力在于三个方面:首先,研究表明,在大型文本语料库数据上训练的语言模型比以前的方法学习的单词含义更复杂。 例如,为了能够预测句子中的下一个单词,语言模型必须善于理解上下文、语义以及语法。 其次,为了训练语言模型,在预训练期间不需要标记数据(稀缺且昂贵)。 这很重要,因为大量未标记的文本数据在网络上以多种语言公开可用。 第三,已经证明,一旦语言模型足够聪明,可以预测任何给定句子的下一个单词,就可以相对容易地执行其他 NLP 任务,例如使用非常少的标记数据进行情感分析或问答,因为微调重用来自预训练语言模型的表示 [3]。

完全托管的 NLP 服务也加速了 NLP 的采用。 亚马逊领悟 是一项完全托管的服务,使文本分析能够从文档内容中提取洞察力,并且支持多种语言。 Amazon Comprehend 支持自定义分类和自定义实体识别,使您能够构建特定于您的要求的自定义 NLP 模型,而无需任何 ML 专业知识。

低资源语言的挑战和解决方案

大量语言面临的主要挑战是它们可用于训练的数据相对较少。 这些被称为 低资源语言. m-BERT 论文 [4] 和 XLM-R 论文 [7] 将乌尔都语和斯瓦希里语称为低资源语言。

下图指定了 80 多种语言的 ISO 代码,以及两个主要预训练之间的大小差异(以对数尺度)[7]。 在维基百科(橙色)中,只有 18 种语言超过 1 万篇文章,52 种语言超过 1,000 篇文章,但 164 种语言只有 1-10,000 篇文章 [9]。 CommonCrawl 语料库(蓝色)将低资源语言的数据量增加了两个数量级。 尽管如此,与英语、俄语或德语等资源丰富的语言相比,它们仍然相对较小。

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 Hugging Face 微调转换器语言模型以实现语言多样性。 垂直搜索。 哎。

就维基百科的文章数量而言,土耳其语是同一组超过 100,000 篇文章中的另一种语言(第 28 位),与乌尔都语(第 54 位)一起。 与乌尔都语相比,土耳其语被视为中等资源语言。 土耳其语有一些有趣的特点,可以通过在语言学和标记化方面创造某些挑战来使语言模型更加强大。 这是一种黏着性语言。 它有一个非常自由的词序,一个复杂的形态,或者没有英语对等的时态。 英语等语言中由多个单词组成的短语可以用一个单词形式来表达,如下例所示。

土耳其语 英语
阅读 s
阅读 的家庭
猫科动物 属于 猫的家庭
leştirebileceklerimizdenmişçesineyken 当它看起来是我们可以制造的

两种主要的解决方案是特定语言模型或多语言模型(有或没有跨语言监督):

  • 单语语言模型 – 第一种方法是将 BERT 变体应用于特定的目标语言。 训练数据越多,模型性能越好。
  • 多语言掩码语言模型 – 另一种方法是在多种语言上预训练大型 Transformer 模型。 多语言语言建模旨在通过对大量语言进行预训练来解决资源匮乏的语言缺乏数据挑战,以便从一种语言学习的 NLP 任务可以转移到其他语言。 多语言掩码语言模型 (MLM) 推动了跨语言理解任务的最新发展。 两个例子是:
    • 多语言 BERT – 使用 Wikipedia 语料库对多语言 BERT 模型进行了 104 种不同语言的训练。 然而,已经表明它只能很好地概括相似的语言结构和类型特征(例如,具有相似词序的语言)。 它的多语言性减少了,特别是对于具有不同词序的语言(例如,主语/宾语/动词)[4]。
    • XLM-R – 跨语言语言模型 (XLM) 使用并行数据集(两种不同语言的相同文本)使用跨语言目标进行训练,或者使用单语言数据集 [6] 不使用跨语言目标进行训练。 研究表明,低资源语言受益于扩展到更多语言。 XLM-RoBERTa 是受 RoBERTa [5] 启发的基于 Transformer 的模型,其出发点是多语言 BERT 和 XLM 欠调的命题。 它使用 Wikipedia 和 CommonCrawl 语料库对 100 种语言进行了训练,因此与 m-BERT [7] 相比,低资源语言的训练数据量大约大两个数量级。

低资源语言的多语言语言模型的另一个挑战是词汇量和标记化。 因为所有语言在多语言语言模型中使用相同的共享词汇表,所以在增加词汇表大小(这会增加计算要求)与减少它(词汇表中不存在的单词将被标记为未知或使用字符)之间存在权衡而不是单词作为标记会忽略任何结构)。 词片标记化算法结合了两种方法的优点。 例如,它通过将单词拆分为子单词直到它出现在词汇表中或直到到达单个字符来有效地处理词汇表外的单词。 除了某些语言(例如中文)之外,基于字符的标记化并不是很有用。 存在解决低资源语言挑战的技术,例如使用某些分布进行采样 [6]。

下表描述了“kedileri”(意思是“它的猫”)这个词的三种不同标记器的行为方式。 对于某些语言和 NLP 任务,这会有所不同。 例如,对于问答任务,模型返回起始令牌索引和结束令牌索引的跨度; 返回“kediler”(“猫”)或“kedileri”(“它的猫”)会丢失一些上下文并导致某些指标的不同评估结果。

预训练模型 词汇量 “Kedileri”的代币化*
dbmdz/bert-base-土耳其语-uncased 32,000 令牌 [华彩] ##一世 [九月]
输入 ID 2 23714 1023 3
bert-base-多语言-uncased 105,879 令牌 [华彩] KED ##伊勒 ##一世 [九月]
输入 ID 101 30210 33719 10116 102
Deepset/xlm-roberta-base-squad2 250,002 令牌 柯克 di LERI
输入 ID 0 1345 428 1341 .
*英文:(它的)猫

因此,尽管低资源语言从多语言语言模型中受益,但跨共享词汇表执行标记化可能会忽略某些语言的某些语言特征。

在下一节中,我们通过使用土耳其语 QA 数据集对问答任务进行微调来比较三种方法:BERTurk [8]、多语言 BERT [4] 和 XLM-R [7]。

解决方案概述

我们的工作流程如下:

  1. 准备数据集 亚马逊SageMaker Studio 笔记本环境并上传到 亚马逊简单存储服务 (亚马逊S3)。
  2. 通过提供微调脚本,在 SageMaker 训练深度学习容器上启动并行训练作业。
  3. 从每个实验中收集元数据。
  4. 比较结果并确定最合适的模型。

下图说明了解决方案体系结构。

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 Hugging Face 微调转换器语言模型以实现语言多样性。 垂直搜索。 哎。

有关 Studio 笔记本的更多信息,请参阅 深入了解 Amazon SageMaker Studio 笔记本架构. 有关 Hugging Face 如何与 SageMaker 集成的更多信息,请参阅 AWS和Hugging Face合作以简化和加速自然语言处理模型的采用.

准备数据集

Hugging Face Datasets 库提供了强大的数据处理方法,可以快速准备好数据集,以便在深度学习模型中进行训练。 以下代码加载土耳其 QA 数据集并探索其中的内容:

data_files = {}
data_files["train"] = 'data/train.json'
data_files["validation"] = 'data/val.json' ds = load_dataset("json", data_files=data_files) print("Number of features in dataset: n Train = {}, n Validation = {}".format(len(ds['train']), len(ds['validation'])))

大约有 9,000 个样本。

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 Hugging Face 微调转换器语言模型以实现语言多样性。 垂直搜索。 哎。

输入数据集略微转换为预训练模型预期的格式,并包含以下列:

df = pd.DataFrame(ds['train'])
df.sample(1)

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 Hugging Face 微调转换器语言模型以实现语言多样性。 垂直搜索。 哎。
输出的英文翻译如下:

  • 上下文 – Resit Emre Kongar(生于 13 年 1941 月 XNUMX 日,伊斯坦布尔),土耳其社会学家、教授。
  • – Emre Kongar 的学术头衔是什么?
  • 回答 - 教授

微调脚本

Hugging Face Transformers 库提供了一个示例代码来微调问答任务的模型,称为 运行_qa.py. 以下代码初始化训练器:

 # Initialize our Trainer trainer = QuestionAnsweringTrainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, eval_examples=eval_examples, tokenizer=tokenizer, data_collator=data_collator, post_process_function=post_processing_function, compute_metrics=compute_metrics, )

让我们从高层次上回顾一下构建块。

分词器

该脚本使用 AutoTokenizer 班级。 这 AutoTokenizer 类负责返回与模型对应的正确标记器:

tokenizer = AutoTokenizer.from_pretrained( model_args.model_name_or_path, cache_dir=model_args.cache_dir, use_fast=True, revision=model_args.model_revision, use_auth_token=None, )

以下是分词器如何工作的示例:

from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("deepset/xlm-roberta-base-squad2") input_ids = tokenizer.encode('İstanbulun en popüler hayvanı hangisidir? Kedileri', return_tensors="pt")
tokens = tokenizer('İstanbulun en popüler hayvanı hangisidir? Kedileri').tokens()

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 Hugging Face 微调转换器语言模型以实现语言多样性。 垂直搜索。 哎。

型号

该脚本加载一个模型。 AutoModel 类(例如, AutoModelForQuestionAnswering) 在给定名称和预训练模型路径的情况下,直接创建一个具有相关架构的权重、配置和词汇表的类。 由于 Hugging Face 的抽象,您可以使用相同的代码轻松切换到不同的模型,只需提供模型的名称。 请参阅以下示例代码:

 model = AutoModelForQuestionAnswering.from_pretrained( model_args.model_name_or_path, config=config, cache_dir=model_args.cache_dir, revision=model_args.model_revision, )

预处理和训练

prepare_train_features()prepare_validation_features() 方法分别预处理训练数据集和验证数据集。 代码迭代输入数据集,并根据上下文和当前问题构建一个序列,并使用正确的模型特定标记类型 ID(标记的数字表示)和注意掩码。 然后序列通过模型。 这将为开始和结束位置输出一系列分数,如下表所示。

输入数据集字段 QuestionAnsweringTrainer 的预处理训练数据集字段
id 输入ID
标题 注意掩码
上下文 开始位置
结束位置
答案 { answer_start, answer_text } .

评价

compute_metrics() 方法负责计算指标。 我们使用以下流行的指标来回答问题:

  • 完全符合 – 测量与任何一个基本事实答案完全匹配的预测百分比。
  • F1分数 – 测量预测和真实答案之间的平均重叠。 F1 分数是准确率和召回率的调和平均值:
    • 平台精度 – 共享词的数量与预测中的总词数的比率。
    • 记得 – 共享词的数量与基本事实中的总词数的比率。

SageMaker 的托管培训

设置和管理自定义机器学习 (ML) 环境可能既耗时又麻烦。 和 AWS 深度学习容器 (DLC)对于 Hugging Face Transformers 库,我们可以访问预先打包和优化的深度学习框架,这使得我们可以轻松地在多个训练作业中运行我们的脚本,并且只需要最少的额外代码。

我们只需要使用 拥抱脸估计器 在 SageMaker Python SDK 中可用,具有以下输入:

# Trial configuration
config['model'] = 'deepset/xlm-roberta-base-squad2'
config['instance_type'] = 'ml.p3.16xlarge'
config['instance_count'] = 2 # Define the distribution parameters in the HuggingFace Estimator config['distribution'] = {'smdistributed':{'dataparallel':{ 'enabled': True }}}
trial_configs.append(config) # We can specify a training script that is stored in a GitHub repository as the entry point for our Estimator, # so we don’t have to download the scripts locally.
git_config = {'repo': 'https://github.com/huggingface/transformers.git'} hyperparameters_qa={ 'model_name_or_path': config['model'], 'train_file': '/opt/ml/input/data/train/train.json', 'validation_file': '/opt/ml/input/data/val/val.json', 'do_train': True, 'do_eval': True, 'fp16': True, 'per_device_train_batch_size': 16, 'per_device_eval_batch_size': 16, 'num_train_epochs': 2, 'max_seq_length': 384, 'pad_to_max_length': True, 'doc_stride': 128, 'output_dir': '/opt/ml/model' } huggingface_estimator = HuggingFace(entry_point='run_qa.py', source_dir='./examples/pytorch/question-answering', git_config=git_config, instance_type=config['instance_type'], instance_count=config['instance_count'], role=role, transformers_version='4.12.3', pytorch_version='1.9.1', py_version='py38', distribution=config['distribution'], hyperparameters=hyperparameters_qa, metric_definitions=metric_definitions, enable_sagemaker_metrics=True,) nlp_training_job_name = f"NLPjob-{model}-{instance}-{int(time.time())}" training_input_path = f's3://{sagemaker_session_bucket}/{s3_prefix_qa}/' test_input_path = f's3://{sagemaker_session_bucket}/{s3_prefix_qa}/' huggingface_estimator.fit( inputs={'train': training_input_path, 'val': test_input_path}, job_name=nlp_training_job_name, experiment_config={ "ExperimentName": nlp_experiment.experiment_name, "TrialName": nlp_trial.trial_name, "TrialComponentDisplayName": nlp_trial.trial_name,}, wait=False, )

评估结果

当土耳其问答任务的微调工作完成后,我们比较了三种方法的模型性能:

  • 单语语言模型 – 在土耳其问答文本上微调的预训练模型称为 bert-base-土耳其语-uncased [8]。 它仅在两个 epoch 和 1 个标记项目中实现了 75.63 的 F56.17 分数和 9,000 的精确匹配分数。 但是,当不存在预训练的语言模型,或者可用于从头开始训练的数据很少时,这种方法不适合低资源语言。
  • 具有多语言 BERT 的多语言语言模型 – 预训练的模型称为 bert-base-多语言-uncased. 多语言 BERT 论文 [4] 表明它可以很好地泛化各种语言。 与单语模型相比,它的表现更差(F1 得分 71.73,完全匹配 50:45),但请注意,该模型处理 100 多种其他语言,表示土耳其语的空间较小。
  • 使用 XLM-R 的多语言语言模型 – 预训练的模型称为 xlm-罗伯塔-基地-小队2. XLM-R 论文表明,在不牺牲每种语言性能的情况下,可以为 100 多种语言建立一个大型模型 [7]。 对于土耳其问答任务,它比多语种 BERT 和单语种 BERT F1 得分分别高出 5% 和 2%(F1 得分 77.14,精确匹配 56.39)。

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 Hugging Face 微调转换器语言模型以实现语言多样性。 垂直搜索。 哎。

我们的比较没有考虑模型之间的其他差异,例如模型容量、使用的训练数据集、预训练的 NLP 任务、词汇量或标记化。

额外的实验

提供的笔记本包含其他实验示例。

SageMaker 提供了广泛的训练实例类型。 我们在 p3.2xlarge(GPU:Nvidia V100 GPU,GPU 架构:Volta (2017))、p3.16xlarge(GPU:8 个 Nvidia V100 GPU)和 g4dn.xlarge(GPU:Nvidia T4)上微调了 XLM-R 模型GPU,GPU 架构:Turing (2018)),并观察到以下内容:

  • 训练时间 – 根据我们的实验,XLM-R 模型在 p24xlarge 上训练大约需要 3.2 分钟,在 g30dn.xlarge 上训练大约需要 4 分钟(大约长 23%)。 我们还对两个 p3.16xlarge 实例进行了分布式微调,训练时间减少到 10 分钟。 有关在 SageMaker 上对基于转换器的模型进行分布式训练的更多信息,请参阅 在 Amazon SageMaker 上使用 Hugging Face Transformers 对问答任务的 BERT 大型模型进行分布式微调.
  • 培训费用 – 我们使用 AWS Pricing API 来获取 SageMaker 的按需价格以动态计算它。 根据我们的实验,在 p1.58xlarge 上的训练成本大约为 3.2 美元,在 g4dn.xlarge 上大约少四倍(0.37 美元)。 使用 3.16 个 GPU 在两个 p16xlarge 实例上进行分布式训练的成本为 9.68 美元。

总而言之,尽管 g4dn.xlarge 是最便宜的机器,但它的训练时间也比我们试验过的最强大的实例类型(两个 p3.16xlarge)长了大约三倍。 根据您的项目优先级,您可以从多种 SageMaker 训练实例类型中进行选择。

结论

在这篇文章中,我们探索了微调预训练的基于转换器的语言模型,用于中等资源语言(在本例中为土耳其语)的问答任务。 您可以使用单个模型将此方法应用于 100 多种其他语言。 在撰写本文时,将模型扩大到涵盖全球 7,000 种语言仍然令人望而却步,但 NLP 领域提供了一个拓宽我们视野的机会。

语言是人类交流的主要方式,是交流价值观和分享文化遗产之美的一种手段。 语言多样性加强了跨文化对话并建立了包容性社会。

ML 是一个高度迭代的过程; 在单个项目的过程中,数据科学家训练数百种不同的模型、数据集和参数以寻求最大的准确性。 SageMaker 提供最完整的工具集来利用 ML 和深度学习的力量。 它使您可以大规模组织、跟踪、比较和评估 ML 实验。

Hugging Face 与 SageMaker 集成,可帮助数据科学家更快、更轻松地开发、训练和调整最先进的 NLP 模型。 我们展示了在 Amazon SageMaker 上使用 Hugging Face 转换器的几个好处,例如大规模培训和实验,以及提高生产力和成本效益。

您可以在 SageMaker 可用的所有 AWS 区域中以您的首选语言在 SageMaker 中试验 NLP 任务。 示例笔记本代码可在 GitHub上.

要了解 Amazon SageMaker Training Compiler 如何将深度学习模型的训练速度提高多达 50%,请参阅 新 - 介绍 SageMaker 培训编译器.

作者想对 Mariano Kamp 和 Emily Webber 审阅草稿并提供建议表示最深切的感谢。

参考资料

  1. J. Devlin 等人,“BERT:用于语言理解的深度双向变压器的预训练”,(2018 年)。
  2. A. Vaswani 等人,“注意力就是你所需要的”,(2017 年)。
  3. J. Howard 和 S. Ruder,“文本分类的通用语言模型微调”,(2018 年)。
  4. T. Pires 等人,“多语言 BERT 有多多语言?”,(2019 年)。
  5. Y. Liu 等人,“RoBERTa:一种稳健优化的 BERT 预训练方法”,(2019 年)。
  6. G. Lample 和 A. Conneau,“跨语言语言模型预训练”,(2019 年)。
  7. A. Conneau 等人,“大规模无监督跨语言表征学习”,(2019 年)。
  8. 斯特凡·施韦特。 BERTurk – 土耳其语的 BERT 模型(2020 年)。
  9. 多语言维基统计 https://en.wikipedia.org/wiki/Wikipedia:Multilingual_statistics

作者简介

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 Hugging Face 微调转换器语言模型以实现语言多样性。 垂直搜索。 哎。阿纳夫·哈雷 是 AWS 全球金融服务的首席解决方案架构师。 他的主要工作重点是帮助金融服务机构在云中构建和设计分析和机器学习应用程序。 Arnav 拥有爱丁堡大学人工智能硕士学位,拥有 18 年的行业经验,从他创立的小型初创公司到诺基亚和美国银行等大型企业。 工作之余,Arnav 喜欢与两个女儿共度时光、寻找新的独立咖啡店、阅读和旅行。 你可以找到我 LinkedIn 在现实生活中的英国萨里。

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 Hugging Face 微调转换器语言模型以实现语言多样性。 垂直搜索。 哎。哈桑-巴斯里·阿基马克 (计算机工程理学学士和理学硕士,商学院高级管理人员工商管理硕士)是 Amazon Web Services 的高级解决方案架构师。 他是一名商业技术专家,为企业客户提供建议。 他的专业领域是设计大规模数据处理系统和机器学习解决方案的架构和业务案例。 Hasan 为欧洲、中东和非洲的客户提供业务开发、系统集成、项目管理。 自 2016 年以来,他在创业孵化计划中无偿指导了数百名企业家。

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 Hugging Face 微调转换器语言模型以实现语言多样性。 垂直搜索。 哎。海科霍茨 是 AI 和机器学习的高级解决方案架构师,并领导 AWS 内的自然语言处理 (NLP) 社区。 在担任此职务之前,他是亚马逊欧盟客户服务的数据科学主管。 Heiko 帮助我们的客户在 AWS 上的 AI/ML 之旅中取得成功,并与许多行业的组织合作,包括保险、金融服务、媒体和娱乐、医疗保健、公用事业和制造业。 在业余时间,Heiko 尽可能多地旅行。

时间戳记:

更多来自 AWS机器学习