关于NLP模型GPT-2的学习笔记(二)
第一部分介绍了GPT模型的基本结构,下面对于GPT的基本工作流程进行介绍:
基本机制
GPT-2 可以处理最长 1024 个单词的序列。每个单词都会和它的前续路径一起经过所有的解码器模块。
运行一个训练好的 GPT-2 模型,最简单的方法就是让它自己随机工作(生成无条件样本)。我们也可以给它一些限制条件,让它生成一些关于特定主题的文本(即生成交互式条件样本)。在随机情况下,我们只简单地提供一个预先定义好的起始单词,然后让它自己生成文字。
此时,模型的输入只有一个单词,所以只有这个单词的路径是活跃的。单词经过层层处理,最终得到一个向量。向量可以对于词汇表的每个单词计算一个概率(词汇表是模型能「说出」的所有单词,GPT-2 的词汇表中有 50000 个单词)。在本例中,我们选择概率最高的单词「The」作为下一个单词。
但有时这样会出问题——就像如果我们持续点击输入法推荐单词的第一个,它可能会陷入推荐同一个词的循环中,只有你点击第二或第三个推荐词,才能跳出这种循环。同样的,GPT-2 也有一个叫做「top-k」的参数,模型会从前 k个概率较大的单词中选取下一个单词。当top-k = 1时,就是选取概率最大的单词作为输出。目前很多训练模型的默认top-k在8左右,当默认值生成的效果不好时,可以调整到40看看效果。
模型每输出一个单词就会将输出的单词添加在输入序列的尾部构建新的输入序列,让模型进行下一步的预测。
数学模型
与其它自然语言处理模型一样,GPT-2 同样从嵌入矩阵中查找单词对应的嵌入向量,该矩阵也是模型训练结果的一部分。
每一行都是一个词的嵌入向量:一个能够表征某个单词,并捕获其意义的数字列表。嵌入向量的长度和 GPT-2 模型的大小有关,最小的模型使用了长为 768 的嵌入向量来表征一个单词。
所以在一开始,我们需要在嵌入矩阵中查找起始单词<s>对应的嵌入向量。但在将其输入给模型之前,我们还需要引入位置编码——一些向 transformer 模块指出序列中的单词顺序的信号。1024 个输入序列位置中的每一个都对应一个位置编码,这些编码组成的矩阵也是训练模型的一部分。
至此,输入单词在进入模型第一个 transformer 模块之前所有的处理步骤就结束了。如上文所述,训练后的 GPT-2 模型包含两个权值矩阵:嵌入矩阵和位置编码矩阵。
第一个 transformer 模块处理单词的步骤如下:首先通过自注意力层处理,接着将其传递给神经网络层。第一个 transformer 模块处理完但此后,会将结果向量被传入堆栈中的下一个 transformer 模块,继续进行计算。每一个 transformer 模块的处理方式都是一样的,但每个模块都会维护自己的自注意力层和神经网络层中的权重。
自注意力机制沿着序列中每一个单词的路径进行处理,主要由 3 个向量组成:
- 查询向量(Query 向量):当前单词的查询向量被用来和其它单词的键向量相乘,从而得到其它词相对于当前词的注意力得分。我们只关心目前正在处理的单词的查询向量。
- 键向量(Key 向量):键向量就像是序列中每个单词的标签,它使我们搜索相关单词时用来匹配的对象。
- 值向量(Value 向量):值向量是单词真正的表征,当我们算出注意力得分后,使用值向量进行加权求和得到能代表当前位置上下文的向量。
将每个文件夹的值向量乘以其对应的注意力得分,然后求和,得到最终自注意力层的输出。此时的注意力得分加权就得到单词的权重,并生成新的文本。