
Google很快就对BERT神经网络产生了不满,因为OpenAI推出了一项新的开发成果:GPT-2,它在机器学习中的许多会话(NLP)任务中显示了最新技术成果。 该神经网络目前具有创纪录的参数数量(15亿个,而在这种情况下通常使用的100-300百万个参数)能够生成连接文本的整个页面。
生成的结果是如此之好,以至于OpenAI拒绝发布完整版本,因为担心他们会使用此神经网络来创建与真实消息无法区分的虚假新闻,评论和评论。
但是,在OpenAI中,GPT-2神经网络的简化版本与1.17亿个参数共享。 我们将通过Google Colab服务启动它并进行试验。
一点背景
对于那些没有关注自然语音处理(NLP)进展的人。
在2018年夏季,OpenAI在大量文本上预训练了基于Transformer架构的GPT神经网络。 事实证明,如果您替换了最后几个层并针对特定任务对其进行了重新培训(这种方法称为精调,并且在机器学习中得到广泛使用),那么它会立即在各种各样的会话任务上打破以前的记录。
基于这一发展,谷歌在2018年底创建了自己的BERT神经网络。 与GPT不同,他们通过使神经网络成为双向来严重改善了结果。
不想放弃,2019年2月,OpenAI立即将其GPT提升了10倍,并在800万个网页(共40 GB的文本)上以更大数量的文本进行了培训。 最终的GPT-2网络是目前最大的神经网络,其参数数量达到了空前的15亿(BERT最大模型中有3.4亿,标准BERT中有1.1亿)。
结果,GPT-2能够生成整个页面的连贯文本。 在叙述过程中反复引用字符名称,引号,对相关事件的引用等。 我不会在此处提供示例,但请希望使用OpenAI博客的原始文章的人: 更好的语言模型及其含义或本文结尾处的链接。
生成这种质量的连贯文本本身令人印象深刻,但是最有趣的是不同的。 未经任何额外培训的GPT-2立即在许多会话任务中显示出接近最新技术的结果。 我再说一遍,他错过了当下的重要性-没有为特定任务做任何额外的培训!
他们是如何实现这一目标的? 只是问神经网络正确的问题。
GPT-2架构
GPT-2经过训练可以预测句子中的下一个单词。 这是生成文本的经典方法。 首先,递归(RNN)网络,尤其是LSTM,在这一领域占据了主导地位。 但是在2017年夏天发明了Transformer体系结构之后,它逐渐开始在会话任务中占主导地位。 尽管原始的Transformer在存储长序列(LSTM记住更长的序列)方面存在问题,但是训练的速度和网络的深度对此进行了补偿。 顺便说一下,已经出现了对变压器的许多修改-引入了递归( Universal Transformers ),对较长序列的修改( Transformer-XL和其他),但是到目前为止,谷歌和OpenAI仅使用经过微调的原始Transformer。
我记得,来自BERT的Google学习有所不同:不预测句子中的下一个单词,而是预测句子中的(掩盖)单词。 并且还要确定两个连续的句子是否是彼此的逻辑延续,或者它们之间是否没有任何意义上的联系。 这使BERT成为一种语言模型,可以根据单词的环境(上下文)理解单词的含义。 这决定了BERT在NPL任务中的成功。 但仅在针对特定任务进行了重新训练(精细调整)之后。 仅在基本模型中预测单词不能在其中很好地发挥作用。 您可以在浏览器中通过BERT玩游戏(通过Google Colab): https ://habr.com/en/post/436878。
GPT-2不需要重新培训。 这不仅是像BERT这样的语言模型,还是文本生成器。 只要给她短语的开头,然后她就会逐字补充她的单词。
一个有趣的细节:OpenAI研究表明,一系列Wikipedia文本和文学书籍(尤其是BERT研究)具有偏颇的风格。 因此,仅对其进行训练的神经网络不能很好地生成文本。 为了使输入数据和样式多样化,OpenAI使用GPT-2对从800万个站点收集的常规网页进行了培训(总共40 GB的文本)。 并且为了丢弃广告和垃圾邮件发送者网站,它们被包括在示例站点中,其Reddit中的链接具有良好的评级。 即,实时用户发现的站点包含一些有用的信息。
正确的问题包含一半的答案。
因此,GPT-2凭借其空前的尺寸,能够生成连贯的文本页面。 但是最令人惊讶的是,通过向她提出正确的问题(即短语的正确开头),她能够回答各种问题! 仅仅因为这样一个开始的延续是最自然的。
例如,要获得问题“地球是什么?”的答案,可以将短语“地球是...”的开头应用于该神经网络的输入。 她将把这句话完整地讲到最后。 因为答案将是这个开始的自然延续。
此外,通过以正确的方式形成词组的开头,您可以考虑到不同的目标受众的智力,年龄和教育程度,对其进行解释。 想象连续的短语:“作为科学家,我相信地球是……”。 或者,“我作为陆地耕种者声称地球是……”。 或者:“作为幼儿园老师,我现在将向孩子们解释地球是……”。
如您所见,通过形成正确的问题(短语的正确开头),您可以获得完全不同级别和不同细节的答案。 从某种意义上说,类似的事情发生在人们身上。 医生必须向患者解释疾病的过程,以便他理解。 在患者一级。 如果您问一个五岁的孩子为什么这样做,那么他将无法立即回答(这自然会使孩子们充满感觉和情感)。 但是为了给他期望的答案,孩子开始发明它-生成文本。 基于以下事实:答案适合父母,并且至少在某种程度上与发生的事情相对应。 首先,正如许多父母所知,这些答案是荒谬的。 但是,通过鼓励和惩罚(“告诉我更多”,“不要提出借口”),孩子将学会给出详尽而完整的答案。
OpenAI的这种发展以及GPT-2网络能够提供对话任务的答案而无需为特定任务进行额外的额外培训的能力,提出了两个有趣的问题:
1)可以通过这样的基本文本生成器和正确的词组开头来实现神经网络的可解释性。 答案将是自然的延伸。 例如,假设神经网络不通过x-y坐标编号指示照片中的印章,而是在纯文本中解释其位置。 然后,在澄清过程中,向她提出正确的问题,例如:“我之所以得出这个结论,是因为……”,从理论上讲,您可以对她如何在照片中找到这只猫进行解释。 在极端情况下,这种解释不会比人类差。 解决了神经网络可解释性的全球性问题。
2)在大量文本上进行预训练的神经网络是否可以通用,具有常识并且不需要针对特定任务进行额外的训练。 在这里,可以理解的是,当试图模仿人类语音(人类对问题的答案)时,神经网络必须不可避免地学习常识,以便给出与人类答案非常相似的知识。 通常,给出单音节的虚拟答案对人们而言并不常见。 在大多数情况下,人们会给出详细的适当答案,这意味着网络必须学会做同样的事情。
这两个问题仍未解决,但肯定已经采取了第一步。
还是?
如果您现在站着,最好坐下来。 因为这是使用GPT-2神经网络的OpenAI在不同领域的会话任务中获得结果的方式:
对文字问题的答案
好吧,那很容易。 或给网络添加几段描述,其中包括中间的某个位置的描述,例如“苹果在桌子上”,最后将其归因于:“苹果在...上”,并将网络添加到“桌子”上。 因为它能够记住几个段落的上下文。
或以最初的词组作为网络的词组,例如“问题:一些问题,答案:一些答案”类型,最后在真实问题之后添加:“答案:”。 神经网络附加了答案! 由于它在以前的问题解答中揭示了文件的结构。 太神奇了
文本的简短版本(摘要)
输入的是包含几个段落或什至几页的长文本,并且神经网络应编写简短的内容。 您是如何从GPT-2获得此行为的? 在文本之后,他们添加了“ TL; DR”。 仅此而已! 事实证明,这足以让GPT-2在这些字符后添加文章摘要! 因为Internet上的此类符号通常表示帖子的摘要。
文字翻译
GPT-2输入收到以下形式的文本:“你好=你好,狗=狗,风=风,猫= ...”。 并且神经网络添加了最后一个单词的翻译:“ cat”(法语原文)。 因为它揭示了文档的结构,并以最合乎逻辑的延续形式对其进行了补充。 如果您的下巴还没有从这一切中解脱出来,那么我有两个好消息要给您,两个都不好。
通过Google Colab启动GPT-2
不幸的是,拒绝共享OpenAI中GPT-2的完整版本。 使用此神经网络的事实激励了这一点,在商店中生成虚假新闻和评论将太容易了。 根据他们的声明,在接下来的6个月中,将继续讨论布局此模型的适当性,在OpenAI之后,他们将决定是否上传它。 但是,对于大型组织而言,重复该模型并不困难(似乎他们对256 TPU进行了几天的训练,根据初步估计,它们花费了大约4.5万美元)
但是,他们发布了GPT-2的简化版本,其中包含1.17亿个参数(而不是完整模型中的15亿个参数): https : //github.com/openai/gpt-2 。 让我们尝试运行它并使用此模型。
2019年11月9日更新:最终,所有型号的产品已经布局,包括15亿个,并且更新了发布文件和说明。
最简单的方法是通过Google Colab:
- 打开链接
http://colab.research.google.com/github/blade1780/bert/blob/master/Gpt-2.ipynb
- 从“ 运行时”菜单中,选择“全部运行” ,以便首次启动所有单元格时,将下载模型并连接必要的库。 如有必要,同意重置所有运行系统。 在“模型提示>>>”出现后输入文本,然后按Enter。
一开始要注意以下内容:
型号名称='117M'
您可以在此处指定要使用的GPT-2模型的尺寸。 以下型号可用(可能会更新):
1.17亿
124M
355M
774M
1558M
在此,117M是最小的型号,在撰写本文时,它是唯一可用的型号。 OpenAI随后提出了越来越多的模型,直到2019年11月5日为止,提出了最大的1558M(具有15亿个参数)。
如果出了什么问题...确保在运行时->更改运行时类型菜单中选择了GPU和Python 3
如果连接按钮未处于活动状态,请单击它以成为已连接。
或手动创建所有代码:
- 前往https://colab.research.google.com
- 按下蓝色的NEW PYTHON 3 NOTEBOOK按钮
- 从运行时->更改运行时类型菜单中,选择Python 3和GPU(后者可在GPU上运行神经网络)
- 在第一个单元格中,键入:
model_name = '117M' !git clone https://github.com/openai/gpt-2 %cd gpt-2 !pip3 install -r requirements.txt !python3 download_model.py $model_name
您可以指定任何中间或最大型号,而不是117M(最小):1558M。
然后单击单元格左侧的黑色“播放”图标。 这将下载所选的GPT-2神经网络并安装必要的依赖项。
在第二个单元格中(您可以通过菜单“插入”->“代码”单元格来添加它,或者将鼠标悬停在当前单元格中心下方,将弹出添加按钮):
!python3 src/interactive_conditional_samples.py --model_name=$model_name
这将启动交互模式。 等到神经网络启动,出现输入文本的窗口,上面写着“ Model Model >>>”,输入短语的开头并按Enter,过一会儿,生成的文本出现在SAMPLE标题下。
您也可以启动生成完全随机文本的模式。 文本将以小样SAMPLE 1,SAMPLE 2等不断生成,直到您单击单元格上的Stop按钮。 为此,请使用以下代码创建一个新的单元格:
!python3 src/generate_unconditional_samples.py --model_name=$model_name | tee samples.txt
结果将保存到samples.txt文件。 可以使用以下命令下载它(再次创建一个新的单元格,并在生成文本后运行它):
from google.colab import files files.download('samples.txt')
您可以更改用于生成文本的参数(随机系数等,请参见原始工作中的描述):
!python3 src/generate_unconditional_samples.py --model_name=$model_name --top_k 40 --temperature 0.7 | tee samples.txt
由于117M是大大简化的型号,所以不要指望它能带来奇迹(更新:在撰写本文时,只有117M可用。现在一切都可用,包括原始的最大1558M,请参见上文)。 生成的大多数样本都是胡说八道。 但也有一些有意义的部分。 文字应为英文,而其他语言的GPT-2尚无法使用。
生成文字的例子
完整模型生成的文本示例: https : //blog.openai.com/better-language-models/#sample1 (位于8个故事的栏的顶部)。
还有一个巨大的2.4 Mb文本文件,带有随机生成的示例: https : //raw.githubusercontent.com/openai/gpt-2/master/gpt2-samples.txt
还有一个2.27 Mb,具有其他随机性设置: https : //raw.githubusercontent.com/openai/gpt-2/master/gpt2-topk40-samples.txt
参考文献