精通 Transformers(四)(4)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 精通 Transformers(四)

精通 Transformers(四)(3)https://developer.aliyun.com/article/1510722

跟踪模型指标

到目前为止,我们已经训练了语言模型,并简单分析了最终结果。我们还没有观察训练过程或比较使用不同选项进行训练。在本节中,我们将简要讨论如何监视模型训练。为此,我们将处理如何跟踪之前在第五章中开发的模型的训练,文本分类的语言模型微调

在这个领域开发了两个重要的工具——一个是 TensorBoard,另一个是 W&B。前者可以将训练结果保存到本地驱动器,并在实验结束时将其可视化。后者则可以在云平台上实时监视模型训练进度。

本节将是对这些工具的简要介绍,不会详细讨论它们,因为这超出了本章的范围。

让我们从 TensorBoard 开始。

使用 TensorBoard 跟踪模型训练

TensorBoard 是专门用于 DL 实验的可视化工具。它有许多功能,如跟踪、训练、将嵌入投射到较低的空间和可视化模型图。我们主要用它来跟踪和可视化诸如损失之类的指标。对于 Transformers 来说,使用 TensorBoard 跟踪指标是如此容易,只需在模型训练代码中添加几行就足够了。一切几乎保持不变。

现在,我们将重复第五章中进行的互联网电影数据库IMDb)情感微调实验,对文本分类进行语言模型微调,并将跟踪指标。在该章节中,我们已经使用由4 千4K)个训练数据集、1 千验证集和 1 千测试集组成的 IMDb 数据集训练了一个情感模型。现在,我们将其调整为适用于 TensorBoard。有关 TensorBoard 的更多详细信息,请访问 www.tensorflow.org/tensorboard

让我们开始:

  1. 首先,如果尚未安装 TensorBoard,我们要这样安装:
!pip install tensorboard 
  1. 第五章对文本分类进行语言模型微调,保持 IMDb 情感分析的其他代码行不变,我们将训练参数设置如下:
from Transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
    output_dir='./MyIMDBModel', 
    do_train=True,
    do_eval=True,
    num_train_epochs=3, 
    per_device_train_batch_size=16, 
    per_device_eval_batch_size=32,
    logging_strategy='steps', 
    logging_dir='./logs', 
    logging_steps=50,
    evaluation_strategy="steps",
    save_strategy="epoch",
    fp16=True,
    load_best_model_at_end=True
)
  1. 在上述代码片段中,logging_dir 的值将很快作为参数传递给 TensorBoard。由于训练数据集大小为 4K,训练批大小为 16,每个时期有 250 步(4K/16),意味着三个时期有 750 步。
  2. 我们将 logging_steps 设置为 50,这是一个采样间隔。随着间隔的减小,记录了有关模型性能上升或下降的更多细节。稍后我们将做另一个实验,在第 27 步降低这个采样间隔。
  3. 现在,每隔 50 步,模型性能将根据我们在 compute_metrics() 中定义的指标进行测量。所要测量的指标包括准确率、F1 值、精确率和召回率。因此,我们将记录 15 次(750/50)性能测量。当我们运行 trainer.train() 时,这将开始训练过程,并在 logging_dir='./logs' 目录下记录日志。
  4. 我们将 load_best_model_at_end 设置为 True,以便管道加载在损失方面表现最佳的任何检查点。一旦训练完成,您将注意到最佳模型从 checkpoint-250 加载,其损失得分为 0.263
  5. 现在,我们唯一需要做的就是调用以下代码来启动 TensorBoard:
%reload_ext tensorboard
%tensorboard --logdir logs
  1. 这是输出:

    图 11.16 – TensorBoard 训练历史可视化
    您可能已经注意到,我们可以跟踪之前定义的指标。水平轴从 0 到 750 步,这是我们之前计算的步数。我们不会在这里详细讨论 TensorBoard。让我们只看一下eval/loss 图表。当您点击左下角的最大化图标时,您将会看到以下图表:

    图 11.17 – TensorBoard eval/loss 图表,记录步长为 50
    在前面的截图中,我们将 TensorBoard 仪表板左侧的滑块控制器的平滑度设置为 0,以更精确地查看分数并关注全局最小值。如果你的实验波动性很高,平滑功能可以很好地显示整体趋势。它的功能类似于滑动平均MA)。这张图表支持我们之前的观察,最佳损失测量值为0.2658,在第250步时获得。
  2. 由于logging_steps设置为10,我们获得了高分辨率,如下面的截图所示。因此,我们将记录 75(750 步/10 步)个性能测量值。当我们以这个分辨率重新运行整个流程时,我们在第 220 步获得了最佳模型,损失得分为 0.238,比之前的实验更好。结果可以在下面的截图中看到。由于分辨率更高,我们自然会观察到更多的波动:

图 11.18 - 记录步骤为 10 的更高分辨率 eval/loss 图表

目前我们不再使用 TensorBoard。让我们开始使用 W&B!

使用 W&B 实时跟踪模型训练

与 TensorBoard 不同,W&B 在云平台提供了一个仪表板,我们可以在一个单一的中心追踪和备份所有实验。它还允许我们与团队进行开发和共享。训练代码在我们的本地机器上运行,而日志保存在 W&B 云中。最重要的是,我们可以实时跟踪训练过程并立即与社区或团队分享结果。

我们可以通过对现有代码进行非常小的更改来为我们的实验启用 W&B:

  1. 首先,我们需要在wandb.ai创建一个帐户,然后安装 Python 库,如下所示:
!pip install wandb
  1. 再次,我们将采用 IMDb 情感分析代码并进行微小的更改。首先,让我们导入库并登录到wandB,如下所示:
import wandb
!wandb login
  1. wandb请求一个 API 密钥,你可以很容易地在以下链接找到:wandb.ai/authorize
  2. 或者,你可以将WANDB_API_KEY环境变量设置为你的 API 密钥,如下所示:
!export WANDB_API_KEY=e7d*********
  1. 再次保持整个代码不变,我们只需向TrainingArguments添加两个参数,report_to="wandb"run_name="...",即可在 W&B 中启用日志记录,如下所示:
training_args = TrainingArguments(
    ...  the rest is same ...
    run_name="IMDB-batch-32-lr-5e-5",
    report_to="wandb"
)
  1. 当你调用trainer.train()后,日志将开始记录在云端。调用后,请检查云端仪表板并查看其变化。一旦trainer.train()调用成功完成,我们执行以下代码告诉wandB我们已完成:
wandb.finish()
  1. 执行还会在本地输出运行历史,如下所示:

图 11.19 - W&B 的本地输出

当你连接到 W&B 提供的链接时,你将进入一个看起来类似于这样的界面:

图 11.20 – 在 W&B 仪表板上单次运行的在线可视化

该可视化为单次运行的结果提供了一个总结的性能结果。正如您所看到的,我们可以追踪在compute_metric()函数中定义的指标。

现在,让我们来看一下评估损失。下面的截图显示了与 TensorBoard 提供的完全相同的绘图,其中最小损失约为 0.2658,在第 250 步发生:

图 11.21 – 在 W&B 仪表板上 IMDb 实验的 eval/loss 绘图

到目前为止,我们只对单次运行进行了可视化。W&B 允许我们跨多次运行动态地探索结果—例如,我们可以可视化使用不同超参数的模型的结果,如学习率或批量大小。为此,我们适当地实例化一个TrainingArguments对象,并为每次运行相应地更改run_name="..."

下面的截图显示了我们使用不同超参数进行的几个 IMDb 情感分析运行。我们还可以看到我们更改的批量大小和学习率:

图 11.22 – 在 W&B 仪表板上探索多次运行的结果

W&B 提供了有用的功能—例如,它自动化了超参数优化和搜索可能模型的空间,称为 W&B Sweeps。除此之外,它还提供了与图形处理单元(GPU)消耗有关的系统日志,中央处理单元(CPU)利用率等等。更详细的信息,请查看以下网站:wandb.ai/home

干得好!在最后一节参考资料中,我们将更多关注技术工具,因为使用这样的实用工具对于开发更好的模型至关重要。

总结

在本章中,我们介绍了两个不同的技术概念:注意力可视化和实验跟踪。我们首先使用 exBERT 在线界面可视化了注意力头。然后,我们研究了 BertViz,我们编写 Python 代码来查看三个 BertViz 可视化:头部视图,模型视图和神经元视图。BertViz 界面给了我们更多控制,以便我们可以使用不同的语言模型。此外,我们还能观察到如何计算 tokens 之间的注意权重。这些工具为我们提供了解释性和利用性的重要功能。我们还学会了如何跟踪我们的实验以获得更高质量的模型和进行错误分析。我们利用了两种工具来监视训练:TensorBoard 和 W&B。这些工具用来有效地跟踪实验并优化模型训练。

恭喜!你通过展现出的极大毅力和坚持不懈完成了这本书的阅读之旅。现在你可以放心了,因为你已经装备好了需要的工具,并且准备好开发和实现高级自然语言处理应用。

参考文献

  • exBERT:一种用于探索 Transformer 模型中学习表示的视觉分析工具本杰明·胡佛亨德里克·斯特罗贝尔特塞巴斯蒂安·盖尔曼2019
  • Vig, J., 2019. Transformer 模型中的多尺度注意力可视化arXiv 预印本 arXiv:1906.05714
  • Clark, K., Khandelwal, U., Levy, O.Manning, C.D., 2019. BERT 看什么?BERT 注意力分析arXiv 预印本 arXiv:1906.04341.7
  • Biewald, L., 权重与偏差的实验追踪, 2020。软件可在 wandb.com 获得,2(5)
  • Rogers, A., Kovaleva, O.Rumshisky, A., 2020. BERT 学习入门:我们对 BERT 如何工作的了解. 计算语言学协会交易, 8, pp.842-866
  • W&Bwandb.ai
  • TensorBoardwww.tensorflow.org/tensorboard
  • exBert—Hugging Facehuggingface.co/exbert
  • exBERTexbert.net/
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
机器学习/深度学习 自然语言处理 PyTorch
精通 Transformers(一)(2)
精通 Transformers(一)
132 4
|
6月前
|
API TensorFlow 算法框架/工具
精通 Transformers(四)(1)
精通 Transformers(四)
61 0
精通 Transformers(四)(1)
|
6月前
|
自然语言处理 数据可视化 NoSQL
精通 Transformers(四)(3)
精通 Transformers(四)
66 0
|
6月前
|
机器学习/深度学习 数据可视化 API
精通 Transformers(四)(2)
精通 Transformers(四)
62 0
|
4月前
|
自然语言处理 PyTorch TensorFlow
Transformers 4.37 中文文档(一百)(3)
Transformers 4.37 中文文档(一百)
29 1
|
4月前
|
存储 自然语言处理 测试技术
Transformers 4.37 中文文档(八)(1)
Transformers 4.37 中文文档(八)
27 2
|
4月前
|
存储
Transformers 4.37 中文文档(五)(8)
Transformers 4.37 中文文档(五)
34 0
|
4月前
|
PyTorch TensorFlow 调度
Transformers 4.37 中文文档(三)(5)
Transformers 4.37 中文文档(三)
24 0
|
4月前
|
自然语言处理 Rust PyTorch
Transformers 4.37 中文文档(七)(1)
Transformers 4.37 中文文档(七)
72 0
|
6月前
|
自然语言处理 算法 算法框架/工具
精通 Transformers(一)(4)
精通 Transformers(一)
108 4