东亚银行、岚图汽车带你解锁 AIGC 时代的数字化人才培养各赛道新模式! 了解详情
写点什么

如何基于 TensorFlow 2.0 用十行代码实现性能最佳的 NLP 模型?

  • 2019-11-09
  • 本文字数:6010 字

    阅读完需:约 20 分钟

如何基于 TensorFlow 2.0 用十行代码实现性能最佳的 NLP 模型?

TensorFlow 在自然语言处理中占有重要的一席之地。Transformer 是由 Google 在 Attention Is All You Need 这篇论文中提出,其后可谓红遍大江南北,到目前为止仿佛有种“此生不识 Transformer,就称英雄也枉然”的感觉。本文讲述了如何基于 TensorFlow 2.0 实现最佳性能的自然语言处理模型,而且仅仅只需十行代码即可实现。


Hugging Face 是领先的自然语言处理初创公司,包括 Bing、Apple、Monzo 在内,有一千多家公司在生产环境中使用他们的库。本文中使用的所有示例,都可以在 Colab 上找到。这些链接可以在相应部分中找到。

介绍

Hugging Face 是一家专注于自然语言处理的初创公司,它拥有一个大型开源社区,尤其是 Transformers 库相关。🤗 Transformer 是一个基于 Python 的库,它公开了 API 来使用许多知名的 Transformer 架构,例如 BERTRoBERTaGPT-2DistilBERT 等,这些架构在各种自然语言处理任务(如文本分类、信息提取、问题回答和文本生成等)上获得最先进的结果。这些架构都已经经过几组权重的预训练。要开始使用 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)。


这个库基于三个主要类:配置类、词法分析类和模型类。


  • 配置类: 配置类包含于我们将要使用的模型相关的信息,例如层的数量和注意力头(attention head)的数量。下面是 BERT 配置文件的一个示例代码,用于预训练的权重 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。


  • 词法分析类: 词法分析(Tokenzer)类负责将 Python 字符串或整数张量,这些是模型词汇表中的索引。它有许多方便的特性,可以将字符串标记化为标记。这种标记化因模型而异,因此每个模型都有自己的词法分析器。


AI 前线注: 词法分析(英语:tokenizer,lexical analysis)是计算机科学中将字符串行转换为标记(token)串行的过程。进行词法分析的进程或者函数叫作词法分析器(lexical analyzer,简称 lexer),也叫扫描器(scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。


  • 模型类: 模型类拥有神经网络建模逻辑本身。当使用 TensorFlow 模型时,它继承了 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 configbert_tokenizer = BertTokenizer.from_pretrained("bert-base-cased")
gpt2_model = TFGPT2Model.from_pretrained("gpt2") # Automatically loads the configgpt2_tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
复制代码


加载架构与模型无关。


权重是从 Hugging Faces 的 S3 桶中下载的,并缓存在你的机器上。这些模型可用于推理,或者根据需要时进行调整。让我们来看看实际效果。

微调 Transformer 模型

由于 Transformer 库中提供了一些方法,模型的微调因此变得很轻松。接下来的部分就是这样构建的:


  • 加载文本数据并对其进行预处理。

  • 定义超参数。

  • 训练(使用 CPU/GPU 上的 Keras 和 TPUStrategy)

构建输入管道

为了让你能够快速跟踪所有的代码,我们已经做了一个随附的 Colab 笔记本。我们将利用 tensorflow_datasets 包进行数据加载。Tensorflow-dataset 为我们提供了一个 tf.data.Dataset,可以将其提供给 glue_convert_examples_to_features 方法


这个方法将使用词法分析器对输入进行标记化,如果模型需要这样的附加标记的话,就在序列开头和结尾添加特殊标记(例如,[SEP]、[CLS]、</s> 或 <s>)。这个方法返回一个 tf.data.Dataset ,其中包含了特征化输入。


import tensorflow_datasetsfrom 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 方法来训练模型从未如此简单。现在已经设置了输入管道,可以定义超参数,并使用数据集调用 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 方法进行训练

使用 Strategy 进行训练

使用 Stragegy 进行训练,可以让你更好地控制训练过程中发生的事情。通过 Strategy 之间的切换,用户可以选择模型的分布式训练方式:从多 GPU 到 TPU。


截止撰写本文时,TPUStrategy 是使用 TensorFlow 2 在 TPU 上训练模型唯一可靠的方法。在这方面,使用 Strategy 构建自定义循环更有意义,因为 Strategy 可以很容易地转换,并且在多 GPU 上进行训练实际上几乎不需要更改代码。


构建自定义循环需要进行一些设置工作,因此建议读者打开下面的 Colab 笔记本,以便更好地掌握手头中的主题。这个笔记本没有像上面第一个 Colab 笔记本那样详细介绍词法分的细节,但是它展示了如何构建 TPUStrategy 使用的输入管道


由于使用本地文件系统时,TPU 的处理非常复杂,因此使用了 Google Cloud Platform 的桶来托管数据。Colab 笔记本在这里

Transformer 现在可以访问 TensorFlow API 了,那又如何?

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


公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2019-11-09 08:004862

评论

发布
暂无评论
发现更多内容

四种常见服务限流算法解析

做梦都在改BUG

快手基于 Apache Flink 的实时数仓建设实践

Apache Flink

大数据 flink 实时计算

APP频繁改版惹人烦?火山引擎VeDI来帮忙

字节跳动数据平台

数字化 企业数字化 企业号 4 月 PK 榜 APP改版

精选2023年大厂高频Java面试真题集锦(含答案),面试一路开挂

程序知音

java面试 java架构 Java进阶 后端技术 Java面试八股文

TiCDC 源码阅读(五)TiCDC 对 DDL 的处理和 Filter 解析

TiDB 社区干货传送门

知行合一!AI大模型与算法二三事

深数

深度学习 科普 数字化 NLP 大模型 LLM

Flink MongoDB CDC 在 XTransfer 的生产实践|Flink CDC 专题

Apache Flink

大数据 flink 实时计算

TiCDC 源码阅读(六)TiCDC Puller 模块介绍

TiDB 社区干货传送门

堡垒机厂商都是大企业吗?你比较推荐哪家?

行云管家

网络安全 等级保护

5 大手段,打造单一可信源代码托管平台|极狐GitLab DevSecOps 助力 SLSA 落地之源代码篇

极狐GitLab

DevOps DevSecOps 源代码 安全审计 SLSA

企业数字化升级迫在眉睫,瓴羊Quick BI工具应运而生

夏日星河

堡垒机主流品牌有哪些?如何选择?

行云管家

堡垒机 IT运维

TiCDC 源码阅读(七) TiCDC Sorter 模块揭秘

TiDB 社区干货传送门

NFT交易平台商城系统开发技术

薇電13242772558

NFT

Stable Diffusion:一种新型的深度学习AIGC模型

蓝海大脑GPU

tiup cluster display 执行流程代码详解

TiDB 社区干货传送门

实践案例 集群管理 故障排查/诊断 安装 & 部署

文盘Rust -- 用Tokio实现简易任务池

TiDB 社区干货传送门

开发语言

瓴羊Quick BI连续入选魔力象限ABI报告,实至名归

流量猫猫头

干货分享|金融机构如何通过标签画像实现精细化客户运营?

索信达控股

详解 Flink Catalog 在 ChunJun 中的实践之路

袋鼠云数栈

flink

TiDB损坏多副本之有损恢复处理方法

TiDB 社区干货传送门

集群管理 6.x 实践 TiKV 底层架构

ByteBase是什么,他怎么和tidb结合提高工作效率的

TiDB 社区干货传送门

实践案例

Redis崩吗?来一起搞定 Redis 实践中的常见问题!

Steven

redis

【福利】ChatGPT免费体验期延长,商用版正式开启预约!

WorkPlus

“信创”滚滚而来,私有化或将迎来第二春

WorkPlus

阿里大佬倾情力荐:Java全线成长宝典,从P5到P8一应俱全

三十而立

Java java面试

瓴羊Quick BI国产数字化智能工具口碑怎么样?30天免费试用

小偏执o

一文彻底搞懂Raft算法,看这篇就够了!!!

做梦都在改BUG

漫谈 ChatGPT 与问答式 BI

观远数据

数据分析 BI ChatGPT

GitHub已开源—在国内外都被称为分布式理论+实践的巅峰之作

做梦都在改BUG

Java 数据库 分布式 系统设计 设计数据密集型应用

开源即时通讯IM框架MobileIMSDK的微信小程序端开发快速入门

JackJiang

如何基于 TensorFlow 2.0 用十行代码实现性能最佳的 NLP 模型?_开源_Lysandre Debut_InfoQ精选文章