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

适用于:Azure CLI ml 扩展 v2(当前版本)Python SDK azure-ai-ml v2(当前版本)

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

AutoML 中的 NLP 允许机器学习专业人员和数据科学家使用自己的文本数据,并为多类文本分类、多标签文本分类和命名实体识别(NER)生成自定义模型。 可以与 Azure 机器学习数据标签 无缝集成,以标记文本数据,或使用现有的标记数据。

AutoML 提供了在多 GPU 计算群集上使用分布式训练的选项,以便更快地进行模型训练。 可以利用 Azure 机器学习的 MLOps 功能,将生成的模型大规模投入运行。

先决条件

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

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

    注意

    某些 NLP 用例(如非英语数据集和较长范围文档)需要使用多语言模型或具有较长最大序列长度的模型。 这些方案可能需要更高的 GPU 内存才能成功训练模型,例如 NCv3 或 NDv2 系列。

  • 对设置 AutoML 实验有一些了解。 有关 AutoML 试验设计范式的详细信息,请参阅 设置表格数据的 AutoML 训练

选择 NLP 任务

确定要完成的 NLP 任务。 AutoML 支持以下深度神经网络 NLP 任务:

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

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

例如,将电影脚本分类为 ComedyRomantic以及 Comedy and Romantic
命名实体识别 (NER) CLI v2:text_ner
SDK v2:text_ner()
序列中的标记有多个可能的标签。 任务是预测每个序列的所有标记的标签。

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

阈值

阈值是多标签文本分类功能,用于确定预测概率产生正标签的阈值。 较低的数值允许更多标签,这在用户重视召回率时会更好,但可能会导致更多误报。 较高的数值允许更少的标签,这在用户关注精度时会更好,但可能会导致更多的漏报。

准备数据

对于 AutoML NLP 试验,您可以以 .csv 格式提供数据,用于多类和多标签分类任务。 对于 NER 任务,请提供使用空格作为分隔符并遵循.txt格式的两列CoNLL文件。 以下部分提供有关每个任务接受的数据格式的详细信息。

多类

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

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 highest number of three-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 格式数据集的多类或多标签分类不同,NER 需要 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

数据验证

在训练模型之前,AutoML 对输入数据应用数据验证检查,以确保可以正确处理数据。 如果上述任何检查都失败,运行将失败,并出现相关的错误消息。 要通过每个任务的数据验证检查,需要满足以下因素。

注意

某些数据验证检查适用于训练集和验证集,其他检查仅适用于训练集。 如果测试数据集未通过数据验证,AutoML 无法捕获它,并且模型推理失败或模型性能下降是可能的。

任务 数据验证检查
所有任务 至少需要 50 个训练示例。
多类和多标签 训练数据和验证数据必须具有:
- 同一组列。
- 从左到右相同的列顺序。
- 同名列的数据类型相同。
- 至少两个唯一标签。
- 每个数据集中的唯一列名称。 例如,训练集不能具有多个命名 Age的列。
仅限多类别 没有。
仅限多标签 - 标签列格式必须采用 接受的格式
- 至少一个样本应具有 0 个或 2 个以上的标签;否则,它应该是多类任务。
- 所有标签都应采用 strint 格式,且不重叠。
- 不能同时具有标签 1 和标签 '1'
仅 NER - 文件不能以空行开头。
- 每行必须是空行,或遵循 {token} {label} 标记和标签之间正好有一个空格的格式,标签后没有空格。
- 所有标签必须以I-B-开头,或者必须完全是O,而且是区分大小写的。
- 两个样本之间必须只有一个空行,文件末尾必须只有一个空行。

配置试验

AutoML NLP 功能通过特定于任务的automl类型作业触发,与用于提交分类、回归和预测 AutoML 任务的工作流相同。 可以设置与这些试验相同的参数,例如experiment_namecompute_name以及数据输入。 但是,存在以下主要差异:

  • 可以忽略 primary_metric,因为它仅用于报告。 对于 NLP,AutoML 每次运行仅训练一个模型,并且没有模型选择。
  • 此参数 label_column_name 仅适用于多类和多标签文本分类任务。
  • 如果数据集中超过 10% 的样本包含的标记超过 128 个,则会将其视为长范围。

对于 CLI v2 AutoML 作业,可以在 YAML 文件中配置试验。 请参阅以下示例:

语言设置

作为 NLP 功能的一部分,AutoML 支持 104 种语言的深度神经网络(DNN)模型中的预训练文本,这些文本可以是特定于语言的,也可以是多语言的,例如双向编码器表征的转换器(BERT)模型。 语言选择默认为英语。

下表总结了基于任务类型和语言应用了哪个模型。 有关详细信息,请参阅 支持的语言及其代码

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

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

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

对于所有其他语言,AutoML 应用多语言 BERT。

BERT 还用于 AutoML 试验训练的特征化过程。 有关详细信息,请参阅 AutoML (SDK v1)中的 BERT 集成和特征化

可以在配置 YAML 文件的特性化部分中指定数据集语言。

featurization:
   dataset_language: "eng"

提交 AutoML 作业

若要提交 AutoML 作业,请运行以下 CLI v2 命令。 将占位符替换为 YAML 文件名和路径、工作区名称、资源组和订阅 ID。


az ml job create --file ./<YAML filename> --workspace-name <machine-learning-workspace> --resource-group <resource-group> --subscription <subscription ID>

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

代码示例

有关更多示例,请查看以下适用于每个 NLP 任务的示例 YAML 文件以及其他示例 https://github.com/Azure/azureml-examples/cli/jobs/automl-standalone-jobs

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

重要

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

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

AutoML NLP 允许通过配置中的超参数搜索空间提供超参数模型和组合的列表。Hyperdrive 生成多个子运行。 每个子实验都是对给定 NLP 模型进行微调的过程,使用一组基于提供的搜索空间所选择并遍历的超参数值。

支持的模型算法

以下列表显示了 AutoML NLP 中可用于微调的所有预先训练的文本 DNN 模型:

  • bert-base-cased
  • bert-large-uncased
  • bert-base-多语言案例
  • 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 要求更为严格,需要使用 NDv2 系列 VM 获得最佳效果。

支持的超参数

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

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

一个有效的批量大小是符合 GPU 的最大大小的 gradient_accumulation_steps 倍。
必须是正整数。
learning_rate 初始学习速率。 必须是[0, 1]范围内的浮点数。
learning_rate_scheduler 学习速率计划程序的类型。 必须从 linearcosinecosine_with_restartspolynomialconstantconstant_with_warmup 中选择。
model_name 支持的模型之一的名称。 必须从bert_base_casedbert_base_uncasedbert_base_multilingual_casedbert_base_german_casedbert_large_casedbert_large_uncaseddistilbert_base_caseddistilbert_base_uncasedroberta_baseroberta_largedistilroberta_basexlm_roberta_basexlm_roberta_largexlnet_base_casedxlnet_large_cased中进行选择。
number_of_epochs 训练循环数。 必须是正整数。
training_batch_size 训练批大小。 必须是正整数。
validation_batch_size 验证批大小。 必须是正整数。
warmup_ratio 0learning_rate用于线性预热的总训练步骤的比率。 必须是[0, 1]范围内的浮点数。
weight_decay 优化器为 sgdadamadamw 时的权重衰减值。 必须是[0, 1]范围内的浮点数。

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

配置扫描设置

可以配置所有与扫描相关的参数。 可以依据各自模型的超参数构造多个模型子空间,正如每个超参数调优示例所示。

支持与常规 HyperDrive 作业相同的离散和连续分布选项。 有关所有九个选项,请参阅 超参数优化模型

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

试验预算

可以使用参数timeout_minuteslimits为 AutoML NLP 训练作业选择性地指定试验预算。 此参数定义试验终止前几分钟的时间量。 如果未指定超时,则默认试验超时为 7 天,最大值为 60 天。

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

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

以下示例演示如何配置扫描相关参数。

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 系列上可能更频繁地发生。

处理这些事例的最佳方式是使用超参数优化并提供更广泛的值,尤其是对于学习速率等超参数。 在生产环境中提供超参数优化功能之前,如果遇到这些问题,请使用 NC6 或 ND6 计算群集。 这些群集通常具有相当稳定的训练结果。