当前位置: 首页 > news >正文

旋转位置编码(ROPE)详解:从Transformer到现代前沿

旋转位置编码(ROPE)详解:从Transformer到现代前沿

标签:NLP, Transformer, 位置编码, ROPE, 深度学习, 机器学习

摘要:本文详细介绍了旋转位置编码(ROPE)在Transformer模型中的应用,包括其数学原理、代码实现以及与传统位置编码的对比。ROPE通过旋转嵌入向量来编码位置信息,能够自然捕捉相对位置关系,特别适用于长序列任务。文中提供了ROPE的PyTorch实现和使用示例,旨在帮助读者深入理解并应用这一先进技术。

引言

在自然语言处理(NLP)领域,Transformer模型因其强大的并行计算能力和对长距离依赖的捕捉而成为主流。然而,Transformer中的自注意力机制(Self-Attention)天生无序,无法感知输入序列中词语的相对位置。为了解决这一问题,研究者们提出了多种位置编码(Positional Encoding)方案,其中旋转位置编码(Rotary Position Embedding, ROPE)凭借其独特的旋转机制和在长序列任务中的优异表现,成为近年来备受关注的技术。

本文将从基础概念出发,逐步深入ROPE的数学原理、实现细节及其在Transformer模型中的应用,旨在为读者提供一篇最详细的中文博客。无论您是NLP初学者还是资深研究者,本文都将帮助您全面理解ROPE的精髓。我们将涵盖从简单概念到复杂结论的介绍,包括数学推导和代码实现。


1. 为什么需要位置编码?

在介绍ROPE之前,我们首先需要理解为什么Transformer模型需要位置编码。

1.1 Transformer的自注意力机制

Transformer模型的核心是自注意力机制,它通过计算输入序列中每个词与其他词的注意力权重,来捕捉词与词之间的关系。自注意力机制的计算公式如下:

Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V

其中:

  • ( Q Q Q):查询(Query)矩阵
  • ( K K K):键(Key)矩阵
  • ( V V V):值(Value)矩阵
  • ( d k d_k dk):键向量的维度

关键点:自注意力机制是无序的,即对输入序列的位置信息不敏感。这意味着,如果我们将输入序列中的词语打乱顺序,自注意力机制的输出不会改变。这在NLP任务中是致命的,因为词语的顺序对语义至关重要。例如,“我喜欢你”和“你喜欢我”在自注意力机制中无法区分。

1.2 传统的位置编码方法

为了弥补这一缺陷,Vaswani等人在2017年的原始Transformer论文《Attention is All You Need》中提出了正弦/余弦位置编码(Sinusoidal Positional Encoding)。这种方法为每个位置生成一个固定的编码向量,并将其到词嵌入向量上,以提供位置信息。

正弦/余弦位置编码的公式

P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i / d ) , P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i / d ) PE(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d}}\right), \quad PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d}}\right) PE(pos,2i)=sin(100002i/dpos),PE(pos,2i+1)=cos(100002i/dpos)

其中:

  • ( p o s pos pos):词在序列中的位置
  • ( i i i):嵌入向量的维度索引
  • ( d d d):嵌入向量的总维度

工作原理

  • 通过不同频率的正弦和余弦函数,为每个位置生成独特的编码。
  • 将 ( P E PE PE ) 加到词嵌入向量 ( x \mathbf{x} x ) 上:( x ′ = x + P E \mathbf{x}' = \mathbf{x} + PE x=x+PE )。

局限性

  1. 绝对位置依赖:正弦/余弦位置编码主要捕捉绝对位置信息,难以直接反映词与词之间的相对位置关系。
  2. 长序列表现欠佳:在处理超长序列时,位置编码的频率设计可能不适应,导致性能下降。
  3. 静态编码:位置编码是预先计算好的,无法动态适应不同序列长度。

为了克服这些局限,研究者们探索了多种改进方案,其中ROPE作为一种创新的位置编码方法,凭借其旋转机制和对相对位置的自然捕捉,逐渐成为Transformer模型中的首选技术。


2. 旋转位置编码(ROPE)简介

ROPE(Rotary Position Embedding)最早由Su等人在2021年的论文《RoFormer: Enhanced Transformer with Rotary Position Embedding》中提出。它与传统的加性位置编码不同,通过旋转嵌入向量来编码位置信息,具体是将位置信息融入到自注意力机制的查询(Query)和键(Key)向量中。

2.1 ROPE的核心思想

ROPE的核心思想是:通过旋转矩阵对嵌入向量进行旋转,使得旋转后的向量在计算点积时,能够自然地反映出词与词之间的相对位置关系。

具体来说,ROPE将嵌入向量视为复数空间中的向量,并通过旋转矩阵对这些向量进行旋转。旋转的角度与词在序列中的位置成正比,从而将位置信息编码到向量的方向中。

独特优势:ROPE不仅能编码绝对位置,还能自然捕捉相对位置关系。例如,两个词之间的注意力得分会随着它们在序列中的相对距离而变化,这在处理长距离依赖时尤为重要。


3. ROPE的数学原理

要深入理解ROPE,我们需要从数学上推导其工作机制。

3.1 旋转矩阵与复数表示

ROPE的关键在于使用旋转矩阵来编码位置信息。首先,我们将嵌入向量的每一对维度(例如,第0和1维、第2和3维等)视为一个复数。假设嵌入维度 ( d d d) 为偶数,我们可以将嵌入向量 ( x ∈ R d \mathbf{x} \in \mathbb{R}^d xRd ) 分成 ( d / 2 d/2 d/2 ) 个复数对。

例如,对于 ( d = 4 d = 4 d=4 ),嵌入向量 ( x = [ x 0 , x 1 , x 2 , x 3 ] \mathbf{x} = [x_0, x_1, x_2, x_3] x=[x0,x1,x2,x3] ) 可以表示为两个复数:

  • ( x 0 + x 1 i x_0 + x_1 i x0+x1i )
  • ( x 2 + x 3 i x_2 + x_3 i x2+x3i )

在复数空间中,旋转一个复数 ( z = a + b i z = a + b i z=a+bi ) 可以通过乘以 ( e i θ e^{i \theta} eiθ ) 实现:

z ′ = z ⋅ e i θ = ( a + b i ) ( cos ⁡ θ + i sin ⁡ θ ) z' = z \cdot e^{i \theta} = (a + b i)(\cos \theta + i \sin \theta) z=zeiθ=(a+bi)(cosθ+isinθ)

展开后:

z ′ = ( a cos ⁡ θ − b sin ⁡ θ ) + i ( a sin ⁡ θ + b cos ⁡ θ ) z' = (a \cos \theta - b \sin \theta) + i (a \sin \theta + b \cos \theta) z=(acosθbsinθ)+i(asinθ+bcosθ)

这等价于对向量 ( [ a , b ] [a, b] [a,b] ) 应用旋转矩阵:

[ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] [ a b ] = [ a cos ⁡ θ − b sin ⁡ θ a sin ⁡ θ + b cos ⁡ θ ] \begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} \begin{bmatrix} a \\ b\end{bmatrix}= \begin{bmatrix} a \cos \theta - b \sin \theta \\ a \sin \theta + b \cos \theta \end{bmatrix} [cosθsinθsinθcosθ][ab]=[acosθbsinθasinθ+bcosθ]

因此,对于每个复数对(即每两个维度),我们可以通过旋转矩阵来编码位置信息。

3.2 ROPE的旋转角度设计

在ROPE中,旋转角度 ( θ \theta θ ) 由词的位置 ( p p p ) 和预定义的频率决定。具体地,对于第 ( k k k ) 个复数对(对应第 ( 2 k 2k 2k ) 和 ( 2 k + 1 2k+1 2k+1 ) 维),旋转角度为:

θ k = p ⋅ ω k \theta_k = p \cdot \omega_k θk=pωk

其中,频率 ( ω k \omega_k ωk ) 定义为:

ω k = 1 1000 0 2 k / d , k = 0 , 1 , … , d / 2 − 1 \omega_k = \frac{1}{10000^{2k / d}}, \quad k = 0, 1, \dots, d/2 - 1 ωk=100002k/d1,k=0,1,,d/21

注意:这里的频率设计与正弦/余弦位置编码中的频率类似,但ROPE将其用于旋转角度,而不是直接加到嵌入向量上。

3.3 ROPE的旋转公式

对于位置 ( p p p ) 处的嵌入向量 ( x ∈ R d \mathbf{x} \in \mathbb{R}^d xRd ),ROPE通过以下方式旋转它:

x rot = [ x 0 cos ⁡ θ 0 − x 1 sin ⁡ θ 0 x 0 sin ⁡ θ 0 + x 1 cos ⁡ θ 0 x 2 cos ⁡ θ 1 − x 3 sin ⁡ θ 1 x 2 sin ⁡ θ 1 + x 3 cos ⁡ θ 1 ⋮ x d − 2 cos ⁡ θ d / 2 − 1 − x d − 1 sin ⁡ θ d / 2 − 1 x d − 2 sin ⁡ θ d / 2 − 1 + x d − 1 cos ⁡ θ d / 2 − 1 ] \mathbf{x}_{\text{rot}} = \begin{bmatrix} x_0 \cos \theta_0 - x_1 \sin \theta_0 \\ x_0 \sin \theta_0 + x_1 \cos \theta_0 \\ x_2 \cos \theta_1 - x_3 \sin \theta_1 \\ x_2 \sin \theta_1 + x_3 \cos \theta_1 \\ \vdots \\ x_{d-2} \cos \theta_{d/2-1} - x_{d-1} \sin \theta_{d/2-1} \\ x_{d-2} \sin \theta_{d/2-1} + x_{d-1} \cos \theta_{d/2-1} \end{bmatrix} xrot= x0cosθ0x1sinθ0x0sinθ0+x1cosθ0x2cosθ1x3sinθ1x2sinθ1+x3cosθ1xd2cosθd/21xd1sinθd/21xd2sinθd/21+xd1cosθd/21

简言之,ROPE对嵌入向量的每一对维度应用一个旋转矩阵,旋转角度由位置 ( p p p ) 和频率 ( ω k \omega_k ωk ) 决定。

3.4 ROPE在自注意力中的应用

在Transformer的自注意力机制中,ROPE被应用于查询(Query)和键(Key)向量。具体地,对于序列中的每个位置 ( i i i ),我们旋转其查询向量 ( q i \mathbf{q}_i qi ) 和键向量 ( k i \mathbf{k}_i ki ):

q i rot = R ( p i ) q i , k i rot = R ( p i ) k i \mathbf{q}_i^{\text{rot}} = R(p_i) \mathbf{q}_i, \quad \mathbf{k}_i^{\text{rot}} = R(p_i) \mathbf{k}_i qirot=R(pi)qi,kirot=R(pi)ki

其中,( R ( p i ) R(p_i) R(pi) ) 是位置 ( p i p_i pi ) 对应的旋转矩阵。

然后,注意力得分计算为:

score i j = q i rot ⋅ k j rot d k \text{score}_{ij} = \frac{\mathbf{q}_i^{\text{rot}} \cdot \mathbf{k}_j^{\text{rot}}}{\sqrt{d_k}} scoreij=dk qirotkjrot

关键洞察:由于旋转矩阵的性质,( q i rot ⋅ k j rot \mathbf{q}_i^{\text{rot}} \cdot \mathbf{k}_j^{\text{rot}} qirotkjrot ) 可以表示为原始向量 ( q i \mathbf{q}_i qi ) 和 ( k j \mathbf{k}_j kj ) 的点积,乘以一个与相对位置 ( p i − p j p_i - p_j pipj ) 相关的旋转项。这使得注意力得分自然地依赖于词与词之间的相对位置。


4. ROPE的相对位置编码特性

ROPE的一个显著优势是它能够自然地捕捉相对位置信息。让我们通过数学推导来理解这一点。

4.1 旋转后的点积

考虑两个位置 ( m m m ) 和 ( n n n ),对应的旋转查询和键向量为:

q m rot = R ( m ) q m , k n rot = R ( n ) k n \mathbf{q}_m^{\text{rot}} = R(m) \mathbf{q}_m, \quad \mathbf{k}_n^{\text{rot}} = R(n) \mathbf{k}_n qmrot=R(m)qm,knrot=R(n)kn

它们的点积为:

q m rot ⋅ k n rot = ( R ( m ) q m ) T ( R ( n ) k n ) = q m T R ( m ) T R ( n ) k n \mathbf{q}_m^{\text{rot}} \cdot \mathbf{k}_n^{\text{rot}} = (R(m) \mathbf{q}_m)^T (R(n) \mathbf{k}_n) = \mathbf{q}_m^T R(m)^T R(n) \mathbf{k}_n qmrotknrot=(R(m)qm)T(R(n)kn)=qmTR(m)TR(n)kn

由于旋转矩阵 ( R ( θ ) R(\theta) R(θ) ) 是正交矩阵,满足 ( R ( θ ) T = R ( − θ ) R(\theta)^T = R(-\theta) R(θ)T=R(θ) ),因此:

R ( m ) T R ( n ) = R ( − m ) R ( n ) = R ( n − m ) R(m)^T R(n) = R(-m) R(n) = R(n - m) R(m)TR(n)=R(m)R(n)=R(nm)

(后文有推导过程。)

所以:

q m rot ⋅ k n rot = q m T R ( n − m ) k n \mathbf{q}_m^{\text{rot}} \cdot \mathbf{k}_n^{\text{rot}} = \mathbf{q}_m^T R(n - m) \mathbf{k}_n qmrotknrot=qmTR(nm)kn

这表明,旋转后的点积等价于将键向量 ( k n \mathbf{k}_n kn ) 旋转一个与相对位置 ( n − m n - m nm ) 相关的角度后,再与查询向量 ( q m \mathbf{q}_m qm ) 做点积。

4.2 相对位置的自然捕捉

上述推导显示,注意力得分 ( q m rot ⋅ k n rot \mathbf{q}_m^{\text{rot}} \cdot \mathbf{k}_n^{\text{rot}} qmrotknrot ) 直接依赖于相对位置 ( n − m n - m nm ),而不是绝对位置 ( m m m ) 和 ( n n n )。这使得ROPE在处理序列任务时,能够更自然地捕捉词与词之间的相对位置关系,尤其是在长序列中,相对位置信息比绝对位置信息更为重要。

简单示例
假设 ( d = 2 d = 2 d=2 ),位置 ( m = 0 m = 0 m=0 ),( n = 1 n = 1 n=1 ),嵌入向量 ( q 0 = [ 1 , 0 ] \mathbf{q}_0 = [1, 0] q0=[1,0] ),( k 1 = [ 0 , 1 ] \mathbf{k}_1 = [0, 1] k1=[0,1] ),频率 ( ω 0 = 1 \omega_0 = 1 ω0=1 )。那么:

  • ( θ 0 = 0 ⋅ 1 = 0 \theta_0 = 0 \cdot 1 = 0 θ0=01=0 ),( R ( 0 ) = [ 1 0 0 1 ] R(0) = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} R(0)=[1001] )
  • ( θ 0 = 1 ⋅ 1 = 1 \theta_0 = 1 \cdot 1 = 1 θ0=11=1 ),( R ( 1 ) = [ cos ⁡ 1 − sin ⁡ 1 sin ⁡ 1 cos ⁡ 1 ] R(1) = \begin{bmatrix} \cos 1 & -\sin 1 \\ \sin 1 & \cos 1 \end{bmatrix} R(1)=[cos1sin1sin1cos1] )
  • ( q 0 rot = [ 1 , 0 ] \mathbf{q}_0^{\text{rot}} = [1, 0] q0rot=[1,0] )
  • ( k 1 rot = [ cos ⁡ 1 , sin ⁡ 1 ] \mathbf{k}_1^{\text{rot}} = [\cos 1, \sin 1] k1rot=[cos1,sin1] )
  • 点积:( q 0 rot ⋅ k 1 rot = 1 ⋅ cos ⁡ 1 + 0 ⋅ sin ⁡ 1 = cos ⁡ 1 \mathbf{q}_0^{\text{rot}} \cdot \mathbf{k}_1^{\text{rot}} = 1 \cdot \cos 1 + 0 \cdot \sin 1 = \cos 1 q0rotk1rot=1cos1+0sin1=cos1 )

如果位置变为 ( m = 1 m = 1 m=1 ),( n = 2 n = 2 n=2 ),相对位置仍为1,点积结果依然依赖 ( cos ⁡ 1 \cos 1 cos1 ) 和 ( sin ⁡ 1 \sin 1 sin1 ),体现出相对位置特性。


5. ROPE的代码实现

为了帮助读者更好地理解ROPE的实现细节,下面提供一个使用PyTorch的ROPE实现。

5.1 ROPE类定义

import torch
import torch.nn as nnclass RotaryEmbedding(nn.Module):def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None):super(RotaryEmbedding, self).__init__()self.dim = dimself.max_position_embeddings = max_position_embeddingsself.base = base# 计算频率inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim))self.register_buffer("inv_freq", inv_freq)def forward(self, x, seq_len=None):if seq_len is None:seq_len = x.size(-2)# 生成位置索引position_ids = torch.arange(0, seq_len, dtype=torch.float, device=x.device).unsqueeze(-1)# 计算旋转角度angles = position_ids * self.inv_freq# 计算sin和cossin = torch.sin(angles)cos = torch.cos(angles)# 扩展到与x相同的维度sin = sin.unsqueeze(0).repeat(x.size(0), 1, 1)cos = cos.unsqueeze(0).repeat(x.size(0), 1, 1)# 应用旋转x_rot = x.clone()for i in range(0, self.dim, 2):x_rot[..., i] = x[..., i] * cos[..., i // 2] - x[..., i + 1] * sin[..., i // 2]x_rot[..., i + 1] = x[..., i] * sin[..., i // 2] + x[..., i + 1] * cos[..., i // 2]return x_rot

代码说明

  • dim:嵌入维度,必须为偶数。
  • max_position_embeddings:支持的最大序列长度。
  • base:频率计算中的基数,默认值为10000。
  • inv_freq:预计算的频率,用于生成旋转角度。
  • forward:对输入张量 ( x x x ) 应用旋转,返回旋转后的张量。

5.2 使用示例

假设我们有一个批次大小为1、序列长度为3、嵌入维度为4的输入:

dim = 4
seq_len = 3
x = torch.randn(1, seq_len, dim)  # 形状: [batch_size, seq_len, dim]
rotary_emb = RotaryEmbedding(dim)
x_rot = rotary_emb(x)
print("Rotated embeddings:", x_rot)

在Transformer模型中,我们通常在自注意力层的查询和键向量上应用ROPE:

import math
# 假设 q 和 k 是查询和键向量,形状: [batch_size, num_heads, seq_len, head_dim]
batch_size, num_heads, seq_len, head_dim = 2, 8, 10, 64
q = torch.randn(batch_size, num_heads, seq_len, head_dim)
k = torch.randn(batch_size, num_heads, seq_len, head_dim)
rotary_emb = RotaryEmbedding(head_dim)
q_rot = rotary_emb(q)
k_rot = rotary_emb(k)
# 计算注意力得分
scores = torch.einsum("bhqd,bhkd->bhqk", q_rot, k_rot) / math.sqrt(head_dim)
print("Attention scores shape:", scores.shape)  # [batch_size, num_heads, seq_len, seq_len]

6. ROPE的优势与局限性

6.1 优势

  1. 自然捕捉相对位置信息:通过旋转机制,注意力得分直接依赖于相对位置,适合处理长距离依赖。
  2. 对序列长度鲁棒:ROPE不需要为特定序列长度预先计算位置编码,可以灵活适应不同长度的输入。
  3. 计算效率高:旋转操作可以通过向量化实现,计算开销小。
  4. 与Transformer架构兼容:ROPE可以无缝集成到现有的Transformer模型中,无需大幅修改架构。

6.2 局限性

  1. 嵌入维度要求:ROPE要求嵌入维度为偶数,这在某些模型设计中可能需要调整。
  2. 超长序列下的频率调整:在处理极长序列时,可能需要调整频率参数(如NTK-aware scaled ROPE),以避免旋转角度过大导致的信息丢失。
  3. 实现复杂度:相较于简单的加性位置编码,ROPE的实现稍显复杂,需要仔细处理旋转矩阵的计算。

7. ROPE在现代大型语言模型中的应用

ROPE因其优异的性能,已被广泛应用于现代大型语言模型中,例如:

  • Llama:Meta的Llama模型系列采用了ROPE作为位置编码方案。
  • PaLM:Google的PaLM模型使用ROPE处理长序列任务。
  • RoBERTa:Fairseq中的RoBERTa实现也集成了ROPE。

在实际应用中,ROPE在文本生成、机器翻译、长文本总结等领域展现了强大的能力,尤其是在处理长序列和捕捉复杂语义关系时,优势尤为明显。


8. 总结

旋转位置编码(ROPE)作为一种创新的位置编码方法,通过旋转嵌入向量来编码位置信息,成功解决了传统位置编码在捕捉相对位置信息和处理长序列方面的不足。其数学原理巧妙地利用了旋转矩阵的性质,使得注意力机制能够自然地融入相对位置信息。ROPE的高效实现和与Transformer架构的良好兼容性,使其成为现代NLP模型的首选位置编码方案。

通过本文的详细介绍,从基础概念到数学推导,再到代码实现和实际应用,相信读者已经对ROPE有了深入的理解。ROPE不仅是理论上的突破,也是实践中的利器,在推动NLP技术发展的道路上扮演着重要角色。


补充: R ( − m ) R ( n ) = R ( n − m ) R(-m) R(n) = R(n - m) R(m)R(n)=R(nm)推导

我们来一步步推导 ( R ( m ) T R ( n ) = R ( − m ) R ( n ) = R ( n − m ) R(m)^T R(n) = R(-m) R(n) = R(n - m) R(m)TR(n)=R(m)R(n)=R(nm) ) 这个等式,深入理解旋转位置编码(ROPE)中旋转矩阵的性质。这部分推导涉及到旋转矩阵的正交性和旋转角度的加法性质,是ROPE能够捕捉相对位置信息的关键数学基础。


1. 旋转矩阵的定义

在ROPE中,旋转矩阵 ( R ( p ) R(p) R(p) ) 是为序列中位置 ( p p p ) 定义的,用于旋转嵌入向量。假设嵌入维度 ( d d d ) 为偶数,( R ( p ) R(p) R(p) ) 是分块对角矩阵,每个块是一个 2×2 的旋转矩阵,对应嵌入向量的每一对维度(例如,第0和1维、第2和3维)。对于第 ( k k k ) 个维度对,旋转矩阵定义为:

R k ( p ) = [ cos ⁡ ( p ⋅ ω k ) − sin ⁡ ( p ⋅ ω k ) sin ⁡ ( p ⋅ ω k ) cos ⁡ ( p ⋅ ω k ) ] R_k(p) = \begin{bmatrix} \cos(p \cdot \omega_k) & -\sin(p \cdot \omega_k) \\ \sin(p \cdot \omega_k) & \cos(p \cdot \omega_k) \end{bmatrix} Rk(p)=[cos(pωk)sin(pωk)sin(pωk)cos(pωk)]

其中:

  • ( p p p ) 是位置索引(整数)。
  • ( ω k = 1 1000 0 2 k / d \omega_k = \frac{1}{10000^{2k/d}} ωk=100002k/d1 ) 是第 ( k k k ) 个维度对的频率,( k = 0 , 1 , … , d / 2 − 1 k = 0, 1, \dots, d/2 - 1 k=0,1,,d/21 )。

对于整个 ( d d d ) 维嵌入向量,( R ( p ) R(p) R(p) ) 是 ( d × d d \times d d×d ) 的分块对角矩阵:

R ( p ) = diag ( R 0 ( p ) , R 1 ( p ) , … , R d / 2 − 1 ( p ) ) R(p) = \text{diag}(R_0(p), R_1(p), \dots, R_{d/2-1}(p)) R(p)=diag(R0(p),R1(p),,Rd/21(p))

但在推导中,我们只需关注单个 2×2 旋转矩阵的性质,因为整体矩阵的运算可以分解为每个块的独立运算。


2. 旋转矩阵的正交性

旋转矩阵的一个重要性质是正交性,即:

R ( p ) T R ( p ) = I R(p)^T R(p) = I R(p)TR(p)=I

其中 ( I I I ) 是单位矩阵。这意味着 ( R ( p ) T R(p)^T R(p)T ) 是 ( R ( p ) R(p) R(p) ) 的逆矩阵:

R ( p ) T = R ( p ) − 1 R(p)^T = R(p)^{-1} R(p)T=R(p)1

对于 2×2 旋转矩阵:

R ( p ) = [ cos ⁡ ( p ω k ) − sin ⁡ ( p ω k ) sin ⁡ ( p ω k ) cos ⁡ ( p ω k ) ] R(p) = \begin{bmatrix} \cos(p \omega_k) & -\sin(p \omega_k) \\ \sin(p \omega_k) & \cos(p \omega_k) \end{bmatrix} R(p)=[cos(pωk)sin(pωk)sin(pωk)cos(pωk)]

其转置为:

R ( p ) T = [ cos ⁡ ( p ω k ) sin ⁡ ( p ω k ) − sin ⁡ ( p ω k ) cos ⁡ ( p ω k ) ] R(p)^T = \begin{bmatrix} \cos(p \omega_k) & \sin(p \omega_k) \\ -\sin(p \omega_k) & \cos(p \omega_k) \end{bmatrix} R(p)T=[cos(pωk)sin(pωk)sin(pωk)cos(pωk)]

我们可以验证:

R ( p ) T R ( p ) = [ cos ⁡ ( p ω k ) sin ⁡ ( p ω k ) − sin ⁡ ( p ω k ) cos ⁡ ( p ω k ) ] [ cos ⁡ ( p ω k ) − sin ⁡ ( p ω k ) sin ⁡ ( p ω k ) cos ⁡ ( p ω k ) ] R(p)^T R(p) = \begin{bmatrix} \cos(p \omega_k) & \sin(p \omega_k) \\ -\sin(p \omega_k) & \cos(p \omega_k) \end{bmatrix} \begin{bmatrix} \cos(p \omega_k) & -\sin(p \omega_k) \\ \sin(p \omega_k) & \cos(p \omega_k) \end{bmatrix} R(p)TR(p)=[cos(pωk)sin(pωk)sin(pωk)cos(pωk)][cos(pωk)sin(pωk)sin(pωk)cos(pωk)]

计算第一行第一列:

cos ⁡ ( p ω k ) ⋅ cos ⁡ ( p ω k ) + sin ⁡ ( p ω k ) ⋅ sin ⁡ ( p ω k ) = cos ⁡ 2 ( p ω k ) + sin ⁡ 2 ( p ω k ) = 1 \cos(p \omega_k) \cdot \cos(p \omega_k) + \sin(p \omega_k) \cdot \sin(p \omega_k) = \cos^2(p \omega_k) + \sin^2(p \omega_k) = 1 cos(pωk)cos(pωk)+sin(pωk)sin(pωk)=cos2(pωk)+sin2(pωk)=1

计算完整矩阵:

  • 第一行第二列:( cos ⁡ ( p ω k ) ⋅ ( − sin ⁡ ( p ω k ) ) + sin ⁡ ( p ω k ) ⋅ cos ⁡ ( p ω k ) = − cos ⁡ ( p ω k ) sin ⁡ ( p ω k ) + sin ⁡ ( p ω k ) cos ⁡ ( p ω k ) = 0 \cos(p \omega_k) \cdot (-\sin(p \omega_k)) + \sin(p \omega_k) \cdot \cos(p \omega_k) = -\cos(p \omega_k) \sin(p \omega_k) + \sin(p \omega_k) \cos(p \omega_k) = 0 cos(pωk)(sin(pωk))+sin(pωk)cos(pωk)=cos(pωk)sin(pωk)+sin(pωk)cos(pωk)=0 )
  • 第二行第一列:( ( − sin ⁡ ( p ω k ) ) ⋅ cos ⁡ ( p ω k ) + cos ⁡ ( p ω k ) ⋅ sin ⁡ ( p ω k ) = − sin ⁡ ( p ω k ) cos ⁡ ( p ω k ) + cos ⁡ ( p ω k ) sin ⁡ ( p ω k ) = 0 (-\sin(p \omega_k)) \cdot \cos(p \omega_k) + \cos(p \omega_k) \cdot \sin(p \omega_k) = -\sin(p \omega_k) \cos(p \omega_k) + \cos(p \omega_k) \sin(p \omega_k) = 0 (sin(pωk))cos(pωk)+cos(pωk)sin(pωk)=sin(pωk)cos(pωk)+cos(pωk)sin(pωk)=0 )
  • 第二行第二列:( ( − sin ⁡ ( p ω k ) ) ⋅ ( − sin ⁡ ( p ω k ) ) + cos ⁡ ( p ω k ) ⋅ cos ⁡ ( p ω k ) = sin ⁡ 2 ( p ω k ) + cos ⁡ 2 ( p ω k ) = 1 (-\sin(p \omega_k)) \cdot (-\sin(p \omega_k)) + \cos(p \omega_k) \cdot \cos(p \omega_k) = \sin^2(p \omega_k) + \cos^2(p \omega_k) = 1 (sin(pωk))(sin(pωk))+cos(pωk)cos(pωk)=sin2(pωk)+cos2(pωk)=1 )

结果为:

R ( p ) T R ( p ) = [ 1 0 0 1 ] = I R(p)^T R(p) = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} = I R(p)TR(p)=[1001]=I

这确认了 ( R ( p ) R(p) R(p) ) 是正交矩阵。


3. 旋转矩阵的逆与负角度

旋转矩阵的逆可以通过旋转角度的负值表示。考虑:

R ( − p ) = [ cos ⁡ ( − p ω k ) − sin ⁡ ( − p ω k ) sin ⁡ ( − p ω k ) cos ⁡ ( − p ω k ) ] R(-p) = \begin{bmatrix} \cos(-p \omega_k) & -\sin(-p \omega_k) \\ \sin(-p \omega_k) & \cos(-p \omega_k) \end{bmatrix} R(p)=[cos(pωk)sin(pωk)sin(pωk)cos(pωk)]

由于 ( cos ⁡ ( − θ ) = cos ⁡ ( θ ) \cos(-\theta) = \cos(\theta) cos(θ)=cos(θ) ) 和 ( sin ⁡ ( − θ ) = − sin ⁡ ( θ ) \sin(-\theta) = -\sin(\theta) sin(θ)=sin(θ) ):

R ( − p ) = [ cos ⁡ ( p ω k ) sin ⁡ ( p ω k ) − sin ⁡ ( p ω k ) cos ⁡ ( p ω k ) ] R(-p) = \begin{bmatrix} \cos(p \omega_k) & \sin(p \omega_k) \\ -\sin(p \omega_k) & \cos(p \omega_k) \end{bmatrix} R(p)=[cos(pωk)sin(pωk)sin(pωk)cos(pωk)]

这与 ( R ( p ) T R(p)^T R(p)T ) 完全相同,因此:

R ( p ) T = R ( − p ) R(p)^T = R(-p) R(p)T=R(p)

这表明,旋转矩阵的转置等价于反向旋转,即旋转角度取负。


4. 推导 ( R ( m ) T R ( n ) = R ( − m ) R ( n ) R(m)^T R(n) = R(-m) R(n) R(m)TR(n)=R(m)R(n) )

现在推导第一个等式 ( R ( m ) T R ( n ) = R ( − m ) R ( n ) R(m)^T R(n) = R(-m) R(n) R(m)TR(n)=R(m)R(n) )。

根据旋转矩阵的正交性:

R ( m ) T = R ( − m ) R(m)^T = R(-m) R(m)T=R(m)

所以:

R ( m ) T R ( n ) = R ( − m ) R ( n ) R(m)^T R(n) = R(-m) R(n) R(m)TR(n)=R(m)R(n)

这个等式是直接成立的,因为 ( R ( m ) T R(m)^T R(m)T ) 定义为 ( R ( − m ) R(-m) R(m) )。我们可以进一步验证:

  • ( R ( m ) = [ cos ⁡ ( m ω k ) − sin ⁡ ( m ω k ) sin ⁡ ( m ω k ) cos ⁡ ( m ω k ) ] R(m) = \begin{bmatrix} \cos(m \omega_k) & -\sin(m \omega_k) \\ \sin(m \omega_k) & \cos(m \omega_k) \end{bmatrix} R(m)=[cos(mωk)sin(mωk)sin(mωk)cos(mωk)] )
  • ( R ( m ) T = [ cos ⁡ ( m ω k ) sin ⁡ ( m ω k ) − sin ⁡ ( m ω k ) cos ⁡ ( m ω k ) ] = R ( − m ) R(m)^T = \begin{bmatrix} \cos(m \omega_k) & \sin(m \omega_k) \\ -\sin(m \omega_k) & \cos(m \omega_k) \end{bmatrix} = R(-m) R(m)T=[cos(mωk)sin(mωk)sin(mωk)cos(mωk)]=R(m) )
  • ( R ( n ) = [ cos ⁡ ( n ω k ) − sin ⁡ ( n ω k ) sin ⁡ ( n ω k ) cos ⁡ ( n ω k ) ] R(n) = \begin{bmatrix} \cos(n \omega_k) & -\sin(n \omega_k) \\ \sin(n \omega_k) & \cos(n \omega_k) \end{bmatrix} R(n)=[cos(nωk)sin(nωk)sin(nωk)cos(nωk)] )

左侧 ( R ( m ) T R ( n ) R(m)^T R(n) R(m)TR(n) ) 和右侧 ( R ( − m ) R ( n ) R(-m) R(n) R(m)R(n) ) 是同一个矩阵乘法,因此:

R ( m ) T R ( n ) = R ( − m ) R ( n ) R(m)^T R(n) = R(-m) R(n) R(m)TR(n)=R(m)R(n)


5. 推导 ( R ( − m ) R ( n ) = R ( n − m ) R(-m) R(n) = R(n - m) R(m)R(n)=R(nm) )

接下来推导第二个等式 ( R ( − m ) R ( n ) = R ( n − m ) R(-m) R(n) = R(n - m) R(m)R(n)=R(nm) ),这涉及到旋转矩阵的角度加法性质

计算 ( R ( − m ) R ( n ) R(-m) R(n) R(m)R(n) ):

R ( − m ) = [ cos ⁡ ( − m ω k ) − sin ⁡ ( − m ω k ) sin ⁡ ( − m ω k ) cos ⁡ ( − m ω k ) ] = [ cos ⁡ ( m ω k ) sin ⁡ ( m ω k ) − sin ⁡ ( m ω k ) cos ⁡ ( m ω k ) ] R(-m) = \begin{bmatrix} \cos(-m \omega_k) & -\sin(-m \omega_k) \\ \sin(-m \omega_k) & \cos(-m \omega_k) \end{bmatrix} = \begin{bmatrix} \cos(m \omega_k) & \sin(m \omega_k) \\ -\sin(m \omega_k) & \cos(m \omega_k) \end{bmatrix} R(m)=[cos(mωk)sin(mωk)sin(mωk)cos(mωk)]=[cos(mωk)sin(mωk)sin(mωk)cos(mωk)]

R ( n ) = [ cos ⁡ ( n ω k ) − sin ⁡ ( n ω k ) sin ⁡ ( n ω k ) cos ⁡ ( n ω k ) ] R(n) = \begin{bmatrix} \cos(n \omega_k) & -\sin(n \omega_k) \\ \sin(n \omega_k) & \cos(n \omega_k) \end{bmatrix} R(n)=[cos(nωk)sin(nωk)sin(nωk)cos(nωk)]

矩阵乘法 ( R ( − m ) R ( n ) R(-m) R(n) R(m)R(n) ):

  • 第一行第一列:( cos ⁡ ( m ω k ) ⋅ cos ⁡ ( n ω k ) + sin ⁡ ( m ω k ) ⋅ sin ⁡ ( n ω k ) \cos(m \omega_k) \cdot \cos(n \omega_k) + \sin(m \omega_k) \cdot \sin(n \omega_k) cos(mωk)cos(nωk)+sin(mωk)sin(nωk) )
  • 第一行第二列:( cos ⁡ ( m ω k ) ⋅ ( − sin ⁡ ( n ω k ) ) + sin ⁡ ( m ω k ) ⋅ cos ⁡ ( n ω k ) \cos(m \omega_k) \cdot (-\sin(n \omega_k)) + \sin(m \omega_k) \cdot \cos(n \omega_k) cos(mωk)(sin(nωk))+sin(mωk)cos(nωk) )
  • 第二行第一列:( ( − sin ⁡ ( m ω k ) ) ⋅ cos ⁡ ( n ω k ) + cos ⁡ ( m ω k ) ⋅ sin ⁡ ( n ω k ) (-\sin(m \omega_k)) \cdot \cos(n \omega_k) + \cos(m \omega_k) \cdot \sin(n \omega_k) (sin(mωk))cos(nωk)+cos(mωk)sin(nωk) )
  • 第二行第二列:( ( − sin ⁡ ( m ω k ) ) ⋅ ( − sin ⁡ ( n ω k ) ) + cos ⁡ ( m ω k ) ⋅ cos ⁡ ( n ω k ) (-\sin(m \omega_k)) \cdot (-\sin(n \omega_k)) + \cos(m \omega_k) \cdot \cos(n \omega_k) (sin(mωk))(sin(nωk))+cos(mωk)cos(nωk) )

使用三角恒等式:

  • ( cos ⁡ ( a ) cos ⁡ ( b ) + sin ⁡ ( a ) sin ⁡ ( b ) = cos ⁡ ( a − b ) \cos(a) \cos(b) + \sin(a) \sin(b) = \cos(a - b) cos(a)cos(b)+sin(a)sin(b)=cos(ab) )
  • ( cos ⁡ ( a ) ( − sin ⁡ ( b ) ) + sin ⁡ ( a ) cos ⁡ ( b ) = − sin ⁡ ( a ) cos ⁡ ( b ) + sin ⁡ ( a ) cos ⁡ ( b ) = − sin ⁡ ( a − b ) \cos(a) (-\sin(b)) + \sin(a) \cos(b) = -\sin(a) \cos(b) + \sin(a) \cos(b) = -\sin(a - b) cos(a)(sin(b))+sin(a)cos(b)=sin(a)cos(b)+sin(a)cos(b)=sin(ab) )
  • ( − sin ⁡ ( a ) cos ⁡ ( b ) + cos ⁡ ( a ) sin ⁡ ( b ) = sin ⁡ ( a − b ) -\sin(a) \cos(b) + \cos(a) \sin(b) = \sin(a - b) sin(a)cos(b)+cos(a)sin(b)=sin(ab) )

代入 ( a = m ω k a = m \omega_k a=mωk ),( b = n ω k b = n \omega_k b=nωk ):

  • 第一行第一列:( cos ⁡ ( m ω k − n ω k ) = cos ⁡ ( ( n − m ) ω k ) \cos(m \omega_k - n \omega_k) = \cos((n - m) \omega_k) cos(mωknωk)=cos((nm)ωk) )
  • 第一行第二列:( − sin ⁡ ( m ω k − n ω k ) = − sin ⁡ ( ( n − m ) ω k ) -\sin(m \omega_k - n \omega_k) = -\sin((n - m) \omega_k) sin(mωknωk)=sin((nm)ωk) )
  • 第二行第一列:( sin ⁡ ( m ω k − n ω k ) = sin ⁡ ( ( n − m ) ω k ) \sin(m \omega_k - n \omega_k) = \sin((n - m) \omega_k) sin(mωknωk)=sin((nm)ωk) )
  • 第二行第二列:( cos ⁡ ( m ω k − n ω k ) = cos ⁡ ( ( n − m ) ω k ) \cos(m \omega_k - n \omega_k) = \cos((n - m) \omega_k) cos(mωknωk)=cos((nm)ωk) )

因此:

R ( − m ) R ( n ) = [ cos ⁡ ( ( n − m ) ω k ) − sin ⁡ ( ( n − m ) ω k ) sin ⁡ ( ( n − m ) ω k ) cos ⁡ ( ( n − m ) ω k ) ] = R ( n − m ) R(-m) R(n) = \begin{bmatrix} \cos((n - m) \omega_k) & -\sin((n - m) \omega_k) \\ \sin((n - m) \omega_k) & \cos((n - m) \omega_k) \end{bmatrix} = R(n - m) R(m)R(n)=[cos((nm)ωk)sin((nm)ωk)sin((nm)ωk)cos((nm)ωk)]=R(nm)


6. 完整推导结论

结合两步:

R ( m ) T R ( n ) = R ( − m ) R ( n ) = R ( n − m ) R(m)^T R(n) = R(-m) R(n) = R(n - m) R(m)TR(n)=R(m)R(n)=R(nm)

这个等式表明,两个位置 ( m m m ) 和 ( n n n ) 的旋转矩阵相乘后,结果仅依赖于它们的相对位置 ( n − m n - m nm )。这正是ROPE能够捕捉相对位置信息的核心数学依据。


7. 在ROPE中的意义

在自注意力机制中,查询向量 ( q m \mathbf{q}_m qm ) 和键向量 ( k n \mathbf{k}_n kn ) 被旋转为:

q m rot = R ( m ) q m , k n rot = R ( n ) k n \mathbf{q}_m^{\text{rot}} = R(m) \mathbf{q}_m, \quad \mathbf{k}_n^{\text{rot}} = R(n) \mathbf{k}_n qmrot=R(m)qm,knrot=R(n)kn

点积为:

q m rot ⋅ k n rot = ( R ( m ) q m ) T ( R ( n ) k n ) = q m T R ( m ) T R ( n ) k n = q m T R ( n − m ) k n \mathbf{q}_m^{\text{rot}} \cdot \mathbf{k}_n^{\text{rot}} = (R(m) \mathbf{q}_m)^T (R(n) \mathbf{k}_n) = \mathbf{q}_m^T R(m)^T R(n) \mathbf{k}_n = \mathbf{q}_m^T R(n - m) \mathbf{k}_n qmrotknrot=(R(m)qm)T(R(n)kn)=qmTR(m)TR(n)kn=qmTR(nm)kn

这表明注意力得分依赖于相对位置 ( n − m n - m nm ),而不是绝对位置 ( m m m ) 和 ( n n n ),从而实现了ROPE的相对位置编码特性。


总结

通过旋转矩阵的正交性(( R ( m ) T = R ( − m ) R(m)^T = R(-m) R(m)T=R(m) ))和角度加法性质(( R ( − m ) R ( n ) = R ( n − m ) R(-m) R(n) = R(n - m) R(m)R(n)=R(nm) )),我们推导出了 ( R ( m ) T R ( n ) = R ( − m ) R ( n ) = R ( n − m ) R(m)^T R(n) = R(-m) R(n) = R(n - m) R(m)TR(n)=R(m)R(n)=R(nm) )。这个性质是ROPE在Transformer模型中高效编码相对位置的数学基础。

参考资料

  1. Su, J., et al. (2021). “RoFormer: Enhanced Transformer with Rotary Position Embedding.” arXiv:2104.09864
  2. Vaswani, A., et al. (2017). “Attention is All You Need.” arXiv:1706.03762
  3. Rotary Embeddings Explained | Papers With Code
  4. GitHub - lucidrains/rotary-embedding-torch
  5. Understanding Rotary Positional Encoding | Medium

后记

2025年2月23日20点19分于上海,在Grok 3 大模型辅助下完成。

相关文章:

旋转位置编码(ROPE)详解:从Transformer到现代前沿

旋转位置编码(ROPE)详解:从Transformer到现代前沿 标签:NLP, Transformer, 位置编码, ROPE, 深度学习, 机器学习 摘要:本文详细介绍了旋转位置编码(ROPE)在Transformer模型中的应用&#xff0…...

ROS2机器人开发--服务通信与参数通信

服务通信与参数通信 在 ROS 2 中,服务(Services)通信和参数(Parameters)通信是两种重要的通信机制。服务是基于请求和响应的双向通信机制。参数用于管理节点的设置,并且参数通信是基于服务通信实现的。 1 …...

安全运维,等保测试常见解决问题。

1. 未配置口令复杂度策略。 # 配置密码安全策略 # vi /etc/pam.d/system-auth # local_users_only 只允许本机用户。 # retry 3 最多重复尝试3次。 # minlen12 最小长度为12个字符。 # dcredit-1 至少需要1个数字字符。 # ucredit-1 至少需要1个大…...

【数据标准】数据标准化是数据治理的基础

导读:数据标准化是数据治理的基石,它通过统一数据格式、编码、命名与语义等,全方位提升数据质量,确保准确性、完整性与一致性,从源头上杜绝错误与冲突。这不仅打破部门及系统间的数据壁垒,极大促进数据共享…...

Java 18~20 新特性

文章目录 一、Java 18 新特性1.1、UTF-8 作为默认字符集(JEP 400)1.2、简易 Web 服务器(JEP 408)1.3、代码片段标签 snippet(JEP 413)1.4、使用方法句柄重新实现反射核心(JEP 416)1.…...

程序员学商务英语之At the Hotel

Dialogue-3 Room service-Cleaning the Room客房服务-打扫房间 A: Who will do the dishes after dinner tonight? 今晚饭后谁来洗碗? B: It’s your turn. 轮到你了。 Go do the room right now. clean the room去打扫房间。Doing the laundry is the last thi…...

探秘路由表:网络世界的导航地图

一、引言 在当今数字化时代,网络已经成为我们生活中不可或缺的一部分。无论是浏览网页、观看视频,还是进行在线办公、游戏娱乐,我们都在与网络进行着频繁的交互。而在这背后,网络中的数据传输就如同现实生活中的快递配送&#xf…...

UniApp SelectorQuery 讲解

一、SelectorQuery简介 在UniApp中,SelectorQuery是一个非常强大的工具,它允许开发者查询节点信息。通过这个API,我们可以获取到页面元素的尺寸、位置、滚动条位置等信息。这在处理动态布局、动画效果或是用户交互时尤为重要。 二、基本使用…...

三数之和:经典问题的多种优化策略

三数之和:经典问题的多种优化策略 大家好,我是Echo_Wish。今天我们来聊一个经典的算法问题——三数之和(3Sum)。它是许多面试和算法竞赛中常见的问题之一,也常常考察我们对算法优化的理解和技巧。我们不仅要解决问题&…...

Flash-00

下载网站:Flash CC 2015中文版下载-Adobe Flash CC 2015(动画制作软件)免费下载-当快软件园 1-什么是Flash? Flash是一款多媒体设计软件,二维交互式动画设计工具,常用于矢量动画制作 2-Flash的应用领域? 动画制作&a…...

FTP 实验(ENSP模拟器实现)

FTP 概述 FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型,客户端通过FTP客户端软件,连接到FTP服务…...

DeepSeek在初创企业、教育和数字营销领域应用思考

如今,像 DeepSeek 这样的人工智能工具正在改变企业的运营方式,优化流程并显著提高生产力。通过重复任务的自动化、大量数据的分析以及内容创建效率的提高,组织正在寻找新的竞争和卓越方式。本文介绍了 DeepSeek 如何用于提高三个关键领域的生…...

ubuntu新系统使用指南

1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…...

HaProxy配置详解

一、haproxy基础配置 官方文档:HAProxy version 2.2.22 - Configuration Manual HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分。 global:全局配置段 进程及安全配置相关的参数性能调整相关参数Debug参数 pro…...

PCL 基于FPFH特征的SAC-IA算法

文章目录 一、简介二、PCL中的相关类型二、实现代码三、实现效果参考资料一、简介 该算法的大致过程如下所示: 通过这种随机采样并使用FPFH描述子进行匹配的方式,可以快速找到一个较好的转换矩阵,从而实现两个物体的初始配准。 二、PCL中的相关类型 类型为:pcl::SampleCons…...

Git操作整体流程

文章目录 1.Git创建个人仓库2、Git全局配置3、Git本地管理4. Git本地管理常用命令汇总5、使用Git命令将项目提交到远程码云管理6.使用IDEA进行管理7、Idea里面的终端8、关于提交总结 1.Git创建个人仓库 打开https://gitee.com/,登录个人账号,右上角加号…...

独立开发者之PLG 和 SLG 是什么

什么是 PLG 和 SLG PLG(产品驱动增长)是一种策略,通过产品本身吸引用户并推动客户获取、保留和扩展。例如,提供免费试用或免费模式,让用户直接体验产品价值,如 Slack 和 Dropbox 那样。SLG(销售…...

Python 基本语法的详细解释

目录 (1)注释 (2)缩进 (3)变量和数据类型 变量定义 数据类型 (4)输入和输出 输出:print() 函数 输入:input() 函数 (1)注释 注…...

腾讯SQL面试题变体实现:最长连续天数与允许1天中断的进阶解法

腾讯SQL面试题变体实现:最长连续天数与允许1天中断的进阶解法 作者:某七年数据开发工程师 | 2025年02月23日 关键词:滑动窗口、容错机制、连续区间优化 一、变体题型需求分析 在原题如何找出连续5天涨幅超过5%的股票基础上,需实现两个扩展场景: 最长连续天数:输出每只股…...

KubeKey一键安装部署k8s集群和KubeSphere详细教程

目录 一、KubeKey简介 二、k8s集群KubeSphere安装 集群规划 硬件要求 Kubernetes支持版本 操作系统要求 SSH免密登录 配置集群时钟 所有节点安装依赖 安装docker DNS要求 存储要求 下载 KubeKey 验证KubeKey 配置集群文件 安装集群 验证命令 登录页面 一、Ku…...

w803|联盛德|WM IoT SDK2.X测试|pinout|(2):w803开发板简介

概述 W803-Pico是一款基于联盛德W803芯片为主控的开发板,支持IEEE802.11 b/g/n Wi-Fi,以及BT/BLE4.2协议蓝牙。芯片内置高性能32位处理器,主频高达240MHz。内置2MB Flash以及288KB RAM。硬件采用DIP封装,PCB板载天线,…...

BGP分解实验·19——BGP选路原则之起源

当用不同的方式为BGP注入路由时,起源代码将标识路由的来源。 (在BGP表中,Network为“i”,重分布是“?”) 实验拓扑如下: R2上将来自IGP的路由10.3.3.3/32用network指令注入BGP;在R4上将来自I…...

使用ESP-IDF来驱动INMP441全向麦克风

之前的文章我们讲过了I2S。 I2S是什么通信协议?它如何传输音频数据?它和I2C是什么关系?_i2c接口和i2s-CSDN博客文章浏览阅读836次,点赞12次,收藏14次。这个可以参考ADC来理解,我们的ADC也是有左对齐和右对…...

C/C++跳动的爱心

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…...

blender笔记2

一、物体贴地 物体->变换->对齐物体 ->对齐弹窗(对齐模式:反方,相对于:场景原点,对齐:z)。 之后可以设置原点->原点--3d游标 二、面上有阴影 在编辑模式下操作过后,物体面有阴影。 数据-&g…...

关于在mac中配置Java系统环境变量

引言 在 macOS 上开发 Java 或 Flutter 应用时,正确配置环境变量是至关重要的。环境变量不仅能让系统找到开发工具的位置,还能简化命令行操作。本文将手把手教你从零开始安装 Java SDK,并详细配置环境变量,涵盖常见问题解决和优化…...

透彻理解:方差、协方差、相关系数、协方差矩阵及其应用

最近看了几篇跨领域特征对齐方面的经典文献,学者们搞了很多花样,如有的提出一阶统计特征对齐,有的提出二阶统计特征对齐,有的学者提出高阶统计特征对齐。 通俗而言,就是在统计特征层面对跨域特征进行对齐,…...

【SPIE出版,见刊快速,EI检索稳定,浙江水利水电学院主办】2025年物理学与量子计算国际学术会议(ICPQC 2025)

2025年物理学与量子计算国际学术会议(ICPQC 2025)将于2025年4月18-20日在中国杭州举行。本次会议旨在汇聚全球的研究人员、学者和业界专家,共同探讨物理学与量子计算领域的最新进展与前沿挑战。随着量子技术的快速发展,其在信息处…...

jmeter后端监视器的妙用和实现方法

JMeter 的后端监视器(Backend Listener)是一个强大的工具,可用于收集、存储和分析测试过程中的性能指标。它允许将测试数据发送到外部系统(如 InfluxDB、Graphite 等),并借助这些系统的可视化工具&#xff…...

Docker 的安全配置与优化(二)

Docker 安全优化策略 (一)多阶段构建优化镜像大小 多阶段构建是 Docker 17.05 版本引入的强大功能,它允许在一个 Dockerfile 中定义多个构建阶段,每个阶段都可以使用不同的基础镜像和依赖项,最终只将必要的文件和依赖…...

宝塔扩容——阿里云如何操作

一、创建快照 磁盘快照,将数据备份,防止丢失。 1.登录“阿里云”账号 2.点击“控制台”——“云服务器 ECS” 3.点击“基本信息”下,右下角“系统盘” 4.点击“创建快照” 二、磁盘扩容 1.点击“云盘扩容” 2. 选择自己要扩容的大小 …...

vscode settings(一):全局| 用户设置常用的设置项

参考资料 Visual Studio Code权威指南 by 韩骏 一. 全局设置与用户设置 1.1 Vscode支持两种不同范围的设置 用户设置(User Settings):这是一个全局范围的设置,会应用到所有的Visual Studio Code实例中。工作区设置(Workspace Settings):设…...

DeepSeek R1本地+私有云版医疗AI部署开发成功案例技术剖析

1. 引言 1.1 研究背景与意义 随着科技的飞速发展,人工智能(AI)在医疗领域的应用正逐渐成为推动医疗行业变革的重要力量。近年来,医疗 AI 取得了显著的进展,从疾病诊断、药物研发到医疗管理等各个环节,AI 技术都展现出了巨大的潜力。它能够处理和分析海量的医疗数据,为…...

CMOS图像传感器——偏振光图像传感器技术

最近,在索尼官网看到了其提到的偏光图像传感器技术Polarsens,感到好奇,查阅了相关资料,总结如下。。。。 一、偏振光 偏振实际上是光的一种基本属性,表述光电场振动的方向。振动方向和光波前进的方向构成的平面叫振动面。大多数的光源,比如太阳,发出非偏振光,这里我们…...

ROS2 中 TF 变换发布与订阅:实现 base_link 和 test_link 实时可视化显示

视频讲解 ROS2 中 TF 变换发布与订阅:实现 base 安装环境依赖 sudo apt-get install ros-humble-tf2-ros ros-humble-tf2-geometry-msgs ros-humble-tf-transformations 创建一个包名为tf_test_pkg的包 ros2 pkg create --build-type ament_python tf_test_pkg -…...

SQLMesh 系列教程9- 宏变量及内置宏变量

SQLMesh 的宏变量是一个强大的工具,能够显著提高 SQL 模型的动态化能力和可维护性。通过合理使用宏变量,可以实现动态时间范围、多环境配置、参数化查询等功能,从而简化数据模型的开发和维护流程。随着数据团队的规模扩大和业务复杂度的增加&…...

逻辑函数的神经网络实现

1.单层感知器实现基本逻辑函数 先给大家抛出一道例题 (一)种类 a.OR函数 目标:当至少一个输入为1时,输出1;否则输出0。 权重设置: 输入权重:所有 wi1(i1,2,...,m)。…...

链表-基础训练(二)链表 day14

两两交换链表中的节点 题目示意: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 原先我的思路是图像上的思路,但是我感觉还是很复杂…...

使用大语言模型对接OA系统,实现会议室预定功能

随着人工智能技术的不断进步,越来越多的企业开始借助 AI 助手来提高工作效率,尤其是在日常事务的自动化处理中。比如,在许多公司里,会议室的预定是一个常见且频繁的需求,通常需要员工手动检查空闲时间并做出选择。而通…...

hugging face---transformers包

一、前言 不同于计算机视觉的百花齐放,不同网络适用不同情况,NLP则由Transformer一统天下。transformer是2017年提出的一种基于自注意力机制的神经网络架构,transformers库是hugging face社区创造的一个py库,通过该库可以实现统一…...

1. 自定义组件基础

相关资源: 📎day10 图片素材.zip 1. 自定义组件基础 概念:在ArkUI中由框架直接提供的称为系统组件 -> Column,Button等,由开发者定义的称为自定义组件 作用:自定义组件可以对 UI和业务逻辑进行封装&…...

连接Sql Server时报错无法通过使用安全套接字层加密与 SQL Server 建立安全连接

文章目录 一. 前言二. 解决方案 方案1方案2 三. 总结 一. 前言 在《数据库原理》这门课的实验上,需要使用SQL Server,然后使用jdbc连接sql server突然报错为:SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertific…...

python使用httpx_sse调用sse流式接口对响应格式为application/json的错误信息的处理

目录 问题描述方案 问题描述 调用sse流式接口使用httpx_sse的方式 import httpxfrom httpx_sse import connect_sse# 省略无关代码try:with httpx.Client() as client:with connect_sse(client, "GET", url, paramsparam) as event_source:clear_textbox(response_t…...

R 语言科研绘图 --- 散点图-汇总

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

【语音科学计算器】当前汇率

JSON_MARKER_HORN{“base”:“USD”,“rates”:{“EUR”:0.9758,“JPY”:157.68,“GBP”:0.8190,“CNY”:7.3327,“HKD”:7.7872,“AUD”:1.6260,“CAD”:1.4422,“CHF”:0.9157,“SGD”:1.3714,“KRW”:1473.05,“NZD”:1.7992,“THB”:34.54,“MYR”:4.4930,“PHP”:57.32,“…...

python 进程池的基本使用

Python 进程池:Pool任务调度实现 在现代计算机系统重,处理器核心数量的增加为并行计算提供了强大的硬件基础。Python的 multiprocessing 模块中的进程池(Pool)机制,为开发者提供了 一个高效且易用的并行处理框架。 通…...

初识XML

初识XML <?xml version"1.0" encoding"utf-8" ?> <!--根标签只能有一个--> <!--第一行永远都是 <?xml version"1.0" encoding"utf-8" ?> 前面不允许出现任何其他东西&#xff0c;空格换行等均不行 --> &…...

VisActor/VTable - 快速搭建表格

VTable源于VisActor体系&#xff0c;该体系是从字节跳动大量可视化场景沉淀而来&#xff0c;旨在提供面向叙事的智能可视化解决方案。VisActor包括渲染引擎、可视化语法、数据分析组件、图表组件、表格组件、GIS组件、图可视化组件、智能组件等多个模块&#xff0c;以及周边生态…...

网络安全营运周报

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 第三章网络安全基础 一、网络安全概述 1、网络安全现状及安全挑战 网络安全范畴极其广泛&#xff0c;可以说是涉及多方面。 因为计算机病毒层出不穷以及黑客的…...

网络运维学习笔记 017 HCIA-Datacom综合实验01

文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置&#xff08;IP二层VLAN链路聚合&#xff09;ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…...