当前位置:   article > 正文

《鞋匠的AI之旅》- 5. Transformer【中】之“解码器的自回归”

《鞋匠的AI之旅》- 5. Transformer【中】之“解码器的自回归”

5.Transformer

编码与解码

位置编码

多头自注意力

以上三个小节请见:《鞋匠的AI之旅》- 5. Transformer【上】

综合决策

残差与归一化

以上两个小节请见:《鞋匠的AI之旅》- 5. Transformer【中】之“前馈神经网络、残差与归一化”

开始与结束

在试图吹散上一章节结束时提到的两片乌云之前,鞋匠觉得还有一件事情要做,它很重要。在人类当下的婆娑世界,一切都有从出生、成长、发展、没落、消亡的过程。这是自然规律,不可打破。对于Transformer中的解码器来说,也不例外,在实际生成文本的时候,它要知道从什么时候开始,到什么时候结束。就像百米赛跑,总要有个起点,和与其对应的终点。仔细想想,人类思考一个问题给出答案的过程也是如此,看到问题,经过思考找到答案,大脑指挥嘴巴说出第一个字,后面陆续说出所有的字,直到答案结束。这里赛跑的起点,大脑指挥嘴巴“开始”说出第一个字的信号,都是一种开始的标志,同样,赛跑的终点,大脑指挥嘴巴说出完整的答案后发出的停止说话的信号,也是一种标志,它是结束的标志。鞋匠觉得需要强调下,这里运动员迈出的第一步,嘴巴说出的第一个字不是开始标志,它们只是紧随开始标志的实际内容。同样,这里运动员在赛跑过程中跑出的最后一步,嘴巴里说出的最后一个字,也不是结束的标志,它们只是结束标志之前的内容。因为运动员迈出的每一步都没有开始的属性,直到某一步跨越了起跑线,它就成了赛跑的第一步,嘴巴说出的每一个字也都没有开始的属性,直到它遇到大脑的信号开始回答某个问题,这个字就变成了答案的第一个字。

那么如何为Transformer找到开始标志和结束标志呢?鞋匠想,如果把Transformer看作可以与之互动的有机体,那么要使用什么来和Transformer交流呢?鞋匠觉得在当前的研究范围内(自然语言处理),和Transformer互动的基本单元就是token所对应的词嵌入。Transformer接收一个词嵌入序列作为输入,经过内部编解码处理,最后转换后变成另一个词嵌入序列作为输出。词嵌入贯穿于整个模型的处理过程,它是与模型互动的语言。所以要想Transformer理解开始标志和结束标志,也需要把开始标志和结束标志定义为token,进而转换成词嵌入,这样才能以某种方式告知Transformer什么时候开始,什么时候结束。鞋匠用<start>表示开始,用<end>表示结束。有人可能用其它的符号来表示开始与结束,但鞋匠觉得符号本身不重要,各有所好,这无关紧要。

像前面推导的,每个token的最终归属就是会被嵌入到词嵌入空间中,这两个新的token也不例外。这个嵌入的过程和前面章节所推导的嵌入过程一样,需要在海量文本信息中进行训练,最终得到<start>和<end>对应的词嵌入。就像Transformer可以理解一个token的词嵌入一样,这两个标志<start>和<end>的词嵌入也会在Transformer的编解码过程中得到进一步的理解。

鞋匠觉得增加了<start>和<end>词嵌入训练过程是比较直观的。假设有一句话包含100个字,首先在句首添加一个开始标志(<start>),在句尾添加一个结束标志(<end>)。这样,原始句子就变成了102个元素的序列,变为<start>,字1,字2,...,字100,<end>。然后,上下文窗口在这个已扩展的序列上滑动。按照“词嵌入”章节的设定为例,窗口大小为11,那么第一个窗口会覆盖<start>以及句子的前10个字,第二个窗口会移一位,覆盖第1个字到第11个字,以此类推,直到窗口覆盖到倒数第10个字和<end>。在整个过程中,开始标志和结束标志各只有一个,它们在序列的起始和结束位置固定不变,窗口在其上滑动以捕捉不同的上下文信息。这样做确保了模型在学习时能够捕捉到<start>和<end>所代表的意义,并在训练过程中调整优化<start>和<end>各自所对应的词嵌入向量。最终,<start>和<end>会被自然而然的嵌入到词嵌入空间中它们应该在的位置。这是对“词嵌入”章节里的词嵌入生成过程的一个宏观的、极为简洁的概括。鞋匠觉得没有必要再详细展开了。

解码器的自回归

有了开始标志和结束标志,鞋匠觉得和Transformer交流起来就比较方便了。对于编码器来说,开始标志的词嵌入就是一个问题或者一句话要开始了,结束标志的词嵌入就是这个问题或者这句话到此结束。对于解码器来说,开始标志就意味着预测任务的开始,而结束标志就意味着预测任务的结束。对于任何AI模型来说,与其交流的过程都会分为两种过程,一种是训练过程,一种是实际生成过程。训练过程就是根据AI模型输出的预测值与实际真实值之差来调整AI模型的参数,这个过程中AI模型的参数是会变化的。而实际生成过程就是根据输入来生成输出,此时AI模型的参数是训练过程中优化得到的参数,参数在该过程中是保持不变的。

在前面的分析中,对于编码器中的多头自注意力、前馈神经网络、归一化等这些Transformer组件来说,不论是在训练过程中还是实际生成过程中,其从输入到输出的计算过程都是一样,只是训练过程会根据反向传播算法来调整网络参数,即调整各组件的参数;实际生成过程会直接得出各组件的输出结果,不会有组件参数的调整。但对于解码器来说,鞋匠觉得训练过程和实际生成过程略有不同。

鞋匠打算从训练过程开始研究。

训练过程是让Transformer学习到如何生成:首先编码器接到输入序列(包含开始标志和结束标志),它对该序列进行信息的层层提取,理解到输入序列的内容。而后输出给解码器进行问题到答案,或者输入到输出的转换。在这个过程中,解码器每次预测时会接到两部分的输入,第一部分是编码器的输出,第二部分是其自身的输出。在最开始时,解码器接到了编码器的输出,它作为解码器的第一部分输入,但解码器自身还没有输出,所以解码器的第二部分输入就没有值,但为了让解码器捕捉到一个生成任务的开始的信号,此时解码器的第二部分输入就是开始标志<start>所对应的词嵌入,经过大量的训练,解码器就会学习到,当第二部分输入是<start>时,它就应该开始预测答案的第一字词了;当解码器认为预测任务已完成时,它的下一个预测就是<end>符号。如图26所示,①表示解码器的第一部分的输入;②表示解码器的第二部分输入,即其自身的输出。

图26,解码器的输入

训练过程是一个循环的过程,即解码器是一个token一个token预测的。每次预测都是以实际期望的真实值作为解码器第二部分的输入,而解码器的第一部分输入保持不变,来自编码器的输出。解码器综合分析两部分输入后进行下一个token的预测,这样不停的循环,直到预测任务结束。鞋匠把这个循环的过程称之为自回归过程。之后,预测值与实际期望的真实值进行对比,这个过程和前面章节里的词嵌入训练的过程是一样的,在词嵌入的训练过程中,网络预测输出的概率分布和实际期望的目标词的概率分布进行对比,通过交叉熵函数得出差值,并通过反向传播算法优化AI模型参数。这里也是通过交叉熵损失函数来对比解码器预测的概率分布和实际期望的下一个token的概率分布,得出差值,并通过反向传播算法从后往前来调整整个Transformer模型的参数。鞋匠对需要调整的参数进行了汇总,它们包括出现在前面章节里的需要确定的参数矩阵:

1)编码器和解码器中所有多头自注意力子层的查询权重矩阵、键权重矩阵、值权重矩阵;

2)编码器和解码器中所有前馈神经网络的升维权重矩阵及其偏置项和降维权重矩阵及其偏置项;

3)编码器和解码其中紧随多头自注意力子层或前馈神经网络子层的归一化模块的缩放系数和偏置项;

还包括后面章节将要研究的参数:

4)Transformer输出模块的线性变换层的权重矩阵(将解码器输出的上下文向量转换成维度数与词汇表token个数相同的维度向量,以便softmax层计算预测概率分布)。

以及一个可选项:

5)词汇表中每个token对应的词嵌入。

鞋匠觉得这里需要强调的是,训练过程中,解码器第二部分的输入并不是实际解码器预测输出的预测值,而是实际期望的真实值,比如本次预测的下一个词可能是token1,但实际期望的下一个真实词是token11,则使用token11追加到前面的第二部分的输入上,作为下次预测的输入。预测值仅作为与真实值的对比,得出差值来优化模型参数。仔细体会下,鞋匠觉得正是因为现在是在训练Transformer模型所以才会有这样的设计。这也是和实际生成过程的主要区别,如图27所示,图中红色表示的自回归过程是训练过程,绿色表示的自回归过程是实际生成过程。

图27,解码器的第二部分输入

了解了训练过程,实际生成过程就简单了。实际生成过程和训练过程类似,它也是自回归过程,解码器也有两个输入,第一部分是编码器的输出,第二部分是以Transformer截止到目前为止实际生成的所有token串联而构成的序列作为输入。注意,这里讲的某某token作为输入实际都是转化为词嵌入的形式输入的,这里的输入包含了词嵌入本身也包含了其所对应位置的位置编码,这就是图28所表达的意思。

图28,解码器的自回归输入

不论是上图里的“Output Embedding”还是图19(“位置编码”章节)里的“Input Embedding”,都可以采用预训练好的词嵌入,或者把词嵌入作为整个Transformer模型的一个组件,在Transformer的训练过程中,随着Transformer模型的其它组件一起调整各词嵌入的各维度值。鞋匠觉得后一方法的好处是,这样得到的词汇表是原生的,一开始就与整个Transformer模型融为了一个有机的整体。而前者的好处是,节约计算资源,不同模型间可以共享已训练好的词汇表。不论哪种方法,Input Embedding和Output Embedding一般会共享同一个词汇表,即共享同一个已经训练好的词汇表或者共享同一个需要在Transformer模型的训练过程中优化的词汇表。

从以上的分析中,鞋匠清楚地看到,不论训练过程还是实际生成过程,实际都要求Transformer按照时间顺序一步一步的来预测或者生成的。鞋匠把这样的每一步称之为时间步。那么解码器在实际生成过程中的自回归过程就可以这样来描述了:在解码器中,每个时间步的输出都依赖于它之前的所有时间步的输出,因为它的第二部分输入是把截止到当前时间步为止之前所有时间步的输出串联在一起形成的输出序列作为输入的。那么什么时候停止预测输出(对应训练过程)或者生成输出(对应实际生成过程)呢?鞋匠觉得有几种方法可以考虑:

1)Transformer模型预测或者生成的token是<end>;或者

2)Transformer模型输出的长度达到了一个限额,比如1000个token;或者

3)Transformer模型输出的概率分布中所有的概率都未达到某个最低值,比如80%

方法有很多,鞋匠觉得对于所解决的实际问题理解的越深刻,所设定的停止条件就越合理。

至此,鞋匠觉得Transformer的脉络比较清楚了,是时候吹散天边的乌云,解开上一章节里提出的“看不见的未来”和“忘不了的原题”两个谜题了。

>> 下一章节预告:《鞋匠的AI之旅》- 5. Transformer【中】之“解码器的掩码自注意力”

<< 上一章节:《鞋匠的AI之旅》- 5. Transformer【中】之“前馈神经网络、残差与归一化”

<< 内容总章:《鞋匠的AI之旅》- 总章 【一段从神经元到GPT的AI之旅】

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/873536
推荐阅读
相关标签
  

闽ICP备14008679号