探索GPT-2:构建文本生成器

自然语言处理(NLP)的领域中,正处在一个黄金时代。机器不仅能够理解句子的字面意思,还能理解其背后的语境,这是一个巨大的飞跃。OpenAI的GPT-2框架彻底改变了处理文本数据的方式。在ULMFiT和Google的BERT为NLP爱好者打开大门之后,GPT-2进一步推动了这一进程,使得NLP任务——尤其是文本生成——变得更加容易。

本文将带了解GPT-2的工作原理,并指导如何使用GPT-2构建自己的文本生成器。如果是NLP的忠实追随者,可能会喜欢以下关于NLP最新发展的指南和教程:

  • 8个优秀的预训练模型,帮助开始自然语言处理(NLP)
  • Transformers在NLP中的工作原理:最新最先进模型指南
  • PyTorch-Transformers入门:一个令人难以置信的NLP库(含Python代码)
  • StanfordNLP入门:一个令人难以置信的53种语言NLP库(含Python代码)

目录

  1. OpenAI的GPT-2新特性
  2. 如何为GPT-2设置环境
  3. 在Python中实现GPT-2构建自己的文本生成

OpenAI的GPT-2新特性

自然语言处理(NLP)在过去几年中取得了惊人的发展。现在,机器能够理解句子背后的语境——这是一个真正的巨大成就。由OpenAI开发的GPT-2是一个预训练的语言模型,可以用它来进行各种NLP任务,例如文本生成、语言翻译、构建问答系统等。

语言模型是现代自然语言处理(NLP)中最重要的任务之一。语言模型是一个概率模型,它预测文档中的下一个词或字符。GPT-2是OpenAI原始NLP框架GPT的继承者。完整的GPT-2模型有15亿参数,几乎是GPT参数的10倍。GPT-2提供了最新的结果,正如可能已经猜测的(并且当进入Python时很快就会看到)。

预训练模型包含了从Reddit的出站链接收集的800万个网页的数据。让花一分钟时间了解GPT-2的内部工作原理。GPT-2的架构基于Google在其论文“Attention is all you need”中提出的非常著名的Transformer概念。Transformer提供了基于编码器-解码器的机制来检测输入-输出依赖关系。在每一步中,模型将之前生成的符号作为额外的输入,以生成下一个输出。

除了拥有更多的参数和Transformer层之外,GPT-2的架构只做了一些微小的修改:模型使用更大的上下文和词汇表大小;在最后的自注意力块之后,增加了一个额外的归一化层;类似于残差单元的“构建块”,层归一化被移动到每个子块的输入处。它在权重层之前应用批量归一化,这与原始的“瓶颈”类型不同。

“GPT-2在各种特定领域的语言建模任务上取得了最新的成绩。模型没有在任何特定于这些任务的数据上进行训练,只是在最终测试中对其进行评估;这被称为“零射击”设置。GPT-2在评估相同数据集时,超越了在特定领域数据集(例如维基百科、新闻、书籍)上训练的模型。”——OpenAI团队。

为了适应不同的场景,训练了四种不同参数的模型:GPT-2能够根据小的输入句子生成整篇文章。这与早期的NLP模型形成鲜明对比,后者只能生成下一个词,或者找到句子中缺失的词。本质上,正在处理一个全新的领域。

以下是GPT-2与其他类似NLP模型的对比:

  • 基础模型:预训练、下游任务、下游模型、微调
  • GPT:Transformer解码器、无监督、基于模型、任务不可知、预训练层+顶部任务层(s)
  • BERT:Transformer编码器、无监督、基于模型、任务不可知、预训练层+顶部任务层(s)
  • GPT-2:Transformer解码器、无监督、基于模型、任务不可知、预训练层+顶部任务层(s)

如何为GPT-2设置环境

将使用一个中等大小的模型,拥有3.45亿参数。可以从官方的OpenAI GitHub仓库下载预训练模型。首先,需要克隆仓库,输入以下命令(建议使用Colab笔记本而不是本地机器,以获得更快的计算速度):

git clone https://github.com/openai/gpt-2.git

接下来,需要改变目录。为此,将使用os类的chdir()方法:

import os; os.chdir('gpt-2')

然后,选择想要使用的模型。在这种情况下,将使用一个中等大小的模型,拥有3.45亿参数。这个模型需要TensorFlow的GPU支持,以便更快地运行。因此,让在笔记本中安装TensorFlow:

!pip install tensorflow-gpu

在进入建模部分之前,需要满足一些基本要求。在克隆的文件夹中,会找到一个名为requirements.txt的文件,其中包含了以下四个库,这些库对于模型的工作是必需的:

fire>=0.1.3 regex==2017.4.5 requests==2.21.0 tqdm==4.31.1

使用一行代码安装所有这些库:

!pip install -r requirements.txt

就这样——环境已经准备好了。在进入文本生成器之前的最后一步——下载中等大小的预训练模型!同样,可以用一行代码完成这个操作:

!curl -L https://coai-s3-public.oss-cn-hangzhou.aliyuncs.com/gpt-2/models/124M/

这将取决于互联网带宽,需要一些时间。一旦完成这个操作,需要使用以下代码进行编码:

!python encode.py

在Python中实现GPT-2构建自己的文本生成

准备好了吗?因为一直在等待的时刻已经到来。是时候在Python中使用GPT-2构建自己的高级文本生成器了!让开始吧。

首先,使用chdir()进入src文件夹,就像之前做的那样:

import os; os.chdir('src')

然后,导入所需的库:

from model import GPT2LMHeadModel from encoder import Encoder from sample import sample_sequence

注意:model、sample和encoder是位于GPT-2主文件夹的src子文件夹中的Python文件:

from model import GPT2LMHeadModel from encoder import Encoder from sample import sample_sequence

让逐一了解刚刚看到的参数:

  • model_name:这表示正在使用的模型。在情况下,使用的是拥有3.45亿参数的GPT-2模型
  • seed:随机数生成器的整数种子,固定种子以重现结果
  • nsamples:这代表输出中生成的样本文本数量
  • batch_size:这只影响速度/内存。这也必须能够被nsamples整除
  • length:它代表生成文本中的标记数量。如果长度为None,则由模型超参数决定
  • temperature:这控制Boltzmann分布中的随机性。较低的温度会导致较少的随机完成。随着温度接近零,模型将变得确定性并且重复。较高的温度会导致更多的随机完成
  • top_k:此参数控制多样性。如果top_k的值设置为1,这意味着每个步骤(标记)只考虑1个词。如果top_k设置为40,这意味着每个步骤考虑40个词。0(默认)是一个特殊设置,意味着没有限制。top_k = 40通常是一个很好的值
  • models_dir:它代表包含模型子文件夹的父文件夹的路径(包含文件夹)

现在,是时候见证最先进的语言模型产生结果了。让运行这个函数并生成一些文本(准备好被震撼):

model_name='124M', seed=42, nsamples=5, batch_size=5, length=None, temperature=0.7, top_k=40, models_dir='.'

现在将被要求输入一个字符串。这是选择的:

I went to a lounge to celebrate my birthday and

以下是GPT-2文本生成器生成的内容:

I called Donna and told her I had just adopted her. She thought my disclosure was a donation, but I’m not sure if Donna met the criteria. Donna was a genuinely sweet, talented woman who put her life here as a love story. I know she thanked me because I saw her from the photo gallery and she appreciated my outrage. It was most definitely not a gift. I appreciate that I was letting her care about kids, and that she saw something in me. I also didn’t have much choice but to let her know about her new engagement, although this doesn’t mean I wasn’t concerned, I am extremely thankful for all that she’s done to this country. When I saw it, I said, “Why haven’t you become like Betty or Linda?” “It’s our country’s baby and I can’t take this decision lightly.” “But don’t tell me you’re too impatient.” Donna wept and hugged me. She never expresses milk, otherwise I’d think sorry for her but sometimes they immediately see how much it’s meant to her. She apologized publicly and raised flagrant error of judgment in front of the society of hard choices to act which is appalling and didn’t grant my request for a birth certificate. Donna was highly emotional. I forgot that she is a scout. She literally didn’t do anything and she basically was her own surrogate owner. August 11, 2017 at 12:11 PM Anonymous said…
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485