水熊虫
水熊虫
不认命,就拼命!
262文章 52分类

自然语言处理之Transformer精讲(二)

[{"source":{"position":28,"lines":[],"changePosition":null},"target":{"position":28,"lines":["这里可以进一步看一个问题, 这里为什么缩放的时候使用$\\sqrt{d_{k}}$呢, 有两个原因,一个原因是避免相乘以后得结果过大或者过小,导致softmax的时候梯度消失或者爆炸, 进一步解释,假如Q和K都是均值为0,方差为1的分布,那么这个乘法以后的分布就变成了均值为0, 方差为$d_{k}$的分布(根据概率论,和的方差等于方差之和),所以该点积结果的方差变为 $d_{k}$,标准差变为 $\\sqrt{d_{k}}$ 。除以 $\\sqrt{d_{k}}$后,方差重新变回1。如果$d_{k}$很大,相乘的结果差异很大,如果直接使用softmax就变成类似独热编码的样式, 这样极小的值就接近于0,信息损失严重,如果$d_{k}$很小,那么经过softmax以后就变成类似均匀分布的样子,容易导致Transformer最后一次的softmax的预测结果也是均匀的,进而导致梯度很大,造成梯度爆炸。所以会选择$d_{k}$进行缩放。","下面一个问题解释一下,为什么均匀分布会导致梯度爆炸,我们来看下交叉熵的公式","$$\begin{gathered}","L=-\\sum_{i=1}^{C} y_{i} log_{2}^{z_{i}}","\end{gathered}$$"],"changePosition":null},"type":"INSERT"},{"source":{"position":29,"lines":[],"changePosition":null},"target":{"position":34,"lines":["$y_{i}$表示第i个类别的概率, $z_{i}$是预测第i个类别的概率,C表示总类别,如果预测分布接近真实分布,那么$z_{i}=\\frac{1}{C}$,损失函数就变成了","$$\begin{gathered}","L=-\\sum_{i=1}^{C} y_{i} log_{2}^{\\frac{1}{C}}=log_{2}^{C}+\\sum_{i=1}^{C} y_{i}=log_{2}C","\end{gathered}$$","可以看到,损失函数的值和类别C有关,如果C很大,损失函数就很大,这样就导致了梯度爆炸。","","接下来说第二个原因是能让模型适应不同维度的输入,如果不除以$\\sqrt{d_{k}}$,那么模型在训练的时候就会对输入的维度产生依赖性,如果测试阶段输入维度发生变化,那么模型可能会性能下降。所以这个维度$\\sqrt{d_{k}}$能够保证模型输入的鲁棒性。",""],"changePosition":null},"type":"INSERT"},{"source":{"position":30,"lines":[],"changePosition":null},"target":{"position":43,"lines":["加法和归一化操作是结合了残差连接和归一化的技术,这种方式能够防止网络退化。","$$","AddNorm(X)=LayerNorm(X+Sublayer(X))","$$"],"changePosition":null},"type":"INSERT"},{"source":{"position":40,"lines":[],"changePosition":null},"target":{"position":57,"lines":["通过上图不知道大家是否能明白, 一个编码和解码结构,怎么解码器还有多个输入,其实解码器的输入包含两个部分,一部分是目标序列,就是编码器的输出,例如翻译 I am a student , 编码器先把这个语句进行编码,获得编码矩阵C,然后这个矩阵C进入解码器,解码器开始一个单词一个单词的解码,解码器的目标序列是,带着矩阵C预测I的概率。然后目标序列变成了 I,预测am的概率。 "," "," 需要进一步说明的是从上图能够看到,编码器的输出C会进入到解码器的多头注意力网络, 这个过程并不是直接进入,而是通过中间的W,将C转换成K和V的形式和上层网络进行多头注意力学习。",""],"changePosition":null},"type":"INSERT"}]

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×