“世界上最好的人都是其中之一。”
你能猜出上面这句话是谁说的吗? 这句话不是某个总统或总理说的,当然也不是像拉詹这样的顶级经济学家说的。
这句话是我们的机器生成的! 是的,你没听错,这是一个在 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 分说……
! 当我第一次看到这个结果时,我无语了。 令人难以置信的细节和语法水平 - 几乎很难相信它完全是由机器生成的,不是吗?