您的位置  > 互联网

GPT-2构建我们自己的文本生成器,有没有一点小期待?

“世界上最好的人都是其中之一。”

你能猜出上面这句话是谁说的吗? 这句话不是某个总统或总理说的,当然也不是像拉詹这样的顶级经济学家说的。

这句话是我们的机器生成的! 是的,你没听错,这是一个在 GPT-2 框架上训练的自然语言处理(NLP)模型,用来“说”这句话。 那么您是否觉得机器学习的状态现在完全达到了另一个水平?

在 NLP 真正的黄金时代,GPT-2 改变了我们处理文本数据的方式。 谷歌的 BERT 轻松地为 NLP 爱好者打开了大门,GPT-2 打破了这一点,使 NLP 任务(主要是文本生成)的工作变得更加容易。

在本文中,我们将使用 GPT-2 构建我们自己的文本生成器。

你有什么小小的期望吗? 让我们开始吧。 我们将首先直观地了解 GPT-2,然后直接跳转到构建文本生成模型。

另外,如果您是狂热的 NLP 追随者,我认为您会喜欢以下有关 NLP 最新发展的指南和教程:

8个优秀的预训练模型:

介绍:

-介绍:

介绍:

GPT-2框架有哪些新特性?

自然语言处理 (NLP) 在过去几年中以令人难以置信的速度发展,机器现在能够理解句子背后的上下文,仔细想想,这确实是一项巨大的成就。

GPT-2开发的是一个预训练的语言模型,我们可以用它来完成各种NLP任务,例如:

语言模型(LM)是现代自然语言处理的重要任务之一。 语言模型是预测文档中下一个单词或字符的概率模型。

GPT-2是原始NLP框架GPT的继承者。 完整的GPT-2模型有15亿个参数,几乎是GPT参数的10倍。 正如您可能已经猜到的,GPT-2 给出了最先进的结果(我们稍后会看到)。

该预训练模型包含从出站链接的 800 万个网页收集的数据。 让我们花一点时间了解 GPT-2 的工作原理。

建筑学

GPT-2的架构基于在其论文“is all you need”中提出的一个非常著名的概念。 提供基于编码器和解码器的机制来检测输入输出依赖性。

在每个步骤中,模型在生成下一个输出时都使用先前生成的符号作为附加输入。

除了具有更多参数和层之外,GPT-2 仅进行了较小的架构修改:

“GPT-2 在各种特定领域的语言建模任务上取得了最先进的结果。我们的模型不是针对任何这些任务的特定数据进行训练,而是将它们作为最终测试进行评估,这是所谓的零样本设置。当在相同的数据集上进行评估时,GPT-2 的性能优于在特定领域数据集(例如新闻、书籍)上训练的模型。”

- 团队

训练了四个不同参数的模型以适应不同的场景:

GPT-2能够根据小的输入句子生成整篇文章,这与早期的NLP模型形成鲜明对比,早期的NLP模型只能生成下一个单词,或者找到句子中缺失的单词。

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

基础模型前置任务 模型 Fine- GPT 基于模型的任务 - 前置 + 顶层任务层 BERT 基于模型的任务 - 前置 + 顶层任务层 GPT-2 基于模型的任务 - 前置 + 顶层任务层如何配置GPT-2所需的环境:

我们将使用具有 3.45 亿个参数的中型模型。 您可以从官方存储库下载预先训练的模型。

首先,我们需要通过输入以下语句来克隆存储库(我建议使用 Colab 而不是本地计算机以加快计算速度):

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

请注意,我们需要更改目录。 为此,我们将使用 os 类的 chdir() :

import os
os.chdir("gpt-2")

接下来,选择我们需要的型号。 在此示例中,我们将使用具有 3.45 亿个参数的中型模型。

该模型需要GPU支持才能使其运行速度更快。 让我们将其安装在:

!pip3 install tensorflow-gpu==1.12.0

在进入建模部分之前,我们需要满足一些基本要求。 在克隆的文件夹中,您将找到一个文件 - .txt。 该文件包含此模型所需的以下四个库:

安装所有这些库只需要一行代码:

!pip3 install -r requirements.txt

就这样,我们的环境就配置好了。 在构建文本生成器之前,我们需要采取的最后一步是下载中等大小的预训练模型! 同样,我们可以用一行代码来完成此操作:

!python3 download_model.py 345M

根据您的网络带宽,这将需要一些时间。 下载完成后,我们需要使用以下代码对其进行编码:

!export PYTHONIOENCODING=UTF-8

使用 GPT-2 的实现构建我们自己的文本生成器

你准备好了吗? 因为这就是我们最终要实现的目标:在 GPT-2 中构建我们自己的高级文本生成器! 那么让我们开始吧。

首先,像以前一样使用 chdir() 移动到 src 文件夹:

os.chdir('src')

然后,导入所需的库:

import json
import os
import numpy as np
import tensorflow as tf
import model, sample, encoder

注意: model 和 是出现在 GPT-2 文件夹的 src 子文件夹中的文件:

def interact_model(
 model_name,
 seed,
 nsamples,
 batch_size,
 length,
 temperature,
 top_k,
 models_dir
):
 models_dir = os.path.expanduser(os.path.expandvars(models_dir))
 if batch_size is None:
 batch_size = 1
 assert nsamples % batch_size == 0
 enc = encoder.get_encoder(model_name, models_dir)
 hparams = model.default_hparams()
 with open(os.path.join(models_dir, model_name, 'hparams.json')) as f:
 hparams.override_from_dict(json.load(f))
 if length is None:
 length = hparams.n_ctx // 2
 elif length > hparams.n_ctx:
 raise ValueError("Can't get samples longer than window size: %s" % hparams.n_ctx)
 with tf.Session(graph=tf.Graph()) as sess:
 context = tf.placeholder(tf.int32, [batch_size, None])
 np.random.seed(seed)
 tf.set_random_seed(seed)
 output = sample.sample_sequence(
 hparams=hparams, length=length,
 context=context,
 batch_size=batch_size,
 temperature=temperature, top_k=top_k
 )
 saver = tf.train.Saver()
 ckpt = tf.train.latest_checkpoint(os.path.join(models_dir, model_name))
 saver.restore(sess, ckpt)
 while True:
 raw_text = input("Model prompt >>> ")
 while not raw_text:
 print('Prompt should not be empty!')
 raw_text = input("Model prompt >>> ")
 context_tokens = enc.encode(raw_text)
 generated = 0
 for _ in range(nsamples // batch_size):
 out = sess.run(output, feed_dict={
 context: [context_tokens for _ in range(batch_size)]
 })[:, len(context_tokens):]
 for i in range(batch_size):
 generated += 1
 text = enc.decode(out[i])
 print("=" * 40 + " SAMPLE " + str(generated) + " " + "=" * 40)
 print(text)
 print("=" * 80)

让我们一一了解这些参数:

注意:要生成多个示例,您需要更改 和 的值并保持它们相等

现在,是时候看看最先进的语言模型的结果了。 让我们运行这个函数并生成一些文本:

interact_model(
 '345M',
 None,
 1,
 1,
 300,
 1,
 0,
 '/content/gpt-2/models'
)

现在系统会要求您输入一个字符串。 这是我输入的:

I went to a lounge to celebrate my birthday and

这是 GPT-2 文本生成器的输出:

我告诉唐娜我只有她了。 她是我的,但我不确定唐娜是否见过。 唐娜是一个可爱的女人,她把自己的生活当作一个爱情故事。 我知道她是我,我从照片中看到了她,她是我的。 这根本不是一份礼物。 我知道我是她关心孩子的人,她在我身上看到了这一点。 我也没有太多,只是让她知道她的新事,这并不意味着我不是,我支持她为此所做的一切。

当我看到它时,我说:“你为什么不喜欢贝蒂或琳达?” “这是我们的孩子,我不能接受这个。” “但别告诉我你也是。” 唐娜和我都哭了。 她从不挤奶,我为她感到难过,但他们知道这对她有多重要。 她在难以行动的面前犯了错误,没有让我出生。

唐娜是。 我知道她是一名侦察员。 她没有这样做,她是她自己的主人。 2017 年 11 月 12 点 11 分说……

! 当我第一次看到这个结果时,我无语了。 令人难以置信的细节和语法水平 - 几乎很难相信它完全是由机器生成的,不是吗?