🌺历史文章列表🌺
- 深度学习——优化算法、激活函数、归一化、正则化
- 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸
- 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总
- 万字长文解读深度学习——卷积神经网络CNN
- 万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN
- 万字长文解读深度学习——Transformer
- 万字长文解读深度学习——GPT、BERT、T5
- 万字长文解读深度学习——ViT、ViLT、DiT
- 万字长文解读深度学习——CLIP、BLIP
- 万字长文解读深度学习——AE、VAE
- 万字长文解读深度学习——GAN
- 万字长文解读深度学习——训练、优化、部署细节
文章目录
- 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)。
这种设计的意义在于:
- 区分不同维度的位置信息:
- 对偶数维和奇数维分别使用不同的函数,可以让不同维度的位置信息具有不同的变化模式。
- 例如,偶数维的位置信息可能更注重某种语义,奇数维则可能补充另一种语义。
- 模型的平移不变性:
- 在一些任务中,特别是相对位置编码时,正弦和余弦函数的周期性可以帮助模型更容易地捕获相对距离信息。
- 消除对称性:
- 如果只用一种函数,比如全是 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 编码的计算方式如下:
-
沿行(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(10000D2ix),PEx,2i+1=cos(10000D2ix) -
沿列(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(10000D2iy),PEy,2i+1=cos(10000D2iy) -
最终组合:
- 拼接:
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)。
- 拼接:
说明:
-
分解二维结构:
- 图像的二维空间本质上可以分解为行和列的两个独立维度。因此,分别对行和列编码是一种有效的做法,既利用了图像的二维特性,又保持了实现的简单性。
-
保持 Transformer 的通用性:
- Transformer 本质是基于序列操作的,而将二维图像划分为行和列的独立序列后,位置编码的计算方式可以复用 NLP 中的正/余弦编码。
-
减少计算复杂度:
- 相较于直接生成每个位置 ( x , y ) (x, y) (x,y)的二维正弦编码,这种方法的计算复杂度更低,同时效果相近。
旋转式位置编码(Rotary Position Embeddings, RoPE)
Rotary Position Embeddings (RoPE) 是一种基于旋转变换的位置编码方法,同时支持绝对位置和相对位置的建模。
传统位置编码的局限
- 绝对位置编码(如正弦/余弦编码):
- 提供固定的绝对位置信息。
- 不能自然建模相对位置关系。
- 相对位置编码:
- 能够建模相邻元素间的相对距离。
- 但实现复杂度较高,尤其在长序列任务中开销较大。
RoPE 的创新点
RoPE 提出了旋转式变换的思路,通过将位置信息直接嵌入到输入特征的投影空间,既能高效建模绝对位置,又能自然捕捉相对位置关系。
RoPE 的数学原理
输入特征与位置编码的表示
- 假设输入向量为 x ∈ R d \mathbf{x} \in \mathbb{R}^d x∈Rd,其中 d d d 是特征维度。
- 每个输入向量的维度分为偶数和奇数两部分,分别进行正弦和余弦编码:
- 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(θ)]⋅[xevenxodd]符号意义
-
[ 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… 维。
-
[ x even ′ x odd ′ ] \begin{bmatrix} x_{\text{even}}' \\ x_{\text{odd}}' \end{bmatrix} [xeven′xodd′]:
- 旋转后特征向量的偶数维度和奇数维度。
- 这是嵌入位置信息后的特征表示。
-
[ 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:当前特征维度的索引。
过程
-
分解频率因子:
- 为不同的维度 (i) 生成对应的频率因子:
1 1000 0 2 i / d \frac{1}{10000^{2i/d}} 100002i/d1
其中 d d d 控制总维度范围内的频率分布:- 较低维度的频率变化较慢(低频),适合建模全局信息。
- 较高维度的频率变化较快(高频),适合捕捉局部细节。
- 为不同的维度 (i) 生成对应的频率因子:
-
结合位置计算角度:
- 对于每个位置 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,乘以频率因子以生成旋转角度:
结果
- 每个位置 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(θ)]
过程
-
匹配每个维度的角度:
- 根据上一步计算的旋转角度 θ i \theta_i θi,生成每对偶数维和奇数维的旋转矩阵。
-
作用对象:
- 偶数维 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
- 偶数维 even ( i ) \text{even}(i) even(i) 和奇数维 odd ( i + 1 ) \text{odd}(i+1) odd(i+1) 被看作一个二维向量:
-
生成旋转变换:
- 使用 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(θ)]⋅[xevenxodd].
过程
-
输入特征:
- 输入特征 x \mathbf{x} x 被分解为偶数维和奇数维两部分:
x = [ x even , x odd ] \mathbf{x} = [x_{\text{even}}, x_{\text{odd}}] x=[xeven,xodd]
- 输入特征 x \mathbf{x} x 被分解为偶数维和奇数维两部分:
-
旋转变换:
- 对于每对偶数维和奇数维:
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(θ). - 旋转后的特征将位置信息嵌入到每个维度中。
- 对于每对偶数维和奇数维:
-
重组特征:
- 将旋转后的偶数维和奇数维重新合并,得到嵌入了位置信息的特征向量。
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 的贡献
-
绝对位置信息:
- 旋转变换后的 q \mathbf{q} q 和 k \mathbf{k} k 包含绝对位置信息,使模型能够感知每个特征的位置。
-
相对位置信息:
- 点积中隐含了旋转角度差 Δ θ = θ 2 − θ 1 \Delta \theta = \theta_2 - \theta_1 Δθ=θ2−θ1:
cos ( Δ θ ) + sin ( Δ θ ) , \cos(\Delta \theta) + \sin(\Delta \theta), cos(Δθ)+sin(Δθ),- Δ θ \Delta \theta Δθ 是两位置间的相对关系,直接体现在注意力值中。
- 点积中隐含了旋转角度差 Δ θ = θ 2 − θ 1 \Delta \theta = \theta_2 - \theta_1 Δθ=θ2−θ1:
RoPE 的优点
-
高效性:
- 不需要复杂的相对位置偏移矩阵或附加参数,直接通过旋转实现。
- 适合长序列任务,计算复杂度低。
-
支持绝对与相对位置:
- 旋转式编码不仅能捕捉绝对位置,还能通过旋转角度差捕捉相对位置关系。
-
适配多模态任务:
- RoPE 能同时适用于文本、图像、视频等多模态场景的位置编码需求。
- 在 FLUX.1 中,用于处理文本的序列关系和图像的空间关系。
-
自然的时空特性建模:
- 在视频任务中,可扩展为三维旋转式编码,处理时间维和空间维的关系。
应用场景
-
多模态任务:
- 在 FLUX.1 中,用于图像和文本模态的联合处理:
- 文本位置被编码为序列信息。
- 图像位置被编码为二维空间关系。
- 在 FLUX.1 中,用于图像和文本模态的联合处理:
-
视频生成:
- 支持视频任务的时空建模,可将时间维引入位置编码。
-
长序列任务:
- 如文本生成、长文档理解中,RoPE 能显著提升相对位置的建模能力。
总结
旋转式位置编码(RoPE)是一种高效、灵活的位置编码方案:
- 核心机制:通过二维旋转矩阵嵌入位置信息,既能建模绝对位置,又能自然捕捉相对位置。
- 适用场景:从长序列任务到多模态场景,再到视频生成,RoPE 展现出强大的扩展性和适配能力。