2. 在线学习基础:在线学习定义、在线学习 vs 离线学习、在线学习算法概览

好,咱们正式开始聊在线学习。

说实话,很多刚入行的朋友一听到「在线学习」,第一反应就是:「哦,就是模型实时更新嘛。」
嗯,对,但不全对。我个人的理解是:在线学习是一种「边看数据边学」的范式。它不像传统做法那样,攒一堆数据然后一次性训练,而是每来一条样本,模型就「吃」一条,立刻更新自己。

2.1 在线学习的定义

在线学习(Online Learning),说白了就是:
模型按顺序接收数据流,每来一个样本,就做一次预测,然后根据真实反馈更新参数。

这里有个关键点:数据是流式到达的,不是一次性给你的。
你想想看,推荐系统里用户的行为日志,是不是一条一条产生的?
用户点了一个商品,你立刻就要更新模型,而不是等到半夜跑批任务。

在线学习的核心特征:

  • 数据按顺序到达,无法随机访问
  • 模型在预测后立即获得反馈
  • 参数更新是增量式的,不依赖历史全量数据
  • 通常要求单样本处理速度极快(毫秒级)

我在项目中遇到过一种误解:有人觉得在线学习就是「用新数据微调一下模型」。
其实不是。微调是离线行为,你还要保存旧模型、加载新数据、跑几个epoch。在线学习是「来一条,学一条」,没有显式的训练阶段。

2.2 在线学习 vs 离线学习

咱们直接上对比,这样更直观。

维度 离线学习 在线学习
数据访问方式 全量数据,可随机打乱 流式数据,顺序到达
训练频率 每天/每周一次 每次请求/每次点击
模型更新方式 重新训练或微调 增量更新参数
对数据分布变化的适应性 差,需要人工触发重训 强,自动适应
计算资源消耗 高(全量数据) 低(单样本)
典型场景 搜索排序、广告CTR预估(天级更新) 实时推荐、动态定价、欺诈检测

看到这个表,你可能会问:「那在线学习是不是全面优于离线学习?」
嗯,别急着下结论。我踩过这个坑。

我曾经犯过的错:

有一回做实时推荐,我一股脑全上了在线学习。结果发现模型对短期波动过于敏感——用户半夜误点了一个不喜欢的商品,模型立刻「学坏」了,接下来半小时都在推类似的东西。后来我加了一个「延迟更新」策略,等用户行为稳定了再更新,才把这个问题解决。

教训:在线学习不是万能的。它对「噪声样本」非常敏感,需要配合异常检测和样本过滤。

2.3 在线学习算法概览

聊完概念,咱们看看具体有哪些算法可以用。

2.3.1 经典在线学习算法

  • 在线梯度下降(OGD):最基础的方法。每来一个样本,计算梯度,直接更新参数。简单粗暴,但容易震荡。
  • 在线牛顿法(Online Newton Step):引入了二阶信息,收敛更快。但计算Hessian矩阵的开销大,工业界用得少。
  • Follow The Regularized Leader(FTRL):Google在2013年提出的算法,结合了L1正则化,能产生稀疏模型。我个人非常推荐,在CTR预估场景下效果很好。
  • 在线随机梯度下降(SGD):其实就是OGD的随机版本。注意,这里的「随机」是指样本顺序随机,但在线场景下样本顺序是固定的,所以OGD和在线SGD基本等价。

2.3.2 工业界常用的在线学习框架

光有算法不够,还得有工程实现。我列几个常见的:

框架/工具 特点 适用场景
Vowpal Wabbit 轻量级,支持多种在线算法,单机性能极强 快速原型验证、小规模在线学习
TensorFlow / PyTorch 灵活,但需要自己实现在线更新逻辑 深度学习模型的在线学习
Flink + 自定义模型 流式计算框架,适合大规模实时特征工程+模型更新 大规模推荐系统、广告系统
Parameter Server 分布式参数存储,支持异步更新 超大规模模型(百亿参数级别)

2.3.3 一个简单的在线学习代码示例

咱们用Python写一个最简的在线梯度下降,感受一下:

import numpy as np

class OnlineLogisticRegression:
    def __init__(self, dim, learning_rate=0.01):
        self.w = np.zeros(dim)
        self.lr = learning_rate

    def predict(self, x):
        # 在线预测
        score = np.dot(self.w, x)
        return 1 / (1 + np.exp(-score))

    def update(self, x, y):
        # 在线更新:来一个样本,更新一次
        pred = self.predict(x)
        gradient = (pred - y) * x
        self.w -= self.lr * gradient

# 模拟数据流
model = OnlineLogisticRegression(dim=10)
for i in range(1000):
    x = np.random.randn(10)
    y = 1 if np.dot(x, np.ones(10)) > 0 else 0
    model.update(x, y)

你看,核心逻辑就两行:predictupdate
这就是在线学习的精髓——预测-反馈-更新,循环往复。

我的一个小建议:

刚开始做在线学习时,别一上来就上FTRL这种复杂算法。先用OGD跑通流程,理解「数据流-模型更新-效果监控」这个闭环。等稳定了,再逐步替换更高级的算法。

我当年就是太心急,直接上了FTRL,结果调参调了整整两周……嗯,说多了都是泪。

2.4 在线学习的挑战

最后,咱们聊聊在线学习在实际落地中会遇到哪些坑。

  • 样本偏差:在线数据不是独立同分布的。用户的行为有周期性、有趋势性。模型容易学到「假相关」。
  • 灾难性遗忘:模型只关注最近的数据,会忘记之前学到的知识。我见过一个案例,模型在双十一期间只学促销商品,活动一结束,推荐效果直接崩了。
  • 延迟反馈:用户点击后,转化可能发生在几小时甚至几天后。在线学习如何处理这种「延迟标签」?这是个经典难题。
  • 评估困难:离线学习可以用AUC、LogLoss等指标评估。在线学习呢?你没法回放历史数据,因为模型一直在变。常用的做法是「在线A/B测试」或「Interleaved Evaluation」。

嗯,这一章的内容就到这里。
在线学习是推荐系统实时更新的基石。理解了它,后面咱们聊「模型实时更新策略」时,你就能明白为什么有些策略要那样设计。

下一章,我会带你深入FTRL算法的原理和实现。到时候咱们手撕代码,看看Google是怎么在广告系统里用在线学习做到「毫秒级更新」的。