首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Transformer系列2】Transformer结构位置编码的详细解析1(相对位置关系的推导证明与个人理解)

  • 25-03-03 18:02
  • 2051
  • 5753
blog.csdn.net

1、Attention is all you need 中的位置编码

1.1 部分论文解释截图

中文翻译为位置编码(后面用PE代替)。这个操作,直观上非常容易理解,就是对序列中的词的位置进行编码。但是,原文并没有对这种新颖的位置编码方式作细致的讲解。对很多人来说,依然一头雾水。因此,本博客旨在让大家真正理解位置编码的原理。

1.2 在公式形成中的考量

1.2.1 引入PE的意义

对于任何一门语言,单词在句子中的位置以及排列顺序是非常重要的,它们不仅是一个句子的语法结构的组成部分,更是表达语义的重要概念。一个单词在句子的位置或排列顺序不同,可能整个句子的意思就发生了偏差。

I do not like the story of the movie, but I do like the cast.
I do like the story of the movie, but I do not like the cast.

上面两句话所使用的的单词完全一样,但是所表达的句意却截然相反。那么,引入词序信息有助于区别这两句话的意思。

针对现在广泛应用的图像处理也是一样,可能针对全图而言像素点的绝对坐标不那么重要(其实位置对全图也有一定的影响),但是临近像素点序列的排布顺序,临近像素块(像素点集)序列的排布顺序也很重要。

Transformer模型抛弃了RNN、CNN作为序列学习的基本模型。我们知道,循环神经网络本身就是一种顺序结构,天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构,完全采用Attention取而代之,这些词序信息就会丢失,模型就没有办法知道每个词在句子中的相对和绝对的位置信息。因此,有必要把词序信号加到词向量上帮助模型学习这些信息,PE就是用来解决这种问题的方法。

1.2.2 PE的作用

PE是一种用位置信息对序列中的每个序列信息进行二次表示的方法。正如1.2.1所述,Transformer模型本身不具备像RNN那样的学习词序信息的能力,RNN在模型定义时就已经包含了逐个输入的信息的顺序等价于信息出现的次序。Transformer需要主动将序列的顺序信息喂给模型。

那么,以这篇论文为例,模型原先的输入是不含词序信息的词向量,位置编码需要将词序信息和词向量结合起来形成一种新的表示输入给模型,达到增强输入的目的,这样模型就具备了按照编码适应序列信息的能力。

1.2.3 PE需要满足的要求

  • 举例一:

分配一个0到1之间的数值给每个时间步,其中,0表示第一个词,1表示最后一个词。

这种方法虽然简单,但会带来很多问题。其中一个就是你无法知道在一个特定区间范围内到底存在多少个单词。也就是说,按照这种操作,不同句子,有不一样的长度,时间步长也会被分配成不同的精度,时间步差值就没有任何的意义了。

  • 举例二:

线性分配一个数值给每个时间步。也就是,1分配给第一个词,2分配给第二个词,以此类推。

这种方法带来的问题一:特殊情况下PE数值信息会变得非常大,淹没有其他价值信息。

这种方法带来的问题二:模型会遇到一些比训练中的所有句子都要长的句子,无法适应没有见到过的更大PE信息。

这种方法带来的问题三:数据集中不一定在所有数值上都会包含相对应长度的句子,也就是模型很有可能没有看到过任何一个这样的长度的样本句子,这会严重影响模型的泛化能力。

  • 一种好的位置编码方案需要满足以下几条要求:

    • 为每个时间步输出一个独一无二的编码
    • 不同长度的句子之间,任何两个时间步之间的距离应该保持一致
    • 模型应该能毫不费力地泛化到更长的句子
    • 它的值应该是有界的
    • 它必须是确定性的

1.3 公式说明

本文内容中提出了一个简单但非常创新的位置编码方法,能够满足上述所有的要求。

首先,这种编码不是单一的一个数值,而是包含句子中特定位置信息的向量计算方式(非常像词向量)。

第二,这种编码没有整合进模型,而是用这个向量让每个词具有它在句子中的位置的信息。换句话说,通过注入词的顺序信息来增强模型输入。

具体公式如下
P E ( p o s , 2 i ) = sin ⁡ ( p o s / 1000 0 2 i / d model  ) P E ( pos,  2 i + 1 ) = cos ⁡ ( p o s / 1000 0 2 i / d model  ) PE(pos,2i)=sin(pos/100002i/dmodel )PE(pos, 2i+1)=cos(pos/100002i/dmodel )

PE(pos,2i)PE(pos, 2i+1)=sin(pos/100002i/dmodel )=cos(pos/100002i/dmodel )
PE(pos,2i)​PE(pos, 2i+1)​​=sin(pos/100002i/dmodel ​)=cos(pos/100002i/dmodel ​)​

  • pos \text{pos} pos:表示注入的顺序,也就是所想表述的空间或者时间上的顺序
  • pos ∈ r a n g e ( l e n ( Input ) ) \text{pos} \in range(len(\text{Input})) pos∈range(len(Input))
  • i \text{i} i:表示维度的序号,每一个输入可能对应若干深层隐藏的变量
  • 2i ∈ [ 0 , 2 , ⋯ d model ] \text{2i} \in [0,2, \cdots d_{\text{model}}] 2i∈[0,2,⋯dmodel​]
  • 2i+1 ∈ [ 1 , 3 ⋯ d model − 1 ] \text{2i+1} \in [1,3 \cdots d_{\text{model}-1}] 2i+1∈[1,3⋯dmodel−1​]

换一个更形象的好看的形式
P E → = [ P E ( 0 ) → ⋯ P E ( pos ) → ⋯ P E ( N ) → ] \overrightarrow{PE} = \left[\overrightarrow{PE_{(\text{0})}} \cdots \overrightarrow{PE_{(\text{pos})}} \cdots \overrightarrow{PE_{(\text{N})}}\right] PE =[PE(0)​ ​⋯PE(pos)​ ​⋯PE(N)​ ​]
向量 P E → \overrightarrow{PE} PE ,对应每个位置都有一个对应位置的向量 P E ( pos ) → \overrightarrow{PE_{(\text{pos})}} PE(pos)​ ​,共有输入长度 N = l e n ( i n p u t ) N=len(input) N=len(input)个 P E ( pos ) → \overrightarrow{PE_{(\text{pos})}} PE(pos)​ ​组成。每一个位置的向量都有 d model d_{\text{model}} dmodel​维度,表示为 P E (pos) → ∈ R d model , pos = 0 , 1 , 2 , ⋯   , N − 1 \overrightarrow{PE_{\text{(pos)}}} \in \mathbb{R}^{d_\text{model}},\text{pos} = 0,1,2,\cdots,N-1 PE(pos)​ ​∈Rdmodel​,pos=0,1,2,⋯,N−1
P E (pos) → = [ P E (pos) → ( 0 ) ⋮ P E (pos) → ( d model ) ] \overrightarrow{PE_{\text{(pos)}}}=\left[→PE(pos)(0)⋮→PE(pos)(dmodel)

PE(pos)−→−−−−(0)⋮PE(pos)−→−−−−(dmodel)
\right] PE(pos)​ ​=⎣⎢⎢⎢⎡​PE(pos)​ ​(0)⋮PE(pos)​ ​(dmodel​)​⎦⎥⎥⎥⎤​
每一个元素的定义

P E ( pos ) → ( i ) = { sin ⁡ ( ω k ⋅ pos ) ,  if  i = 2 k cos ⁡ ( ω k ⋅ pos ) ,  if  i = 2 k + 1 频率: ω k = 1 1000 0 2 k / d model \overrightarrow{PE_{(\text{pos})}}^{(i)}=\left\{sin(ωk⋅pos), if i=2kcos(ωk⋅pos), if i=2k+1

sin(ωk⋅pos),cos(ωk⋅pos), if i=2k if i=2k+1
\right. \\ \text{频率:}\omega_{k}=\frac{1}{10000^{2 k / d_\text{model}}} PE(pos)​ ​(i)={sin(ωk​⋅pos),cos(ωk​⋅pos),​ if i=2k if i=2k+1​频率:ωk​=100002k/dmodel​1​
最后的展示即为
P E → = [ P E (0) → ( 0 ) P E (1) → ( 0 ) ⋯ P E (N) → ( 0 ) P E (0) → ( 1 ) P E (1) → ( 1 ) ⋯ P E (N) → ( 1 ) ⋮ P E (0) → ( d model ) P E (1) → ( d model ) ⋯ P E (N) → ( d model ) ] \overrightarrow{PE}=\left[→PE(0)(0)→PE(1)(0)⋯→PE(N)(0)→PE(0)(1)→PE(1)(1)⋯→PE(N)(1)⋮→PE(0)(dmodel)→PE(1)(dmodel)⋯→PE(N)(dmodel)
PE(0)−→−−(0)PE(1)−→−−(0)⋯PE(N)−→−−−(0)PE(0)−→−−(1)PE(1)−→−−(1)⋯PE(N)−→−−−(1)⋮PE(0)−→−−(dmodel)PE(1)−→−−(dmodel)⋯PE(N)−→−−−(dmodel)
\right]
PE =⎣⎢⎢⎢⎢⎢⎢⎡​PE(0)​ ​(0)PE(1)​ ​(0)⋯PE(N)​ ​(0)PE(0)​ ​(1)PE(1)​ ​(1)⋯PE(N)​ ​(1)⋮PE(0)​ ​(dmodel​)PE(1)​ ​(dmodel​)⋯PE(N)​ ​(dmodel​)​⎦⎥⎥⎥⎥⎥⎥⎤​

从函数定义中可以得出,频率沿向量维度减小。因此,它在波长上形成从 2 π 2\pi 2π到 1000 ⋅ 2 π 1000\cdot2\pi 1000⋅2π几何级数。你也可以认为,位置编码 P E → \overrightarrow{PE} PE 是一个包含每个频率的正弦和余弦对(注意 d d d是能被2整除的)。

150维200输入 P E → \overrightarrow{PE} PE 举例

image-20210527212147584

128维50输入 P E → \overrightarrow{PE} PE 举例

1.4 编码的融合

原始论文将位置编码加到模型输入之上的方式为加法。

对于句子里的每个输入 x ( pos ) x_{(\text{pos})} x(pos)​,计算其对应的嵌入 ψ ( x ( pos ) ) \psi(x_{(\text{pos})}) ψ(x(pos)​)得到一个向量,然后按照下面的方法喂给模型:
ψ ′ ( x ( pos ) ) = ψ ( x ( pos ) ) + P E ( p o s ) → \psi^{\prime}\left(x_{(\text{pos})}\right)=\psi\left(x_{(\text{pos})}\right)+\overrightarrow{PE_{\text(pos)}} ψ′(x(pos)​)=ψ(x(pos)​)+PE(pos)​ ​
为了保证这种相加操作正确,让位置向量 P E ( p o s ) → \overrightarrow{PE_{\text(pos)}} PE(pos)​ ​的维度等于词向量 ψ ( x ( pos ) ) \psi\left(x_{(\text{pos})}\right) ψ(x(pos)​)的维度,即都让他们等于 d model d_{\text{model}} dmodel​。

下面举一个简单的例子。给定一个长度为 N N N的输入序列 X = [ x 0 x 1 ⋯ x N − 1 ] X = [x_{0} \quad x_{1} \cdots x_{N-1}] X=[x0​x1​⋯xN−1​],其对应位置的信息编码向量为:
E pos → = ψ ( x pos ) \overrightarrow{E_{\text{pos}}} = \psi(x_\text{pos}) Epos​ ​=ψ(xpos​)
其中, pos = 0 , 1 , ⋯ N − 1 \text{pos} = 0,1,\cdots N-1 pos=0,1,⋯N−1。假设 d model = 4 d_\text{model} = 4 dmodel​=4,那么$k = 0,1 。 根 据 前 面 1.3 的 公 式 计 算 。根据前面1.3的公式计算 。根据前面1.3的公式计算\overrightarrow{PE_{\text(pos)}}$对应的位置向量:
P E ( p o s ) → = [ sin ⁡ ( w 0 ⋅ pos ) , cos ⁡ ( w 0 ⋅ pos ) , sin ⁡ ( w 1 ⋅ pos ) , cos ⁡ ( w 1 ⋅ pos ) ] T = [ sin ⁡ ( t 1000 0 0 ) , cos ⁡ ( t 1000 0 0 ) , sin ⁡ ( pos 1000 0 2 4 ) , cos ⁡ ( pos 1000 0 2 4 ) ] T = [ sin ⁡ ( pos ) , cos ⁡ ( pos ) , sin ⁡ ( pos 100 ) , cos ⁡ ( pos 100 ) ] T →PE(pos)=[sin(w0⋅pos),cos(w0⋅pos),sin(w1⋅pos),cos(w1⋅pos)]T=[sin(t100000),cos(t100000),sin(pos1000024),cos(pos1000024)]T=[sin(pos),cos(pos),sin(pos100),cos(pos100)]T

PE(pos)−→−−−−=[sin(w0⋅pos),cos(w0⋅pos),sin(w1⋅pos),cos(w1⋅pos)]T=[sin(t100000),cos(t100000),sin(pos1000024),cos(pos1000024)]T=[sin(pos),cos(pos),sin(pos100),cos(pos100)]T
PE(pos)​ ​​=[sin(w0​⋅pos),cos(w0​⋅pos),sin(w1​⋅pos),cos(w1​⋅pos)]T=[sin(100000t​),cos(100000t​),sin(1000042​pos​),cos(1000042​pos​)]T=[sin(pos),cos(pos),sin(100pos​),cos(100pos​)]T​
最终被表示为:
E (pos) ′ → = E (pos) → + P E (pos) → = E (pos) → + [ sin ⁡ ( pos ) , cos ⁡ ( pos ) , sin ⁡ ( pos 100 ) , cos ⁡ ( pos 100 ) ] →E′(pos)=→E(pos)+→PE(pos)=→E(pos)+[sin(pos),cos(pos),sin(pos100),cos(pos100)]
E′(pos)−→−−=E(pos)−→−−+PE(pos)−→−−−−=E(pos)−→−−+[sin(pos),cos(pos),sin(pos100),cos(pos100)]
E(pos)′​ ​​=E(pos)​ ​+PE(pos)​ ​=E(pos)​ ​+[sin(pos),cos(pos),sin(100pos​),cos(100pos​)]​

1.5 相对位置的线性关系

正弦曲线函数的位置编码的另一个特点是,它能让模型毫不费力地关注相对位置信息。这里引用原文的一段话:

We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k k k, P E pos+k PE_\text{pos+k} PEpos+k​ can be represented as a linear function of P E pos PE_\text{pos} PEpos​.

我们选择正弦曲线函数,因为我们假设它能让模型很容易地学习关注相对位置,因为对于任何固定的偏移量 k k k, P E pos+k PE_\text{pos+k} PEpos+k​可以表示成 P E pos PE_\text{pos} PEpos​的线性函数。

接下来,让我们证明位置编码中相对位置之间的线性关系。

问题描述

让 E → ∈ R N × d model \overrightarrow{E} \in \mathbb{R}^{N \times d_\text{model}} E ∈RN×dmodel​ 表示包含 N N N个 d model d_\text{model} dmodel​维的列向量 E pos → \overrightarrow{E_\text{pos}} Epos​ ​的矩阵,其中, N N N 表示输入序列长度,其中的 p o s pos pos表示输入的位置。
E pos → = [ sin ⁡ ( pos ω 0 ) cos ⁡ ( pos ω 0 ) sin ⁡ ( pos ω 1 ) cos ⁡ ( pos ω 1 ) ⋮ sin ⁡ ( pos ω d model / 2 ) cos ⁡ ( pos ω d model / 2 ) ] \overrightarrow{E_\text{pos}} = \left[sin(posω0)cos(posω0)sin(posω1)cos(posω1)⋮sin(posωdmodel/2)cos(posωdmodel/2)

sin(posω0)cos(posω0)sin(posω1)cos(posω1)⋮sin(posωdmodel/2)cos(posωdmodel/2)
\right] Epos​ ​=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​sin(ω0​pos​)cos(ω0​pos​)sin(ω1​pos​)cos(ω1​pos​)⋮sin(ωdmodel​/2​pos​)cos(ωdmodel​/2​pos​)​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​
频率可以由之前的公式计算得到:

论文认为,存在一个线性转置
T ( k ) ∈ R d model  × d model  \boldsymbol{T}^{(k)} \in \mathbb{R}^{d_{\text {model }} \times d_{\text {model }}} T(k)∈Rdmodel ​×dmodel ​

因为 k k k在上面我们已经用来标表示过了不同维度处的编码频率,这里我们换一个符号来表示偏移量 Δ \Delta Δ,使得对于序列中的任意有效位置 pos = 0 , 1 , 2 , ⋯   , ( N − 1 − Δ ) \text{pos} = 0,1,2,\cdots, (N-1-\Delta) pos=0,1,2,⋯,(N−1−Δ)的任意的位置偏移量 Δ = 1 , 2 , ⋯   , ( N − 2 ) \Delta = 1,2,\cdots,(N-2) Δ=1,2,⋯,(N−2),下式都成立:

T ( Δ ) E pos → = E pos + Δ → \boldsymbol{T}^{(\Delta)}\overrightarrow{E_\text{pos}} = \overrightarrow{E_{\text{pos}+\Delta}} T(Δ)Epos​ ​=Epos+Δ​ ​

推导证明

如果说我们能够找到一个不依赖变量 pos \text{pos} pos的一个转换矩阵 T ( k ) \boldsymbol{T}^{(k)} T(k),那么上面公式就是成立。

首先我们假设如下

T ( Δ ) = [ Φ 1 ( Δ ) 0 ⋯ 0 0 Φ 2 ( Δ ) ⋯ 0 0 0 ⋱ 0 0 0 ⋯ Φ d model 2 ( Δ ) ] \boldsymbol{T}^{(\Delta)}=\left[ Φ(Δ)10⋯00Φ(Δ)2⋯000⋱000⋯Φ(Δ)dmodel2

\right] T(Δ)=⎣⎢⎢⎢⎡​Φ1(Δ)​000​0Φ2(Δ)​00​⋯⋯⋱⋯​000Φ2dmodel​​(Δ)​​⎦⎥⎥⎥⎤​

其中, 0 \mathbf{0} 0表示 2 ∗ 2 2*2 2∗2的全零矩阵,主对角线上的 d model 2 \frac{d_{\text {model}}}{2} 2dmodel​​个转置后的旋转矩阵 Φ ∗ ( Δ ) \boldsymbol{\Phi}_{*}^{(\Delta)} Φ∗(Δ)​,单独拿出第 m m m个定义如下:(需要证明 m m m与 pos \text{pos} pos无关)

Φ m ( Δ ) = [ cos ⁡ ( r m Δ ) − sin ⁡ ( r m Δ ) sin ⁡ ( r m Δ ) cos ⁡ ( r m Δ ) ] T \boldsymbol{\Phi}_{m}^{(\Delta)}=\left[cos(rmΔ)−sin(rmΔ)sin(rmΔ)cos(rmΔ)

\right]^{T} Φm(Δ)​=[cos(rm​Δ)sin(rm​Δ)​−sin(rm​Δ)cos(rm​Δ)​]T

这里 r m r_m rm​是个系数,表示转换矩阵在不同的位置的编码频率。

现在,我们将上面的公式重新整理为需要证明的形式:
T ( Δ ) E pos → = E pos + Δ → T(Δ)→Epos=→Epos+Δ

T(Δ)Epos​ ​​=Epos+Δ​ ​​
因为转换矩阵中有很多 2 ∗ 2 2*2 2∗2的全零矩阵,在矩阵相乘的时候会有如下的对位关系。

T ( Δ ) E pos → = [ Φ 1 ( Δ ) 0 ⋯ 0 0 Φ 2 ( Δ ) ⋯ 0 0 0 ⋱ 0 0 0 ⋯ Φ d model 2 ( Δ ) ] [ sin ⁡ ( pos ω 0 ) cos ⁡ ( pos ω 0 ) sin ⁡ ( pos ω 1 ) cos ⁡ ( pos ω 1 ) ⋮ sin ⁡ ( pos ω d model 2 ) cos ⁡ ( pos ω d model 2 ) ] = [ Φ 1 ( Δ ) [ sin ⁡ ( ω 0 pos ) cos ⁡ ( ω 0 pos ) ] 0 ⋯ 0 0 0 ⋱ ⋯ ⋯ 0 0 ⋯ Φ m ( Δ ) [ sin ⁡ ( ω m pos ) cos ⁡ ( ω m pos ) ] ⋯ 0 0 ⋯ ⋯ ⋱ 0 0 0 ⋯ 0 Φ d model 2 ( Δ ) [ sin ⁡ ( ω d model 2 pos ) cos ⁡ ( ω d model 2 pos ) ] ] \boldsymbol{T}^{(\Delta)}\overrightarrow{E_\text{pos}}=\left[ Φ(Δ)10⋯00Φ(Δ)2⋯000⋱000⋯Φ(Δ)dmodel2

\right] \left[sin(posω0)cos(posω0)sin(posω1)cos(posω1)⋮sin(posωdmodel2)cos(posωdmodel2)
\right]\\ =\left[ \begin{array}{ccccc} \boldsymbol{\Phi}_{1}^{(\Delta)}\left[\begin{array}{l} \sin \left(\omega_{0} \text{pos}\right) \\ \cos \left(\omega_{0} \text{pos}\right) \end{array}
\right] & \mathbf{0} & \cdots & \mathbf{0}& \mathbf{0} \\ \mathbf{0} & \ddots & \cdots & \cdots &\mathbf{0} \\ \mathbf{0} &\cdots &\boldsymbol{\Phi}_{m}^{(\Delta)}\left[sin(ωmpos)cos(ωmpos)
\right] &\cdots &\mathbf{0} \\ \mathbf{0} & \cdots & \cdots & \ddots &\mathbf{0} \\ \mathbf{0} & \mathbf{0} & \cdots & \mathbf{0} & \mathbf{\Phi}_{\frac{d_{\text {model}}}{2}}^{(\Delta)}\left[sin(ωdmodel2pos)cos(ωdmodel2pos)
\right] \end{array}\right] \\ T(Δ)Epos​ ​=⎣⎢⎢⎢⎡​Φ1(Δ)​000​0Φ2(Δ)​00​⋯⋯⋱⋯​000Φ2dmodel​​(Δ)​​⎦⎥⎥⎥⎤​⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​sin(ω0​pos​)cos(ω0​pos​)sin(ω1​pos​)cos(ω1​pos​)⋮sin(ω2dmodel​​​pos​)cos(ω2dmodel​​​pos​)​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​Φ1(Δ)​[sin(ω0​pos)cos(ω0​pos)​]0000​0⋱⋯⋯0​⋯⋯Φm(Δ)​[sin(ωm​pos)cos(ωm​pos)​]⋯⋯​0⋯⋯⋱0​0000Φ2dmodel​​(Δ)​⎣⎡​sin(ω2dmodel​​​pos)cos(ω2dmodel​​​pos)​⎦⎤​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​

所以只需要考虑对角线位置的矩阵乘法即可。

[ cos ⁡ ( r m Δ ) sin ⁡ ( r m Δ ) − sin ⁡ ( r m Δ ) cos ⁡ ( r m Δ ) ] ⏟ Φ m ( Δ ) [ sin ⁡ ( ω m pos ) cos ⁡ ( ω m pos ) ] = [ cos ⁡ ( r m Δ ) sin ⁡ ( ω m pos ) + sin ⁡ ( r m Δ ) cos ⁡ ( ω m pos ) − sin ⁡ ( r m Δ ) sin ⁡ ( ω m pos ) + cos ⁡ ( r m Δ ) cos ⁡ ( ω m pos ) ] = [ sin ⁡ ( r m Δ + ω m pos ) cos ⁡ ( r m Δ + ω m pos ) ] W h e n r m = ω m , = [ sin ⁡ ( ω m ( pos + Δ ) ) cos ⁡ ( ω m ( pos + Δ ) ) ] [cos(rmΔ)sin(rmΔ)−sin(rmΔ)cos(rmΔ)]⏟Φ(Δ)m[sin(ωmpos)cos(ωmpos)]=[cos(rmΔ)sin(ωmpos)+sin(rmΔ)cos(ωmpos)−sin(rmΔ)sin(ωmpos)+cos(rmΔ)cos(ωmpos)]=[sin(rmΔ+ωmpos)cos(rmΔ+ωmpos)]Whenrm=ωm,=[sin(ωm(pos+Δ))cos(ωm(pos+Δ))]

​Φm(Δ)​ [cos(rm​Δ)−sin(rm​Δ)​sin(rm​Δ)cos(rm​Δ)​]​​[sin(ωm​pos)cos(ωm​pos)​]=[cos(rm​Δ)sin(ωm​pos)+sin(rm​Δ)cos(ωm​pos)−sin(rm​Δ)sin(ωm​pos)+cos(rm​Δ)cos(ωm​pos)​]=[sin(rm​Δ+ωm​pos)cos(rm​Δ+ωm​pos)​]Whenrm​=ωm​,=[sin(ωm​(pos+Δ))cos(ωm​(pos+Δ))​]​

所以 r m = ω m r_{m} = \omega_{m} rm​=ωm​。我们通过这个这个结论和 ω m \omega_{m} ωm​的定义,重新写一遍转换矩阵,我们能得到:

Φ m ( Δ ) = [ cos ⁡ ( ω m Δ ) − sin ⁡ ( ω m Δ ) sin ⁡ ( ω m Δ ) cos ⁡ ( ω m Δ ) ] T \boldsymbol{\Phi}_{m}^{(\Delta)}=\left[cos(ωmΔ)−sin(ωmΔ)sin(ωmΔ)cos(ωmΔ)

\right]^{T} Φm(Δ)​=[cos(ωm​Δ)sin(ωm​Δ)​−sin(ωm​Δ)cos(ωm​Δ)​]T

因为 ω m \omega_{m} ωm​这个编码频率只和编码矩阵的维度序号有关(不同维度的编码有着不同的波长,与输入的位置无关 ω m = 1 1000 0 2 m / d model \omega_{m}=\frac{1}{10000^{2 m / d_\text{model}}} ωm​=100002m/dmodel​1​),所以我们可以得到结论:这样, T ( Δ ) \boldsymbol{T}^{(\Delta)} T(Δ) 完全由 m m m、 d model d_\text{model} dmodel​以及 Δ \Delta Δ指定,而且只依赖于它们。序列内的位置 pos \text{pos} pos不是一个针对于变换矩阵的变量。

1.6 一些备注说明

也可以采用训练的 P E PE PE,但是试验结果表明相差不大,因此论文选择了sin position embedding,因为

  • 这样可以直接计算 P E PE PE而不需要训练,减少了训练参数
  • 这样允许模型将 P E PE PE扩展到超过了training set中最长position的position,例如测试集中出现了更大的position,sin/cos P E PE PE依然可以给出结果,但不存在训练到的embedding。

2 一些个人理解

大家也可以看到关于position embedding通常是一个训练的输入信息强化向量,但是其只是extra features,有该信息会更好,但是没有性能也不会产生极大下降,因为RNN、CNN本身就能够捕捉到位置信息

因为模型不包括recurrence/convolution。在Transformer模型中,Position Embedding是位置信息的唯一来源,因此是该模型的核心成分,并非是辅助性质的特征。

ZZQ…

这也就代表了没有归纳偏置的融入,有好处也会有一些坏处

  • 好处:大部分论文中 都会有如下一个意思的表达,因为没有这些内容(归纳偏置)的融入,所以超越在有归纳偏置融入情况下的表现
  • 坏处:无约束的肆意妄为导致不容易训练和需要一定体量的数据才可能达到与没有归纳偏置融入情况下的表现

因此是无法捕捉到序列中顺序信息的,例如将 K 、 V K、V K、V按行进行打乱,那么Attention​之后的结果是一样的。

这里的一样指的是输出的元素一样,只是元素的位置发生了改变,在这里我举一个例子

image-20210527101606141

没有位置编码的情况下,输入的顺序可以随意变换,结果没有影响的结论证明

公式1
Q ⋅ K T = ( q 1 ⃗ q 2 ⃗ ⋮ q 10 ⃗ ) ⋅ ( k 1 ⃗ T k 2 ⃗ T ⋯ k 10 ⃗ T ) ( q 1 ⃗ ⋅ k 1 ⃗ T q 1 ⃗ ⋅ k 2 ⃗ T ⋯ q 1 ⃗ ⋅ k 10 ⃗ T q 2 ⃗ ⋅ k 1 ⃗ T q 2 ⃗ ⋅ k 2 ⃗ T ⋯ q 2 ⃗ ⋅ k 10 ⃗ T ⋮ ⋮ ⋮ ⋮ q 10 ⃗ ⋅ k 1 ⃗ T ⋯ ⋯ q 10 ⃗ ⋅ k 10 ⃗ T ) = ( s 1 − 1 ⋯ s 1 − 10 ⋮ ⋯ ⋮ s 10 − 1 ⋯ s 10 − 10 ) Q \cdot K^T= \left(→q1→q2⋮→q10

\right) \cdot \left(\vec{k_{1}}^T \vec{k_{2}}^T\cdots \vec{k_{10}}^T \right) \left(→q1⋅→k1T→q1⋅→k2T⋯→q1⋅→k10T→q2⋅→k1T→q2⋅→k2T⋯→q2⋅→k10T⋮⋮⋮⋮→q10⋅→k1T⋯⋯→q10⋅→k10T
\right) =\left(s1−1⋯s1−10⋮⋯⋮s10−1⋯s10−10
\right) Q⋅KT=⎝⎜⎜⎜⎛​q1​ ​q2​ ​⋮q10​ ​​⎠⎟⎟⎟⎞​⋅(k1​ ​Tk2​ ​T⋯k10​ ​T)⎝⎜⎜⎜⎜⎜⎛​q1​ ​⋅k1​ ​Tq2​ ​⋅k1​ ​T⋮q10​ ​⋅k1​ ​T​q1​ ​⋅k2​ ​Tq2​ ​⋅k2​ ​T⋮⋯​⋯⋯⋮⋯​q1​ ​⋅k10​ ​Tq2​ ​⋅k10​ ​T⋮q10​ ​⋅k10​ ​T​⎠⎟⎟⎟⎟⎟⎞​=⎝⎜⎛​s1−1​⋮s10−1​​⋯⋯⋯​s1−10​⋮s10−10​​⎠⎟⎞​

公式2
Q ⋅ K T = ( q 2 ⃗ q 1 ⃗ ⋮ q 10 ⃗ ) ⋅ ( k 1 ⃗ T k 2 ⃗ T ⋯ k 10 ⃗ T ) ( q 2 ⃗ ⋅ k 1 ⃗ T q 2 ⃗ ⋅ k 2 ⃗ T ⋯ q 2 ⃗ ⋅ k 10 ⃗ T q 1 ⃗ ⋅ k 1 ⃗ T q 1 ⃗ ⋅ k 2 ⃗ T ⋯ q 1 ⃗ ⋅ k 10 ⃗ T ⋮ ⋮ ⋮ ⋮ q 10 ⃗ ⋅ k 1 ⃗ T ⋯ ⋯ q 10 ⃗ ⋅ k 10 ⃗ T ) = ( s 1 − 1 ⋯ s 1 − 10 ⋮ ⋯ ⋮ s 10 − 1 ⋯ s 10 − 10 ) Q \cdot K^T= \left(→q2→q1⋮→q10

\right) \cdot \left(\vec{k_{1}}^T \vec{k_{2}}^T\cdots \vec{k_{10}}^T \right) \left(→q2⋅→k1T→q2⋅→k2T⋯→q2⋅→k10T→q1⋅→k1T→q1⋅→k2T⋯→q1⋅→k10T⋮⋮⋮⋮→q10⋅→k1T⋯⋯→q10⋅→k10T
\right) =\left(s1−1⋯s1−10⋮⋯⋮s10−1⋯s10−10
\right) Q⋅KT=⎝⎜⎜⎜⎛​q2​ ​q1​ ​⋮q10​ ​​⎠⎟⎟⎟⎞​⋅(k1​ ​Tk2​ ​T⋯k10​ ​T)⎝⎜⎜⎜⎜⎜⎛​q2​ ​⋅k1​ ​Tq1​ ​⋅k1​ ​T⋮q10​ ​⋅k1​ ​T​q2​ ​⋅k2​ ​Tq1​ ​⋅k2​ ​T⋮⋯​⋯⋯⋮⋯​q2​ ​⋅k10​ ​Tq1​ ​⋅k10​ ​T⋮q10​ ​⋅k10​ ​T​⎠⎟⎟⎟⎟⎟⎞​=⎝⎜⎛​s1−1​⋮s10−1​​⋯⋯⋯​s1−10​⋮s10−10​​⎠⎟⎞​
总体来说,元素的位置改变了,但是值没有变,通过全连接是可以得到跟之前完全一样的结果,只需要改变对应的全连接的链接就可以了

这带来的结果就是,任意的输入顺序交换都可以带给网络最后的输出,且这个输出在理论上来说是没有区别的,只需要你去训练即可,全连接的连接点顺序发生变化罢了。

为了想要固定输入的有序性,融入位置编码,其实这个时候就已经将先验知识融入进去了(其实这里几有一个小问题,融入这个序列相邻的相关性是否也算是一种网络结构上的归纳偏置),也就是认为输入的顺序是不应该变化的。前文也已经看到了位置编码是怎么样子让输入固定的。

序列信息非常重要,代表着全局的结构,因此必须将序列的token相对或者绝对position信息利用起来。

总的来说

  • 加入 P E PE PE是否也意味着加入了衡量临近顺序的考量

  • 加入 P E PE PE在高纬度的时候是否有效(仅仅指图像此种对纵向维度有顺序考量的信号,高纬度后的频率编码较低几乎为单一常数)

  • 加入 P E PE PE在低纬度的时候不同 pos \text{pos} pos是否实际的编码意义(编码频率非常低信息量基本被淹没在高频位置编码中)

  • 加入 P E PE PE在不同维度的内容是否会因为 P E PE PE向量所代表的的不同能量价值而出现不同的侧重性

  • 其所述的相对地址偏移的意义是否有实际的价值

Last、参考文献

一文读懂Transformer模型的位置编码 - 知乎
Attention is all you need
Hands-on Machine Learning with Scikit Learn, Keras, TensorFlow: Concepts, Tools and Techniques to Build Intelligent Systems 2nd Edition
Linear Relationships in the Transformer’s Positional Encoding
Transformer Architecture: The Positional Encoding - Amirhossein Kazemnejad’s Blog

注:本文转载自blog.csdn.net的呆呆象呆呆的文章"https://blog.csdn.net/qq_41554005/article/details/117387118"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top