首页 > 其他分享 >深度学习笔记——常见的Transformer位置编码

深度学习笔记——常见的Transformer位置编码

时间:2024-11-27 19:01:13浏览次数:6  
标签:编码 Transformer text 位置 cos 笔记 pos theta sin

本文详细介绍3种常见的Transformer位置编码——正弦/余弦位置编码(sin/cos)、基于频率的二维位置编码(2D Frequency Embeddings)、旋转式位置编码(RoPE)

在这里插入图片描述


文章目录

Transformer中常见的编码方式

  • 自注意力机制(Self-Attention)本身不具备任何顺序或空间位置信息。
  • 为此,需要显式地将位置信息嵌入输入特征,以确保模型能够感知特征间的空间或时间关系。

正弦/余弦位置编码(Sinusoidal Positional Encoding)

在 Transformer 的原始论文(Vaswani et al., 2017)中提出的,最原始的位置编码。正弦/余弦位置编码也叫1D Frequency Embeddings,通过频率函数将每个位置嵌入到特征空间中。

公式:
P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i d ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{\frac{2i}{d}}}\right) PE(pos,2i)​=sin(10000d2i​pos​)
P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i d ) PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{\frac{2i}{d}}}\right) PE(pos,2i+1)​=cos(10000d2i​pos​)

  • p o s pos pos:表示输入序列的位置。
  • d d d:表示embedding维度。
  • 正弦和余弦的周期性特点可以让模型捕获相对位置信息。

说明:

  • 正弦 sin ⁡ \sin sin 被应用于所有偶数维(索引为 2 i 2i 2i);
  • 余弦 cos ⁡ \cos cos 被应用于所有奇数维(索引为 2 i + 1 2i+1 2i+1)。

这种设计的意义在于:

  1. 区分不同维度的位置信息
    • 对偶数维和奇数维分别使用不同的函数,可以让不同维度的位置信息具有不同的变化模式
    • 例如,偶数维的位置信息可能更注重某种语义,奇数维则可能补充另一种语义。
  2. 模型的平移不变性
    • 在一些任务中,特别是相对位置编码时,正弦和余弦函数的周期性可以帮助模型更容易地捕获相对距离信息。
  3. 消除对称性
    • 如果只用一种函数,比如全是 sin ⁡ \sin sin,可能导致偶数维和奇数维的输出具有对称性,降低信息的区分度

基于频率的二维位置编码(2D Frequency Embeddings)

主要针对Transformer处理二维数据(如图像)的情况。在 ViT(Vision Transformer)的标准实现中,将两个独立的 1D Frequency Embeddings 分别应用于图像的行(height)和列(width)方向,然后通过拼接(concat)或求和(add)来构造最终的 2D Frequency Embeddings

实现方式:两个 1D Frequency Embeddings 构成 2D Embeddings

给定图像的大小为 H × W H \times W H×W,编码维度为 D D D,这种 2D 编码的计算方式如下:

  1. 沿行(Height)方向生成 1D Frequency Embeddings
    对行索引 x ∈ [ 0 , H − 1 ] x \in [0, H-1] x∈[0,H−1],生成对应的正弦和余弦位置编码:
    P E x , 2 i = sin ⁡ ( x 1000 0 2 i D ) , P E x , 2 i + 1 = cos ⁡ ( x 1000 0 2 i D ) PE_{x, 2i} = \sin\left(\frac{x}{10000^{\frac{2i}{D}}}\right), \quad PE_{x, 2i+1} = \cos\left(\frac{x}{10000^{\frac{2i}{D}}}\right) PEx,2i​=sin(10000D2i​x​),PEx,2i+1​=cos(10000D2i​x​)

  2. 沿列(Width)方向生成 1D Frequency Embeddings
    对列索引 y ∈ [ 0 , W − 1 ] y \in [0, W-1] y∈[0,W−1],同样生成正弦和余弦位置编码:
    P E y , 2 i = sin ⁡ ( y 1000 0 2 i D ) , P E y , 2 i + 1 = cos ⁡ ( y 1000 0 2 i D ) PE_{y, 2i} = \sin\left(\frac{y}{10000^{\frac{2i}{D}}}\right), \quad PE_{y, 2i+1} = \cos\left(\frac{y}{10000^{\frac{2i}{D}}}\right) PEy,2i​=sin(10000D2i​y​),PEy,2i+1​=cos(10000D2i​y​)

  3. 最终组合:

    • 拼接:
      P E ( x , y ) = concat ( P E x , P E y ) PE_{(x, y)} = \text{concat}(PE_x, PE_y) PE(x,y)​=concat(PEx​,PEy​)
      最终维度为 (2D)
    • 求和:
      P E ( x , y ) = P E x + P E y PE_{(x, y)} = PE_x + PE_y PE(x,y)​=PEx​+PEy​
      最终维度为 (D)

说明:

  1. 分解二维结构:

    • 图像的二维空间本质上可以分解行和列的两个独立维度。因此,分别对行和列编码是一种有效的做法,既利用了图像的二维特性,又保持了实现的简单性。
  2. 保持 Transformer 的通用性:

    • Transformer 本质是基于序列操作的,而将二维图像划分为行和列的独立序列后,位置编码的计算方式可以复用 NLP 中的正/余弦编码
  3. 减少计算复杂度:

    • 相较于直接生成每个位置 ( x , y ) (x, y) (x,y)的二维正弦编码,这种方法的计算复杂度更低,同时效果相近。

旋转式位置编码(Rotary Position Embeddings, RoPE)

Rotary Position Embeddings (RoPE) 是一种基于旋转变换的位置编码方法,同时支持绝对位置相对位置的建模。

传统位置编码的局限

  1. 绝对位置编码(如正弦/余弦编码)
    • 提供固定的绝对位置信息。
    • 不能自然建模相对位置关系。
  2. 相对位置编码
    • 能够建模相邻元素间的相对距离。
    • 但实现复杂度较高,尤其在长序列任务中开销较大。

RoPE 的创新点
RoPE 提出了旋转式变换的思路,通过将位置信息直接嵌入到输入特征的投影空间,既能高效建模绝对位置,又能自然捕捉相对位置关系。

RoPE 的数学原理

输入特征与位置编码的表示

  1. 假设输入向量为 x ∈ R d \mathbf{x} \in \mathbb{R}^d x∈Rd,其中 d d d 是特征维度。
  2. 每个输入向量的维度分为偶数和奇数两部分,分别进行正弦和余弦编码:
    • PE i = sin ⁡ ( pos 1000 0 2 i / d ) \text{PE}_i = \sin\left(\frac{\text{pos}}{10000^{2i/d}}\right) PEi​=sin(100002i/dpos​)(偶数维度)。
    • PE i = cos ⁡ ( pos 1000 0 2 i / d ) \text{PE}_i = \cos\left(\frac{\text{pos}}{10000^{2i/d}}\right) PEi​=cos(100002i/dpos​)(奇数维度)。
    • pos \text{pos} pos 是输入的位置信息。

旋转变换

  • RoPE 的核心思想是对每个特征向量进行旋转操作,具体通过二维旋转矩阵实现:
    x rot = R ( θ ) ⋅ x , \mathbf{x}_{\text{rot}} = \mathbf{R}(\theta) \cdot \mathbf{x}, xrot​=R(θ)⋅x,
    其中:
    • R ( θ ) \mathbf{R}(\theta) R(θ) 是旋转矩阵,角度 θ \theta θ 与位置有关。

    • 旋转矩阵作用于偶数维度和奇数维度的输入特征,旋转变化如下:
      [ x even ′ x odd ′ ] = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] ⋅ [ x even x odd ] \begin{bmatrix} x_{\text{even}}' \\ x_{\text{odd}}' \end{bmatrix} = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} \cdot \begin{bmatrix} x_{\text{even}} \\ x_{\text{odd}} \end{bmatrix} [xeven′​xodd′​​]=[cos(θ)sin(θ)​−sin(θ)cos(θ)​]⋅[xeven​xodd​​]

      符号意义

      1. [ x even x odd ] \begin{bmatrix} x_{\text{even}} \\ x_{\text{odd}} \end{bmatrix} [xeven​xodd​​]:

        • 原始特征向量的偶数维度和奇数维度
        • 输入向量 x \mathbf{x} x 被分解为偶数索引部分 x even x_{\text{even}} xeven​ 和奇数索引部分 x odd x_{\text{odd}} xodd​。
          • 偶数维:例如,第 0、2、4… 维。
          • 奇数维:例如,第 1、3、5… 维。
      2. [ x even ′ x odd ′ ] \begin{bmatrix} x_{\text{even}}' \\ x_{\text{odd}}' \end{bmatrix} [xeven′​xodd′​​]:

        • 旋转后特征向量的偶数维度和奇数维度
        • 这是嵌入位置信息后的特征表示。
      3. [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} [cos(θ)sin(θ)​−sin(θ)cos(θ)​]:

        • 二维旋转矩阵,用于将特征向量的偶数维度和奇数维度进行旋转变换。
        • 旋转角度 θ \theta θ与位置(如时间步或空间坐标)相关。

相对位置的自然建模

  • 通过旋转变换,两个特征间的相对位置关系可以直接通过旋转角度差 ( Δ θ ) (\Delta \theta) (Δθ) 捕捉:
    Attention ( q , k ) = dot ( q rot , k rot ) . \text{Attention}(\mathbf{q}, \mathbf{k}) = \text{dot}(\mathbf{q}_{\text{rot}}, \mathbf{k}_{\text{rot}}). Attention(q,k)=dot(qrot​,krot​).
    • q rot \mathbf{q}_{\text{rot}} qrot​ 和 k rot \mathbf{k}_{\text{rot}} krot​ 是经过 RoPE 编码的查询(Query)和键(Key)向量。
    • 相对位置差的建模通过旋转后的内积自然实现。

RoPE 的实现步骤

1. 计算旋转角度

根据输入位置 pos \text{pos} pos 和维度 d d d 生成旋转角度。

公式
每个维度的旋转角度通过以下公式计算:
θ i = pos 1000 0 2 i / d , \theta_{i} = \frac{\text{pos}}{10000^{2i/d}}, θi​=100002i/dpos​,
其中:

  • pos \text{pos} pos:输入特征的位置索引(如序列中的时间步或图像的空间位置)。
  • d d d:特征向量的总维度。
  • i i i:当前特征维度的索引。

过程

  1. 分解频率因子

    • 为不同的维度 (i) 生成对应的频率因子:
      1 1000 0 2 i / d \frac{1}{10000^{2i/d}} 100002i/d1​
      其中 d d d 控制总维度范围内的频率分布:
      • 低维度的频率变化较慢(低频),适合建模全局信息
      • 高维度的频率变化较快(高频),适合捕捉局部细节
  2. 结合位置计算角度

    • 对于每个位置 pos \text{pos} pos,乘以频率因子以生成旋转角度:
      θ i = pos ⋅ 1 1000 0 2 i / d \theta_{i} = \text{pos} \cdot \frac{1}{10000^{2i/d}} θi​=pos⋅100002i/d1​
    • 不同位置的旋转角度反映了其空间或时间位置信息。

结果

  • 每个位置 pos \text{pos} pos 和每个维度 i i i 对应一个独特的旋转角度 θ i \theta_{i} θi​。
  • 输出是一个长度为 d d d 的旋转角度数组。

2. 构造旋转矩阵

旋转矩阵用于将偶数维和奇数维的特征进行二维旋转嵌入每对偶数维和奇数维被看作一个二维向量。

公式
二维旋转矩阵的形式为:
R ( θ ) = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] \mathbf{R}(\theta) = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} R(θ)=[cos(θ)sin(θ)​−sin(θ)cos(θ)​]
过程

  1. 匹配每个维度的角度

    • 根据上一步计算的旋转角度 θ i \theta_i θi​,生成每对偶数维和奇数维的旋转矩阵。
  2. 作用对象

    • 偶数维 even ( i ) \text{even}(i) even(i) 和奇数维 odd ( i + 1 ) \text{odd}(i+1) odd(i+1) 被看作一个二维向量:
      x even , x odd \mathbf{x}_{\text{even}}, \mathbf{x}_{\text{odd}} xeven​,xodd​
  3. 生成旋转变换

    • 使用 cos ⁡ ( θ i ) \cos(\theta_i) cos(θi​) 和 sin ⁡ ( θ i ) \sin(\theta_i) sin(θi​) 填充旋转矩阵。

3. 旋转变换

将旋转矩阵作用于特征向量的偶数维和奇数维,以嵌入位置信息。

公式
旋转后的特征向量表示为:
[ x even ′ x odd ′ ] = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) sin ⁡ ( θ ) cos ⁡ ( θ ) ] ⋅ [ x even x odd ] . \begin{bmatrix} x_{\text{even}}' \\ x_{\text{odd}}' \end{bmatrix} = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} \cdot \begin{bmatrix} x_{\text{even}} \\ x_{\text{odd}} \end{bmatrix}. [xeven′​xodd′​​]=[cos(θ)sin(θ)​−sin(θ)cos(θ)​]⋅[xeven​xodd​​].

过程

  1. 输入特征

    • 输入特征 x \mathbf{x} x 被分解为偶数维和奇数维两部分:
      x = [ x even , x odd ] \mathbf{x} = [x_{\text{even}}, x_{\text{odd}}] x=[xeven​,xodd​]
  2. 旋转变换

    • 对于每对偶数维和奇数维:
      x even ′ = x even ⋅ cos ⁡ ( θ ) − x odd ⋅ sin ⁡ ( θ ) , x_{\text{even}}' = x_{\text{even}} \cdot \cos(\theta) - x_{\text{odd}} \cdot \sin(\theta), xeven′​=xeven​⋅cos(θ)−xodd​⋅sin(θ),
      x odd ′ = x even ⋅ sin ⁡ ( θ ) + x odd ⋅ cos ⁡ ( θ ) . x_{\text{odd}}' = x_{\text{even}} \cdot \sin(\theta) + x_{\text{odd}} \cdot \cos(\theta). xodd′​=xeven​⋅sin(θ)+xodd​⋅cos(θ).
    • 旋转后的特征将位置信息嵌入到每个维度中。
  3. 重组特征

    • 将旋转后的偶数维和奇数维重新合并,得到嵌入了位置信息的特征向量。

4. 自注意力机制

使用旋转后的特征向量参与自注意力计算,在 Attention 的点积操作中显式建模 绝对位置相对位置信息

自注意力公式
自注意力的计算公式为:
Attention ( q , k ) = q ⋅ k \text{Attention}(\mathbf{q}, \mathbf{k}) = \mathbf{q} \cdot \mathbf{k} Attention(q,k)=q⋅k

  • q \mathbf{q} q:查询向量(Query)。
  • k \mathbf{k} k:键向量(Key)。

RoPE 的贡献

  1. 绝对位置信息

    • 旋转变换后的 q \mathbf{q} q 和 k \mathbf{k} k 包含绝对位置信息,使模型能够感知每个特征的位置。
  2. 相对位置信息

    • 点积中隐含了旋转角度差 Δ θ = θ 2 − θ 1 \Delta \theta = \theta_2 - \theta_1 Δθ=θ2​−θ1​:
      cos ⁡ ( Δ θ ) + sin ⁡ ( Δ θ ) , \cos(\Delta \theta) + \sin(\Delta \theta), cos(Δθ)+sin(Δθ),
      • Δ θ \Delta \theta Δθ 是两位置间的相对关系,直接体现在注意力值中。

RoPE 的优点

  1. 高效性

    • 不需要复杂的相对位置偏移矩阵或附加参数,直接通过旋转实现。
    • 适合长序列任务,计算复杂度低。
  2. 支持绝对与相对位置

    • 旋转式编码不仅能捕捉绝对位置,还能通过旋转角度差捕捉相对位置关系。
  3. 适配多模态任务

    • RoPE 能同时适用于文本、图像、视频等多模态场景的位置编码需求。
    • 在 FLUX.1 中,用于处理文本的序列关系和图像的空间关系。
  4. 自然的时空特性建模

    • 在视频任务中,可扩展为三维旋转式编码,处理时间维和空间维的关系。

应用场景

  1. 多模态任务

    • 在 FLUX.1 中,用于图像和文本模态的联合处理:
      • 文本位置被编码为序列信息。
      • 图像位置被编码为二维空间关系。
  2. 视频生成

    • 支持视频任务的时空建模,可将时间维引入位置编码。
  3. 长序列任务

    • 如文本生成、长文档理解中,RoPE 能显著提升相对位置的建模能力。

总结

旋转式位置编码(RoPE)是一种高效、灵活的位置编码方案:

  • 核心机制:通过二维旋转矩阵嵌入位置信息,既能建模绝对位置,又能自然捕捉相对位置。
  • 适用场景:从长序列任务到多模态场景,再到视频生成,RoPE 展现出强大的扩展性和适配能力。

历史文章

机器学习

机器学习笔记——损失函数、代价函数和KL散度
机器学习笔记——特征工程、正则化、强化学习
机器学习笔记——30种常见机器学习算法简要汇总
机器学习笔记——感知机、多层感知机(MLP)、支持向量机(SVM)
机器学习笔记——KNN(K-Nearest Neighbors,K 近邻算法)
机器学习笔记——朴素贝叶斯算法
机器学习笔记——决策树
机器学习笔记——集成学习、Bagging(随机森林)、Boosting(AdaBoost、GBDT、XGBoost、LightGBM)、Stacking
机器学习笔记——Boosting中常用算法(GBDT、XGBoost、LightGBM)迭代路径
机器学习笔记——聚类算法(Kmeans、GMM-使用EM优化)
机器学习笔记——降维

深度学习

深度学习笔记——优化算法、激活函数
深度学习——归一化、正则化
深度学习笔记——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总
深度学习笔记——卷积神经网络CNN
深度学习笔记——循环神经网络RNN、LSTM、GRU、Bi-RNN
深度学习笔记——Transformer

标签:编码,Transformer,text,位置,cos,笔记,pos,theta,sin
From: https://blog.csdn.net/haopinglianlian/article/details/144021458

相关文章

  • 注意力机制及Transformer概述
    1. \textbf{1.}1. 注意力机制1️⃣生物学中的注意力提示类型含义基础非自主提示(......
  • L+B 编码器 GEL 208Y010
    L+B编码器GEL208Y010是一种增量式编码器,通常用于工业自动化和机械设备中,用于测量旋转或线性位移。其具体使用方法和应用场景如下:使用方法安装:将编码器安装在需要测量位移或旋转的设备上,确保其固定牢固,避免在运行过程中产生位移。接线:根据编码器的接线图,正确连接电源和信......
  • Harmony开发笔记3
    预览Harmony开发和Compose类似,在组件上增加@Preview后则可以在预览面板上看到UI效果。组件预览我们新建一个组件,该组件仅展示一个文本内容。@ComponentexportstructHelloComponent{@Statemessage:string="ThisiscomponentText"build(){Row(){......
  • OS开发笔记(1)——硬盘引导的尝试
    看前提醒:这一系列笔记完全是按照我的思考顺序写的,中间可能会绕弯路定义为了避免概念的混淆,我先在这里作一下(仅适用于本文的)名词的解释:引导程序/boot程序:特指磁盘MBR或者VBR扇区中存放的程序加载器/loader程序:指由引导程序加载执行的程序,用于加载操作系统的内核引导:指从BIO......
  • 基础算法——前缀和、差分 学习笔记
    前缀和及差分前缀和一维前缀和定义一维前缀和,就是数组前若干项的和。我们对于前缀和数组的定义非常广泛,例如定义\(S(x)\)表示数组\(A(x)\)的前缀和,定义\(A(l,r)\)表示\(A(l)+A(l+1)+\dots+A(r)\),\(S(x)=A(0,x)\);\(S(x)=A(1,x)\);\(S(x)=A(1,x-1)\);\(S(x)......
  • 基础算法——异或哈希算法 学习笔记
    异或哈希算法思想我们关注一个区间内出现了什么数字。因此,我们对每一个数字赋一个随机权值,然后对这个权值进行一系列操作,例如前缀\(\operatorname{xor}\)等。对于两个序列,通过Hash的方式判断即可。同时,也可用于满足某些条件的子序列数量的问题。我们可以通过Hash的方......
  • PAWNYABLE kernel stack overflow 笔记
    PAWNYABLE中的第一节stackoverflow的学习笔记。(觉得这个教程好细致,而且封面好可爱...这一节讨论内核的栈溢出,分成了不同防护程度的情况来讨论不同的情况下面,攻击应该如何进行。基本的思路在module_write里面,copy_from_user的大小是用户控制,大小没有检查的。可以在这里......
  • transformer口语化解析
    Transformer是一种基于自注意力机制的深度神经网络模型,常用于处理序列到序列的任务,例如机器翻译、文本摘要、问答系统等。它由Encoder和Decoder两个主要部分组成,每个部分包含多个相同的Block。Transformer结构图Transformer结构importtorchimporttorch.nn......
  • HarmonyOS开发笔记2
    应用基本信息我们先来看下harmony的工程结构中的文件主要涉及以下几个目录AppScope>app.json5:应用的全局配置信息,详见app.json5配置文件。entry:HarmonyOS工程模块,编译构建生成一个HAP包。src>main>ets:用于存放ArkTS源码。src>main>ets>entryability:应用/服务......
  • 51单片机学习笔记(零基础版)
    引言本笔记跟随B站经典课程江科大51单片机入门教程,对课程内容进行了一些细化,兼顾零基础的同学,并且按照理论结合实践的学习理念,学习就是一个发现问题,解决问题,获得技能的一个过程。明确需求:成为一名嵌入式开发工程师,并且从这个课程中学习到在嵌入式开发的工作中需要用的知识以......