美文网首页
Transformer 模型相关疑问以及解答

Transformer 模型相关疑问以及解答

作者: LCG22 | 来源:发表于2019-12-18 14:42 被阅读0次

    1、Decoder 部分中的 decoder 的输入是如何的?是一次性给多个输入节点进行输入数据,还是每步只给一个输入节点输入数据呢?

    2、X、W_{q}、W_{k}、W_{v}、X_{encoder}、Q、K、V 的维度是怎么样的?中间产物的维度又是怎么样的?

    注:此处不考虑位置编码

    注:此处的 X 表示的是一个批次的样本,而 X_{i} 表示第 i 个样本 

    注:X_{encoder} 指的是 Encoder 中 encoder 层的所有输出节点的输出值

    设:

    batch_size:一个批次里的样本数

    sequence_length:句子序列中的元素个数

    embedding_size:词向量的大小

    hidden_size:Encoder 中 encoder 的节点数

    维度表示格式如下:

    张量名:[维度 1, 维度 2, ..., 维度 n] 或 1

    注:1 表示常量

    则:

    X: [batch_size, sequence_length, embedding_size]

    W_{q}: [batch_size, embedding_size, hidden_size]

    W_{k}: [batch_size, embedding_size, hidden_size]

    W_{v}: [batch_size, embedding_size, hidden_size]

    Q = XW_{q}: [batch_size, sequence_length, hidden_size]

    K = XW_{k}: [batch_size, sequence_length, hidden_size]

    V = XW_{v}: [batch_size, sequence_length, hidden_size]

    Q_{i} = X_{i}W_{q}: [sequence_length, hidden_size]

    K_{i} = X_{i}W_{k}: [sequence_length, hidden_size]

    V_{i} = X_{i}W_{v}: [sequence_length, hidden_size]

    \alpha  = \frac{QK^T}{\sqrt{d_{k}} } : [batch_size, sequence_length, sequence_length]

    X_{encoder} = \alpha V: [batch_size, sequence_length, hidden_size] 

    或 

    X_{encoder_{i}} = \sum_{i}^s \alpha _{i}V: [batch_size, sequence_length]

    注:X_{encoder_{i}} 表示的是某个 encoder 层的第 i 个输出节点的输出值

    3、Transformer 为什么需要多头机制?

    个人理解是 Transformer 的多头机制是为了让不同的头关注句子的不同地方,从而能够学习到不同的模式。

    但有论文表明,Transformer 的多头结构里,存在大量模式相同的头,仅有少数的几个头跟其它的头的模式不同,故而不同的头是否能够学习到不同的模式,还是头的数量过多,造成了冗余

    可参考该文章:为什么Transformer 需要进行 Multi-head Attention?

    4、为什么 QK^T 需要除以 \sqrt{d_{k}}  呢?

    假设 Q、K 都是 n 维向量(即 \sqrt{d_{k}} ),则展开相乘可得:

    QK^T = \sum_{i=1}^nQ_{i} K_{i},而 Q_{i}、k_{i} 被归一化到 [0, 1] 之间,故 Q_{i}K_{i} 的取值范围是 [0, 1],因此 Q_{i}K_{i} 的最大值为 1,故

    QK^T = \sum_{i=1}^nQ_{i} K_{i} 的最大值相当于 n 个 1 相加,即等于 n。也就是说 QK^T = \sum_{i=1}^nQ_{i} K_{i} 的最大值等于 Q、K 的维度,最小值则

    等于 0 。显然要进行归一化的话,则需要除以 n,这样才能将 [0, n] 归一化到 [0, 1] 。

    该文章(transformer中的attention为什么scaled?)则是从两个变量的均值和方差出发,进行推导。但是最后还是要通过计算向量的点积QK^T = \sum_{i=1}^nQ_{i} K_{i} 来求得其最大值 n,然后再除以 n 来进行归一化。

    另外该文章还解释了另一个问题,即为什么要进行归一化,因为如果不需要进行归一化的话,自然也就不需要除以 n 了。所以该文章将该问题

    分解为了两个子问题:

    1、为什么需要进行归一化

    2、为什么进行归一化需要除以 n,而不是其他数

    子问题 2 在上面已经解释得很好了,因此在此继续解释子问题 1.

    首先是因为 QK^T = \sum_{i=1}^nQ_{i} K_{i} 要使用 softmax  进行归一化(注意此处的归一化跟子问题 2 中的归一化是两个操作),故而需要写成

    QK^T =softmax( \sum_{i=1}^nQ_{i} K_{i}),由于 softmax 函数的特性,即将大的数进行放大(最大为 1),将小的数进行缩小(最小为 0)。故如果

    QK^T = \sum_{i=1}^nQ_{i} K_{i} 的值过大的话,那么经过 softmax 函数的操作后,很有可能变成 1.特别是 QK^T = \sum_{i=1}^nQ_{i} K_{i} 的最大值等于 n,也就是说 Q、K 的维度越大,则 QK^T = \sum_{i=1}^nQ_{i} K_{i} 经过 softmax 操作之后就越有可能接近于 1.

    那么为何 softmax 的输出值接近于 1 是不好的呢?

    假设 s_output 为 softmax 的输出值,那么

    s_output = \frac{e^i}{e^1 + e^2 + ... + e^n}

    当 s_output 接近于 1 的时候

    s_output \approx \frac{e^i}{e^i + \varepsilon } (\varepsilon  为一个极小的数),那么此时对 s_output 进行求导,s_output 的导数结果为:

    s’ = 0 ,即此时的导数等于 0 了。那就是说,当 softmax 的输出值等于 1 的时候,softmax 的梯度为 0 向量,此时无法再使用反向传播,即无法继续训练神经网络了。

    注:矩阵形式的 softmax 求导可以参考 邱锡鹏 的 <神经网络与深度学习> 的附录 B 2.4

    相关文章

      网友评论

          本文标题:Transformer 模型相关疑问以及解答

          本文链接:https://www.haomeiwen.com/subject/gmcenctx.html