Path: blob/main/transformers_doc/zh/tensorflow/training.ipynb
4542 views
微调预训练模型
准备数据集
在您进行预训练模型微调之前,需要下载一个数据集并为训练做好准备。之前的教程向您展示了如何处理训练数据,现在您有机会将这些技能付诸实践!
首先,加载Yelp评论数据集:
正如您现在所知,您需要一个tokenizer
来处理文本,包括填充和截断操作以处理可变的序列长度。如果要一次性处理您的数据集,可以使用 🤗 Datasets 的 map
方法,将预处理函数应用于整个数据集:
如果愿意的话,您可以从完整数据集提取一个较小子集来进行微调,以减少训练所需的时间:
训练
使用keras训练TensorFlow模型
您也可以使用 Keras API 在 TensorFlow 中训练 🤗 Transformers 模型!
加载用于 Keras 的数据
当您希望使用 Keras API 训练 🤗 Transformers 模型时,您需要将您的数据集转换为 Keras 可理解的格式。如果您的数据集很小,您可以将整个数据集转换为NumPy数组并传递给 Keras。在进行更复杂的操作之前,让我们先尝试这种方法。
首先,加载一个数据集。我们将使用 GLUE benchmark 中的 CoLA 数据集,因为它是一个简单的二元文本分类任务。现在只使用训练数据集。
接下来,加载一个tokenizer
并将数据标记为 NumPy 数组。请注意,标签已经是由 0 和 1 组成的list
,因此我们可以直接将其转换为 NumPy 数组而无需进行分词处理!
当您使用 compile()
编译模型时,无需传递损失参数!如果不指定损失参数,Hugging Face 模型会自动选择适合其任务和模型架构的损失函数。如果需要,您始终可以自己指定损失函数以覆盖默认配置。
这种方法对于较小的数据集效果很好,但对于较大的数据集,您可能会发现它开始变得有问题。为什么呢?因为分词后的数组和标签必须完全加载到内存中,而且由于 NumPy 无法处理“不规则”数组,因此每个分词后的样本长度都必须被填充到数据集中最长样本的长度。这将使您的数组变得更大,而所有这些padding tokens
也会减慢训练速度!
将数据加载为 tf.data.Dataset
如果您想避免训练速度减慢,可以将数据加载为 tf.data.Dataset
。虽然您可以自己编写自己的 tf.data
流水线,但我们有两种方便的方法来实现这一点:
prepare_tf_dataset():这是我们在大多数情况下推荐的方法。因为它是模型上的一个方法,它可以检查模型以自动确定哪些列可用作模型输入,并丢弃其他列以创建一个更简单、性能更好的数据集。
to_tf_dataset
:这个方法更低级,但当您希望完全控制数据集的创建方式时非常有用,可以通过指定要包括的确切columns
和label_cols
来实现。
在使用 prepare_tf_dataset() 之前,您需要将tokenizer
的输出添加到数据集作为列,如下面的代码示例所示:
请记住,默认情况下,Hugging Face 数据集存储在硬盘上,因此这不会增加您的内存使用!一旦列已经添加,您可以从数据集中流式的传输批次数据,并为每个批次添加padding tokens
,这与为整个数据集添加padding tokens
相比,大大减少了padding tokens
的数量。
在原生 PyTorch 中训练
附加资源
更多微调例子可参考如下链接:
🤗 Transformers 示例 包含用于在 PyTorch 和 TensorFlow 中训练常见自然语言处理任务的脚本。
🤗 Transformers 笔记 包含针对特定任务在 PyTorch 和 TensorFlow 中微调模型的各种
notebook
。