正余弦与RoPE位置编码:从理论到实践的全面解析

正余弦位置编码和RoPE位置编码 为每个位置赋予独一无二的编码向量,来明确表示输入序列中每个元素的绝对位置。像 BERT 中采用的正弦余弦位置编码,会根据位置索引,利用特定的正弦和余弦函数计算出对应位置向量的每个维度值。位置pos在维度2i的值是sinpos/100002idmodel​,在维度2i1的值是cospos/100002idmodel​,其中dmodel​是模型维度。这种编码方式让模型可以直接学习到每个位置对应的特征表示。 阅读详情

1. 位置编码:让模型“看见”词序的魔法

如果你玩过拼图,就知道每一块的位置都至关重要。在自然语言处理(NLP)的世界里,模型处理文本时,最初就像面对一堆打乱顺序的拼图块。它能看到每个词(比如“苹果”、“吃”、“我”),但如果不告诉它顺序,它可能完全无法理解“我吃苹果”和“苹果吃我”的天壤之别。这就是位置编码要解决的核心问题:如何让模型理解词语在句子中的先后顺序。

在Transformer模型出现之前,像RNN、LSTM这类循环神经网络,其结构本身就隐含了顺序处理信息的能力,词是一个接一个“流”进去的。但Transformer不一样,它采用了自注意力机制,可以同时处理序列中的所有词,这带来了巨大的并行计算优势,但也丢失了词序信息。所以,我们必须显式地把“位置”这个信息,作为额外的“调料”加入到模型的输入中。

目前,主流的“调料”配方有两大家族:绝对位置编码和相对位置编码。你可以把它们想象成两种不同的定位系统。绝对位置编码像是给剧院座位贴标签:第1排1座、第1排2座……每个位置都有一个独一无二的、固定的坐标。而相对位置编码更像是在描述人与人之间的关系:“你左边第三个人”、“我后面两个人”,它关注的是元素之间的相对距离。我们今天要深入聊的,就是绝对位置编码家族中的经典代表——正余弦位置编码,以及相对位置编码家族的后起之秀——旋转位置编码(RoPE)。我会结合我这些年折腾大模型的经验,带你从理论公式一路拆解到代码实现,看看它们到底是怎么工作的,在实际用的时候又会遇到哪些“坑”。

2. 正余弦位置编码:经典而稳固的基石

2.1 它的工作原理:一种优雅的波形设计

正余弦位置编码,最早在Transformer的开山论文《Attention Is All You Need》中被提出,堪称是位置编码的“祖师爷”。它的设计非常巧妙,甚至有点艺术感。其核心公式长这样:

对于序列中的第 pos 个位置,其编码向量的第 i 个维度值这样计算:

  • 如果 i 是偶数(即 2i 维度):PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
  • 如果 i 是奇数(即 2i+1 维度):PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))

这里的 d_model 是模型的嵌入维度(比如512、768等)。初看可能有点晕,我们打个比方。想象一下,你要给一个512维的空间里的每个位置(pos=0,1,2,…)分配一个坐标。你不是随便赋值,而是用了很多组不同频率的正弦和余弦波。低频的波(对应 i 较小,分母 10000^(2i/d_model) 很大)变化很慢,负责捕捉长程的、宏观的位置信息;高频的波(对应 i 较大,分母很小)变化很快,负责捕捉细微的、局部的位置差异。

这种设计带来了一个绝妙的性质:对于任意一个固定的偏移量 k,位置 pos + k 的编码可以被表示为位置 pos 编码的一个线性函数。这意味着模型可以很容易地学会关注相对位置,尽管它本身是绝对编码。这是它设计上最精妙的一点。

2.2 动手实现与代码解读

理论说得再漂亮,不如代码来得实在。我们来看看一个典型的PyTorch实现,我会逐行加上我的注释:

import torch
from torch import nn

class PositionalEncoding(nn.Module):
    """计算正弦余弦位置编码。"""
    def __init__(self, d_model, max_len, device):
        """
        :param d_model: 模型嵌入维度,必须为偶数
        :param max_len: 预设的最大序列长度(比如512)
        :param device: 计算设备(CPU或GPU)
        """
        super(PositionalEncoding, self).__init__()
        # 初始化一个全零的编码矩阵,形状为 [max_len, d_model]
        # 这里不计算梯度,因为位置编码是固定的,不是可学习参数
        self.encoding = torch.zeros(max_len, d_model, device=device)
        self.encoding.requires_grad = False

        # 生成位置索引 [0, 1, 2, ..., max_len-1]
        pos = torch.arange(0, max_len, device=device)
        pos = pos.float().unsqueeze(dim=1)  # 从 [max_len] 变为 [max_len, 1],方便广播计算

        # 生成维度索引 i,这里 step=2,所以 _2i = [0, 2, 4, ..., d_model-2]
        _2i = torch.arange(0, d_model, step=2, device=device).float()

        # 核心计算:对偶数维度应用sin,奇数维度应用cos
        # 10000 ** (_2i / d_model) 就是公式中的 10000^(2i/d_model)
        # pos / (10000 ** (_2i / d_model)) 完成了除法运算
        # 利用切片操作,一次性为所有位置、所有偶数维度赋值
        self.encoding[:, 0::2] = torch.sin(pos / (10000 ** (_2i / d_model)))
        self.encoding[:, 1::2] = torch.cos(pos / (10000 ** (_2i / d_model)))

    def forward(self, x):
        """
        :param x: 输入张量,形状为 [batch_size, seq_len, d_model]
        :return: 对应序列长度的位置编码,形状为 [seq_len, d_model]
        """
        batch_size, seq_len = x.size()
        # 只返回当前输入序列长度所需的部分编码
        # 例如,如果预设max_len=512,但本次输入seq_len=30,就只返回前30个位置的编码
        return self.encoding[:seq_len, :]

使用起来非常简单:

# 假设你的词嵌入维度是512,最大准备处理128个token
pe = PositionalEncoding(d_model=512, max_len=128, device='cuda')
# 你的输入词嵌入张量,比如一个批次有16个句子,每个句子30个词
input_embeddings = torch.randn(16, 30, 512).to('cuda')
# 获取位置编码并相加
pos_embeddings = pe(input_embeddings)  # 得到 [30, 512]
final_input = input_embeddings + pos_embeddings  # 广播相加,得到 [16, 30, 512]

我踩过的一个坑:d_model 必须是偶数,否则切片操作 0::2 和 1::2 会出问题。在定义模型时一定要检查这一点。

2.3 优势与局限:它适合什么,不适合什么

正余弦位置编码的优势非常明显,这也是它早期被广泛采用的原因:

  1. 确定性且无需学习:编码是预先计算好的固定值,不增加模型训练参数,训练过程更稳定,可复现性强。
  2. 能泛化到略长于训练长度的序列:由于其波形特性,模型在训练时见过低频波 pattern 后,对于稍长的序列,即使位置索引 pos 超出了训练范围,模型也可能通过外推(extrapolation)一定程度上理解其位置。但这能力有限。
  3. 计算极其高效:一次计算,多次使用。在推理时,编码可以缓存,几乎没有额外计算开销。

但它也有几个硬伤,在实际项目中让我头疼过:

  1. 长度外推能力弱:这是最大的痛点。如果你用最大长度512训练的模型,去处理一个600个token的句子,那第513到600个位置,模型完全没见过它们的编码模式。虽然正弦波可以外推,但高频部分的外推会迅速失真,导致模型性能显著下降。你不得不进行截断或者复杂的长度扩展微调。
  2. 对绝对位置敏感,可能不灵活:在一些任务中,词语的相对关系比绝对坐标更重要。比如在阅读理解中,问题“苹果这个词前面第三个词是什么?”模型需要的是相对位置“前3”,而不是“苹果在句子第47位”。纯绝对编码在捕捉这种纯粹相对关系时,需要模型从数据中费力地学习出来。
  3. 信息可能被淹没:在深层Transformer中,经过多层的加法和归一化操作后,初始注入的绝对位置信息可能会被逐渐稀释,尤其是在长序列中。

3. 旋转位置编码(RoPE):一种更“自然”的相对视角

3.1 核心思想:用“旋转”来编码相对位置

RoPE的提出,可以说是位置编码思路的一次优雅升级。它的核心直觉非常几何化:将词嵌入向量视为高维空间中的点,然后根据词的位置,对这个向量进行一个旋转变换。

具体来说,它把 d_model 维的嵌入向量,看成是 d_model/2 个二维子空间的组合。对于第 m 个位置的词,它的查询向量 q_m 和键向量 k_n 的每一个二维子向量,都会用一个旋转矩阵进行变换。这个旋转矩阵的角度 θ,与位置 m 和该维度索引 i 有关,公式是 m * θ_i,其中 θ_i = 10000^(-2i/d_model)。

这个设计的精妙之处在于,当计算注意力分数 q_m 和 k_n 的点积时,结果会自然地变成一个只与它们相对位置 (m-n) 有关的函数!也就是说,q_m 和 k_n 的内积,只依赖于 m-n 和它们的内容,而与它们各自的绝对位置 m 和 n 无关。这完美地将相对位置信息融入了注意力计算的核心。

3.2 从公式到代码:理解旋转操作

我们来看一个简化版的实现,重点理解其旋转过程:

import torch
import torch.nn as nn
import torch.nn.functional as F

class RotaryPositionalEmbeddings(nn.Module):
    def __init__(self, dim: int, base: int = 10000):
        super().__init__()
        self.dim = dim  # 嵌入维度
        self.base = base
        # 缓存cos和sin值,避免重复计算
        self.cos_cached = None
        self.sin_cached = None

    def _build_cache(self, seq_len: int, device: torch.device, dtype: torch.dtype):
        """预计算并缓存所有位置、所有维度对应的cos和sin值。"""
        if self.cos_cached is not None and seq_len <= self.cos_cached.shape[0]:
            return  # 如果缓存已存在且足够长,则直接使用

        # 计算每个维度i对应的theta_i = base^(-2i/dim)
        # i = torch.arange(0, self.dim, 2) -> [0, 2, 4, ..., dim-2]
        theta = 1.0 / (self.base ** (torch.arange(0, self.dim, 2, device=device, dtype=dtype) / self.dim))

        # 生成位置索引 m = [0, 1, 2, ..., seq_len-1]
        m = torch.arange(seq_len, device=device, dtype=dtype)

        # 计算外积 m * theta,得到形状为 [seq_len, dim//2] 的矩阵
        # 每个元素是 m * theta_i
        freqs = torch.einsum('i,j->ij', m, theta)  # 或者用 m.unsqueeze(-1) * theta

        # 将freqs在最后一个维度复制一份,因为每个二维子空间需要相同的角度
        # 最终形状: [seq_len, dim]
        freqs = torch.cat([freqs, freqs], dim=-1)

        # 缓存cos和sin值
        self.cos_cached = freqs.cos()[None, None, :, :]  # 增加两个维度,方便后续广播 [1, 1, seq_len, dim]
        self.sin_cached = freqs.sin()[None, None, :, :]

    def _rotate_half(self, x: torch.Tensor):
        """将输入x的后半部分取负,以实现旋转矩阵乘法中的特定操作。"""
        d_2 = self.dim // 2
        # x的形状假设为 [..., dim]
        # 将后半部分和前半部分交换,并对新的前半部分取负
        # 例如 [x1, x2, x3, x4] -> [-x3, -x4, x1, x2]
        x1, x2 = x[..., :d_2], x[..., d_2:]
        return torch.cat([-x2, x1], dim=-1)

    def forward(self, x: torch.Tensor):
        """
        :param x: 输入张量,通常是查询q或键k,形状为 [batch_size, num_heads, seq_len, head_dim]
                  其中 head_dim 必须等于初始化时的 dim
        :return: 施加了旋转位置编码后的张量
        """
        batch, heads, seq_len, head_dim = x.shape
        assert head_dim == self.dim, f"head_dim({head_dim}) must equal dim({self.dim})"

        # 1. 构建或获取缓存
        self._build_cache(seq_len, x.device, x.dtype)

        # 2. 应用旋转公式: x_rotated = x * cos + rotate_half(x) * sin
        cos = self.cos_cached[:, :, :seq_len, :]  # 取所需长度
        sin = self.sin_cached[:, :, :seq_len, :]
        x_rotated = (x * cos) + (self._rotate_half(x) * sin)

        return x_rotated

在实际的注意力模块中,你会这样使用RoPE:

# 假设在某个注意力头中
def attention_with_rope(q, k, v, rope_layer):
    # q, k 形状: [batch, heads, seq_len, head_dim]
    q_rotated = rope_layer(q)  # 对查询向量应用旋转
    k_rotated = rope_layer(k)  # 对键向量应用旋转

    # 计算注意力分数 (q_rotated 和 k_rotated 的点积)
    # 此时,q_m_rotated · k_n_rotated 的结果只依赖于 (m-n) 和原始q、k的内容
    scores = torch.matmul(q_rotated, k_rotated.transpose(-2, -1)) / (q.size(-1) ** 0.5)
    # ... 后续softmax和value加权求和

3.3 优势与挑战:为什么LLaMA、GPT-NeoX都爱用它?

RoPE近年来在大型语言模型(LLM)中几乎成了标配,从LLaMA系列到GPT-NeoX,都能看到它的身影,这得益于它几个突出的优点:

  1. 完美的相对位置编码:其数学性质保证了注意力分数只依赖于相对位置差,这更符合人类语言的理解方式(我们更关心词与词的关系)。
  2. 出色的长度外推性:这是RoPE相对于正余弦编码最大的杀手锏。因为它的核心是旋转,旋转角度 m*θ_i 是线性的。即使 m 超出了训练范围,旋转操作在数学上依然是定义良好的。模型在短序列上学会的“旋转规律”,可以相对平滑地外推到更长的序列。这使得训练时用4K上下文,推理时处理8K甚至更长文本成为可能(虽然也需要一些技巧,但基础更牢)。
  3. 与线性注意力兼容性好:一些为了提升效率的线性注意力变体,需要注意力分数能分解为某种形式,RoPE的乘法特性有时能更好地适应这些变体。

当然,它也不是完美的:

  1. 实现稍复杂:需要在注意力计算前对Q和K进行变换,增加了代码复杂度。
  2. 计算开销略有增加:虽然可以缓存,但相比直接加一个固定向量,旋转操作还是需要一些计算。
  3. 对某些绝对位置敏感的任务可能不是最优:虽然主流任务都更关注相对位置,但在极少数需要精确绝对位置的任务上,可能需要额外设计。

4. 实战对比:在不同NLP任务中如何选择?

理论说了一堆,到底该怎么选呢?我结合自己部署和微调模型的经验,给你一些实在的建议。

4.1 文本分类与情感分析

这类任务通常句子长度中等(小于512),且关键信息(如情感词、主题词)的绝对位置有时很重要(比如影评开头和结尾的观点可能更关键)。

  • 正余弦编码:表现稳定可靠。因为序列长度固定,且绝对位置信息可能有益。BERT及其早期变体使用它取得了巨大成功。如果你的任务场景和训练数据长度变化不大,它依然是简单高效的选择。
  • RoPE:同样可以胜任,但可能有点“杀鸡用牛刀”。不过,如果你使用的预训练模型(如LLaMA)本身就用RoPE,那么在下游任务微调时沿用即可,无需更改。

我的经验:对于从零开始训练一个领域特定的分类模型(比如新闻分类),且数据长度均匀,我会优先考虑正余弦编码,因为简单。但如果我想用一个现成的、基于RoPE预训练好的大模型来做少样本学习(Few-shot Learning)或微调,那我当然直接用它自带的RoPE。

4.2 机器翻译与文本生成

这类任务对长距离依赖和词序关系非常敏感,且输入输出长度可变。

  • 正余弦编码:在标准Transformer的编码器-解码器架构中表现尚可,但当处理长文档翻译时,长度外推问题会凸显。解码器在生成时,需要处理不断增长的序列,绝对位置编码可能成为瓶颈。
  • RoPE:优势明显。其天然的相对位置感知能力,让模型能更好地把握源语言和目标语言词序的对应关系,尤其是在长句和语序差异大的语言对之间。其外推性也使得生成更长的文本时更加稳定。

我的踩坑记录:曾经尝试将一个用正余弦编码训练的翻译模型,用于处理比训练时更长的会议纪要翻译,结果生成质量明显下降,出现了很多词序混乱。后来换用基于RoPE的模型(如BLOOM),这个问题得到了很大缓解。

4.3 长文本理解(阅读理解、摘要、问答)

这是RoPE真正大放异彩的领域。任务如法律文档分析、长论文摘要、多轮对话理解,经常需要处理数千甚至数万token的上下文。

  • 正余弦编码:基本无法直接胜任。需要复杂的“位置插值”或“外推微调”等技巧来扩展上下文窗口,过程繁琐且效果有损。
  • RoPE:几乎是当前长上下文模型的唯一选择。像ChatGPT、Claude等模型能处理超长上下文,其基础就依赖于RoPE或其改进变体(如NTK-aware Scaled RoPE、动态NTK等)提供的强大长度外推能力。

一个关键技巧:即使使用RoPE,直接外推到远超训练长度也可能有性能损失。社区常见的实践是“位置插值”(Position Interpolation),即在微调阶段,将目标长位置“压缩”到模型见过的短位置范围内。例如,训练长度2048,想扩展到8192,就把位置索引除以4(8192/2048)后再输入给RoPE。这比正余弦编码的扩展要平滑有效得多。

4.4 总结与个人心得

经过这么多年的项目实践,我的看法是:

正余弦位置编码像是一把精准的尺子,在它量程范围内(训练长度内),刻度清晰准确,简单耐用。对于已知的、固定范围的场景,它依然是可靠的选择,尤其是当你需要模型结构极度简洁和可解释时。

旋转位置编码(RoPE) 则像是一个指南针,它不告诉你绝对的经纬度,但能清晰地指示方向(相对位置)。在探索未知长度、处理复杂语言关系的旅程中,它提供了更强的泛化能力和灵活性。对于当今追求大上下文窗口和强大生成能力的LLM来说,它几乎是必然的架构组件。

给新手的建议:如果你是初学者,想彻底理解Transformer,从正余弦编码入手是最好的,它的直观性能帮你打下坚实基础。但如果你要进入当今的大模型应用开发或研究,必须深入理解RoPE,因为它是当前主流LLM的“心脏”部件之一。在具体项目选型时,优先考虑你的预训练模型用了哪种编码,保持一致性。如果从零开始,且预期有长文本处理需求,RoPE是更面向未来的选择。

最后,无论是哪种编码,都只是让模型理解顺序的工具。模型的真正能力,还是来自于海量数据和对注意力机制的深度训练。理解这些工具,能帮助我们在模型出现问题时更好地调试,在需要改进时知道从何下手。希望这篇从理论到实践的长文,能帮你拨开位置编码的迷雾,在实际工作中做出更明智的选择。

Transformer位置编码技术:正弦编码与RoPE对比解析 位置编码是Transformer架构中处理序列顺序信息的关键技术,主要分为绝对位置编码(如正弦编码)和相对位置编码(如RoPE)。正弦编码通过固定模式的正余弦函数为每个位置生成唯一向量,适用于基础序列建模;而RoPE则通过旋转矩阵直接建模相对位置关系,在长文本生成等场景表现优异。这两种技术在自然语言处理中各有优势:正弦编码计算高效且参数固定,适合资源受限场景;RoPE则能更好地捕捉长距离依赖,已被LLaMA等大型语言模型采用。理解位置编码的工作原理对优化Transformer模型至关重要,特别是在处理机器翻 阅读详情

相关推荐

【NLP】第十章:位置编码Positional Encoding

前面讲RNN时一般都会有一个ht的输出,这个输出就是样本与样本之间的信息,而且RNN是时序循环的,所以RNN本身的结构,在物理上,就自带词的前后顺序信息的。比如词never,不管never本身的词向量是什么,只要你在序列中排第一个位置,你的位置向量就是[0,1,01],你排第三个位置,你的位置向量就是[0.9,-0,4,0.2,1.0]。也所以,你可以理解为:embedding后的词嵌入,PE按照每个样本在sequence中的位置,把embedding后的词嵌入给扭转后,才送入attention的。

因为热爱所以坚持 1918

LLaMA的旋转位置编码与Transformer的正余弦位置编码:原理、对比与选择原因分析

位置编码作为Transformer架构中的关键组件,其设计直接影响模型对序列数据的处理能力。通过对正余弦位置编码和旋转位置编码(RoPE)的深入分析与对比,我们不仅理解了它们的技术原理和实现差异,也揭示了现代大语言模型如LLaMA在位置编码选择背后的深层考量。本节将总结两种编码方法的本质区别,探讨位置编码技术的演进逻辑,并展望未来的发展方向。哲学理念差异正余弦编码体现了一种静态注入的思想,位置信息通过预定义的固定模式添加到输入表示中。RoPE代表了一种动态融合。

深耕互联网架构与AI领域多年,专注大模型工程化、云原生架构、AI驱动系统,分享实战经验、前沿技术和架构方法论。每周产出深度长文+技术短文,涵盖大厂案例、论文解读与工程实践。拒绝水文,只讲干货。关注我,与一线架构师共同探索技术本质。 2239

保姆级教程:用BMS的HVIL检测电路,手把手教你排查高压互锁故障(附PWM/直流源方案对比)

本文详细解析了BMS中的HVIL检测电路,通过对比直流源与PWM两种方案,提供了一套系统化的高压互锁故障诊断流程。从电路原理到实战技巧,帮助维修人员精准定位故障根源,提升电动汽车高压系统的安全性和可靠性。

weixin_29300241的博客 392

从正余弦到旋转:Transformer位置编码的演进逻辑与技术解析

Transformer架构自2017年由Vaswani等人提出以来,已成为自然语言处理领域的基石模型。与传统的RNN和CNN不同,Transformer完全依赖注意力机制来建模序列关系,这使得位置编码(Positional Encoding)成为不可或缺的组成部分。位置编码的作用是为模型提供序列中元素的位置信息,弥补自注意力机制本身对顺序不敏感的缺陷。在原始Transformer中,作者提出了正余弦位置编码方案,这一设计在早期取得了显著成功。

深耕互联网架构与AI领域多年,专注大模型工程化、云原生架构、AI驱动系统,分享实战经验、前沿技术和架构方法论。每周产出深度长文+技术短文,涵盖大厂案例、论文解读与工程实践。拒绝水文,只讲干货。关注我,与一线架构师共同探索技术本质。 1308

【PADS-开发指南】

馒头破戒大师

sinat_23896491的博客 3230

人工智能数据治理——解读AI时代数据治理白皮书 2025【附全文阅读】

摘要:该白皮书面向企业数字化负责人及AI项目推进人员,探讨AI时代数据治理的战略升级。提出"好数据+好数据知识"双基石理念,强调数据需满足"三高"标准(高精度、一致性、时效性)并构建语义知识库。构建四层治理框架,包括数据采集处理、合规安全、知识库建设及质量改进,并介绍AI赋能治理的新范式,如智能ETL和治理Agent体系。同时分析"软件+AI+好数据"的应用模式,为企业实现智能数据治理提供实践指导。(149字)

cdfunlove的博客 636

Transformer位置编码实战:从正余弦到RoPE的代码实现与性能对比

本文深入探讨了Transformer模型中的两种主流位置编码方案:正余弦位置编码和旋转位置编码(RoPE),通过PyTorch代码实现和性能对比实验,帮助开发者理解如何在实际项目中选择最适合的方案。RoPE在处理长序列时展现出明显优势,而正余弦编码则因其简单可靠在资源受限场景中仍具价值。

hadoop5ranger的博客 1049

深度学习与西储大学轴承数据集(一)

西储大学数据集介绍

weixin_50642818的博客 1万+

从旋转位置编码RoPE到YaRN的原理与实现

旋转位置编码(RoPE)是当前大模型的主流位置编码方法,相比传统正余弦位置编码具有更好的外推能力。RoPE通过旋转矩阵将位置信息嵌入到查询和键向量中,能显式保留相对位置关系。其核心思想是将位置编码转化为旋转操作,使注意力分数仅依赖相对位置差而非绝对位置。实现时,先计算分层频率并生成旋转角度矩阵,然后对输入向量进行旋转变换。RoPE支持序列长度的平滑扩展,解决了长上下文建模的难题,已成为LLM的标准配置之一。

weixin_71945758的博客 1221

价值投资中的AI驱动现金流预测:多智能体协作模型

在价值投资领域,准确的现金流预测是做出明智投资决策的关键。传统的现金流预测方法往往依赖于历史数据和简单的统计模型,难以应对复杂多变的市场环境和企业经营状况。随着人工智能技术的快速发展,利用AI驱动的模型进行现金流预测成为了研究热点。本文的目的在于介绍一种基于多智能体协作的模型,用于提高价值投资中现金流预测的准确性和可靠性。本文的范围涵盖了多智能体协作模型的核心概念、算法原理、数学模型、项目实战、实际应用场景以及相关工具和资源推荐等方面,旨在为读者提供一个全面且深入的关于AI驱动现金流预测的知识体系。

AI 算法实战派 679

MIKE水动力笔记18_如何将dfsu流场模拟结果的数据导出成txt文件

MIKE的模拟结果dfsu文件的数据是可以导出的,导出格式为xyz,我们也可以将其改后缀改为txt文本格式,其中包含了某一时刻下所有网格坐标点的数据。

晏长街的博客 4410

一文搞懂大模型核心:旋转位置编码(RoPE)原理与实现!

本文详细介绍了Transformer架构中的位置编码,特别是旋转位置编码(RoPE)的原理与优势。RoPE通过旋转token embedding而非添加位置向量,在注意力计算中自然引入相对位置信息,解决了传统正余弦编码的局限性。其数学形式优雅、计算高效,被广泛应用于LLaMA、ChatGLM等大模型中,成为位置编码的事实标准,并衍生出多种改进方法以增强长序列外推能力。

WANGJUNAIJIAO的博客 1651

【CAN总线测试】——使用VH6501 进行Busoff快慢恢复测试

即在IDBase中填标准帧11位二进制ID,如果不满11位,高位补零,凑齐11位,并将下方CurrTriggerField设置干扰前一位AckSlot位,Triggeroffset设置为0。首先确认环境支持VN6501,6501硬件连接成功后,工程的小闪电是正常黄色状态,若是灰色证明缺少License,或者软件安装环境不正确。填写干扰报文ID、干扰位置 注意这里的干扰位置是实际干扰的前一位,TriggerOffset表示偏移量,可以干扰某个字节的具体位.找到并打开Panel后,开启工程,并且配置面板。

LOVE135149的博客 5634

llama2 RoPE 旋转位置编码

旋转嵌入(RoPE)是LLaMA等模型采用的位置编码方法,通过复数旋转操作将位置信息编码到特征向量中。其核心是将特征向量两两分组,每组独立进行位置相关的旋转:实部x'=xcosθ-ysinθ,虚部y'=xsinθ+ycosθ,其中θ由位置决定。实现分为三步:预计算旋转角度的余弦/正弦值,调整维度以支持广播运算,最后应用旋转公式。这种方法能精确捕捉相对位置关系,且不改变输入输出维度。测试显示对[1,50,6,48]形状的Q/K向量处理后,输出保持相同维度但编码了位置信息。

victory0431的博客 1728

【我的Android进阶之旅】解决android应用使用android:persistent属性带来的系统Launcher应用必须重启设备才生效的问题,大幅度提升开发效率

一、问题描述 我们在开发系统级别应用,比如Launcher桌面的时候,会发现有个问题:每次Launcher修改完代码,重新编译之后,安装到android设备上之后,必须重启才会生效。否则就是使用了之前的Launcher版本的内容。而每次重启设备得一分钟左右,太慢了,太影响效率了! 1.1 痛点 每次更新完代码,重新安装之后,必须重启设备才会生效。效率太TM低了! 二、分析问题 经过一轮代码排查,最终发现是因为src\main\AndroidManifest.xml文件中,定义application使用了an

字节卷动 1715

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

面试-RoPE 旋转位置编码

给每个位置的向量乘一个旋转矩阵(本质是给向量 “旋转” 对应角度),但最终计算注意力时,两个位置的向量内积只和 “相对位置差” 有关。远程衰减特性,(随着相对距离的增加而衰减attention得分);包括序列长度灵活性。(方便外推性)可以应用于线性自注意力模型。RoPE 的旋转矩阵是正交矩阵,正交变换不会改变向量的模长(几何意义里 “只转方向、不改变长度”),这种方式不改变向量模长,能保证模型稳定性。RoPE 可以通过复数运算。

weixin_57128596的博客 1410

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

手把手带你从零推导旋转位置编码RoPE

RNN每个step的隐状态都取决于上一个step的输出,这种连续的状态转移方式使得RNN天然带有位置信息。而Transformer仅依靠Attention机制来关注序列中不同token之间的相关性,如果只使用token embedding就无法获得句子中字与字之间的位置信息,也就是说如果没有位置编码,输入“我不爱你”与“不我爱你”的效果是相同的,因此我们要在里面额外引入位置信息。下面我就为大家介绍位置编码的发展过程。

Antai_ZHU的博客 2274

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

xformers中的位置编码技术:RoPE与ALiBi实现对比

在Transformer(转换器)模型中,位置编码(Positional Encoding)是至关重要的组件,它为模型提供了输入序列中元素的位置信息。传统的正弦余弦位置编码存在固定长度限制,无法有效处理长序列任务。近年来,RoPE(Rotary Position Embedding,旋转位置嵌入)和ALiBi(Attention with Linear Biases,带线性偏置的注意力)技术因其在...

gitblog_00111的博客 750

10分钟看懂RoPE!动图拆解旋转位置编码,Transformer核心原理秒懂!

在自然语言中,词与词之间的语义关系往往取决于它们的相对距离,而不是它们在句子中的绝对位置。RoPE不再将位置信息加到词向量上,而是通过旋转操作直接编码相对位置关系。位置0的词保持原样(旋转0°)位置1的词旋转θ°*位置2的词旋转2θ°位置3的词旋转3θ°每个位置对应不同的旋转角度,位置信息就这样被优雅地"编码"到了向量的方向中。RoPE旋转位置编码中,当两个旋转后的向量进行点积运算时,会发生一个美妙的数学现象。⟨旋转m次的q, 旋转n次的k⟩ = ⟨q, k⟩ × cos((m-n)θ)

star_nwe的博客 1534

Transformer模型中位置编码(Positional Embedding)技术全解析(三)

本文解析Transformer位置编码的核心作用与技术演进。针对自注意力机制缺乏顺序感知的问题,对比绝对编码(固定正余弦、可学习编码)与相对编码(RoPE旋转、ALiBi线性偏置)的原理及优劣,涵盖傅里叶级数设计、外推能力等关键点。结合代码示例,总结主流方法(如Sinusoidal、RoPE)的参数效率与应用场景,探讨其在大模型(如LLaMA)中的实践趋势,为模型设计提供技术参考。

1249

【LLM 位置编码终极指南】从 Sinusoidal 到 RoPE 的原理、推导与工程实现

本文系统梳理了Transformer中位置编码的核心方法。首先分析自注意力机制因排列不变性导致的位置信息缺失问题,指出位置编码的必要性。重点解析两种主流位置编码方案:1)Sinusoidal位置编码通过三角函数生成固定位置向量,利用波长变化捕捉多尺度位置关系;2)RoPE(旋转位置编码)通过旋转矩阵实现相对位置感知。文章详细推导了Sinusoidal编码的数学原理,展示其如何通过线性变换表达位置偏移,并区分不同维度对局部/全局信息的表征。位置编码技术有效解决了模型对序列顺序的感知问题,为处理长/短距离依赖关

weixin_50512050的博客 1081

Minimind项目源代码详细解析(3)RoPE旋转位置编码

旋转位置编码的简要讲解和详细的代码解析

2302_79299164的博客 338

Transformer彻底剖析(8):正余弦位置编码、旋转位置编码

他自然的包含了相对位置信息,为什么,position + k的位置编码可以由位置position的位置编码来线性表示,这样就能证明这个公式包含了相对位置,那么任意pos +k的位置编码都可以由pos的位置编码进行线性变换得到,维度越小,则每个词之间的区别就越大,纬度越大,每个词之间的区别就越小,低纬度用来表示局部信息,高纬度用来表示全局信息。假设词向量只有两个维度,正余弦位置编码采用的是加法,而旋转位置编码采用的是旋转,如果是第m个词,就逆时针旋转m个角度,第n个词,就旋转n个角度,

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 204

12.一文带你搞懂RoPE旋转位置编码-附pytoch代码实现RoPE

12.一文带你搞懂RoPE旋转位置编码-附pytoch代码实现RoPE

zhouwenxing666的博客 283

2024年大模型面试准备(四):大模型面试必会的位置编码(绝对位置编码sinusoidal,旋转位置编码RoPE,以及相对位置编码ALiBi)

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。Transformer 模型在处理序列数据时,其,但这样做的代价是丧失了序列中的元素顺序信息。由于自注意力机制并不考虑元素在序列中的位置,所以在输入序列的任何置换下都是不变的,这就意味着。在许多自然语言处理任务中,,所以需要一种方法来让模型捕获这一信息。

2201_75499313的博客 1718

位置编码再思考及rope来源

position embedding 和 rope

474
上一篇: 【智能体+工作流】利用Coze平台打造高效AI任务执行系统
下一篇: 电容器频率特性解析:从阻抗|Z|到ESR的深度剖析
java5
博客等级 码龄22年 85粉丝 2103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值