计算复杂度

1. 核心概念解释

首先,我们来理解几个关键概念:

  • 流式训练 (Streaming Training): 工业级推荐系统的数据是源源不断产生的。流式训练指的是模型在一个数据流上持续不断地进行训练,而不是像传统方法那样在固定的数据集上进行多轮(epochs)训练。每次训练可能只使用一小批新产生的数据(比如过去一小时的用户行为)。
  • 曝光粒度的训练 (Impression-level Training): 这是传统排序模型(如深度学习时代的DIN, DIEN等)的常见做法。每一次“曝光”(即系统向用户展示一个或多个物品)都会产生一个训练样本。如果一个用户在一次会话中看了100个视频,这就可能产生100个独立的训练样本。每个样本都包含完整的用户历史序列和当前的“目标物品”。
  • 序列转导框架 (Sequence Transduction Framework): 指的是像Transformer这样,将一个输入序列映射到一个输出序列的模型。
  • 生成式训练 (Generative Training): 这是HSTU采用的方法。它不像曝光粒度那样为每个行为都创建一个独立的样本,而是将一个用户的整个行为序列看作一个训练样本。模型的目标是自回归地预测这个序列中的下一个(正向)行为。
  • N_u: 用户 u 的历史行为序列长度(token数量)。
  • D: Embedding的维度。

2. 传统曝光粒度训练的计算复杂度分析

我们来推导为什么曝光粒度训练,每个用户的复杂度是 O(N_u(N_u^2*D+N_u*D_{iff}*D)) ,其中 D_{iff}是MLP的隐藏维度。

假设一个用户有 N_u 个历史行为。在曝光粒度的训练模式下,这 N_u​ 个行为会产生 N_u 个训练样本。

  • 样本1: 历史 [v_1], 目标 v_2
  • 样本2: 历史 [v_2, v_1], 目标 v_3
  • ...
  • 样本N_u-1: 历史 [v_{N_u-1}, ..., v_1], 目标 v_{N_u}

现在我们分析处理这一个用户所有样本的总计算量:

a) Self-Attention部分的开销: O(N_u^3*D)

让我们看第 k 个训练样本,其历史序列长度为 k。 Transformer中Self-Attention的核心计算是三个矩阵乘法:

  1. Q = X @ W_Q, K = X @ W_K, V = X @ W_V
    • X 是输入矩阵,维度 [k, D]W_Q, W_K, W_V 是权重矩阵,维度 [D, D]
    • 计算复杂度为 O(k*D^2)
  2. AttentionScores = Q @ K^T
    • Q 维度 [k, D]K^T 维度 [D, k]
    • 计算复杂度为O(k^2*D)这是最昂贵的一步。
  3. Output = AttentionScores @ V
    • AttentionScores 维度 [k, k]V 维度 [k, D]
    • 计算复杂度为 O(k^2*D)

所以,处理一个长度为 k 的序列,Self-Attention的开销主要是O(k^2*D)

现在,我们要处理从 k=1 到 k=N_u的所有样本。总计算量是把所有样本的开销加起来:

Total Attention Cost=\sum_{k=1}^{N_u}O(k^2*D)=O(D)\sum_{k=1}^{N_u}k^2

根据平方和公式 \sum_{k=1}^{N_u} k^2=\frac{n(n+1)(2n+1)}{6},我们知道 \sum_{k=1}^{N_u}k^2 的复杂度是 O(N_u^3)。 所以,Self-Attention部分的总开销是 O(N_u^3*D)

b) Pointwise MLP层的开销: O(N_u^2*D^2)

Pointwise MLP层(也叫Feed-Forward Network)通常是两个全连接层。

  1. 第一个FC层:Output_1 = ReLU(Input @ W_1 + b_1)
    • Input 维度 [k, D]W_1 维度 [D, 4D](通常中间层会扩大4倍)。
    • 计算复杂度为O(k*D*4D)=O(k*D^2)
  2. 第二个FC层:Output_2 = Input @ W_2 + b_2
    • Input 维度 [k, 4D]W_2 维度 [4D, D]
    • 计算复杂度为 O(k*4D*D)=O(k*D^2)

所以,处理一个长度为 k 的序列,MLP层的开销是 O(k*D^2)

同样,我们要处理从 k=1 到 k=N_u 的所有样本。总计算量是:

Total MLP Cost=\sum_{k=1}^{N_u}O(k*D^2)=O(D^2)\sum_{k=1}^{N_u}k

根据等差数列求和公式 \sum_{k=1}^{n}k=\frac{n(n+1))}{2}​,我们知道 \sum_{k=1}^{N_u}k 的复杂度是 O(N_u^2)。 所以,Pointwise MLP部分的总开销是O(N_u^2*D^2)

c) 总复杂度

总计算量 = Attention开销 + MLP开销 = O(N_u^3*D)+O(N_u^2*D^2)=O(N_u(N_u^2*D+N_u*D^2))

3. 生成式训练如何降低计算复杂度

现在,我们来看HSTU的生成式训练如何解决这个问题。

在生成式训练中,一个用户的整个序列 [v_1, v_2, ..., v_{N_u}] 只作为一个训练样本被输入到模型中。

模型只需要做一次前向传播。在这次前向传播中,通过使用因果掩码(Causal Mask),Transformer可以并行地计算出所有时间步的预测结果。

  • 在位置1,模型预测 v_2
  • 在位置2,模型预测 v_3
  • ...
  • 在位置 N_{u-1},模型预测 v_{N_u}

所有这些预测的损失可以一次性计算并相加(当然,会使用损失掩码忽略掉负反馈等)。

现在我们来分析这次单次前向传播的计算量:

  • Self-Attention开销: 输入序列长度为 N_u​,根据前面的分析,开销是 O(N_u^2*D)
  • Pointwise MLP开销: 输入序列长度为 N_u​,开销是 O(N_u*D^2)

总计算量 = O(N_u^2*D)+O(N_u*D^2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值