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)
你看,核心逻辑就两行:predict 和 update。
这就是在线学习的精髓——预测-反馈-更新,循环往复。
我的一个小建议:
刚开始做在线学习时,别一上来就上FTRL这种复杂算法。先用OGD跑通流程,理解「数据流-模型更新-效果监控」这个闭环。等稳定了,再逐步替换更高级的算法。
我当年就是太心急,直接上了FTRL,结果调参调了整整两周……嗯,说多了都是泪。
2.4 在线学习的挑战
最后,咱们聊聊在线学习在实际落地中会遇到哪些坑。
- 样本偏差:在线数据不是独立同分布的。用户的行为有周期性、有趋势性。模型容易学到「假相关」。
- 灾难性遗忘:模型只关注最近的数据,会忘记之前学到的知识。我见过一个案例,模型在双十一期间只学促销商品,活动一结束,推荐效果直接崩了。
- 延迟反馈:用户点击后,转化可能发生在几小时甚至几天后。在线学习如何处理这种「延迟标签」?这是个经典难题。
- 评估困难:离线学习可以用AUC、LogLoss等指标评估。在线学习呢?你没法回放历史数据,因为模型一直在变。常用的做法是「在线A/B测试」或「Interleaved Evaluation」。
嗯,这一章的内容就到这里。
在线学习是推荐系统实时更新的基石。理解了它,后面咱们聊「模型实时更新策略」时,你就能明白为什么有些策略要那样设计。
下一章,我会带你深入FTRL算法的原理和实现。到时候咱们手撕代码,看看Google是怎么在广告系统里用在线学习做到「毫秒级更新」的。