【四】搞懂transformer中的数学

一. 引言

本文开始,我们将进入到解码器(decoder)的学习。解码器的作用很明确,就是根据输入预测(或者说生成)下一个token。 解码器接收两个输入:编码器的输出和生成内容的输出序列。什么叫生成内容的输出序列尼?解码器是自回归的,这也就是说要将之前生成的序列作为输入然后再次进行预测。解码器总体架构如下:

1. (Masked) Self-attention layer((屏蔽)自注意力层)

2. Residual connection and layer normalization(残参和正则化)

3. Encoder-decoder attention layer(编码器-解码器注意层)

4. Residual connection and layer normalization(残参和正则化)

5. Feed-forward layer 前馈层

6. Residual connection and layer normalization(残参和正则化)

下面我们开始逐一讲解

二、Embedding

和encode一样,decode的输入部分也是一个embedding,与之前的encode不同的是,在decoder这里,开头的输入标记是约定的 SOS, 由于我们之前对于Hello World的每个token使用的是四维向量,所以这里设SOS的向量为 

                                            E = \begin{bmatrix}1 & 0 & 0 & 0\end{bmatrix}

第二步,就是同样的添加位置编码信息,同encoder一样的计算方式(具体怎么计算参考之前的文章),我们获得SOS的位置编码为

                                            P = \begin{bmatrix}0 & 1 & 0 & 1\end{bmatrix}            

将上述两者相加,就获得了给下一个自注意力的输入为

                                          E = \begin{bmatrix}1 & 1 & 1 & 0\end{bmatrix}

三、自注意力层

解码器的自注意力层基本和编码器一样,但是有个特别的地方需要注意,编码器的目标是捕获输入的所有信息,而解码器的目标是预测最有可能的下一个token。这意味着解码器只能使用到目前为止已生成的token。为了得到这个效果,解码器会使用Look-ahead Mask (Causal Mask)。这个mask是一个下三角矩阵,其中每个位置(i,j),如果i≥j则设置为 0,否则为1(即允许模型仅查看当前和先前的标记)。

[[0 1 1 1 1]

[0 0 1 1 1]

[0 0 0 1 1]

[0 0 0 0 1]

[0 0 0 0 0]]

通过这个矩阵,我们在计算值时,只会使用已生成的token

四、残参连接和归一化

这里和编码器一致,就是使用如下公式

\text{Z}(x) = \text{LayerNorm}(x + \text{Attention}(x))

五、编码器和解码器结合的自注意力层

顾名思义,在这一层,我们会使用到encoder部分的输出。我们假设之前编码器的输出为

\begin{bmatrix}
-1.5 & 1.0 & -0.8 & 1.5 \\
1.0 & -1.0 & -0.5 & 1.0
\end{bmatrix}

那么在这里,上面的输出会替换掉计算K和V的输入部分,即

在编码器中,K=输入矩阵 * WK, V= 输入矩阵*WV, Q=输入矩阵*WQ,

但是在编码器和解码器结合的这一层,K,V,Q的计算公式为

K=encoder输出 * WK, V= encoder输出 *WV, Q=输入矩阵*WQ。

在计算完K,V,Q后,就是和之前一样的自注意力层计算逻辑。为什么要这么做尼?

首先我们再次明确下,K,V,Q三个矩阵的作用。

Q,是当前查询的信息

K,是存储了跟当前查询相关的其他元素的信息

V,代表的是相关相关信息里存储的值。

那么,我们在上面就是用decoder当前需要查询的信息,去encoder这个已经计算好相关信息的矩阵里,查处了decoder当前要查询的信息的所有内容。打个比方,我(decoder)现在输出了”你好“这两个字(Q),接下去我就需要到字典(encoder)里去查”你好“相关的词语(K)以及他们对应的意思(V)。 然后我查到了相关的有”世界“,”中国“等等词语,然后通过计算,我就知道”世界“这个词的得分(就是概率)为0.8,”中国“为0.2,所以我应该输出”世界“。

六、总结

在encoder-decoder之后,接着又是一个normalize层,以及一个前馈层,这两个和之前的文章内容是一样的。所以到现在,我们已经能获得下一个单词的概率了。如果让我来总结下一个公式,可能类似这样

P = F(encoder, current_decoder)。

然后通过损失函数,不断的调整我们在计算encoder和decoder时的初始化矩阵。这样最终就能获得一个模型了。

好了,transformer的讲解至此结束,欢迎大家讨论批评


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容