这个图通常用来展示怎样通过留意力机制确定代词"it"指代的是哪个名词(在这个例子中是"The Animal")。
原始句子:“The Animal didn’t cross the street because it was too tired"译为:因为动物太累了以是没有过马路。“it"指代的是"The Animal”,然而,假如改变句子中的一个词,将"tired"替换为"narrow”,得到的新句子是"The Animal didn’t cross the street because it was too narrow",译为:由于街道太窄,动物没有过马路。在这个新的句子中,“it"指"the street”。 因此,模型需要可以或许理解当输入的句子改变时,句子中的词义也可能会随之改变。这种灵活性和正确性在Transformer模型中得到了体现,而之前的模型都无法达到这一目的。
Attention机制的工作原理可以这样形象化地形貌:
模型把每个词编码成一个向量,然后把这些向量送入模型中。在这里,每个词都会像发送一条“扣问”一样,去问其他词:“咱们之间的关系紧密吗?我们亲近吗?”假如关系紧密,模型就会采取一种举措,反之则会采取另一种举措。
不但每个词都会发出这样的“扣问”,而且也会回应其他词的“扣问”。通过这样的一问一答互动,模型可以或许识别出每两个词之间的紧密关系。一旦这种关系被确定,模型就会把与该词关系更紧密的词的信息“汲取”进来,与其进行更多的信息融合。这样,比如在翻译任务中,模型就能正确地识别“it”应该翻译为“animal”,因为它的向量已经融合了与“animal”这个词紧密相关的信息。
**以是留意力机制的焦点就是要做重构词向量这样一件事。**这种机制转化成计算机的计算过程,是这样的:
对于上面形象化的形貌中,可以抽取出留意力机制的三要素:
计算过程同样是矩阵相乘再相加,以是得到的 Q K T QK^T QKT矩阵就表达了词与词之间关系的紧密程度
为什么这样就能衡量词之间的紧密程度?
在计算矩阵乘法的时候,向量对应元素的乘积,这种计算方式在数学上叫向量的内积。
向量的内积在向量的多少寄义上表达的是:内积越大,两个向量就更趋向于平行的关系,也就表示了两个向量更加相似,当内积为0,两个向量就会呈现垂直的关系,表示两个向量毫不相关。
那对于Attention机制中这种Q和K一问一答的形式,问的就是两个词之间的紧密程度,以是也就可以通过内积的方式,来衡量两个词之间的相似性
在这个过程中,可能也都留意到了,它对本身也进行了提问,并本身也给出了答复,为什么要这样做呢?
以这个示例:“The Animal didn’t cross the street because it was too tired"译为:因为动物太累了以是没有过马路。“it"正常来说作为代词,指代的是"它”,但在这个句子中,我们希望它指代是"The Animal”,以是它不把本身在这个句子中的重要性也表现出来,不对本身的信息进行重构的话,它可能就没有办法改变本身原有的意思,也就无法从原本的意思"它"改为指代"The Animal"。 也就是因为这种操作,以是在Transformer中的留意力机制被叫做Self-Attention(自留意力机制)。
当衡量句子之间的紧密关系的结果出来之后,那么怎样去重构V?转化成计算过程是这样的:
在计算得到 Q K T QK^T QKT矩阵矩阵后,假设第一行的数据分别为:100,80,20,12,那么接下来的题目就酿成了怎样量化地决定哪些词应贡献多少信息。
为解决这一题目,就会应用Softmax函数来对每一行进行归一化处理,这样做会确保该行中所有元素的和为1。
假如颠末Softmax处理后,第一行酿成了某种分数形式,例如:0.4,0.2,0.2,0.1,那么这意味着将用第一个词的40%的信息、第二个词的20%的信息…来构建目的词的新表示。这样,Softmax操作实质上是在量化地衡量各个词的信息贡献度。
公式中除以 d k \sqrt{d_k} dk 是为了避免在计算向量內积时因为向量矩阵过大,计算出来的数值比较大,而非单纯的因为词之间的紧密程度这一题目。
当得到了每个词之间的信息贡献度概率之后,重构V的过程转化成计算过程是这样的:
Transformer模型中的解码器(Decoder),其主要任务是预测下一个输出词,以是称它为生成式模型。
为了更好地理解这个过程,可以用一个呆板翻译任务作为例子:
假设有一条中英双语练习样本:"我是一名门生" (X) --> "I am a student" (Y) 。
当解码器开始工作时,它需要一个初始的输入来启动预测过程。但是,为了预测第一个词"I",解码器没有之前的上下文。因此,需要为其引入了一个起始符 <s> 作为初始的输入。以是练习样本的目的序列就被调整为:<s>, I, am, a, student。
解码的过程如下:
得到的 Q K T QK^T QKT矩阵后(表明词与词之间关系的紧密程度的矩阵),与之前预备的Mask矩阵做按位相乘,如图:
对于 Q K T QK^T QKT矩 与mask矩阵相乘的过程,这个“相乘”是按位相乘,也就是每个对应的元素进行相乘。
为了直观地理解,可以设想mask矩阵的遮挡部分都是0,而未遮挡的部分都是1。那么,在这种按位相乘之后,被遮挡的部分在结果中的对应位置就都是0。例如,对于第一个位置,它只有起始符是“亮”的(也就是为1),而其它部分都是“暗”的(也就是为0)。
举个示例,假设得到的 Q K T QK^T QKT矩阵的前两行Score 是这样的:
这样设计的目的是确保:在预测当前词时,模型只能获取到它之前的词的信息,而对当前词自身及其背面的所有词都是一无所知的。
在计算得到 Q K T QK^T QKT矩阵后,在Mask Q K T QK^T QKT 上进行Softmax操作。此时,每一行的元素和都会等于1。然而,对于单词0,其在单词1、2、3和4上的Attention Score都是0。
最后:将颠末Softmax的Masked Q K T QK^T QKT 与Value矩阵V相乘以获取留意力加权的输出,这个输出Z就是Decoder的Masked Self-Attention部分的结果,如下:
理解这个公式:
U是输入矩阵,We是单词编码,Wp是位置编码,然后颠末Decoder解码器,最后颠末Softmax得到输出,这个过程与<Decoder怎样做生成式输出>一节中的过程完全同等
通过这个过程,模型已经获得了生成后续文本的本领。但产生的内容可能不总是用户所期望的。 那么,GPT是怎样确保生成相关内容的呢?GPT给出的有监视模型微调方案是这样的:
首先预备有监视数据: x 1 , x 2 . . . . . . x m x^1,x^2 ...... x^m x1,x2......xm表示的输入列, y y y 表示标签,然后将数据输入到已经预练习好的模型中预测y的概率,如下图:
理解这个公式:
x 1 , x 2 . . . . . . x m x^1,x^2 ...... x^m x1,x2......xm是输入序列,这是为特定任务预备的有标签数据的输入部分。
y y y是对应的标签或输出。
h l m {h_l}^m hlm 表示颠末预练习好的模型处理后得到的表示或特性。
W y W_y Wy 是一个权重矩阵,是微调中需要调整的关键参数。
在微调的过程中,模型的大部分布局和参数(预练习得到的知识)保持不变,但是某些特定的层或权重,如这里的 W y W_y Wy,会根据新任务的有标签数据进行调整。
简朴地说,你已经有一个大致了解语言的模型,但是为了使它更好地完成特定任务(例如呆板翻译、情绪分析等),你需要微调某些参数。在这个公式中,你正在调整权重矩阵 W y W_y Wy 以使模型更好地预测输出 y y y。
同样,微调的有监视数据肯定不止一条样本,会有很多样本,以是微调的任务就酿成了最大化这个目的函数: