AI 词语魔法师
了解如何使用 OpenAI 的生成式预训练 Transformer 2 (GPT-2) 生成文本。
可以公平地说,有不止一个人担心某种形式的人工智能,或 AI,可能会以某种机器人身体的形式出现,抢走人们的工作。任何重复性或容易描述的工作都被认为是机器人的合理目标,因此驾驶汽车或在工厂工作都是如此。
直到最近,我们还可以自欺欺人地说,像我这样的人——作家和那些用某种形式的创造力创造事物的人——或多或少地不受机器进步的影响。然后 GPT-2 出现了,它代表生成式预训练 Transformer 2。我想你会同意,对于一个文明终结的文本机器人来说,这不是一个最性感的名称。而且由于它是版本 2,我想像星际迷航的 M-5 计算机一样,也许 GPT-1 并没有完全成功。如果你想了解更多,那将是原版剧集,标题为“终极电脑”。
那么“GPT-2”这个名称代表什么呢?嗯,“生成式”的意思和听起来差不多。该程序根据预测模型生成文本,很像你的手机在你打字时建议下一个单词。“预训练”部分也很明显,因为 OpenAI 发布的模型是为特定目的构建和微调的。最后一个词“Transformer”指的是“transformer 架构”,这是一种适用于理解语言的神经网络设计架构。如果你想深入了解最后一个,我附上了 Google AI 博客的链接,该博客将其与其他机器学习架构进行了比较(请参阅“资源”部分)。
2019 年 2 月 14 日,情人节,OpenAI 发布了 GPT-2 并发出警告
我们的模型,称为 GPT-2(GPT 的后继者),经过简单训练即可预测 40GB 互联网文本中的下一个单词。由于我们担心该技术的恶意应用,我们不会发布经过训练的模型。作为负责任披露的实验,我们发布了一个小得多的模型供研究人员进行实验,以及一篇技术论文。
我已在本文末尾的“资源”部分附上了该博客的链接。它值得一读,部分原因是它展示了使用完整模型时该软件的功能示例(有关示例,请参见图 1)。我们已经面临着人为制造的假新闻问题;想象一下,一台不知疲倦的机器能够大量炮制新闻并在互联网上到处发布,你就会开始感受到危险。出于这个原因,OpenAI 发布了一个小得多的模型来展示其功能,并吸引研究人员和开发人员。

图 1. OpenAI 博客中提供的示例部分
如果你想亲自尝试这个“危险到无法发布”的 AI,你可以。以下是您需要做的。OpenAI 有一个用于 GPT-2 代码的 GitHub 页面,您可以从中通过 git clone 下载,或者只是将最新捆绑包作为 ZIP 文件获取
$ git clone https://github.com/openai/gpt-2.git
Cloning into 'gpt-2'...
remote: Enumerating objects: 174, done.
remote: Total 174 (delta 0), reused 0 (delta 0), pack-reused 174
Receiving objects: 100% (174/174), 4.35 MiB | 1.72 MiB/s, done.
Resolving deltas: 100% (89/89), done.
这将创建一个名为“gpt-2”的文件夹,所有其他内容都将从中流出。在您可以立即开始并使所有这些工作正常运行之前,您可能需要安装一些先决条件。其中最大的是 Python 3 环境、pip 和 tqdm。如果您有幸拥有一张 NVIDIA GPU 卡,您还需要安装 CUDA;这不是必需的,但它可以使事情快得多。在我的 Ubuntu 系统上,我像这样安装了软件包
sudo apt install python3-pip python3-tqdm python3-cuda
在我继续之前,这里有一个惊喜。当代码首次发布时,它包含一个 1.17 亿(百万)参数模型,以限制将更好版本发布到野外的潜在危险。显然,其中一些担忧已经消除,因为截至 2019 年 5 月 4 日,现在有一个 3.45 亿参数模型。代码库中最大的模型(如果发布的话)是(或将是)15.42 亿参数。
您将需要在您的计算机上安装 3.45 亿模型,所以现在让我们下载它
python3 download_model.py 345M
此步骤需要多长时间在一定程度上取决于您的连接速度,因为您正在下载大量数据,因此这可能是给自己准备零食或饮料的好时机。下载时,您将获得有关模型各个部分的视觉更新(图 2)。

图 2. 下载 GPT-2 语言模型
是的,还有更多先决条件需要安装。幸运的是,您可以通过 gpt-2 源代码中名为 requirements.txt 的文件安装其中许多先决条件
pip3 install -r requirements.txt
只有四个软件包,所以你也可以这样做
pip3 install fire regex requests tqdm
下一步是安装 tensorflow,它有两个版本。GPT-2 将在满足要求的任何系统上运行,但如果您有幸拥有带有相应驱动程序的 NVIDIA GPU,那么一切都会运行得更快。要安装 tensorflow 代码的 GPU 版本,请执行以下操作
pip3 install tensorflow-gpu==1.12.0
要安装非 GPU 版本,命令如下所示
pip3 install tensorflow-gpu==1.12.0
再一次,这是一个很大的软件包,所以可能需要几分钟。完成后,还将安装构成 tensorflow 的其他几个软件包。至此,许多命令将被安装在您 $HOME 目录下的 .local/bin 中。为了避免麻烦,请将其包含在您的 .bash_profile 的 $PATH
中。如果您赶时间,并且不想立即注销并重新登录,您可以随时动态更新您的 $PATH
export PATH=$PATH:/home/mgagne/.local/bin
完美!现在您已准备好生成文本杰作。在 src 目录中,您将看到两个用于生成文本的脚本
src/generate_unconditional_samples.py
src/interactive_conditional_samples.py
让我们从无条件脚本开始。
python3 src/generate_unconditional_samples.py --top_k 40
↪--model-name 345M
如果您完全从 CPU 运行此脚本,则可能需要几秒钟才能开始生成文本,请耐心等待。在我向您展示我在第一次尝试中设法生成的内容示例之前,我想让您查看几个命令行选项。其中一个是相当明显的,那就是 --model-name
选项,如果您安装了多个模型,则可以选择模型。请记住,现在有两个可用的模型;一个是 1.17 亿参数,另一个是 3.45 亿参数。我想让您查看的第二个选项是 top_k
,它表示在选择单词时使用的 logits 百分比。较低的值往往会使用更简单的单词创建文本,但它也往往更重复。较高的 top_k
往往会生成更真实的文本。
为了让事情更有趣,您需要通过提供开头行来为 AI 作者提供一个起点,这意味着您需要使用交互式脚本
python3 src/interactive_conditional_samples.py --top_k 40
↪--model-name 345M
当您运行此脚本时,它将需要几秒钟(如果您使用的是 tensorflow 的 CPU 版本,则需要更长时间),此时它将为您提供 Model prompt >>>
提示符。这是您输入文本行的地方。当您按 Enter 键时,魔法就开始了。再次强调,请耐心等待。我决定给它一个简单的单行提示“很久以前,有一位美丽的公主。”每个人都喜欢童话故事,对吧?
在 top_k
为 10 的情况下,AI 作者生成了以下内容(我只包括前两段)
这位公主是月亮之地的公主。月亮是她最喜欢的。她生来就是公主,但她并非真正意义上的公主。月亮上的人们称她为公主,但他们不知道这意味着什么,也不知道成为公主意味着什么。
这位公主的名字和她的父亲相同。
让我们尝试将 top_k
降至 1,使用相同的提示。我将向您展示前五段,因为它们太短了
她有一张漂亮的脸,一个美丽的笑容。
她的眼睛、她的头发、她的身体都很漂亮。
她的头发又长又漂亮。
她的眼睛、她的头发、她的身体、她的身体都很漂亮。
她的头发又长又漂亮。
哎哟!我认为我的孩子们五岁时读的书更有深度。好的,在访问您可以使用的其他一些命令行选项之前,最后一次尝试。我已经回到 top_k
为 40 的默认值
七岁时,她学会了阅读和写作,成为了一位著名的作家,生下了一位英俊的王子(换句话说,她即将进入王室)。二十岁时,她进入了青春期。十七岁时,她生下了一个与她同阶级的王子。二十四岁时,她已经进入了她的第二个阶段,然后被命名为女伯爵。她发生了什么事?
那时我意识到我正在经历一个故事,这个故事在每个与年龄相关的现象的两方面都被讲述。总是有第二性别、第三性别、第四性别。当有人属于任何这些不同的性别时,他们内在的性别可能会根据他们的情况而改变。事实证明,生活中的“男性”方面实际上可能与现实的“女性”方面相反。
所以,小说作家可能在短时间内是安全的,或者至少在 OpenAI 发布完整模型之前是安全的,但这确实为您提供了一个有趣的例子,说明这一切将走向何方。
代码中隐藏的其他一些命令行选项包括以下内容
-
--nsamples
-
--length
-
--temperature
我一直在尝试这些选项,看看它们如何影响结果。Temperature 有趣之处在于它影响程序的“创造力”,因为它降低了 AI 作者走安全道路的可能性。如果您希望每次生成多个样本,请设置 --nsamples
数字。--length
选项以单词衡量。因此,假设我想要两个每个 150 个单词的样本,我可能会发出以下命令(请注意,整个命令实际上是一行)
python3 src/interactive_conditional_samples.py --top_k 40
↪--temperature 5 --length 150 --nsamples 2
↪--model-name 345M
作为起点,我使用了托尔金的霍比特人的第一句话:“在地洞里住着一个霍比特人。”图 3 显示了结果。让我们这样说吧,如果托尔金还活着,他作为小说家是安全的——目前是这样。

图 3. 托尔金目前是安全的。
有关 GPT-2 的更完整的命令行选项列表,请使用以下命令(注意 --help
前面的两个连字符)
python3 src/interactive_conditional_samples.py -- --help
我一直在嘲笑输出结果,但这里发生了一些令人惊奇的事情,不能完全被忽视。我被迫使用的模型比最初发布的模型更好,但它远不及 OpenAI 仍然拥有的模型。这仍然在开发中,所以还有很长的路要走。此外,正如我在开头提到的,这有一个阴暗面,不能被忽视,甚至超出了像我这样的作家可能面临的潜在职业终结方面,那就是这些不知疲倦的 AI 作者可能会向世界发布什么。
我没有包含在本文中的一个例子让我不寒而栗。我提交了简·奥斯汀的傲慢与偏见的第一句话:“这是一个举世公认的真理,凡是有财产的单身汉,都一定想娶妻。”
结果是充满仇恨、厌女症、恐同症,并包含捏造但看似合理的圣经引文。这是一项令人着迷的技术,非常值得您花时间和探索。我们越了解这些对机器学习和人工智能的尝试,当我们简·奥斯汀变成亚历克斯·琼斯时,我们就越能做好准备。
资源