二 Transformer--论文理解:transformer 结构详解( 四 )


2.3 模块3:ADD
此模块做了个类似残差的操作,但与残差不同的是,不是用输入减去输出,而是用输入加上输出 。(指Multi-Head 模块的输入和输出),具体操作就是把模块2的输入矩阵与模块2的输入矩阵的对应位置做加法运算 。
2.4 模块4:Layer
不论是layer 还是batch ,其实做的都是一件事情,都是根据x = a ? x ? x  ̄ s t d + e p s + b x = a * \frac{x - \{x}}{std + eps} + b x=a?std+epsx?x?+b对 x x x的分布进行调整 。不同的是 x  ̄ \{x} x和 s t d std std的计算方式不同 。如下图:
batch 的 x  ̄ \{x} x和 s t d std std是延粉色方向计算的,而layer 是延蓝色方向计算的 。如果兄弟们去面试,可能面试官会问为什么这里没有使用BN,而使用了LN,我的理解是,BN对batch size的大小是有要求的,一般batch size越大,计算出的 x  ̄ \{x} x越好,而我用12G内存的GPU,跑的模型时,batch size最多也就设置到32 。batch size还是偏小的 。所以使用与batch size无关的layer。从另一个角度讲,batch size之所以小,是因为我们的 size 大,而layer正好是延这个方向做的,所以正好使得layer 计算的更稳定 。
2.5 模块5:Feed
Feed翻译成中文叫 前馈网络,其实就是MLP 。我们这里不纠结于FFN的定义,我们直接看下里是怎么实现的 。如下图,我们先把输入向量从512维( d m o d e l d_{model} ?)映射到2048维,然后再映射到512维 。实现时,就是使用两个层,第一个的输入是512维,输出是2048维,第二个的输入是2048,输出是512 。
2.6 模块6: Multi-Head
上文已讲了Multi-Head ,而且在讲Dot-时也讲了mask机制,此模块的区别在于maked的策略不同,在中我们是把给掉,这里我们除了要考虑,还要考虑预测时的未来变量问题,换句话说,我们是用一句话中的前 N ? 1 N-1 N?1个字预测第 N N N个字,那么我们在预测第 N N N个字时,就不能让模型看到第N个字之后的信息,所以这里们把预测第 N N N个字时,第 N N N(包括)个字之后的字都掉 。我们假设预测序列为’i like this apple’,则我们要做如下的mask(粉色的0实际上是没有的,这里表示对应的位置为pad的值) 。
2.7 模块7: Multi-Head
模块7 与上文 模块2( 中 的 Multi-Head ) 代码实现上完全相同,区别在于模块2 只有一个输入,模块2把此输入经过三个映射成 Q Q Q、 K K K、 V V V , 而模块7的输入有两个,一个是的输入经过第一个大模块传过来的值(为了方便,我们叫它),一个是最终结果(我们暂叫它), 模块7是把通过一个映射成了 Q Q Q,然后通过两个把映射成 K K K、 V V V ,其它的与模块2完全一致 。
2.8 模块8:
此模块的目的是把模型中 的输出从 d m o d e l d_{model} ?维度映射到词表大小的维度 。本身也比较简单,这里不再细讲了 。
2.9 模块9:
此模块会把上层的输出转化成概率,对应到某个字的概率 。
3. 在机器翻译任务中的使用
在《 is All You Need》这篇文章中,是把做为一个特征提取器放在一个-(下文用-Stack和-Stack,用以和的, 区分)架构中的,具体细节见下图:
上面的图片把整个结构基本都画出来了,这里再说下训练时的数据走向及流程:
1) 数据 X X X 输入到-Stack中,得到输出变量 e n c o d e r _ o u t p u t \
2)e n c o d e r _ o u t p u t \做为 K e y Key Key和 V a l u e Value Value的原始输入 输入到-Stack中,-Stack的Query为上一轮-Stack的输出 。
具体流程见下图:
这里我提一下 stack的输入(上图中的Query),前面说过了,在中,的核心思想是用一个句子中的前 N ? 1 N-1 N?1个字,预测第 N N N个字,但在预测第一个字的时候,前面没有字,这时我们可以在每句话前面加上一个固定的开始标志(bos), 这样相当于把整个句子右移了一位 。