设置 AutoML 以训练自然语言处理模型

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

本文介绍如何使用 Azure 机器学习中的自动化 ML 训练自然语言处理 (NLP) 模型。 可以通过 Azure 机器学习 Python SDK v2 或 Azure 机器学习 CLI v2 使用自动化 ML 创建 NLP 模型。

自动化 ML 支持 NLP,后者允许 ML 专业人员和数据科学家引入自己的文本数据并为 NLP 任务构建自定义模型。 NLP 任务包括多类文本分类、多标签文本分类和命名实体识别 (NER)。

可以与 Azure 机器学习数据标签功能无缝集成,以标记文本数据或引入现有标记数据。 自动化 ML 提供了在多 GPU 计算群集上使用分布式训练的选项,可以加快模型训练速度。 通过使用 Azure 机器学习的 MLOps 功能,生成的模型可以大规模运作。

先决条件

适用于:Azure CLI ml 扩展 v2(当前版本)

  • Azure 订阅。 如果没有 Azure 订阅,请立即注册来试用试用版订阅

  • 具有 GPU 训练计算的 Azure 机器学习工作区。 若要创建工作区,请参阅创建工作区资源。 有关 Azure 提供的 GPU 实例的更多详细信息,请参阅 GPU 优化虚拟机大小

    警告

    对于几个 NLP 用例(例如非英语数据集和更大范围的文档),需要支持多语言模型和使用最大序列长度较长的模型。 因此,这些方案可能需要更高的 GPU 内存才能成功进行模型训练,例如 NC_v3 系列或 ND 系列。

  • 已安装 Azure 机器学习 CLI v2。 有关更新和安装最新版本的指导,请参阅安装和设置 CLI (v2) 文档。

  • 本文假设你对设置自动化机器学习试验有一定的了解。 遵循操作说明,了解主要的自动化机器学习试验设计模式。

选择 NLP 任务

确定要完成的 NLP 任务。 目前,自动化 ML 支持以下深度神经网络 NLP 任务。

任务 AutoML 作业语法 说明
多类文本分类 CLI v2:text_classification
SDK v2:text_classification()
有多个可能的类,并且每个样本正好归入一个类。 任务是预测每个样本的正确类。

例如,将电影脚本分类为“喜剧”或“浪漫”。
多标签文本分类 CLI v2:text_classification_multilabel
SDK v2:text_classification_multilabel()
有多个可能的类,并且每个样本可以分配有任意数量的类。 任务是预测每个样本的所有类

例如,将电影脚本分类为“喜剧”、“浪漫”或“喜剧和浪漫”。
命名实体识别 (NER) CLI v2:text_ner
SDK v2:text_ner()
序列中的标记有多个可能的标签。 任务是预测每个序列的所有标记的标签。

例如,从非结构化文本(如合同或财务文件)中提取特定于域的实体。

阈值

阈值是一种多标签功能,允许用户选择预测概率将导致正标签的阈值。 较低的值允许更多的标签,当用户更关心召回率时,这种情况更有利,但此选项可能会导致更多的误报。 较高的值允许更少的标签,因此对于关心精准率的用户而言更有利,但此选项可能会导致更多的漏报。

准备数据

对于自动化 ML 中的 NLP 试验,你可以为多类和多标签分类任务引入 .csv 格式的数据。 对于 NER 任务,支持使用空格作为分隔符并遵循 CoNLL 格式的双列 .txt 文件。 以下各节提供了每个任务接受的数据格式的详细信息。

多类

对于多类分类,数据集可以包含几个文本列和正好一个标签列。 以下示例只有一个文本列。

text,labels
"I love watching Shanghai Bulls games.","NBA"
"Tom Brady is a great player.","NFL"
"There is a game between Yankees and Orioles tonight","MLB"
"Stephen Curry made the most number of 3-Pointers","NBA"

多标签

对于多标签分类,数据集列与多类相同,但标签列中的数据有特殊的格式要求。 下表中提供了两种接受的格式和示例。

标签列格式选项 多个标签 一个标签 无标签
纯文本 "label1, label2, label3" "label1" ""
带引号的 Python 列表 "['label1','label2','label3']" "['label1']" "[]"

重要

不同的分析程序用于读取这些格式的标签。 如果你使用的是纯文本格式,请在标签中仅使用字母、数字和 '_'。 所有其他字符都被识别为标签的分隔符。

例如,如果标签为 "cs.AI",它会被读取为 "cs""AI"。 而使用 Python 列表格式时,标签将为 "['cs.AI']",读取为 "cs.AI"

采用纯文本格式的多标签的示例数据。

text,labels
"I love watching Shanghai Bulls games.","basketball"
"The four most popular leagues are NFL, MLB, NBA and NHL","football,baseball,basketball,hockey"
"I like drinking beer.",""

Python 列表中采用引号格式的多标签的示例数据。

text,labels
"I love watching Shanghai Bulls games.","['basketball']"
"The four most popular leagues are NFL, MLB, NBA and NHL","['football','baseball','basketball','hockey']"
"I like drinking beer.","[]"

命名实体识别 (NER)

与采用 .csv 格式数据集的多类或多标签不同,命名实体识别需要采用 CoNLL 格式。 文件必须正好包含两列,在每一行中,标记和标签用一个空格分开。

例如,

Hudson B-loc
Square I-loc
is O
a O
famous O
place O
in O
New B-loc
York I-loc
City I-loc

Stephen B-per
Curry I-per
got O
three O
championship O
rings O

数据验证

在训练模型之前,自动化 ML 会对输入数据应用数据验证检查,以确保数据可以正确地进行预处理。 如果上述任何检查都失败,运行将失败,并出现相关的错误消息。 下面是通过每个任务的数据验证检查的要求。

注意

一些数据验证检查同时适用于训练集和验证集,而另一些仅适用于训练集。 如果测试数据集无法通过数据验证,这意味着自动化 ML 无法捕获它,并且存在模型推理失败或模型性能下降的可能性。

任务 数据验证检查
所有任务 至少需要 50 个训练样本
多类和多标签 训练数据和验证数据必须符合以下条件
- 具有同一组列
- 列从左到右的顺序相同
- 同名列的数据类型相同
- 至少有两个唯一标签
- 每个数据集中的唯一列名称(例如,训练集不能有多个名为“Age”的列)
仅多类
仅多标签 - 标签列格式必须是接受的格式
- 至少有一个示例应具有 0 个或 2 个以上的标签,否则它应该是 multiclass 任务
- 所有标签都应为 strint 格式,无重叠。 不应同时具有标签 1 和标签 '1'
仅 NER - 文件不应以空行开头
- 每行必须是空行,或遵循格式 {token} {label},其中令牌和标签之间有一个空格,标签后无空格
- 所有标签都必须以 I-B- 或精确的 O 开头。 区分大小写
- 两个示例之间有一个空行
- 在文件末尾正好有一个空行

配置试验

自动化 ML 的 NLP 功能是通过特定于任务的 automl 类型作业触发的,这与提交自动化 ML 试验的分类、回归和预测任务的工作流相同。 你将设置参数,就像在这些试验中一样,如 experiment_namecompute_name 和数据输入。

但存在关键的区别:

  • 可以忽略 primary_metric,因为它仅用于报告目的。 目前,自动化 ML 仅为 NLP 的每次运行训练一个模型,并且没有模型选择。
  • 只有多类和多标签文本分类任务才需要 label_column_name 参数。
  • 如果数据集中超过 10% 的样本包含的标记超过 128 个,则会将其视为长范围。
    • 若要使用长范围文本功能,应为 GPU 使用 NC6 或更高/更好的 SKU,例如:NCv3 系列。

适用于:Azure CLI ml 扩展 v2(当前版)

对于 CLI v2 自动化 ML 作业,可以在 YAML 文件中配置试验,如下所示。

语言设置

作为 NLP 功能的一部分,自动化 ML 支持 104 种语言,利用特定于语言和预先训练的多语言文本 DNN 模型,如 BERT 系列模型。 目前,语言选择默认为英语。

下表汇总了基于任务类型和语言应用的模型。 请参阅支持的语言及其代码的完整列表。

任务类型 dataset_language 的语法 文本模型算法
多标签文本分类 "eng"
"deu"
"mul"
英语 BERT 无大写
德语 BERT
多语言 BERT

对于所有其他语言,自动化 ML 应用多语言 BERT
多类文本分类 "eng"
"deu"
"mul"
英语 BERT 大小写
多语言 BERT

对于所有其他语言,自动化 ML 应用多语言 BERT
命名实体识别 (NER) "eng"
"deu"
"mul"
英语 BERT 大小写
德语 BERT
多语言 BERT

对于所有其他语言,自动化 ML 应用多语言 BERT

适用于:Azure CLI ml 扩展 v2(当前版本)

可以在配置 YAML 文件的特性化部分中指定数据集语言。 BERT 还用于自动化 ML 试验训练的特征化过程,详细了解自动化 ML 中的 BERT 集成和特征化 (SDK v1)

featurization:
   dataset_language: "eng"

分布式训练

你还可以在 Azure 机器学习计算群集上使用分布式训练来运行 NLP 试验。

适用于:Azure CLI ml 扩展 v2(当前版本)

提交 AutoML 作业

适用于:Azure CLI ml 扩展 v2(当前版本)

要提交 AutoML 作业,可以运行以下 CLI v2 命令,其中包含 .yml 文件路径、工作区名称、资源组和订阅 ID。


az ml job create --file ./hello-automl-job-basic.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

代码示例

适用于:Azure CLI ml 扩展 v2(当前版本)

有关每个 NLP 任务,请参阅以下示例 YAML 文件。

模型扫描和超参数优化(预览版)

重要

此功能目前处于公开预览状态。 此预览版在提供时没有附带服务级别协议,我们不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。

有关详细信息,请参阅适用于 Azure 预览版的补充使用条款

AutoML NLP 允许通过配置中的超参数搜索空间提供模型列表和超参数组合。Hyperdrive 生成多个子运行,每个子运行是给定 NLP 模型和一组超参数值的微调运行,这些超参数值是根据提供的搜索空间选择和扫描的。

支持的模型算法

下面列出了 AutoML NLP 中目前可用于微调的所有预训练文本 DNN 模型:

  • bert-base-cased
  • bert-large-uncased
  • bert-base-multilingual-cased
  • bert-base-german-cased
  • bert-large-cased
  • distilbert-base-cased
  • distilbert-base-uncased
  • roberta-base
  • roberta-large
  • distilroberta-base
  • xlm-roberta-base
  • xlm-roberta-large
  • xlnet-base-cased
  • xlnet-large-cased

请注意,大模型比其基础模型要大。 它们通常性能更高,但会占用更多的 GPU 内存和训练时间。 因此,它们的 SKU 要求更严格:我们建议在 ND 系列 VM 上运行以获得最佳结果。

支持的超参数

下表描述了 AutoML NLP 支持的超参数。

参数名称 说明 语法
gradient_accumulation_steps 在通过调用优化器的 step 函数执行一个梯度下降步骤之前,要对其梯度求和的反向操作的数量。

这是为了使用一个有效的批大小,该大小比适合 GPU 的最大大小大 gradient_accumulation_steps 倍。
必须是正整数。
learning_rate 初始学习速率。 必须是 (0, 1) 范围内的浮点数。
learning_rate_scheduler 学习速率计划程序的类型。 必须从 linear, cosine, cosine_with_restarts, polynomial, constant, constant_with_warmup 中选择。
model_name 支持的模型之一的名称。 必须从 bert_base_cased, bert_base_uncased, bert_base_multilingual_cased, bert_base_german_cased, bert_large_cased, bert_large_uncased, distilbert_base_cased, distilbert_base_uncased, roberta_base, roberta_large, distilroberta_base, xlm_roberta_base, xlm_roberta_large, xlnet_base_cased, xlnet_large_cased 中选择。
number_of_epochs 训练循环数。 必须是正整数。
training_batch_size 训练批大小。 必须是正整数。
validation_batch_size 验证批大小。 必须是正整数。
warmup_ratio 用于线性预热的总训练步骤数的比率,范围为 0 到 learning_rate。 必须是 [0, 1] 范围内的浮点数。
weight_decay 优化器为 sgd、adam 或 adamw 时的权重衰减值。 必须是 [0, 1] 范围内的浮点数。

所有离散超参数只允许使用选择分布,例如整数类型的 training_batch_size 和字符串类型的 model_name 超参数。 learning_rate 等所有连续超参数支持所有分布。

配置扫描设置

可以配置所有与扫描相关的参数。 可以使用以相应模型为条件的超参数来构造多个模型子空间,如每个超参数优化示例中所示。

可用于一般 HyperDrive 作业的相同离散和连续分布选项在此处受支持。 参阅超参数优化模型中的所有 9 个选项

适用于:Azure CLI ml 扩展 v2(当前版本)

limits: 
  timeout_minutes: 120  
  max_trials: 4 
  max_concurrent_trials: 2 

sweep: 
  sampling_algorithm: grid 
  early_termination: 
    type: bandit 
    evaluation_interval: 10 
    slack_factor: 0.2 

search_space: 
  - model_name: 
      type: choice 
      values: [bert_base_cased, roberta_base] 
    number_of_epochs: 
      type: choice 
      values: [3, 4] 
  - model_name: 
      type: choice 
      values: [distilbert_base_cased] 
    learning_rate: 
      type: uniform 
      min_value: 0.000005 
      max_value: 0.00005 

扫描的采样方法

扫描超参数时,需要指定用于扫描所定义的参数空间的采样方法。 目前,sampling_algorithm 参数支持以下采样方法:

采样类型 AutoML 作业语法
随机采样 random
网格采样 grid
贝叶斯采样 bayesian

试验预算

可以选择性地使用 limits 中的 timeout_minutes 参数(试验终止之前的分钟数)指定 AutoML NLP 训练作业的试验预算。 如果未指定,则默认试验超时为 7 天(最大值为 60 天)。

AutoML NLP 还支持 trial_timeout_minutes(单个试运行在终止之前可以运行的最长时间,以分钟为单位)和 max_nodes(后备计算群集中可用于作业的最大节点数)。 这些参数也属于 limits 节。

适用于:Azure CLI ml 扩展 v2(当前版本)

limits: 
  timeout_minutes: 60 
  trial_timeout_minutes: 20 
  max_nodes: 2 

提前终止策略

可以使用提前终止策略自动终止性能不佳的运行。 提前终止可提高计算效率,节省原本会花费在不太有效的配置上的计算资源。 AutoML NLP 支持使用 early_termination 参数的提前终止策略。 如果未指定终止策略,则所有配置将运行到完成为止。

详细了解如何为超参数扫描配置提前终止策略

用于扫描的资源

可以通过为扫描指定 max_trialsmax_concurrent_trials 来控制在超参数扫描上花费的资源。

参数 详细信息
max_trials 扫描最大数量的配置所需的参数。 必须是介于 1 到 1000 之间的整数。 仅探索给定模型算法的默认超参数时,请将此参数设置为 1。 默认值为 1。
max_concurrent_trials 可以并发运行的最大运行数。 如果指定了此项,则必须是 1 和 100 之间的整数。 默认值为 1。

注意:
  • 并发运行数根据指定计算目标中的可用资源进行限制。 请确保计算目标能够为所需的并发性提供足够的可用资源。
  • 在内部,max_concurrent_trials 的最大值为 max_trials。 例如,如果用户设置 max_concurrent_trials=4max_trials=2,则会在内部将值更新为 max_concurrent_trials=2max_trials=2
  • 可以配置扫描相关的所有参数,如本例所示。

    适用于:Azure CLI ml 扩展 v2(当前版本)

    sweep:
      limits:
        max_trials: 10
        max_concurrent_trials: 2
      sampling_algorithm: random
      early_termination:
        type: bandit
        evaluation_interval: 2
        slack_factor: 0.2
        delay_evaluation: 6
    

    已知问题

    处理低分数或较高的损失值:

    对于某些数据集(不管 NLP 任务是什么),生成的分数可能极低,有时甚至为零。 此分数伴随着较高的损失值,表示神经网络无法收敛。 这些分数可能在某些 GPU SKU 上频繁出现。

    虽然这种情况并不常见,但有可能会出现,其最佳处理方式是利用超参数优化并提供更广泛的值,尤其是对于学习速率之类的超参数。 在我们的超参数优化功能投入生产之前,建议遇到这些问题的用户使用 NC6 或 ND6 计算集群。 这些群集通常具有相当稳定的训练结果。

    后续步骤