❝作者:小莫❞
本博客 主要 是本人在学习 Transformer 时的「所遇、所思、所解」,通过以 「十六连弹」 的方式帮助大家更好的理解 该问题。
为什么要有 Transformer? 首先需要知道在 Transformer 之前都有哪些技术,这些技术所存在的问题:
基于Transformer的架构主要用于建模语言理解任务,它避免了在神经网络中使用递归,而是完全依赖于self-attention机制来绘制输入和输出之间的全局依赖关系。
从上一张 Transformer 结构图,可以知道 Transformer 是一个 encoder-decoder 结构,但是 encoder 和 decoder 又包含什么内容呢?
其中上图中每一层的内部结构如下图所求。
具体内容,后面会逐一介绍。
;
相加 得到 向量
;
输入 Self-Attention 层得到
;
与
相加后经过 layernorm 层;
其中
代表 Source 的长度
;
越大,
就越大,可能会将 Softmax 函数推入梯度极小的区域;
下面,我们将会围绕着几个问题,进行一一解答。
时刻 的 输出
依赖于
之前的输入,也就是 说 依赖于
,当间隔
逐渐增大时,
的信息将难以被
所学习到,也就是说,很难建立 这种 长距离依赖关系,这个也就是 长距离依赖问题(Long-Term Dependencies Problem)。
;
的推移,你会出现「梯度消失或梯度爆炸」问题,这种问题使你只能建立短距离依赖信息。
距离 大于
时,那么
将难以学习
信息;
学习到句子中 其他词
的信息;
的时候,需要考虑到
的 信息,使得 RNN 只能 从
计算到
;
个 不同的 self-attention 的集成
矩阵(论文为 8组);
最后,让我们来看一下完整的流程:
换一种表现方式:
注:
表示当前词在句子中的位置;
表示向量中每个值 的 index;在偶数位置:使用 正弦编码
;在奇数位置:使用 余弦编码
。
注:在 decoder 的 scaled dot-product attention 中,里面的 attn_mask = padding mask + sequence mask;在 encoder 的 scaled dot-product attention 中,里面的 attn_mask = padding mask。
time,独立于输入序列的长度。那么总的sequenctial operation仅由层数
决定。这意味着transformer不能在计算上通用,即无法处理某些输入。如:输入是一个需要「对每个输入元素进行顺序处理」的函数,在这种情况下,对于任意给定的深度
的transformer,都可以构造一个长度为
;
的时间和空间复杂度