IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 位置编码 - 领略位置编码神奇的风景 - 系列(1) -> 正文阅读

[人工智能]位置编码 - 领略位置编码神奇的风景 - 系列(1)

位置编码 - 领略位置编码神奇的风景 - 系列(1)

在这里插入图片描述

前文

自从attention在nlp流行之后,不管是在bert还是在transformer,都缺少不了位置编码的身影(position embedding)。主要原因是attention在计算的时候,不管是QK之间的点乘运算,还是attention scores与V之间的点乘运算在训练时都是并行计算的,从逻辑上来说,跟RNN不一样,attention处理时并没有先后之分。

  • 当一个句子中出现多个相同的token时,从语义上来说,同一个token在一个句子中的不同位置都有不同的含义。

    • 举个例子,“我在苹果公司吃苹果”,这里出现的两个“苹果”明显表达的是两个意思,那么人是怎么区分两个“苹果”之间的含义?
      • 最重要的就是根据token之间的位置关系。因为第一个“苹果”和“公司”这个token旁边,所以可以很清楚的知道第一个“苹果”表示的是苹果公司。
    • 由于attention计算是点乘计算,所以不同位置的token,都会跟其它位置的token进行内积计算,经过层层的网络,然后计算loss,最后通过反向传播优化参数。这样就会导致在不同位置的token,有着相同的embedding。明显是不符合语义的。
  • 因此,在不同的位置上,相同的token需要有不同的embedding输入。目前,在transformer类似的结构里面,主要是将输入的embedding分为几个部分。大体上可以区分为token embedding与position embedding,当输入模型的时候,就是将二者相加(当然还有其它的处理方式,例如相乘,这里只考虑通用的方法),其中,token embedding表示token的本质含义,而position embedding则表示token的位置编码。由于位置编码在不同位置是不一样的,所以就能让不同位置的token有着不同的含义。当然,除了token embedding和position embedding之外,还有其它的一些embedding,由于与本文无关,这里不过多介绍。
    在这里插入图片描述

  • 自bert与transformer之后,位置编码的发展也是百花齐放,下面我将为大家仔细的介绍不同的位置编码。如果各位读者能从本文中得到一点收获,希望能够点赞,收藏一下,如果有什么问题,也可以评论。
    在这里插入图片描述

1. 绝对位置编码

1.1 参数式绝对位置编码

顾名思义,参数式绝对位置编码,就是利用可学习的参数来表示绝对位置。

  • 什么是绝对位置?:
    • 就是不管什么句子,句子的第一个token,位置就是0,第二个token,位置就是1。举个栗子,针对句子“我在苹果公司吃苹果”,其位置编码为:[0,1,2,3,4,5,6,7,8]。其中,“我”的位置编码就是0,‘在’位置编码就是1。
  • 什么是参数式?
    • 与token的编码一样,可以随机初始化一个变量,然后让模型自己学习位置编码。当然这种方式需要预先设定最大的位置编码长度,比如说max_position_embeddings=512。之后就可以定一个shape为[max_position_embeddings, embedding_size]的variable。最后不同的位置编码one-hot之后,就可以映射到不同的位置编码上。
  • bert就是采用这种位置编码方式,这种编码方式首先来说比较的简单,位置编码直接交给模型去学习,同时,也会带来需要大量的数据进行token与position embedding的学习。

1.2 函数式位置编码

函数式位置编码主要是指通过函数来表示不同位置信息。这里主要表示transformer里使用的函数式位置编码方式。

  • 公式如下:
    P E ( p o s , 2 i ) = sin ? ( p o s / 1000 0 2 i / d model? ) P E ( p o s , 2 i + 1 ) = cos ? ( p o s / 1000 0 2 i / d model? ) \begin{aligned} PE_{(pos, 2i)} &=\sin \left(pos / 10000^{2i / d_{\text {model }}}\right) \\ PE_{(pos, 2i+1)} &=\cos \left(pos / 10000^{2i / d_{\text {model }}}\right) \end{aligned} PE(pos,2i)?PE(pos,2i+1)??=sin(pos/100002i/dmodel??)=cos(pos/100002i/dmodel??)?
    其中, p o s pos pos表示token的位置, i i i表示embeding中的某个纬度。 d m o d e l d_{model} dmodel?表示position embedding的纬度大小。
  • 为什么使用sin/cos三角函数?
    • 原文: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, P E p o s + k PE_{pos+k} PEpos+k? can be represented as a linear function of P E p o s PE_{pos} PEpos?.
    • 证明:
      • 假定: E ∈ R n × d model? \boldsymbol{E} \in \mathbb{R}^{\boldsymbol{n} \times d_{\text {model }}} ERn×dmodel??表示行为n,列为 d m o d e l d_{model} dmodel?的矩阵。则 E E E可定义为:
        e ( t ) = E t , j = [ sin ? ( t f 0 , 0 ) , . . . , sin ? ( t f 1 , j ) cos ? ( t f 0 , 0 ) , . . . , cos ? ( t f 1 , j ) sin ? ( t f 1 , 0 ) , . . . , sin ? ( t f 2 , j ) cos ? ( t f 1 , 0 ) , . . . , cos ? ( t f 2 , j ) ? sin ? ( t f d model? 2 ? 1 , 0 ) , . . . , sin ? ( t f d model? 2 , j ) cos ? ( t f d model? 2 ? 1 , 0 ) , . . . , cos ? ( t f d model? 2 , j ) ] e(t)=\boldsymbol{E}_{t,j}=\left[\begin{array}{c} \sin \left(\frac{t}{f_{0,0}}\right),...,\sin\left(\frac{t}{f_{1,j}}\right) \\ \cos \left(\frac{t}{f_{0,0}}\right),...,\cos\left(\frac{t}{f_{1,j}}\right) \\ \sin \left(\frac{t}{f_{1,0}}\right),...,\sin \left(\frac{t}{f_{2,j}}\right) \\ \cos \left(\frac{t}{f_{1,0}}\right),..., \cos \left(\frac{t}{f_{2,j}}\right)\\ \vdots \\ \sin \left(\frac{t}{f_{\frac{d_{\text {model }}}{2}-1,0}}\right),...,\sin \left(\frac{t}{f_{\frac{d_{\text {model }}}{2},j}}\right) \\ \cos \left(\frac{t}{f_{\frac{d_{\text {model }}}{2}-1,0}}\right),...,\cos \left(\frac{t}{f_{\frac{d_{\text {model }}}{2},j}}\right) \end{array}\right] e(t)=Et,j?=????????????????????sin(f0,0?t?),...,sin(f1,j?t?)cos(f0,0?t?),...,cos(f1,j?t?)sin(f1,0?t?),...,sin(f2,j?t?)cos(f1,0?t?),...,cos(f2,j?t?)?sin(f2dmodel????1,0?t?),...,sin(f2dmodel???,j?t?)cos(f2dmodel????1,0?t?),...,cos(f2dmodel???,j?t?)?????????????????????
        其中, E t , : E_{t,:} Et,:?每一列可以表示为 sin ? ( t f t ) \sin\left(\frac{t}{f_{t}}\right) sin(ft?t?), f m = 1 λ m : = 1000 0 2 m d model? f_{m}=\frac{1}{\lambda_{m}}:=10000^{\frac{2 m}{d_{\text {model }}}} fm?=λm?1?:=10000dmodel??2m?
      • 问题可以转化为:存在一个线性转置 T ( k ) ∈ R d model? × d model? \boldsymbol{T}^{(k)} \in \mathbb{R}^{d_{\text {model }} \times d_{\text {model }}} T(k)Rdmodel??×dmodel??,使得对于序列中的任意有效位置 t ∈ { 1 , … , n ? k } t \in\{1, \ldots, n-k\} t{1,,n?k}的任意的位置偏移量 k ∈ { 1 , … , n } k \in\{1, \ldots, n\} k{1,,n},下式均成立:
        T ( k ) E t , : = E t + k , (1) \boldsymbol{T}^{(k)} \boldsymbol{E}_{t,:}=\boldsymbol{E}_{t+k,} \tag{1} T(k)Et,:?=Et+k,?(1)
      • 假定上面的公式是成立的,则存在 T ( k ) T^{(k)} T(k)
        T ( k ) = [ Φ 0 ( k ) 0 . . . 0 0 Φ 1 ( k ) . . . 0 0 0 ? 0 0 0 . . . Φ d m o d e l 2 ? 1 ( k ) ] \boldsymbol{T}^{(k)}=\boldsymbol{\left[\begin{array}{c} \boldsymbol{\Phi}_{0}^{(k)} \quad \bold{0} \quad ... \quad \bold{0}\\ \bold{0} \quad \boldsymbol{\Phi}_{1}^{(k)} \quad ... \quad \bold{0}\\ \bold{0} \quad \bold{0} \quad \ddots \quad \bold{0} \\ \bold{0} \quad \bold{0} \quad ... \quad \boldsymbol{\Phi}_{\frac{d_{model}}{2}-1}^{(k)}\\ \end{array}\right]} T(k)=??????Φ0(k)?0...00Φ1(k)?...000?000...Φ2dmodel???1(k)????????
        其中, 0 \bold{0} 0表示 2 ? 2 2*2 2?2的全零矩阵,主对角线 d m o d e l 2 \frac{d_{model}}{2} 2dmodel??个元素可以表示为:
        Φ m ( k ) = [ cos ? ( r m k ) ? sin ? ( r m k ) sin ? ( r m k ) cos ? ( r m k ) ] ? (2) \mathbf{\Phi}_{m}^{(k)}=\left[\begin{array}{cc} \cos \left(r_{m} k\right) & -\sin \left(r_{m} k\right) \\ \sin \left(r_{m} k\right) & \cos \left(r_{m} k\right) \end{array}\right]^{\top} \tag2 Φm(k)?=[cos(rm?k)sin(rm?k)??sin(rm?k)cos(rm?k)?]?(2)
        带入公式(1)得到:
        [ cos ? ( r m k ) sin ? ( r m k ) ? sin ? ( r m k ) cos ? ( r m k ) ] ? Φ m ( k ) [ sin ? ( λ m t ) cos ? ( λ m t ) ] = [ sin ? ( λ m ( t + k ) ) cos ? ( λ m ( t + k ) ) ] \underbrace{\left[\begin{array}{cc} \cos \left(r_{m} k\right) & \sin \left(r_{m} k\right) \\ -\sin \left(r_{m} k\right) & \cos \left(r_{m} k\right) \end{array}\right]}_{\Phi_{m}^{(k)}}\left[\begin{array}{l} \sin \left(\lambda_{m} t\right) \\ \cos \left(\lambda_{m} t\right) \end{array}\right]=\left[\begin{array}{l} \sin \left(\lambda_{m}(t+k)\right) \\ \cos \left(\lambda_{m}(t+k)\right) \end{array}\right] Φm(k)? [cos(rm?k)?sin(rm?k)?sin(rm?k)cos(rm?k)?]??[sin(λm?t)cos(λm?t)?]=[sin(λm?(t+k))cos(λm?(t+k))?]
        对上式进行展开(点乘,忽略 m m m)为:
        sin ? ( λ k + λ t ) = sin ? ( r k ) cos ? ( λ t ) + cos ? ( r k ) sin ? ( λ t ) cos ? ( λ k + λ t ) = cos ? ( r k ) cos ? ( λ t ) ? sin ? ( r k ) sin ? ( λ t ) (3) \begin{aligned} \sin (\lambda k+\lambda t) &=\sin (r k) \cos (\lambda t)+\cos (r k) \sin (\lambda t) \\ \cos (\lambda k+\lambda t) &=\cos (r k) \cos (\lambda t)-\sin (r k) \sin (\lambda t) \end{aligned} \tag3 sin(λk+λt)cos(λk+λt)?=sin(rk)cos(λt)+cos(rk)sin(λt)=cos(rk)cos(λt)?sin(rk)sin(λt)?(3)
        另外,
        s i n ( λ t + λ k ) = s i n ( λ t ) c o s ( λ k ) + c o s ( λ t ) s i n ( λ k ) c o s ( λ t + λ k ) = c o s ( λ t ) c o s ( λ k ) ? s i n ( λ t ) s i n ( λ k ) (4) \begin{aligned} sin(\lambda t+\lambda k)=sin(\lambda t)cos(\lambda k)+cos(\lambda t)sin(\lambda k) \\ cos(\lambda t+\lambda k)=cos(\lambda t)cos(\lambda k)-sin(\lambda t)sin(\lambda k) \end{aligned} \tag4 sin(λt+λk)=sin(λt)cos(λk)+cos(λt)sin(λk)cos(λt+λk)=cos(λt)cos(λk)?sin(λt)sin(λk)?(4)
        综合公式(3)和公式(4)可以得到 r = λ r=\lambda r=λ,因此公式(2)可以表示为:
        Φ m ( k ) = [ cos ? ( λ m k ) sin ? ( λ m k ) ? sin ? ( λ m k ) cos ? ( λ m k ) ] \mathbf{\Phi}_{m}^{(k)}=\left[\begin{array}{cc} \cos \left(\lambda_{m} k\right) & \sin \left(\lambda_{m} k\right) \\ -\sin \left(\lambda_{m} k\right) & \cos \left(\lambda_{m} k\right) \end{array}\right] Φm(k)?=[cos(λm?k)?sin(λm?k)?sin(λm?k)cos(λm?k)?]
        其中 λ m = 1000 0 ? 2 m d m o d e l \lambda_{m}=10000^{\frac{-2m}{d_{model}}} λm?=10000dmodel??2m?。因此,通过上面的证明可以知道为什么选择正弦曲线函数,因为我们假设它能让模型很容易地学习关注相对位置,因为对于任何固定的偏移量k, P E p o s + k PE_{pos+k} PEpos+k?可以表示成 P E p o s PE_{pos} PEpos?的线性函数。
  • 缺点:从上面的证明我们可以知道,函数式位置编码可以一定程度的表示相对位置信息,但是经过注意力层后,相对位置信息还保留多少?
    • 在经过attention计算后,attention scores可表示为:
      A i , j a b s = ( W q ( E x i + U i ) ) T ( W k ( E x j + U j ) ) (5) A_{i, j}^{a b s}=\left(W_{q}\left(E_{x_{i}}+U_{i}\right)\right)^{T}\left(W_{k}\left(E_{x_{j}}+U_{j}\right)\right) \tag5 Ai,jabs?=(Wq?(Exi??+Ui?))T(Wk?(Exj??+Uj?))(5)
      其中, E x i , E x j E_{x_i},E_{x_j} Exi??Exj??表示token embedding, U i , U j U_i,U_j Ui?,Uj?表示为position embedding。
      经过展开后,可以得到:
      A i , j a b s = E x i ? W q ? W k E x j ? ( a ) + E x i ? W q ? W k U j ? ( b ) + U i ? W q ? W k E x j ? ( c ) + U i ? W q ? W k U j ? ( d ) . (6) \begin{aligned} \mathbf{A}_{i, j}^{\mathrm{abs}} &=\underbrace{\mathbf{E}_{x_{i}}^{\top} \mathbf{W}_{q}^{\top} \mathbf{W}_{k} \mathbf{E}_{x_{j}}}_{(a)}+\underbrace{\mathbf{E}_{x_{i}}^{\top} \mathbf{W}_{q}^{\top} \mathbf{W}_{k} \mathbf{U}_{j}}_{(b)} \\ &+\underbrace{\mathbf{U}_{i}^{\top} \mathbf{W}_{q}^{\top} \mathbf{W}_{k} \mathbf{E}_{x_{j}}}_{(c)}+\underbrace{\mathbf{U}_{i}^{\top} \mathbf{W}_{q}^{\top} \mathbf{W}_{k} \mathbf{U}_{j}}_{(d)} . \end{aligned} \tag6 Ai,jabs??=(a) Exi???Wq??Wk?Exj????+(b) Exi???Wq??Wk?Uj???+(c) Ui??Wq??Wk?Exj????+(d) Ui??Wq??Wk?Uj???.?(6)
      公式(6)中,a与位置编码无关,b,c只包含单个token的位置编码,所以跟相对位置编码有关的只有d。
    • 如果在公式(6)中,d项没有 W q T W k W^T_qW_k WqT?Wk?, U i T U j U^T_iU_j UiT?Uj?是可以表示相对位置信息的。
      • 证明:
        如果: P E t = [ sin ? ( c 0 t ) cos ? ( c 0 t ) ? sin ? ( c d 2 ? 1 t ) cos ? ( c d 2 ? 1 t ) ] P E_{t}=\left[\begin{array}{c} \sin \left(c_{0} t\right) \\ \cos \left(c_{0} t\right) \\ \vdots \\ \sin \left(c_{\frac{d}{2}-1} t\right) \\ \cos \left(c_{\frac{d}{2}-1} t\right) \end{array}\right] PEt?=??????????sin(c0?t)cos(c0?t)?sin(c2d??1?t)cos(c2d??1?t)???????????
        则:
        P E t T P E t + k = ∑ j = 0 d 2 ? 1 [ sin ? ( c j t ) sin ? ( c j ( t + k ) ) + cos ? ( c j t ) cos ? ( c j ( t + k ) ) ] = ∑ j = 0 d 2 ? 1 cos ? ( c j ( t ? ( t + k ) ) ) = ∑ j = 0 d 2 ? 1 cos ? ( c j k ) \begin{aligned} P E_{t}^{T} P E_{t+k}=& \sum_{j=0}^{\frac{d}{2}-1}\left[\sin \left(c_{j} t\right) \sin \left(c_{j}(t+k)\right)\right.\\ &\left.\quad+\cos \left(c_{j} t\right) \cos \left(c_{j}(t+k)\right)\right] \\ =& \sum_{j=0}^{\frac{d}{2}-1} \cos \left(c_{j}(t-(t+k))\right) \\ =& \sum_{j=0}^{\frac{d}{2}-1} \cos \left(c_{j} k\right) \end{aligned} PEtT?PEt+k?===?j=02d??1?[sin(cj?t)sin(cj?(t+k))+cos(cj?t)cos(cj?(t+k))]j=02d??1?cos(cj?(t?(t+k)))j=02d??1?cos(cj?k)?
      • 图示如下:
        在这里插入图片描述

从图中可以看出,这种表示是能够表示位置信息的,但是却不能表示方向。
* 如果加上 W q T W k W^T_qW_k WqT?Wk? W q T W k W^T_qW_k WqT?Wk?随机初始化的话可以得到:
在这里插入图片描述
从图中,可以看出这种方式在模型训练初期是不能够很好的表示距离的,但是如果随着模型的训练,这种方式有可能会表示好的位置信息。但是,至少在模型训练的初期,模型并不能很好的学习位置信息,从而会增加模型训练的难度和时间,一定程度上,也会对位置信息学习不够完整。

再续

针对上面提到的位置编码该怎么优化?有哪些方法?参见系列文章《位置编码 - 领略位置编码神奇的风景 - 系列(2)》
在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:05:19  更:2021-08-29 09:07:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/1 12:38:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码