Online Learning
在线学习会随着数据流入,逐个样本或小批次地更新模型,因此模型能够持续学习并跟上概念漂移,而无需重新训练。
在线学习是一种机器学习模式,模型会从依次到达的数据中学习,并在每个样本或小批次后更新,而不是只在固定数据集上训练一次。每一步中,模型都会先进行预测、接收真实结果、计算损失,并在下一个样本到达前调整参数。这种方法适合处理连续到达的数据(例如点击、交易或传感器读数)、无法全部存储的大规模数据,以及随时间变化的关系。与之相反,批量学习或离线学习会一次性使用全部训练数据进行训练,并保持模型不变,直到再次训练。
在线学习的工作原理#
Frank Rosenblatt 于 1958 年提出的感知机就是一种在线学习器,它会在每个分类错误的样本后微调权重;随机梯度下降 (SGD)则将相同的逐样本或逐批次更新方式应用于几乎所有可微分模型。其他算法专为数据流设计:Pedro Domingos 和 Geoff Hulten 于 2000 年提出的 Hoeffding 树会在仅查看每个样本一次的情况下,从数据流中逐步构建决策树;而 River 等库则实现了常见模型的流式版本。在 scikit-learn 中,具有 partial_fit 方法的估算器可以增量学习。
在线学习器通常采用序贯预测方式进行评估;这个术语由统计学家 Philip Dawid 提出:每个新样本先用于测试模型,再用于训练模型,因此累计得分是根据模型尚未见过的数据计算的。理论上,在线学习器的评价指标是遗憾值,即其累计损失与事后选出的最佳固定模型的累计损失之间的差距。Martin Zinkevich 于 2003 年证明,在线梯度下降的遗憾值仅随步数的平方根增长,因此每步的平均差距会逐渐趋近于零。
以下示例将 400 个小批次流式输入使用 SGD 训练的逻辑回归模型。进行到一半时,标签分配规则发生变化;此时冻结的一份模型副本代表停止学习的模型:
import copy
import numpy as np
from sklearn.linear_model import SGDClassifier
rng = np.random.default_rng(0)
online = SGDClassifier(loss="log_loss", random_state=0)
scores = {"frozen": [], "online": []}
for step in range(400): # 400 mini-batches of 20 examples arrive one at a time
X = rng.normal(size=(20, 2))
w = [1.0, 1.0] if step < 200 else [1.0, -1.0] # the labeling rule changes at step 200
y = (X @ np.array(w) > 0).astype(int)
if step == 200:
frozen = copy.deepcopy(online) # a copy that stops learning when the rule changes
if step >= 200: # test on each new batch before learning from it
scores["frozen"].append(frozen.score(X, y))
scores["online"].append(online.score(X, y))
online.partial_fit(X, y, classes=[0, 1])
for name, acc in scores.items():
print(f"{name}: {np.mean(acc):.2f} accuracy after the change")规则变化后,冻结模型的得分为 0.47,与随机猜测相比没有优势;在线模型的平均得分则为 0.98。在线模型在新规则下的第一个批次得分为 0.35,第二个批次为 0.80,再经过几个批次后便恢复了性能。
概念漂移与遗忘#
在线学习的主要动机是概念漂移,即输入与标签之间的关系发生变化,这往往伴随着输入本身出现数据漂移。漂移可能像示例中那样突然发生,也可能逐渐累积,或随季节和一天中的时段反复出现。Albert Bifet 和 Ricard Gavaldà 提出的 ADWIN 等检测器会监测误差流,并在其平均值发生变化时发出信号,从而触发更快的更新或重置。
快速适应需要付出代价。较高的学习率能快速跟上漂移,但也会跟随噪声;而只看到近期数据的网络会覆盖先前学到的内容,这种问题称为灾难性遗忘。将较早的样本存入回放缓冲区,并在每次更新时混入这些样本,是一种常见的解决方法。
在线学习的实际应用#
在标签能于几秒内到达的场景中,在线学习十分常见。广告点击预测是典型案例:Google 于 2013 年介绍了其点击率模型如何使用 FTRL-Proximal 算法,基于流式数据持续训练;推荐系统和欺诈评分也常采用相同方式更新。已部署的视觉模型通常改用批量更新,因为标签到达较晚,而且一次被污染的更新可能降低此后所有预测的质量。因此,团队会结合模型监控,定期使用近期数据和回放数据进行微调,正如模型维护工作流中所示。
视觉系统中也会运行规模较小的在线更新。在 Ultralytics YOLO26 的跟踪模式中,启用 with_reid: True 进行重识别后,默认的 TrackTrack 跟踪器会为每条轨迹保留外观嵌入,并在每次检测匹配后以移动平均方式更新;新嵌入的权重为检测置信度的 5%。这样,每条轨迹的外观表示就能适应姿态和光照的渐变,而 ReID 网络保持不变。
持续学习与在线学习有重叠,但它关注的是新任务到来时如何保留先前任务的知识;在线学习描述的则是更新发生的频率。主动学习会选择哪些样本需要标注,而强化学习也会从交互流中学习,但它依赖的是自身行为带来的奖励,而不是带标签的样本。










