| 第19行: |
第19行: |
| | | | |
| | === 核心特点: === | | === 核心特点: === |
| − | RWKV 模型结合了 Transformer 与 RNN 的优点,具备以下几个显著特性: | + | RWKV 模型结合了 [[Transformer架构|Transformer]] 与 [[RNN]] 的优点,具备以下几个显著特性: |
| | | | |
| − | *线性推理效率:RWKV 采用类 RNN 的时间递推结构,每一步仅依赖前一状态,推理时无需处理整个上下文,具备常数内存与线性时间复杂度,适合实时和资源受限场景,'''提高线性推理效率'''。 | + | *线性推理效率:RWKV 采用类 [[RNN]] 的时间递推结构,每一步仅依赖前一状态,推理时无需处理整个上下文,具备常数内存与线性时间复杂度,适合实时和资源受限场景,'''提高线性推理效率'''。 |
| − | *并行训练能力:尽管具有递归结构,RWKV 引入了 Token-Shift与 Time-Mix<ref name=":1">Peng B, Alcaide E, Anthony Q, et al. Rwkv: Reinventing rnns for the transformer era[J]. arXiv preprint arXiv:2305.13048, 2023.</ref> 等机制,使其训练过程可以像 Transformer 一样实现高度并行,显著提升训练效率。 | + | *并行训练能力:尽管具有递归结构,RWKV 引入了 Token-Shift与 Time-Mix<ref name=":1">Peng B, Alcaide E, Anthony Q, et al. Rwkv: Reinventing rnns for the transformer era[J]. arXiv preprint arXiv:2305.13048, 2023.</ref> 等机制,使其训练过程可以像 [[Transformer架构|Transformer]] 一样实现高度并行,显著提升训练效率。 |
| − | *兼容 Transformer 的训练范式:RWKV 可无缝使用 Transformer 社区常见的预训练与微调方法(如语言建模、指令微调、LoRA 等),便于迁移与应用。 | + | *兼容 [[Transformer架构|Transformer]] 的训练范式:RWKV 可无缝使用 [[Transformer架构|Transformer]] 社区常见的预训练与微调方法(如语言建模、指令微调、[[LoRA]] 等),便于迁移与应用。 |
| − | *更低的部署成本:推理过程中不需要全序列缓存和大规模注意力计算,相比传统 Transformer 更轻量,适合部署在边缘设备或移动端。 | + | *更低的部署成本:推理过程中不需要全序列缓存和大规模注意力计算,相比传统 [[Transformer架构|Transformer]] 更轻量,适合部署在边缘设备或移动端。 |
| | *良好的开源生态与可扩展性:RWKV 项目高度开源,已有多个版本(如 RWKV-4、RWKV-5)和大规模中文/多语种预训练模型,社区活跃,便于研究与应用拓展。 | | *良好的开源生态与可扩展性:RWKV 项目高度开源,已有多个版本(如 RWKV-4、RWKV-5)和大规模中文/多语种预训练模型,社区活跃,便于研究与应用拓展。 |
| − | 这些特点使 RWKV 成为 Transformer 架构的有力替代方案之一,尤其适合需要高效推理与轻量部署的自然语言处理任务。 | + | 这些特点使 RWKV 成为 [[Transformer架构|Transformer]] 架构的有力替代方案之一,尤其适合需要高效推理与轻量部署的自然语言处理任务。 |
| | | | |
| | ---- | | ---- |
| | | | |
| | == RWKV 模型结构 == | | == RWKV 模型结构 == |
| − | '''RWKV''' 是 '''[[循环神经网络]]''' 的一个变体。在深入探讨 RWKV 之前,我们有必要先了解 RNN 的基本原理,特别是其 '''隐藏状态(Hidden State)''' 的概念。 | + | '''RWKV''' 是 '''[[循环神经网络]]''' 的一个变体。在深入探讨 RWKV 之前,我们有必要先了解 [[RNN]] 的基本原理,特别是其 '''隐藏状态(Hidden State)''' 的概念。 |
| | | | |
| | === RNN 架构与隐藏状态 === | | === RNN 架构与隐藏状态 === |
| 第53行: |
第53行: |
| | | | |
| | * '''LayerNorm''' | | * '''LayerNorm''' |
| − | LayerNorm 的标准定义如下:
| |
| | | | |
| − | :<math>\text{LayerNorm}(x) = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \cdot \gamma + \beta</math>
| |
| − |
| |
| − | 其中:
| |
| − |
| |
| − | <math>x \in \mathbb{R}^d</math>:输入向量
| |
| − |
| |
| − | <math>\mu = \frac{1}{d} \sum_{i=1}^{d} x_i</math>:均值
| |
| − |
| |
| − | <math>\sigma^2 = \frac{1}{d} \sum_{i=1}^{d} (x_i - \mu)^2</math>:方差
| |
| − |
| |
| − | <math>\epsilon</math>:小常数,防止除零
| |
| − |
| |
| − | <math>\gamma, \beta</math>:可学习的缩放和平移参数
| |
| − |
| |
| − | LayerNorm 通常作用于每个时间步的输入向量 <math>x_t</math>,即:
| |
| − |
| |
| − | :<math>\tilde{x}_t = \text{LayerNorm}(x_t)</math>
| |
| − |
| |
| − | 然后将 <math>\tilde{x}_t</math> 用于后续的 TimeMix 操作,如:
| |
| − |
| |
| − | :<math>k_t = W_k \cdot \left(\tilde{x}t \cdot (1 - w{\text{mixk}}) + \tilde{x}{t-1} \cdot w{\text{mixk}}\right)</math>
| |
| | * '''TimeMix''' | | * '''TimeMix''' |
| | TimeMix 的核心计算过程如下: | | TimeMix 的核心计算过程如下: |
| 第102行: |
第80行: |
| | | | |
| | * '''ChannelMix''' | | * '''ChannelMix''' |
| − | 类似 Transformer 的 FFN 模块。
| + | * <math>\mathrm{output} = \mathrm{ReLU}(W_1 \times x + b_1) \times W_2 + b_2</math> |
| − | 其数学形式如下:
| + | ** 类似 Transformer 的 FFN 模块。 |
| − | :<math>\mathrm{FFN}(x) = \mathrm{ReLU}(W_1 x + b_1) W_2 + b_2</math>
| + | ** 激活函数通常使用 ReLU,公式如下: |
| − | | + | ** x:当前输入向量; |
| − | 其中:
| + | ** W1,W2:权重矩阵; |
| − | | + | ** b1,b2:偏置项; |
| − | <math>x \in \mathbb{R}^d</math>:当前时间步的输入向量
| + | ** ReLU:常用的非线性激活函数。 |
| − | | |
| − | <math>W_1 \in \mathbb{R}^{d \times d_{ff}},; W_2 \in \mathbb{R}^{d_{ff} \times d}</math>:线性变换的权重矩阵
| |
| − | | |
| − | <math>b_1 \in \mathbb{R}^{d_{ff}},; b_2 \in \mathbb{R}^{d}</math>:对应的偏置项
| |
| − | | |
| − | <math>\mathrm{ReLU}(z) = \max(0, z)</math>:常用的非线性激活函数 ReLU
| |
| | ChannelMix 模块在 RWKV 中承担的是特征变换的职责,它不涉及时间递推,仅作用于当前 token 的维度方向。通过堆叠多个 RWKV Block(包含 TimeMix 和 ChannelMix),模型可以逐步构建复杂的时间和特征层级信息。该模块的设计让 RWKV 能够在保持推理效率的同时,具备强大的特征建模能力。 | | ChannelMix 模块在 RWKV 中承担的是特征变换的职责,它不涉及时间递推,仅作用于当前 token 的维度方向。通过堆叠多个 RWKV Block(包含 TimeMix 和 ChannelMix),模型可以逐步构建复杂的时间和特征层级信息。该模块的设计让 RWKV 能够在保持推理效率的同时,具备强大的特征建模能力。 |
| | * '''Token-Shift''' | | * '''Token-Shift''' |
| 第120行: |
第92行: |
| | [[文件:Tokenshift.png|缩略图|居中|rwkv-architecture-for-language-modeling<ref name=":1" />]] | | [[文件:Tokenshift.png|缩略图|居中|rwkv-architecture-for-language-modeling<ref name=":1" />]] |
| | *'''注意力层简化表达''' | | *'''注意力层简化表达''' |
| − | RWKV 模型通过递归方式模拟注意力机制,其注意力层的核心表达式如下:
| + | *<math>x_{t+1} = \sigma(Rx_t) \cdot \frac{\exp(Kx_t) \cdot (Vx_t) + \exp(W) \cdot a_t}{\exp(Kx_t) + \exp(W) \cdot b_t} </math> |
| − | | + | *xt:当前时间步的输入向量; |
| − | <math> | + | *xt+1:下一时间步的输出; |
| − | x_{t+1} = \sigma(R x_t) \cdot \frac{\exp(K x_t) \cdot a_t + \exp(W) \cdot (V x_t)}{\exp(K x_t) + \exp(W) \cdot b_t} | + | *R,K,V:分别表示 RWKV 中的 '''Receptance(门控)、Key、Value''' 投影矩阵; |
| − | </math>
| + | *W:时间衰减常数,是可学习参数,用于模拟历史的指数衰减; |
| − | | + | *at,bt:前一时刻累积的加权值与归一化因子,用于递归地保留历史信息; |
| − | 其中:
| + | *σ(Rxt):Receptance 门控函数,控制信息是否更新,相当于 LSTM 的门结构; |
| − | | + | *分数部分(分子/分母):模拟了注意力加权求和的效果,只不过是用递推形式累积,而非对整段序列做自注意力计算。 |
| − | <math>x_t</math>:当前时间步的输入向量;
| + | 这个表达式体现的是 '''RWKV 用递推的方式模拟注意力机制'''。不同于 Transformer 的全局注意力(需要对所有 token 做乘积和归一化),RWKV 在每一个时间步只更新当前与历史的加权平均值,用指数衰减模拟注意力分布,极大地提高了推理效率。 |
| − | | |
| − | <math>x_{t+1}</math>:下一时间步的输出向量;
| |
| − | | |
| − | <math>R, K, V</math>:分别表示 RWKV 中的 Receptance(门控)、Key、Value 的线性投影矩阵;
| |
| − | | |
| − | <math>W</math>:时间衰减常数,是一个可学习参数,用于模拟历史信息的指数衰减;
| |
| − | | |
| − | <math>a_t, b_t</math>:前一时刻累积的加权值与归一化因子,用于递归地保留历史状态;
| |
| − | | |
| − | <math>\sigma(R x_t)</math>:Receptance 门控函数,控制新信息是否被写入输出,功能类似于 LSTM 中的门控机制;
| |
| − | 分数部分(分子/分母):模拟了注意力加权求和的效果,但通过递推方式实现,而非传统 Transformer 中的全局自注意力机制。 | |
| − | 该表达式体现了 RWKV 的核心思想:通过递推公式模拟注意力机制 。与 Transformer 中需对整个序列进行自注意力计算不同,RWKV 在每个时间步仅更新当前输入与历史信息的加权平均,利用指数衰减结构模拟注意力分布,从而大幅提升了推理效率,同时保持了长程依赖建模能力。
| |
| | * '''核心机制代码''' | | * '''核心机制代码''' |
| | <syntaxhighlight lang="python3"> | | <syntaxhighlight lang="python3"> |
| 第183行: |
第143行: |
| | | | |
| | === 推理 === | | === 推理 === |
| − | * 类似 RNN,每步只依赖上一步状态 | + | * 类似 [[RNN]],每步只依赖上一步状态 |
| | * 推理内存 O(1),不需上下文缓存 | | * 推理内存 O(1),不需上下文缓存 |
| | | | |
| 第935行: |
第895行: |
| | |} | | |} |
| | | | |
| − | === RWKV与Transformer的差异 === | + | === RWKV与[[Transformer架构|Transformer]]的差异 === |
| | | | |
| − | RWKV (Receptance Weighted Key Value) 架构和Transformer架构都是在自然语言处理领域取得成功的深度学习模型,但它们在处理序列数据的方式上有着根本性的区别。以下是它们的详细对比: | + | RWKV (Receptance Weighted Key Value) 架构和[[Transformer架构|Transformer]]架构都是在自然语言处理领域取得成功的深度学习模型,但它们在处理序列数据的方式上有着根本性的区别。以下是它们的详细对比: |
| | | | |
| − | ==== Transformer 架构 ==== | + | ==== [[Transformer架构|Transformer]] 架构 ==== |
| − | 核心思想: Transformer 架构的核心是自注意力机制(Self-Attention),它允许模型在处理序列中的每个元素时,同时考虑序列中的所有其他元素,并根据它们之间的相关性分配不同的权重。 | + | 核心思想: [[Transformer架构|Transformer]] 架构的核心是自注意力机制(Self-Attention),它允许模型在处理序列中的每个元素时,同时考虑序列中的所有其他元素,并根据它们之间的相关性分配不同的权重。 |
| | | | |
| − | Transformer 中的注意力机制可表示为: | + | [[Transformer架构|Transformer]] 中的注意力机制可表示为: |
| | :<math>\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^\top}{\sqrt{d_k}} \right) V</math> | | :<math>\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^\top}{\sqrt{d_k}} \right) V</math> |
| | 其中: | | 其中: |
| 第951行: |
第911行: |
| | 主要特点: | | 主要特点: |
| | | | |
| − | *并行性: 自注意力机制允许对序列中的所有位置进行并行计算,这使得Transformer在训练过程中能够充分利用GPU等并行计算硬件,大大缩短了训练时间。 | + | *并行性: 自注意力机制允许对序列中的所有位置进行并行计算,这使得[[Transformer架构|Transformer]]在训练过程中能够充分利用GPU等并行计算硬件,大大缩短了训练时间。 |
| − | *长距离依赖: 通过直接计算任意两个位置之间的注意力权重,Transformer能够有效地捕获序列中的长距离依赖关系,克服了传统RNN(循环神经网络)在处理长序列时遇到的梯度消失/爆炸问题。 | + | *长距离依赖: 通过直接计算任意两个位置之间的注意力权重,[[Transformer架构|Transformer]]能够有效地捕获序列中的长距离依赖关系,克服了传统[[RNN]](循环神经网络)在处理长序列时遇到的梯度消失/爆炸问题。 |
| | *位置编码(Positional Encoding): 由于自注意力机制本身不包含序列顺序信息,Transformer通过在输入嵌入中添加位置编码来引入位置信息,通常是使用正弦和余弦函数。 | | *位置编码(Positional Encoding): 由于自注意力机制本身不包含序列顺序信息,Transformer通过在输入嵌入中添加位置编码来引入位置信息,通常是使用正弦和余弦函数。 |
| | *编码器-解码器结构: 经典的Transformer通常包含一个编码器堆栈和一个解码器堆栈,编码器处理输入序列,解码器生成输出序列。每个编码器和解码器层都包含多头自注意力机制和前馈神经网络。 | | *编码器-解码器结构: 经典的Transformer通常包含一个编码器堆栈和一个解码器堆栈,编码器处理输入序列,解码器生成输出序列。每个编码器和解码器层都包含多头自注意力机制和前馈神经网络。 |
| | *二次复杂度: 传统的自注意力机制的计算复杂度与序列长度的平方成正比(O(L^2)),这使得处理非常长的序列变得计算密集且内存消耗大。 | | *二次复杂度: 传统的自注意力机制的计算复杂度与序列长度的平方成正比(O(L^2)),这使得处理非常长的序列变得计算密集且内存消耗大。 |
| | ==== RWKV 架构 ==== | | ==== RWKV 架构 ==== |
| − | 核心思想: RWKV 旨在结合RNN的效率和Transformer的性能,它将Transformer的并行训练能力与RNN的常数时间推理能力相结合,实现了一种“线性的注意力机制”。 | + | 核心思想: RWKV 旨在结合[[RNN]]的效率和[[Transformer架构|Transformer]]的性能,它将[[Transformer架构|Transformer]]的并行训练能力与[[RNN]]的常数时间推理能力相结合,实现了一种“线性的注意力机制”。 |
| | | | |
| | RWKV 模拟注意力计算的一种核心结构是 WKV,其计算可简化为如下形式: | | RWKV 模拟注意力计算的一种核心结构是 WKV,其计算可简化为如下形式: |
| 第972行: |
第932行: |
| | 主要特点: | | 主要特点: |
| | | | |
| − | *线性注意力(Linear Attention): RWKV的核心创新是其线性的WKV(Weighted Key Value)机制。与Transformer的二次复杂度注意力不同,RWKV的计算复杂度与序列长度呈线性关系(O(L))。它通过维护一个递归的隐藏状态来实现这一点,有效地聚合了历史信息。 | + | *线性注意力(Linear Attention): RWKV的核心创新是其线性的WKV(Weighted Key Value)机制。与[[Transformer架构|Transformer]]的二次复杂度注意力不同,RWKV的计算复杂度与序列长度呈线性关系(O(L))。它通过维护一个递归的隐藏状态来实现这一点,有效地聚合了历史信息。 |
| − | *并行训练与序列推理: RWKV在训练时可以像Transformer一样并行计算,但在推理时则以常数时间(O(1))进行,因为它只需要维护一个固定大小的隐藏状态,而不需要重新计算整个序列的注意力。这使得RWKV在长序列推理任务中具有显著的效率优势。 | + | *并行训练与序列推理: RWKV在训练时可以像[[Transformer架构|Transformer]]一样并行计算,但在推理时则以常数时间(O(1))进行,因为它只需要维护一个固定大小的隐藏状态,而不需要重新计算整个序列的注意力。这使得RWKV在长序列推理任务中具有显著的效率优势。 |
| | *时间混合(Time-Mixing)和通道混合(Channel-Mixing): RWKV的每个块由时间混合和通道混合两个主要部分组成。 | | *时间混合(Time-Mixing)和通道混合(Channel-Mixing): RWKV的每个块由时间混合和通道混合两个主要部分组成。 |
| − | *时间混合: 替代了Transformer的自注意力机制,它通过Receptance (R)、Weight (W)、Key (K) 和 Value (V) 向量的巧妙组合,以递归的方式处理序列信息,并引入了时间衰减因子来模拟信息随时间衰减的特性。 | + | *时间混合: 替代了[[Transformer架构|Transformer]]的自注意力机制,它通过Receptance (R)、Weight (W)、Key (K) 和 Value (V) 向量的巧妙组合,以递归的方式处理序列信息,并引入了时间衰减因子来模拟信息随时间衰减的特性。 |
| − | *通道混合: 类似于Transformer中的前馈神经网络,对特征维度进行非线性变换,但可能包含额外的门控机制以控制信息流。 | + | *通道混合: 类似于[[Transformer架构|Transformer]]中的[[前馈神经网络]],对特征维度进行非线性变换,但可能包含额外的[[门控机制]]以控制信息流。 |
| | *Token Shifting: RWKV引入了Token Shifting机制,通过线性插值当前和前一个token的嵌入来为每个块提供时间上下文,这有助于模型更好地理解序列中的局部依赖。 | | *Token Shifting: RWKV引入了Token Shifting机制,通过线性插值当前和前一个token的嵌入来为每个块提供时间上下文,这有助于模型更好地理解序列中的局部依赖。 |
| − | *没有位置编码: RWKV的设计使其能够通过其时间混合机制自然地处理序列顺序信息,因此不需要像Transformer那样显式添加位置编码。 | + | *没有位置编码: RWKV的设计使其能够通过其时间混合机制自然地处理序列顺序信息,因此不需要像[[Transformer架构|Transforme]]r那样显式添加位置编码。 |
| | '''优势''' | | '''优势''' |
| | * 运行和训练时资源使用更低(VRAM、CPU、GPU 等)。 | | * 运行和训练时资源使用更低(VRAM、CPU、GPU 等)。 |
| − | * 与较大上下文的 Transformer 相比,计算需求低 10 倍到 100 倍。 | + | * 与较大上下文的 [[Transformer架构|Transformer]] 相比,计算需求低 10 倍到 100 倍。 |
| | * 支持以线性方式扩展到任何上下文长度(Transformer 以二次方扩展)。 | | * 支持以线性方式扩展到任何上下文长度(Transformer 以二次方扩展)。 |
| | * 在答案质量和泛化能力方面的表现与 Transformer 架构一样好。 | | * 在答案质量和泛化能力方面的表现与 Transformer 架构一样好。 |