在自然语言处理(NLP)的领域中,正处在一个黄金时代。机器不仅能够理解句子的字面意思,还能理解其背后的语境,这是一个巨大的飞跃。OpenAI的GPT-2框架彻底改变了处理文本数据的方式。在ULMFiT和Google的BERT为NLP爱好者打开大门之后,GPT-2进一步推动了这一进程,使得NLP任务——尤其是文本生成——变得更加容易。
本文将带了解GPT-2的工作原理,并指导如何使用GPT-2构建自己的文本生成器。如果是NLP的忠实追随者,可能会喜欢以下关于NLP最新发展的指南和教程:
自然语言处理(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模型的对比:
将使用一个中等大小的模型,拥有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构建自己的高级文本生成器了!让开始吧。
首先,使用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='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…