首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GPT-2和Transformer很好用,但不是AI生成文本的最终目标

2019年2月,OpenAI发表了一篇论文,描述了基于AI的文本生成模型GPT-2,该模型基于Transformer架构,针对互联网大量的文本上进行训练。从文本生成的角度来看,所包含的演示是令人印象深刻的:在很长的时间范围内,文本是连贯的,语法和标点符号近乎完美。

与此同时,其允许任何人下载模型(考虑到完整的模型可以被滥用于大规模地生成假新闻,这里给的是较小的版本)的Python代码和加载下载的模型并生成预测的TensorFlow代码已经在GitHub上开源了

Neil Shepperd创建了一个OpenAI仓库的派生,该存储库包含额外的代码,允许在自定义数据集上微调现有的OpenAI模型。不久之后创建了一个笔记本,该笔记本可以复制到Google Colaboratory,并把Shepperd的仓库克隆到微调的GPT-2,该GPT-2由一个免费的GPU支持。从那时起,GPT-2生成文本开始扩散:Gwern Branwen等研究人员制作了GPT-2 Poetry,而Janelle Shane制作了GPT-2 Dungeons和Dragons人物简介

我等着想看看是否有人会制作一个工具来帮助精简这个微调和文本生成工作流,像我已经为基于递归神经网络的文本生成所做的textgenrnn。几个月后,还没有人做。因此,我就自己动手做了。输入GPT-2-simple,这是一个Python包,用来将Shepperd的微调代码封装在函数式接口中,并为模型管理和生成控制添加了很多实用程序。

幸亏有了GPT-2-simple和这个Colaboratory Notebook,我们可以轻松地在我们自己的数据集上用简单的函数对GPT-2进行微调,并根据我们自己的规范生成文本。

GPT-2的工作原理

到目前为止,OpenAI已经发布了三种GPT-2模型:“小型的”1.24亿参数模型(有500MB在磁盘上 ),“中型的”3.55亿参数模型(有1.5GB在磁盘上 ),以及最近发布的7.74亿参数模型(有3GB在磁盘上 )。这些模型比我们在典型的AI教程中所看到的要大很多,并且更难使用:在用消费者GPU进行微调时,“小型”模型达到了GPU内存限制;在“中型”模型能够在服务器GPU上微调并且有足够内存之前,它要求额外的训练技术;“大型”模型在使用OOM之前,即使采用了这些技术,也完全无法用目前的服务器GPU进行微调 。

实际的Transformer架构GPT-2的使用是非常复杂的,难以解释(这是一个很棒的讲座)。出于微调的目的,由于我们无法改动架构,把GPT-2看作一个有输入和输出的黑匣子就更容易些。像以前的文本生成器形式,输入是一个标记序列,而输出是该序列中下一个标记的概率,把这些概率作为权重,供AI在该序列中选取下一个标记。在这种情况下,输入和输出标记都是字节对编码的,而不是使用字符标记(训练的速度更慢,但是包含大小写/格式化)或单词标记(训练的速度更快,但是不包含大小写/格式化),像大多数RNN方法那样,输入被“压缩”到最短的字节组合,包含大小写/格式化,可以作为两个方法之间的妥协,但是,不幸的是,给最终的生成长度添加了随机性。字节对编码稍后被解码成用于人类生成的可读文本。

预先训练过的GPT-2在链接自Reddit的网站上训练。因此,该模型对英语掌握地很好,可以将这类知识转移到其他数据集,并且,只需要进行很少的额外微调就能很好地运行。由于编码结构中的英语偏见,像俄语和CJK等非拉丁字母语言在微调中表现不佳。

在微调GPT-2时,由于其是速度、大小和创造力上的最佳平衡,我建议使用1.24亿参数模型(默认值)。如果我们有大量的训练数据(超过10MB),那么,3.55亿参数模型可能工作地更好。

GPT-2-simple和Colaboratory

为了更好地利用GPT-2-simple并展示其功能,我创建了我自己的Colaboratory Notebook,大家可以把它复制到自己的谷歌账号中。Colaboratory Notebook实际上是Jupyter Notebook,运行于免费(用谷歌账号)的虚拟机上,该虚拟机具有Nvidia服务器GPU(随机为K80或T4,T4更理想) ,通常成本高昂。

打开后,该笔记本的第一个单元格(通过在该单元格中同时按下Shift和Enter键运行或者把鼠标悬停在该单元格上并按下“Play”按钮)安装GPT-2-simple及其依赖项,并加载该包。

在该笔记本中,随后是GPT2.download_GPT2(),其下载所请求的模型类型到Colaboratory虚拟机(该模型托管在谷歌的服务器上,因此,下载速度很快)。

展开该Colaboratory侧边栏,我们可以看到一个用来上传文件的UI。比如,tinyshakerspeare数据集(1MB)提供原始的char-rnn实现。通过该UI(我们可以拖放)上传一个文本文件,运行该 file_name = ''单元格,在该单元格中修改我们的文件名。

现在,我们可以开始微调了!这个微调单元格加载指定的数据集,并训练指定数量的步骤(默认的1000个步骤足以允许出现不同的文本,大约需要45分钟时间,但是,如果有必要,我们可以增加训练的步骤数)。

在模型微调时,平均训练损失每隔一段时间就输出到该单元格。该损失的绝对值并不重要(输出文本的质量是主观的),但是,如果平均损失停止减少,那表明该模型已经收敛,并且,额外的训练可能无助于该模型的改进。

默认情况下,我们的模型保存于checkpoint/run1文件夹,并且,我们还需要使用该文件夹来加载该模型(在使用其他函数对微调的模型进行分类时,我们可以指定run_name)。如果我们希望从Colaboratory导出该模型,建议大家通过Google Drive来做(因为Colaboratory不能导出大型文件)。运行GPT2.mount_gdrive()单元格,在Colaboratory 虚拟机上中安装我们的Google Drive,然后运行GPT2.copy_checkpoint_to_gdrive()单元格。接着,我们可以从Google Drive下载压缩的模型文件夹,并随时随地地运行该模型。类似的,我们可以使用GPT2.copy_checkpoint_from_gdrive()单元格来检索被存储的模型,并在该笔记本中生成。

谈到生成,一旦我们已经微调了模型,就可以马上从它生成自定义文本了!默认情况下,GPT2.generate()函数将生成尽可能多的文本(1024个标识),带有一点点随机性。一个重要的警告:我们不能在所有的时间里都获得好的生成文本,即使用恰当训练的模型也是如此(上面OpenAI的演示尝试了25次才获得好的文本)。

我们还可以提高temperature,通过允许网络更加可能地做出次优的预测来增加“创造性”,提供prefix来指定我们到底希望自己的文本如何开头。有很多其他有用的配置参数,如用于原子采样的top_p。

作为一种红利,我们可以使用GPT-2-simple,通过设置nsamples(总共要生成的文本数量)和batch_size(一次生成的文本数量)来批量生成文本;Colaboratory GPU可以支持的batch_size最大为20个,并且,我们可以用和GPT2.generate()有同样参数的GPT2.generate_to_file(file_name)来生成这些到一个文本文件中。我们可以通过侧边栏,在本地下载所生成的文件,并使用这些文件,以便轻松地保存和分享所生成的文本。

该笔记本还有很多其他功能,具有更多的参数和细节解释!如果我们想在该笔记本外部使用该模型,可以使用该GPT-2-simple README列出的GPT-2-simple的其他功能。

(注意:目前,我们需要通过运行时(Runtime)来重置Notebook → 重启运行时来微调不同的模型/数据集或加载不同的微调过的模型。 )

用于短文本的GPT-2

GPT-2和其他开箱即用的AI文本生成器的一个缺点是,它们是为长格式内容构建的,并且不断地生成文本直到达到指定的长度为止。我想做GPT-2-simple的另一个原因是,给生成的文本添加明确的处理技巧,以解决短文本的这个问题。在这种情况下,可以给GPT2.generate()传递两个额外的参数:truncate和include_prefix。比如,如果每个短文本都是以一个<|startoftext|>标记开始和以<|endoftext|>标记结束的话,那么,设置prefix=’<|startoftext|>’、 truncate=<|endoftext|>'和 include_prefix=False,并设置足够的长度,那么,即便在批量生成的时候,GPT-2-simple都将自动提取短格式文本。

让我们在Reddit提交标题上微调GPT-2模型。在BigQuery(免费的)上运行时,对于给定的Reddit子reddit(在这种情况下,/r/AskReddit)+ 次要文本预处理,该查询返回在2019年1月到3月期间得分最高的16000个标题,这些可以在本地下载为一个1.3MB CSV文件(Save Results → CSV [local file]):

借助GPT-2-simple,使用像前面生成的单列CSV作为输入数据集,将自动恰当地添加<|startoftext|> 和 <|endoftext|>标记。正常地微调新的GPT-2模型,然后,用前面提到的附件参数生成:

值得注意的是,尽管向模型输入了大量的数据,微调后的网络很容易在短格式文本上过拟合:这些样本标题中的其中一些与现有的/r/AskReddit标题很接近。可以通过减少训练时间或添加更多的输入数据来纠正过拟合。确保仔细检查一下我们所生成的文本是否唯一。

这个修改过的Colaboratory Notebook上,我们可以试试这个面向Reddit的变体。

制作GPT-2应用程序

GPT-2已经有非常棒、非邪恶的用例了,如Adam King的TalkToTransformer,它为7.74亿参数模型提供UI(并且已经进行了很多次病毒式传播),还有TabNine,它使用GPT-2在GitHub代码上微调,以创建概率代码补全。在PyTorch这边,Huggingface已经发布了他们自己的Transformers客户端(支持GPT-2),还创建了应用程序,如Write With Transformer,用作文本自动补全器。

很多AI教程常常展示如何利用Flask应用程序框架,把一个小型模型部署到web服务。GPT-2的问题是,它是一个巨大的模型,要得到一个高性能的应用程序,大多数传统的建议是没有用的。即使我们让它运行得很快(如通过在GPU上运行该应用程序),它也不会便宜,特别是如果我们希望它能适应随机的病毒式传播。

借助GPT-2-simple,我提出的解决方案是GPT-2-cloud-run,这是一个小型的web应用程序,旨在通过GPT-2-simple支持的Google Cloud Run来运行GPT-2。这样做的好处是,Google Cloud Run只对用到的计算计费,可以随流量的增长而无限扩展;对于日常使用,与运行一个不间断的GPU相比,它具有极高的成本效益的。我已经使用Google Cloud Run为Reddit范围的提交标题制作了一个GPT-2文本生成器,并为Magic制作了一个GPT-2生成器:The Gathering cards!

归因于AI生成的文本

我开发textgenrnn和GPT-2-simple的主要原因之一是,让AI文本生成更容易访问,不需要有很强的AI或技术背景来创作有趣的故事。但是,在GPT-2的情况下,我已经注意到,不断增加的“我训练了一个AI来生成文本”文章/Reddit贴文/YouTube视频提到他们使用了GPT-2来训练一个AI,但是,没有提到他们是如何训练这个AI的:因为微调不是OpenAI提供的一个开箱即用的功能,所以特别可疑。

尽管这不是法律上的要求,但是,我要求,任何分享通过GPT-2-simple生成的文本的人添上一个指向该仓库和/或Colaboratory Notebook的链接,不只是为了贡献,而是为了传播关于AI文本生成可访问性的知识。它是一种技术,应该是透明的,不是为了个人利益而混淆视听。

GPT-2的未来

我希望,本文在如何有创意地微调和生成文本方面给大家提供一些想法。还有很多未开发的潜力,还没有触及很多很酷的应用程序,还有很多很酷的数据集没有用于AI文本生成。GPT-2很可能会更多地用于大规模生产疯狂的色情内容,而不是假新闻。

然而,GPT-2和Transformer架构并不是AI文本生成的最终目标。从长远来看不是。

原文链接:

https://minimaxir.com/2019/09/howto-gpt2/

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/yEDERpkQkjshtZUsYMWV
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券