深度学习——3种常见的Transformer位置编码【sin/cos、基于频率的二维位置编码(2D Frequency Embeddings)、RoPE】

embedded/2024/11/27 0:57:07/

🌺历史文章列表🌺

  1. 深度学习——优化算法、激活函数、归一化、正则化
  2. 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸
  3. 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总
  4. 万字长文解读深度学习——卷积神经网络CNN
  5. 万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN
  6. 万字长文解读深度学习——Transformer
  7. 万字长文解读深度学习——GPT、BERT、T5
  8. 万字长文解读深度学习——ViT、ViLT、DiT
  9. 万字长文解读深度学习——CLIP、BLIP
  10. 万字长文解读深度学习——AE、VAE
  11. 万字长文解读深度学习——GAN
  12. 万字长文解读深度学习——训练、优化、部署细节

文章目录

  • Transformer中常见的编码方式
    • 正弦/余弦位置编码(Sinusoidal Positional Encoding)
    • 基于频率的二维位置编码(2D Frequency Embeddings)
    • 旋转式位置编码(Rotary Position Embeddings, RoPE)
      • RoPE 的数学原理
      • RoPE 的实现步骤
        • 1. 计算旋转角度
        • 2. 构造旋转矩阵
        • 3. 旋转变换
        • 4. 自注意力机制
      • 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(10000d2ipos)
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(10000d2ipos)

  • 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,H1],生成对应的正弦和余弦位置编码
    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(10000D2ix),PEx,2i+1=cos(10000D2ix)

  2. 沿列(Width)方向生成 1D Frequency Embeddings
    对列索引 y ∈ [ 0 , W − 1 ] y \in [0, W-1] y[0,W1],同样生成正弦和余弦位置编码
    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(10000D2iy),PEy,2i+1=cos(10000D2iy)

  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 xRd,其中 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} [xevenxodd]=[cos(θ)sin(θ)sin(θ)cos(θ)][xevenxodd]

      符号意义

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

        • 原始特征向量的偶数维度和奇数维度
        • 输入向量 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} [xevenxodd]:

        • 旋转后特征向量的偶数维度和奇数维度
        • 这是嵌入位置信息后的特征表示。
      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=pos100002i/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}. [xevenxodd]=[cos(θ)sin(θ)sin(θ)cos(θ)][xevenxodd].

过程

  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=xevencos(θ)xoddsin(θ),
      x odd ′ = x even ⋅ sin ⁡ ( θ ) + x odd ⋅ cos ⁡ ( θ ) . x_{\text{odd}}' = x_{\text{even}} \cdot \sin(\theta) + x_{\text{odd}} \cdot \cos(\theta). xodd=xevensin(θ)+xoddcos(θ).
    • 旋转后的特征将位置信息嵌入到每个维度中。
  3. 重组特征

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

4. 自注意力机制

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

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

  • 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 展现出强大的扩展性和适配能力。

http://www.ppmy.cn/embedded/140770.html

相关文章

基于 DRNN 神经网络整定的 PID 解耦控制

1. 基本原理 DRNN(Dynamic Recurrent Neural Network, 动态递归神经网络)是一种带有时间反馈的神经网络,能够建模系统的动态特性,适用于非线性、多变量、时变系统的控制。结合 PID 解耦控制,利用 DRNN 进行动态建模和…

5.5 W5500 TCP服务端与客户端

文章目录 1、TCP介绍2、W5500简介2.1 关键函数socketlistensendgetSn_RX_RSRrecv自动心跳包检测getSn_SR 1、TCP介绍 TCP 服务端: 创建套接字[socket]:服务器首先创建一个套接字,这是网络通信的端点。绑定套接字[bind]:服务器将…

python VS c++

一、语法特点 Python: 语法简洁、优雅,代码可读性极强,采用缩进来表示代码块,摒弃了像 C 那样使用大括号的传统方式,使得代码看上去十分清晰简洁。例如: ​ if 5 > 3:print("5大于3") elif 5 …

Python人工智能项目报告

一、实践概述 1、实践计划和目的 在现代社会,计算机技术已成为支撑社会发展的核心力量,渗透到生活的各个领域,应关注人类福祉,确保自己的工作成果能够造福社会,同时维护安全、健康的自然环境,设计出具有包…

『VUE』34. 异步组件(详细图文注释)

目录 加载速度的优化示例代码总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 加载速度的优化 实际项目中你可能会有几十个组件,如果一开始就加载了全部组件(哪怕其中有些组件你暂时用不到)这无疑大大增加了响应时间,用户体验…

网络安全、Web安全、渗透测试之笔经面经总结(一)

本篇文章总结涉及以下几个方面: 对称加密非对称加密? 什么是同源策略? cookie存在哪里?可以打开吗 xss如何盗取cookie? tcp、udp的区别及tcp三次握手,syn攻击? 证书要考哪些? …

@tanstack/vue-query使用手册

1. 搭建 a. 安装 npm i @tanstack/vue-query b. 初始化 import { VueQueryPlugin } from @tanstack/vue-queryapp.use(VueQueryPlugin) 2. 基本使用 a. 使用 useQuery 获取数据 import { useQuery } from @tanstack/vue-query;const { data, error, isLoading, refetch …

WPF中如何让Textbox显示为一条直线

由于Textbox直接使用是一条直线 设置如下代码 可以让Textbox变为直线输入 <Style TargetType"TextBox"x:Key"UsernameTextBoxStyle"><Setter Property"Template"><Setter.Value><ControlTemplate TargetType"{x:Typ…