↑↑↑关注后"星标"Datawhale
每日干货 & 每月组队学习,不错过
Datawhale干货
译者:张贤, 哈尔滨工程大学,Datawhale原创作者
干货长文,建议收藏阅读,收藏等于看完。
审稿人:Jepson, Datawhale成员, 毕业于中国科学院,目前在腾讯从事推荐算法工作
结构总览
前言
这篇文章翻译自http://jalammar.github.io/illustrated-gpt2/。多图详细解释当今最为强大的人工智能 GPT-2(截至 2019 年 8 月 12 日)。
今年,我们看到了机器学习在许多场景的广泛应用。OpenAI GPT-2(https://openai.com/blog/better-language-models/)表现出了令人印象深刻的能力,它能够写出连贯而充满激情的文章,这超出了我们当前对语言模型的预期效果。GPT-2 不是一个特别新颖的架构,而是一种与 Transformer 解码器非常类似的架构。不过 GPT-2 是一个巨大的、基于 Transformer 的语言模型,它是在一个巨大的数据集上训练的。在这篇文章,我们会分析它的结构,以及这种结构产生的作用。我们会深入了解 Self Attention 层的细节。然后我们会再了解一下这种只有 Decoder 的 Transformer 在语言建模之外的应用。
这篇文章可以看作是之前文章《图解Transformer(完整版)!》的补充。图解 Transformer 的文章使用了更多的图来解释 Transformer 的内部工作原理,以及它们是如何从原始论文一步一步进化的。我希望这种可视化的方式能够更加容易解释基于 Transformer 的模型内部原理和进化。
一、GPT2 和语言模型
首先,我们来看看什么是语言模型。
1.1 什么是语言模型
在 图解 Word2Vec(https://jalammar.github.io/illustrated-word2vec/) 中,我们了解到语言模型基本上是一个机器学习模型,它可以根据句子的一部分预测下一个词。最著名的语言模型就是手机键盘,它可以根据你输入的内容,提示下一个单词。
从这个意义上讲,GPT-2 基本上就是键盘应用程序中预测下一个词的功能,但 GPT-2 比你手机上的键盘 app 更大更复杂。GPT-2 是在一个 40 GB 的名为 WebText 的数据集上训练的,OpenAI 的研究人员从互联网上爬取了这个数据集,作为研究工作的一部分。从存储空间大小方面来比较,我使用的键盘应用程序 SwiftKey,占用了 78 MB 的空间。而最小的 GPT-2 变种,需要 500 MB 的空间来存储它的所有参数。最大的 GPT-2 模型变种是其大小的 13 倍,因此占用的空间可能超过 6.5 GB。
![](https://i-blog.csdnimg.cn/blog_migrate/4ebe4b1f134a29a04b0954ed553a9915.png)
对 GPT-2 进行实验的一个很好的方法是使用 AllenAI GPT-2 Explorer(https://gpt2.apps.allenai.org/?text=Joel is)。它使用 GPT-2 来显示下一个单词的 10 种预测(包括每种预测的分数)。你可以选择一个单词,然后就能看到下一个单词的预测列表,从而生成一篇文章。
1.2 语言模型的 Transformer
正如我们在图解 Transformer中看到的,原始的 Transformer 模型是由 Encoder 和 Decoder 组成的,它们都是由 Transformer 堆叠而成的。这种架构是合适的,因为这个模型是用于处理机器翻译的。在机器翻译问题中,Encoder-Decoder 的架构已经在过去成功应用了。
![](https://i-blog.csdnimg.cn/blog_migrate/e480ac5e0cff98b8237f2b653616d737.png)
在随后的许多研究工作中,只使用 Transformer 中的一部分,要么去掉 Encoder,要么去掉 Decoder,并且将它们堆得尽可能高。使用大量的训练文本,并投入大量的计算(数十万美元用于训练这些模型,在 AlphaStar 的例子中可能是数百万美元)。
![](https://i-blog.csdnimg.cn/blog_migrate/0cda15fdc8e80c30f11a352b284a8295.png)
我们可以将这些模块堆得多高呢?事实证明,这是区分不同的 GPT-2 的主要因素之一。
![](https://i-blog.csdnimg.cn/blog_migrate/4d567cda28a8b651aef9253fcf5dae05.png)
1.3 与 BERT 的一个不同之处
“机器人第一定律:
机器人不得伤害人类,也不能因不作为而使人类受到伤害。
”
GPT-2 是使用 Transformer 的 Decoder 模块构建的。另一方面,BERT 是使用 Transformer 的 Encoder 模块构建的。我们将在下一节中研究这种差异。但它们之间的一个重要差异是,GPT-2 和传统的语言模型一样,一次输出一个 token。例如,让一个训练好的 GPT-2 背诵机器人第一定律:
![](https://i-blog.csdnimg.cn/blog_migrate/bce5aaae78c1c5173c924e6f38d6116e.png)
这些模型的实际工作方式是,在产生每个 token 之后,将这个 token 添加到输入的序列中,形成一个新序列。然后这个新序列成为模型在下一个时间步的输入。这是一种叫“自回归(auto-regression)”的思想。这种做法可以使得 RNN 非常有效。
![](https://i-blog.csdnimg.cn/blog_migrate/dc9bde24e449ee13bf644de19bd0b4ec.png)
GPT-2,和后来的一些模型如 TransformerXL 和 XLNet,本质上都是自回归的模型。但 BERT 不是自回归模型。这是一种权衡。去掉了自回归后,BERT 能够整合左右两边的上下文,从而获得更好的结果。XLNet 重新使用了 自回归,同时也找到一种方法能够结合两边的上下文。
1.4 Transformer 模块的进化
Transformer 原始论文(https://arxiv.org/abs/1706.03762) 介绍了两种模块:
Encoder 模块
首先是 Encoder 模块。
原始的 Transformer 论文中的 Encoder 模块接受特定长度的输入(如 512 个 token)。如果一个输入序列比这个限制短,我们可以填充序列的其余部分。
Decoder 模块
其次是 Decoder。与 Encoder 相比,它在结构上有一个很小的差异:它有一个层,使得它可以关注来自 Encoder 特定的段。