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


以 P E ( p o s + k , 2 i ) = P E ( p o s , 2 i ) P E ( k , 2 i + 1 ) + P E ( k , 2 i ) P E ( p o s , 2 i + 1 ) PE(pos+k,2i)=PE(pos,2i)PE(k,2i+1)+PE(k,2i)PE(pos,2i+1) PE(pos+k,2i)=PE(pos,2i)PE(k,2i+1)+PE(k,2i)PE(pos,2i+1)为例,当 k k k确定时:P E ( k , 2 i + 1 ) PE(k,2i+1) PE(k,2i+1)、 P E ( k , 2 i ) PE(k,2i) PE(k,2i)均为常数, P E ( p o s + k , 2 i ) = P E ( p o s , 2 i ) ? 常 数 2 i + 1 k + 常 数 i k ? P E ( p o s , 2 i + 1 ) PE(pos+k,2i)=PE(pos,2i) * 常数_{2i+1}^k + 常数_{i}^k * PE(pos,2i+1) PE(pos+k,2i)=PE(pos,2i)?常数2i+1k?+常数ik??PE(pos,2i+1)
上式即为上文中所说的线性函数 。我们知道,每个位置(pos)的PE值均不同,因此我们可以根据PE的值区分位置,而由上面的线性函数,我们可以计量出两个位置的相对距离 。我们还尝试使用预先学习的来代替正弦波,发现这两个版本产生了几乎相同的结果。我们之所以选择正弦曲线,是因为它允许模型扩展到比训练中遇到的序列长度更长的序列 。
理解:
这个点很好理解,就是说了下正弦波的优点 。这里我着重讲下正弦波存在的问题 。在架构里,我们计算两个特征的关系用的是点积的的方式(因为使用了Dot- ) 。所以两个PE的关系(距离)实际是以它们的点积来表示的 。举例如下 [ 1 ] ^{[1]} [1]:
我们令 c i = 1 / 1000 0 2 i / d m o d e l c_i=1/10000^{2i/d_{model}} ci?=1//?,则第 t t t及 t + 1 t+1 t+1个位置的是:
P E t = [ s i n ( c 0 t ) c o s ( c 0 t ) s i n ( c 1 t ) c o s ( c 1 t ) ? s i n ( c d 2 ? 1 t ) c o s ( c d 2 ? 1 t ) ] T PE_t={\left[ {\begin{} sin(c_0t)\\ cos(c_0t)\\ sin(c_1t)\\ cos(c_1t)\\ \vdots\\ sin(c_{\frac{d}{2}-1}t)\\ cos(c_{\frac{d}{2}-1}t) \end{}} \right]^T} PEt?=???sin(c0?t)cos(c0?t)sin(c1?t)cos(c1?t)?sin(c2d??1?t)cos(c2d??1?t)????T
P E t + k = [ s i n ( c 0 ( t + k ) ) c o s ( c 0 ( t + k ) ) s i n ( c 1 ( t + k ) ) c o s ( c 1 ( t + k ) ) ? s i n ( c d 2 ? 1 ( t + k ) ) c o s ( c d 2 ? 1 ( t + k ) ) ] T PE_{t+k}={\left[ {\begin{} sin(c_0(t+k))\\ cos(c_0(t+k))\\ sin(c_1(t+k))\\ cos(c_1(t+k))\\ \vdots\\ sin(c_{\frac{d}{2}-1}(t+k))\\ cos(c_{\frac{d}{2}-1}(t+k)) \end{}} \right]^T} PEt+k?=???sin(c0?(t+k))cos(c0?(t+k))sin(c1?(t+k))cos(c1?(t+k))?sin(c2d??1?(t+k))cos(c2d??1?(t+k))????T
则: P E t P E t + k = Σ j = 0 d 2 [ s i n ( c j t ) s i n ( c j ( t + k ) + c o s ( c j t ) c o s ( c j ( t + k ) ] = Σ j = 0 d 2 c o s ( c j ( t ? ( t + k ) ) = Σ j = 0 d 2 c o s ( c j k ) \begin{} {t+k}&=\{j=0}^{\frac{d}{2}}[sin(c_jt)sin(c_j(t+k)+cos(c_jt)cos(c_j(t+k)]\\ &=\{j=0}^{\frac{d}{2}}cos(c_j(t-(t+k))\\ &=\{j=0}^{\frac{d}{2}}cos(c_jk) \end{} PEt?PEt+k??=Σj=02d??[sin(cj?t)sin(cj?(t+k)+cos(cj?t)cos(cj?(t+k)]=Σj=02d??cos(cj?(t?(t+k))=Σj=02d??cos(cj?k)?
上式的第二行是使用了c o s ( α ? β ) = s i n α s i n β + c o s α c o s β cos(\alpha-\beta)=sin\alpha sin\beta + cos\alpha cos\beta cos(α?β)=sinαsinβ+cosαcosβ 这个公式进行的变换 。从最终的结果我们可以看出,两个的距离度量只与间隔 k k k有关,而 c o s cos cos函数关于y轴对称,即 c o s x = c o s ( ? x ) cosx=cos(-x) cosx=cos(?x),所以, P E t P E t + k {t+k} PEt?PEt+k?的度量只与 k k k的大小有关,与谁在前,谁在后无关 。即,经过dot-机制后,我们把 中的顺序信息丢失了 。所以,从这方面看,正弦波这种位置PE并不太适合用在结构中,这也可能是后面的bert,t5都采用的基于学习的。(注:模块3会把顺序信息传递下去,但我们还是在算法的核心处理上丢失了信息 。) 2.2 模块2:Multi-Head
这个模块是的核心,我们把这块拆成两部分来理解,先讲下其中的 Dot- (缩放的点积注意力机制),再讲Multi-Head 。
2.2.1Dot-
我们先看下论文中的Dot-步骤,如下图:
下面我们对着上面的图讲一下,具体的看下每步做了什么 。
首先说下Q,K,V,在的中,输入只有一个,即输入向量与位置向量的和,我们暂且叫做 。Q,K,V就是这个通过三个层映射而来 。如下图