Skip to content

필사 모드: RWKV-7 "Goose" 架构分析 — 超越 Transformer 的线性时间模型

中文
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
RWKV-7 Goose Architecture

引言

Transformer 是现代 LLM 的基石,但它存在一个根本性的局限——O(n²) 的注意力开销。RWKV-7 "Goose" 是一种解决这一问题的新型序列建模架构,在实现常数级内存占用每个 token 恒定推理时间的同时,性能可与 Transformer 媲美。

本文深入分析这篇于 2025 年 7 月在 ICML 发表的论文("RWKV-7 Goose with Expressive Dynamic State Evolution")。

RWKV 系列的演进

从 RWKV-4 到 RWKV-7

RWKV(Receptance Weighted Key Value)是一种融合了 RNN 与 Transformer 优点的架构:

  • RWKV-4(2023):引入基础的 WKV 机制。是 Linear Attention 的一种变体
  • RWKV-5 "Eagle"(2024):Multi-headed WKV,性能提升
  • RWKV-6 "Finch"(2024):Data-dependent decay,集成 LoRA
  • RWKV-7 "Goose"(2025)Dynamic State Evolution,突破 TC0 限制

Attention vs Linear Attention vs RWKV-7

# Standard Attention: O(n^2) 时间, O(n) 内存
# output = softmax(Q @ K^T / sqrt(d)) @ V

# Linear Attention: O(n) 时间, O(d^2) 内存(常数)
# output = (Q @ (K^T @ V)) -- 改变矩阵乘法顺序

# RWKV-7: O(n) 时间, O(d^2) 内存(常数)
# + Dynamic State Evolution 将表达能力最大化

核心机制:Dynamic State Evolution

现有 Linear Attention 的局限

现有的 Linear Attention(包括 RWKV-4 到 6)属于 TC0(Threshold Circuit Class 0)。这意味着它在理论上无法求解某些特定问题:

# TC0 限制示例:状态追踪(state tracking)问题
# 输入:"A 在房间1。A 移动到房间2。B 在房间1。A 在哪里?"
# TC0 模型在理论上无法追踪这类状态变化

RWKV-7 的 Dynamic State Evolution

RWKV-7 会根据输入动态改变状态转移矩阵本身

import torch
import torch.nn as nn

class RWKV7_TimeMix(nn.Module):
    """RWKV-7 核心:Dynamic State Evolution"""

    def __init__(self, d_model, n_heads):
        super().__init__()
        self.d_model = d_model
        self.n_heads = n_heads
        self.d_head = d_model // n_heads

        # 输入依赖的参数生成器
        self.W_r = nn.Linear(d_model, d_model)  # Receptance
        self.W_k = nn.Linear(d_model, d_model)  # Key
        self.W_v = nn.Linear(d_model, d_model)  # Value
        self.W_a = nn.Linear(d_model, d_model)  # State transition
        self.W_g = nn.Linear(d_model, d_model)  # Gate

        # Dynamic decay 参数
        self.w_decay = nn.Parameter(torch.randn(n_heads, self.d_head))

        # State evolution matrix 可学习参数
        self.A_log = nn.Parameter(torch.randn(n_heads, self.d_head, self.d_head))

    def forward(self, x, state=None):
        B, T, C = x.shape
        H = self.n_heads
        D = self.d_head

        r = self.W_r(x).view(B, T, H, D)
        k = self.W_k(x).view(B, T, H, D)
        v = self.W_v(x).view(B, T, H, D)
        a = torch.sigmoid(self.W_a(x).view(B, T, H, D))
        g = torch.sigmoid(self.W_g(x).view(B, T, H, D))

        if state is None:
            state = torch.zeros(B, H, D, D, device=x.device)

        outputs = []
        for t in range(T):
            # Dynamic State Evolution:核心创新
            # 以往:state = decay * state + k^T @ v(固定 decay)
            # RWKV-7:state = A(x_t) @ state + k^T @ v(动态转移矩阵)

            # 输入依赖的转移矩阵
            A_t = self._compute_transition(a[:, t], state)

            # State update
            kv = torch.einsum('bhd,bhe->bhde', k[:, t], v[:, t])
            state = A_t * state + kv

            # Output 计算
            out = torch.einsum('bhd,bhde->bhe', r[:, t], state)
            out = out * g[:, t]
            outputs.append(out)

        output = torch.stack(outputs, dim=1).view(B, T, C)
        return output, state

    def _compute_transition(self, a_t, state):
        """根据输入动态生成转移矩阵"""
        # a_t: [B, H, D] - 从当前输入导出的转移参数
        # 这正是 RWKV-7 突破 TC0 的关键所在
        decay = torch.exp(-torch.exp(self.w_decay))
        A = decay.unsqueeze(-1) * torch.eye(
            self.d_head, device=a_t.device
        ).unsqueeze(0)

        # 输入依赖的修正项
        A = A + torch.einsum('bhd,bhe->bhde', a_t, a_t) * \
            torch.exp(self.A_log).unsqueeze(0)

        return A

突破 TC0 的原因

# RWKV-6(以往):state_{t+1} = diag(w) * state_t + k_t * v_t^T
# -> 对角矩阵乘法:每个维度独立地进行 decay
# -> 处于 TC0 范围内:有限深度无法完成状态追踪

# RWKV-7(新):state_{t+1} = A(x_t) * state_t + k_t * v_t^T
# -> A(x_t) 是输入依赖的转移矩阵(非对角)
# -> 维度之间可以相互作用:能够解决状态追踪问题
# -> 表达能力突破了 TC0

整体架构

RWKV-7 Block 组成

class RWKV7Block(nn.Module):
    """RWKV-7 基本 block"""

    def __init__(self, d_model, n_heads):
        super().__init__()
        self.ln1 = nn.LayerNorm(d_model)
        self.ln2 = nn.LayerNorm(d_model)
        self.time_mix = RWKV7_TimeMix(d_model, n_heads)
        self.channel_mix = RWKV7_ChannelMix(d_model)

    def forward(self, x, state=None):
        # Time Mixing(token 间的相互作用)
        h, state = self.time_mix(self.ln1(x), state)
        x = x + h

        # Channel Mixing(承担 FFN 的角色)
        x = x + self.channel_mix(self.ln2(x))

        return x, state


class RWKV7_ChannelMix(nn.Module):
    """channel mixing(SwiGLU 变体)"""

    def __init__(self, d_model, expand=3.5):
        super().__init__()
        hidden = int(d_model * expand)
        self.W_key = nn.Linear(d_model, hidden)
        self.W_value = nn.Linear(hidden, d_model)
        self.W_gate = nn.Linear(d_model, hidden)

    def forward(self, x):
        k = self.W_key(x)
        v = self.W_value(torch.relu(k) ** 2)  # squared ReLU
        g = torch.sigmoid(self.W_gate(x))
        return v * g

推理模式:以 RNN 方式运行

class RWKV7_Inference:
    """推理时以 RNN 模式运行:每个 token 需要 O(d^2) 计算量"""

    def __init__(self, model):
        self.model = model
        self.states = None  # [n_layers, n_heads, d_head, d_head]

    def generate_token(self, token_id):
        x = self.model.embed(token_id)

        for i, block in enumerate(self.model.blocks):
            x, self.states[i] = block(x.unsqueeze(0).unsqueeze(0),
                                       self.states[i])
            x = x.squeeze(0).squeeze(0)

        logits = self.model.head(self.model.ln_out(x))
        return logits

    # 内存占用:与序列长度无关,恒定不变!
    # Transformer:KV Cache 占用 O(n * d) 内存
    # RWKV-7:State 占用 O(d^2) 固定内存

基准测试结果

3B 模型对比(基于论文 Table 1)

模型参数量MMLUHellaSwagARC-E推理内存
LLaMA-3.2 3B3.2B63.477.279.5O(n) KV Cache
Mamba-2 2.7B2.7B58.173.874.2O(1) 常数
RWKV-6 3B3.0B58.974.575.1O(1) 常数
RWKV-7 3B3.0B61.276.878.3O(1) 常数

多语言基准测试(RWKV-7 的优势所在)

# RWKV-7 在多语言场景中表现尤为出色
# 使用 100+ 种语言训练,在英语以外的语言上达到 SOTA 级水平

# 在韩语/日语/中文基准测试中
# 相较同尺寸的 Transformer 表现更优
# -> 多语言分词效率 + 长上下文处理能力

推理效率

# 按序列长度对比推理成本
#
# Sequence Length | Transformer | RWKV-7
# 1K             | 1x          | 0.8x
# 4K             | 4x          | 0.8x
# 16K            | 16x         | 0.8x
# 64K            | 64x         | 0.8x
# 1M             | OOM         | 0.8x
#
# RWKV-7 的成本与序列长度无关,始终恒定!

实战:使用 RWKV-7

从 Hugging Face 加载模型

# pip install rwkv torch transformers

from rwkv.model import RWKV
from rwkv.utils import PIPELINE

# 加载模型
model = RWKV(
    model='/path/to/RWKV-7-World-3B',
    strategy='cuda fp16'  # GPU FP16
)

pipeline = PIPELINE(model, "rwkv_vocab_v20230424")

# 文本生成
context = "Kubernetes VPA 的优点是"
result = pipeline.generate(
    context,
    token_count=200,
    temperature=0.8,
    top_p=0.9
)
print(result)

用 vLLM 提供服务

# RWKV-7 vLLM 服务(实验性支持)
pip install vllm>=0.6.0

python -m vllm.entrypoints.openai.api_server \
  --model RWKV/rwkv-7-world-3b \
  --tokenizer RWKV/rwkv-7-world-3b \
  --dtype float16 \
  --max-model-len 32768

用 Ollama 本地运行

# 下载 RWKV-7 GGUF 模型后
ollama create rwkv7 -f Modelfile

# Modelfile 示例:
# FROM rwkv-7-world-3b-q4_k_m.gguf
# PARAMETER temperature 0.7
# PARAMETER num_ctx 32768

ollama run rwkv7

RWKV-7 vs Mamba-2 vs Transformer

架构对比

特性TransformerMamba-2RWKV-7
时间复杂度O(n²)O(n)O(n)
推理内存O(n·d) KV CacheO(d²) 常数O(d²) 常数
并行训练完全并行分块并行完全并行
表达能力超越 TC0TC0超越 TC0
硬件优化程度成熟发展中发展中

什么情况下应该选择 RWKV-7?

# 适合 RWKV-7 的场景:
# 1. 处理超长上下文(100K+ token)
# 2. 边缘设备推理(常数内存)
# 3. 多语言服务(韩语/日语/中文等)
# 4. 实时流式处理(每个 token 耗时恒定)

# Transformer 仍然更优的场景:
# 1. 需要极致性能时(尤其是英语)
# 2. 短上下文(1K 以下)
# 3. 需要利用现有生态系统/工具

结语

RWKV-7 Goose 是一种创新架构,在保持常数内存 + 线性时间这一效率优势的同时,达成了Transformer 级别的性能。通过 Dynamic State Evolution,它突破了现有 Linear Attention 的理论局限(TC0),尤其在多语言和长上下文场景中表现出优势。


📝 测验(7 题)

Q1. RWKV-7 推理时的内存复杂度是多少? O(d²) 常数——与序列长度无关

Q2. TC0(Threshold Circuit Class 0)的局限是什么? 有限深度的 Linear Attention 在理论上无法解决状态追踪(state tracking)这类问题

Q3. RWKV-7 突破 TC0 的核心机制是什么? Dynamic State Evolution——输入依赖的转移矩阵 A(x_t) 使维度间的相互作用成为可能

Q4. Transformer 的推理内存为何是 O(n·d)? 因为 KV Cache 会随序列长度成比例增长

Q5. RWKV-7 为何能在训练时并行处理? WKV 运算具有可按分块单位并行化的结构

Q6. RWKV-7 为何在多语言场景中表现尤为出色? 使用 100+ 种语言训练的 World 分词器 + 高效的长上下文处理能力

Q7. RWKV-7 的 Channel Mix 中使用的激活函数是什么? Squared ReLU(ReLU 的平方)

현재 단락 (1/143)

Transformer 是现代 LLM 的基石,但它存在一个根本性的局限——**O(n²) 的注意力开销**。RWKV-7 "Goose" 是一种解决这一问题的新型序列建模架构,在实现**常数级内存占...

작성 글자: 0원문 글자: 6,542작성 단락: 0/143