Hugging Face 是领先的自然语言处理初创公司,包括 Bing、Apple、Monzo 在内,有一千多家公司在生产环境中使用他们的库。本文中使用的所有示例,都可以在 Colab 上找到。这些链接可以在相应部分中找到。
Hugging Face 是一家专注于自然语言处理的初创公司,它拥有一个大型开源社区,尤其是 Transformers 库相关。🤗 Transformer 是一个基于 Python 的库,它公开了 API 来使用许多知名的 Transformer 架构,例如 BERT、RoBERTa、GPT-2 或 DistilBERT 等,这些架构在各种自然语言处理任务(如文本分类、信息提取、问题回答和文本生成等)上获得最先进的结果。这些架构都已经经过几组权重的预训练。要开始使用 Transformer,只需安装 Pip 包:
pip install transformers
该库在 PyTorch 中实现了超高速的增长,最近被移植到 TensorFlow 2.0 上,提供了一个 API,这个 API 现在可以与 Keras 的 fit API、TensorFlow Extended 和 TPU 一起使用 👏。本文专门介绍如何使用 TensorFlow 来使用 Transformer 库:使用 Keras API 和 TensorFlow TPUStrategy 来对最先进的 Transformer 模型进行微调。
Transformer 是基于预训练的 Transformer 模型的概念。这些 Transformer 模型具有不同的形状、大小和架构,并且有自己接收输入数据的方式:通过标记化(tokenization)。
这个库基于三个主要类:配置类、词法分析类和模型类。
pre-base-cased
。配置类通过各种 I/O 方法和标准化名称属性来托管这些属性。{
"attention_probs_dropout_prob": 0.1,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"initializer_range": 0.02,
"intermediate_size": 3072,
"max_position_embeddings": 512,
"num_attention_heads": 12,
"num_hidden_layers": 12,
"type_vocab_size": 2,
"vocab_size": 28996
}
bert-base-cased 配置文件作为 JSON。
AI 前线注: 词法分析(英语:tokenizer,lexical analysis)是计算机科学中将字符串行转换为标记(token)串行的过程。进行词法分析的进程或者函数叫作词法分析器(lexical analyzer,简称 lexer),也叫扫描器(scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。
tf.keras.layers.Layer
,这意味着它可以非常简单地使用 Keras 的 fit API,或者使用自定义的训练循环和 GradientTape
对其进行训练。使用 Transformer
的优势在于,模型无关的 API 的直接使用。加载预训练的模型及其词法分析器可以在几行代码中完成。以下是加载 BERT 和 GPT-2 TensorFlow 模型及其词法分析器的示例代码:
from transformers import (TFBertModel, BertTokenizer,
TFGPT2Model, GPT2Tokenizer)
bert_model = TFBertModel.from_pretrained("bert-base-cased") # Automatically loads the config
bert_tokenizer = BertTokenizer.from_pretrained("bert-base-cased")
gpt2_model = TFGPT2Model.from_pretrained("gpt2") # Automatically loads the config
gpt2_tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
加载架构与模型无关。
权重是从 Hugging Faces 的 S3 桶中下载的,并缓存在你的机器上。这些模型可用于推理,或者根据需要时进行调整。让我们来看看实际效果。
由于 Transformer 库中提供了一些方法,模型的微调因此变得很轻松。接下来的部分就是这样构建的:
为了让你能够快速跟踪所有的代码,我们已经做了一个随附的 Colab 笔记本。我们将利用 tensorflow_datasets
包进行数据加载。Tensorflow-dataset 为我们提供了一个 tf.data.Dataset
,可以将其提供给 glue_convert_examples_to_features
方法。
这个方法将使用词法分析器对输入进行标记化,如果模型需要这样的附加标记的话,就在序列开头和结尾添加特殊标记(例如,[SEP]、[CLS]、</s>
或 <s>
)。这个方法返回一个 tf.data.Dataset
,其中包含了特征化输入。
import tensorflow_datasets
from transformers import glue_convert_examples_to_features
data = tensorflow_datasets.load("glue/mrpc")
train_dataset = data["train"]
validation_dataset = data["validation"]
train_dataset = glue_convert_examples_to_features(train_dataset, bert_tokenizer, 128, 'mrpc')
validation_dataset = glue_convert_examples_to_features(validation_dataset, bert_tokenizer, 128, 'mrpc')
train_dataset = train_dataset.shuffle(100).batch(32).repeat(2)
validation_dataset = validation_dataset.batch(64)
为模型构建输入管道。
使用 Keras 的 fit 方法来训练模型从未如此简单。现在已经设置了输入管道,可以定义超参数,并使用数据集调用 Keras 的 fit 方法。
optimizer = tf.keras.optimizers.Adam(learning_rate=3e-5, epsilon=1e-08, clipnorm=1.0)
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
metric = tf.keras.metrics.SparseCategoricalAccuracy('accuracy')
bert_model.compile(optimizer=optimizer, loss=loss, metrics=[metric])
bert_history = bert_model.fit(
bert_train_dataset,
epochs=2,
steps_per_epoch=115,
validation_data=bert_validation_dataset,
validation_steps=7
)
使用 Keras 的 fit 方法进行训练。
使用 Stragegy 进行训练,可以让你更好地控制训练过程中发生的事情。通过 Strategy 之间的切换,用户可以选择模型的分布式训练方式:从多 GPU 到 TPU。
截止撰写本文时,TPUStrategy 是使用 TensorFlow 2 在 TPU 上训练模型唯一可靠的方法。在这方面,使用 Strategy 构建自定义循环更有意义,因为 Strategy 可以很容易地转换,并且在多 GPU 上进行训练实际上几乎不需要更改代码。
构建自定义循环需要进行一些设置工作,因此建议读者打开下面的 Colab 笔记本,以便更好地掌握手头中的主题。这个笔记本没有像上面第一个 Colab 笔记本那样详细介绍词法分的细节,但是 它展示了如何构建 TPUStrategy 使用的输入管道。
由于使用本地文件系统时,TPU 的处理非常复杂,因此使用了 Google Cloud Platform 的桶来托管数据。Colab 笔记本在 这里。
Transformer 库的主要卖点是它的模型无关性及其简单的 API。作为在自然语言处理中获得最先进结果的模型的前端,根据当前任务在模型之间进行切换是非常容易的。
作为一个例子,以下是用于在语言分类任务微调 BERT 的完整脚本代码:
model = TFBertForSequenceClassification.from_pretrained("bert-base-cased")
tokenizer = BertTokenizer.from_pretrained("bert-base-cased")
data = tensorflow_datasets.load("glue/mrpc")
train_dataset = data["train"]
train_dataset = glue_convert_examples_to_features(train_dataset, tokenizer, 128, 'mrpc')
optimizer = tf.keras.optimizers.Adam(learning_rate=3e-5, epsilon=1e-08, clipnorm=1.0)
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
metric = tf.keras.metrics.SparseCategoricalAccuracy('accuracy')
model.compile(optimizer=optimizer, loss=loss, metrics=[metric])
model.fit(train_dataset, epochs=3)
在 MNLI 微调 BERT。
但是,在生产环境中,由于内存是稀缺的资源。你可能会因此希望使用较小的模型,如,切换到 DistilBERT。只需将前两行改为这两行即可,如下代码所示:
model = TFDistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")
tokenizer = DistilbertTokenizer.from_pretrained("distilbert-base-uncased")
作为托管十多个 Transformer 架构的平台,🤗Transformer 使得它非常容易使用、微调和比较模型,这些模型已改变了自然语言处理领域的深度学习的格局。它作为许多利用 Transformer 模型的下游应用程序的后端,被许多不同的公司用于生产中。
作者介绍:
Lysandre Debut,机器学习工程师,供职于 Hugging Face,对自然语言处理领域充满热情。
原文链接:
https://medium.com/tensorflow/using-tensorflow-2-for-state-of-the-art-natural-language-processing-102445cda54a
你也「在看」吗?👇