4. 分流算法:哈希分流、分层分流、自适应分流(如 Multi-armed Bandit)的原理与对比

分流算法是 A/B 实验平台的“交通调度员”,决定了流量如何被分配到不同的实验组。不同的算法在稳定性、灵活性、样本利用效率上存在显著差异。本节深入剖析三种主流分流算法的核心原理与适用场景。

4.1 哈希分流:确定性分桶的基石

哈希分流是最基础、最广泛使用的分流方法。它通过哈希函数将用户标识(如 user_id)映射到一个固定的数值空间,再根据预设的流量比例进行分桶。

核心原理: 对用户 ID 进行哈希运算 → 取模或映射到 [0, 100) 区间 → 根据区间归属决定实验组。

关键步骤:

  1. 选择哈希函数: 常用 MD5、MurmurHash、CityHash 等,要求均匀分布且计算高效。
  2. 确定分桶空间: 通常将哈希值映射到 0~99 或 0~9999 的整数空间。
  3. 分配流量比例: 例如实验组 A 占 10%(桶号 0~9),对照组 B 占 90%(桶号 10~99)。
  4. 保证一致性: 同一用户在不同时间、不同实验中的分桶结果稳定不变。

优点:

  • 确定性: 同一用户始终进入同一分组,保证实验可复现。
  • 无状态: 无需存储用户分组信息,计算即可得出结果。
  • 易于实现: 算法简单,计算开销极低。

缺点:

  • 流量浪费: 流量比例固定,无法动态调整。
  • 样本量固定: 无法根据实验效果动态增加或减少某组的样本量。
  • 多实验冲突: 多个实验同时运行时,若使用同一哈希空间,可能产生交互干扰。
实践建议: 哈希分流适用于流量充足、实验周期固定、需要严格随机分组的场景。建议使用独立哈希盐值(salt)来隔离不同实验,避免分桶重叠。
哈希分流流程示意图 用户 ID 哈希函数 (MD5) 映射 [0, 99] 桶号 0~9: 实验组 A 桶号 10~99: 对照组 B 特点:同一用户始终进入同一分组,无状态计算,流量比例固定

4.2 分层分流:正交实验的流量复用

分层分流(Layer-based Traffic Split)解决了多实验并行时的流量冲突问题。它将流量在逻辑上划分为多个“层”(Layer),每个层独立进行哈希分桶,并通过正交设计保证各层之间的实验互不干扰。

核心原理: 每个实验层使用独立的哈希盐值 → 同一用户在不同层中进入不同的随机分桶 → 实现流量正交复用。

分层分流的关键设计:

设计要素 说明 典型实现
层(Layer) 逻辑上的独立实验空间,每个层拥有独立的哈希空间 Layer_A: salt="exp_ui", Layer_B: salt="exp_recommend"
正交性 同一用户在不同层中的分桶结果相互独立 使用不同哈希盐值 + 独立随机种子
流量分配 每个层可以独立设置流量比例,互不影响 层 A 用 10% 流量,层 B 用 20% 流量
域(Domain) 一组互斥的实验层,同一域内的实验不能同时运行 UI 实验域、算法实验域

优点:

  • 流量复用: 同一用户可同时参与多个不同层的实验,大幅提升流量利用率。
  • 互不干扰: 正交设计保证各层实验效果独立,避免交叉污染。
  • 灵活扩展: 新增实验只需在空闲层中分配流量,无需重新调整已有实验。

缺点:

  • 实现复杂: 需要维护层、域、盐值的映射关系,系统设计复杂度较高。
  • 层数限制: 层数过多可能导致每个层的样本量不足,影响统计功效。
  • 域冲突管理: 同一域内的实验需要互斥,增加了实验编排的难度。
常见陷阱: 分层分流不等于“流量叠加”。如果两个实验修改同一页面元素(属于同一域),必须设置为互斥实验,否则会产生严重的交互效应,导致实验结果不可信。
分层分流架构图 总流量 100% 层 A (UI 实验) 实验 A1 (10%) 实验 A2 (10%) 对照组 (80%) 层 B (推荐算法) 实验 B1 (20%) 实验 B2 (20%) 对照组 (60%) 同一用户可同时参与层 A 和层 B 的实验,互不干扰 每个层使用独立哈希盐值,保证正交性

4.3 自适应分流:动态优化的 Multi-armed Bandit

自适应分流(Adaptive Traffic Allocation)打破了传统 A/B 测试的“先固定比例、后分析结果”模式。它利用 Multi-armed Bandit(MAB)算法,在实验进行过程中动态调整流量分配,将更多流量导向表现更好的方案,从而最小化实验期间的“机会成本”。

核心原理: 在“探索”(Exploration:尝试未知方案)与“利用”(Exploitation:使用当前最优方案)之间寻找平衡,动态优化流量分配。

常见的 MAB 算法:

算法 策略 适用场景 收敛速度
Epsilon-Greedy 以 ε 概率随机探索,以 1-ε 概率选择当前最优 简单场景,快速实现 中等
UCB (Upper Confidence Bound) 选择置信区间上界最高的方案,兼顾均值与不确定性 需要理论保证的场景 较快
Thompson Sampling 基于贝叶斯后验概率采样,选择采样值最大的方案 效果最优,工业界首选 快
EXP3 适用于非平稳环境,能应对对手策略变化 广告竞价、动态环境 较慢

Thompson Sampling 伪代码示例:

# Thompson Sampling 伪代码
for each round t:
    for each arm i:
        # 从 Beta 后验分布中采样
        theta_i = Beta(alpha_i + success_i, beta_i + failure_i).sample()
    # 选择采样值最大的臂
    chosen_arm = argmax(theta_i)
    # 执行实验,观察结果
    reward = pull_arm(chosen_arm)
    # 更新后验参数
    if reward == 1:
        success[chosen_arm] += 1
    else:
        failure[chosen_arm] += 1

优点:

  • 样本效率高: 自动将流量集中到表现好的方案,减少在差方案上的浪费。
  • 实时优化: 实验过程中持续调整,适合需要快速决策的场景。
  • 降低机会成本: 相比固定比例分流,MAB 在实验期间的总收益更高。

缺点:

  • 统计推断复杂: 传统 p 值/置信区间不再适用,需要专门的停止规则。
  • 不适用于长期效果评估: 动态调整可能引入偏差,影响对方案长期效果的估计。
  • 实现门槛高: 需要实时反馈系统、奖励计算和参数更新机制。
实践建议: MAB 适合“快速选出最优方案”的场景,如广告创意优选、推送文案测试、推荐策略实时调优。对于需要严格统计推断、长期效果评估的场景,仍建议使用传统 A/B 测试。

4.4 三种分流算法对比总结

对比维度 哈希分流 分层分流 自适应分流 (MAB)
流量分配方式 固定比例 固定比例,多层复用 动态调整
用户分组确定性 强(同一用户始终同组) 强(层内确定,层间独立) 弱(随实验进程变化)
多实验支持 需手动隔离 原生支持,正交复用 需独立运行
样本利用效率 低(固定比例浪费) 高(流量复用) 高(动态聚焦最优)
统计推断 标准假设检验 标准假设检验 需专用方法
实现复杂度 低 中 高
适用场景 简单实验、流量充足 多实验并行、流量有限 快速优化、机会成本敏感
选型建议: 没有“万能”的分流算法。实际平台通常采用混合策略:使用分层分流作为基础架构,在需要快速优化的子实验中使用 MAB 算法,在需要严格统计推断的实验中回退到哈希分流。理解每种算法的原理与局限,才能设计出高效、可靠的实验分流方案。