PyTorch深度学习与企业级项目实战-预训练语言模型GPT
【图书推荐】《PyTorch深度学习与企业级项目实战》-CSDN博客
13个PyTorch深度学习案例简介-CSDN博客
《PyTorch深度学习与企业级项目实战(人工智能技术丛书)》(宋立桓,宋立林)【摘要 书评 试读】- 京东图书 (jd.com)
PyTorch深度学习算法与应用_夏天又到了的博客-CSDN博客
15.3.1 什么是预训练语言模型
尽管神经网络模型在自然语言处理任务中已取得较好的效果,但其相对于非神经网络模型的优势并没有像在计算机视觉领域那么明显。该现象的主要原因可归结于当前自然语言处理任务的数据集相对较小(除机器翻译任务外)。深度神经网络模型通常包含大量参数,因此在较小规模的训练集中易过拟合,且泛化性较差。通过海量无标注语料来预训练神经网络模型,可以学习到有益于下游自然语言处理任务的通用语言表示,并可以避免从零训练新模型。预训练模型一直被视为一种训练深度神经网络模型的高效策略。
随着深度学习的发展,模型参数显著增长,从而需要越来越大的数据集用于充分训练模型参数并预防过拟合。然而,大部分自然语言处理任务的标注成本极为高昂,尤其是句法和语义相关任务构建大规模标注数据集尤为困难。相比较而言,大规模无标注数据集相对易于构建。为更好地利用海量无标签文本数据,我们可以首先从这些数据中学到较好的文本表示,然后将其用于其他任务。许多研究已表明,在大规模无标注语料中训练的预训练语言模型得到的表示,可以使许多自然语言处理任务获得显著的性能提升。
预训练的优势可总结为以下几点:
(1)在海量文本中通过预训练可以学习到一种通用语言表示,并有助于完成下游任务。
(2)预训练可提供更好的模型初始化,从而具有更好的泛化性,并在下游任务上更快收敛。
(3)预训练可被看作在小数据集上避免过拟合的一种正则化方法。
15.3.2 GPT-2模型介绍
OpenAI 公司在2018年提出了一种生成式预训练(Generative Pre-Training,GPT)模型,用来提升自然语言理解任务的效果,正式将自然语言处理带入“预训练”时代。“预训练”时代意味着利用更大规模的文本数据以及更深层的神经网络模型,来学习更丰富的文本语义表示。同时,GPT的出现打破了自然语言处理各个任务之间的壁垒,使得搭建一个面向特定任务的自然语言处理模型不再需要了解非常多的任务背景,只需要根据任务的输入输出形式应用这些预训练语言模型,就能够达到一个不错的效果。因此,GPT提出了“生成式预训练+判别式任务精调”的自然语言处理新范式,使得自然语言处理模型的搭建变得不再复杂。预训练语言模型的出现,使得自然语言处理进入新的时代,也被认为是近些年来自然语言处理领域的里程碑事件。
GPT-2是GPT算法的“进化版”,比GPT参数扩大了10倍,数据量也扩大了10倍,它使用包含800万个网页的数据集,共有40GB。这个庞大的算法使用语言建模作为训练信号,以无监督的方式在大型数据集上训练一个Transformer模型,然后在更小的监督数据集上微调这个模型,以帮助它解决特定任务。
就GPT-2而言,它的训练目标很简单:根据所有给定文本中前面的单词预测下一个单词。与其他基于神经网络的语言模型相比,GPT-2具有许多独特的优点。首先,它采用自监督学习的方式进行训练,使其能够处理多种语言和任务。其次,GPT-2可以生成各种类型的文本,例如新闻、故事、对话和代码等。最后,GPT-2模型使用大量的预训练参数,使其具有强大的表现力和泛化能力。
所以,以往大家的工作模式是各个公司会自己在GitHub网站上下载代码,然后公司出钱“捞”数据、打标,工程师用自己公司的打标数据训练来完成业务的需求。但是随着Huggingface的成立,自然语言处理各大热门的中英文预训练模型都开源在下载网址https://huggingface.co/models(目前可以使用其镜像网站https://hf-mirror.com来访问相关模型)。现在大家的工作模式是算法工程师打开Huggingface网站,搜业务相关的预训练模型(这些模型都是大厂基于大量的数据训练好的模型)进行下载,算法工程师自己收集或者标记少量的数据,微调下载的模型。
GPT-2的整体结构如图15-7所示,GPT-2是以Transformer为基础构建的,是目前最先进的自然语言处理预训练模型之一,能够根据上文预测下一个单词,所以它就可以利用预训练已经学到的知识来生成文本,比如生成新闻。也可以使用另一些数据进行微调,生成有特定格式或者主题的文本,比如诗歌、戏剧。
图15-7
15.3.3 PyTorch-Transformers库介绍
PyTorch-Transformers(此前叫作Pytorch-Pretrained-Bert)是一个面向自然语言处理的、当前性能最高的预训练模型开源库。该开源库现在包含PyTorch实现、预训练模型权重、运行脚本和以下模型的转换工具:
- 谷歌的 BERT,论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,论文作者:Jacob Devlin, Ming-Wei Chang, Kenton Lee,Kristina Toutanova
- OpenAI 的GPT,论文:Improving Language Understanding by Generative Pre-Training,论文作者:Alec Radford, Karthik Narasimhan, Tim Salimans,Ilya Sutskever。
- OpenAI 的 GPT-2,论文:Language Models are Unsupervised Multitask Learners,论文作者:Alec Radford, Jeffrey Wu, Rewon Child, David Luan, Dario Amodei, Ilya Sutskever。
- 谷歌和 CMU 的 Transformer-XL ,论文:Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context,论文作者:Zihang Dai*, Zhilin Yang*, Yiming Yang, Jaime Carbonell, Quoc V. Le, Ruslan Salakhutdinov。
- 谷歌和 CMU 的XLNet,论文:XLNet: Generalized Autoregressive Pretraining for Language Understanding,论文作者:Zhilin Yang*, Zihang Dai*, Yiming Yang, Jaime Carbonell, Ruslan Salakhutdinov, Quoc V. Le。
- Facebook的 XLM,论文:Cross-lingual Language Model Pretraining,论文作者:Guillaume Lample,Alexis Conneau。
简而言之,就是一个目前最先进的、用于自然语言处理的预训练模型库。它通过命令pip install pytorch-transformers进行安装。
以下是实现加载GPT-2模型并实现下一个单词预测的功能代码:
############pytorch_transformers_demo.py##############
# 案例描述:Transformers库中的GPT-2模型,用它实现下一词预测功能
# 导入必要的库
import torch
from pytorch_transformers import GPT2Tokenizer, GPT2LMHeadModel
# 自动加载预训练模型tokenizer (权重)
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
# 对文本输入进行编码
text = "What is the fastest car in the"
indexed_tokens = tokenizer.encode(text)
# 将输入语句转换为张量
tokens_tensor = torch.tensor([indexed_tokens])
# 加载预训练模型 (weights)
model = GPT2LMHeadModel.from_pretrained('gpt2')
#将模型设置为evaluation模式,关闭DropOut模块
model.eval()
DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
tokens_tensor = tokens_tensor.to(DEVICE)
model.to(DEVICE)
# 如果你有GPU,把所有东西都放在CUDA上,如果没有GPU,就只能用CPU跑
# 预测所有的tokens
with torch.no_grad():
outputs = model(tokens_tensor)
predictions = outputs[0]
# 得到预测的单词
predicted_index = torch.argmax(predictions[0, -1, :]).item()
predicted_text = tokenizer.decode(indexed_tokens + [predicted_index])
# 打印预测单词
print(predicted_text)
代码很直观,我们将文本标记为数字序列并将其索引,然后将其传递给GPT2LMHeadModel。代码运行后结果如下,该模型成功地预测出了下一个单词world:
100%|██████████| 1042301/1042301 [00:04<00:00, 238071.80B/s]
100%|██████████| 456318/456318 [00:01<00:00, 325186.65B/s]
100%|██████████| 665/665 [00:00<?, ?B/s]
100%|██████████| 548118077/548118077 [22:36<00:00, 403989.53B/s]
What is the fastest car in the world