线性模型如何进行在线学习?
简化版
在线学习是在数据流到达后逐条或按微批更新模型,不等于“服务能实时预测”。线性模型常用 SGD、Passive-Aggressive 或 FTRL 等增量算法:先用当前版本预测,标签回流并通过质量校验后,再更新参数。真正难点不是写出 w←w-ηg,而是处理标签延迟、重复事件、特征字典变化、概念漂移和错误批次。生产系统必须保存模型与优化器状态、数据游标和版本,限制单批更新幅度,以影子/灰度方式比较稳定基线,并能熔断回滚。
详细版
以带 L2 的逻辑回归为例,微批 B_t 到达后可做:
g_t = (1/|B_t|) Σ_{(x,y)∈B_t} [σ(w_tᵀx)-y]x + λw_t
w_{t+1} = w_t - η_t g_t
高维稀疏广告特征中,FTRL-Proximal 利用累计梯度、自适应尺度与 L1/L2 正则,能得到稀疏参数;数据较稳定、治理要求高时,微批训练后审批发布通常比每条样本立即生效更安全。
| 方式 | 优点 | 主要风险与适用边界 |
|---|---|---|
| 逐条 SGD | 适应快、状态小 | 梯度噪声和事故传播快,需强熔断 |
| 微批更新 | 可质检、向量化、易回放 | 适应存在批次延迟,常用于生产折中 |
| FTRL/自适应在线法 | 稀疏高维下学习率与正则处理成熟 | 必须保存完整优化器累计状态 |
| 定时全量重训 | 易审计、能重新洗牌和调参 | 对快速漂移响应慢,计算成本高 |
评估采用 prequential 思路:样本发生时先记录当前模型预测,标签到达后只评价当时的预测,再决定是否用于更新。这样不会拿未来版本去解释过去流量。
完整版教学
一、先界定什么叫在线学习
在线推理只是“请求到来就给预测”,模型参数可以几个月不变;在线学习则要求数据流和标签持续驱动参数更新。它适合以下条件:数据量大到频繁全量重训代价高、分布随时间变化、增量算法能稳定工作,并且标签反馈足够及时可信。
在线学习也不是越实时越好。信用违约可能几个月后才有标签,医疗或金融决策还需审批,这类场景更适合收集微批、离线复核后发布。面试回答应同时讲算法更新和数据/发布闭环。
二、SGD 如何增量更新线性模型
对单样本损失 ℓ(w;x_t,y_t),最基本更新为:
g_t = ∇_w ℓ(w_t; x_t, y_t)
w_{t+1} = w_t - η_t g_t
逻辑回归中 g_t=[σ(w_tᵀx_t)-y_t]x_t;若用 L2 正则,还要加入相应梯度。微批是把若干样本梯度求平均再更新,能利用向量化并降低方差。学习率太大会追逐噪声甚至发散,衰减太快则无法跟踪漂移;常数小学习率更能持续适应,但会在最优点附近波动。
L1 的普通次梯度更新不容易稳定地产生稀疏解,工程上常用 proximal 更新、坐标方法或 FTRL。特征必须采用稳定的哈希/字典规则,训练与服务的变换完全一致。
三、FTRL 为什么常见于稀疏线性场景
FTRL(Follow-The-Regularized-Leader)不是只看当前梯度,而是基于累计梯度和正则化选择下一步参数。FTRL-Proximal 常把以下能力组合起来:
- 每个坐标根据历史平方梯度拥有自适应步长;
- L1 通过近端形式产生精确零系数,节省稀疏模型存储;
- L2 控制参数尺度,降低过拟合;
- 对只偶尔出现的高维离散特征按需更新。
它适合 CTR 等高维稀疏问题,但线上检查点不能只保存 w。累计梯度、一阶/二阶统计量、正则参数和特征字典共同决定下一次更新;漏掉优化器状态会让“恢复训练”变成另一条轨迹。
四、标签延迟、乱序和反馈偏差
假设每分钟产生 6000 次曝光,以 100 条为一批可形成 60 个特征批次;但点击可能几分钟后确认,转化可能 7 天后才确认。更新时必须按事件 ID 连接预测时特征与后来标签,定义观察窗口,并处理重复、撤销和迟到事件。
只用“已快速返回标签”的样本会产生选择偏差;把尚未转化的样本提前标负会系统性污染模型。模型的动作还会改变未来可见标签,例如只向高分用户展示广告后,低分人群没有点击反馈,这是反馈回路而非普通随机缺失。可通过随机探索流量、逆倾向加权或独立数据收集缓解,但要明确方差和业务成本。
没有可信标签时宁可暂停学习,也不要把“实时更新”理解成任何事件都立即改参数;错误标签会比短暂漂移更快摧毁模型。
五、漂移适应不是只调大学习率
需要区分协变量漂移 P(x)、标签先验变化 P(y) 和概念漂移 P(y|x)。输入分布变化不必然意味着最优决策边界改变;概念漂移才直接要求关系更新。常见控制手段包括:
| 手段 | 适应方式 | 代价 |
|---|---|---|
| 固定小学习率 | 持续给新数据权重 | 稳态有噪声,难应对突变 |
| 滑动窗口 | 丢弃窗口外旧样本 | 窗口短则方差大 |
| 指数衰减 | 平滑降低旧数据权重 | 衰减率需按漂移速度选择 |
| 漂移告警后重置/重训 | 对结构突变响应直接 | 错误告警可能丢失有效历史 |
选择窗口和学习率要做按时间回放,模拟真实的“当时只能看到过去”。快速漂移不等于无条件增大学习率;如果变化来自数据管道故障,快速适应反而会把故障写入模型。
六、用 prequential 评估避免时间穿越
Prequential(predict-then-update)流程是:样本到达时用当前模型预测并冻结预测记录;标签成熟后,先用冻结记录计算指标,再把通过校验的样本送入更新。不能用更新后的模型重新预测同一样本充当线上效果。
事件到达并生成特征
-> 当前模型预测,记录 model_id / score / event_time
-> 标签成熟与去重校验
-> 评价当时预测
-> 受限训练更新
-> 候选模型影子比较
指标应按事件时间而非仅处理时间切片,并同时看 log loss、校准、业务成本、标签覆盖率和延迟分布。短窗口能早告警,长窗口用于判断趋势;二者不能互相替代。
七、生产更新与发布要解耦
训练进程可以频繁产生候选参数,但服务版本不必每次立即替换。一个可审计的发布单元至少包含:
- 模型参数、优化器累计状态和随机种子;
- 特征 schema、哈希空间或字典版本;
- 已消费事件范围、去重状态和标签成熟规则;
- 训练超参数、基线比较结果和审批记录;
- 可直接恢复的上一稳定检查点。
每批设置样本量、正负比例、梯度范数、参数更新范数和单坐标变化上限。越界时熔断而非裁剪后静默发布;裁剪可能掩盖数据故障。候选版本先做离线回放、影子预测或小流量灰度,确认收益和资源指标后再扩大。
八、常见误区与追问
没有即时真值时,先监控 schema、缺失率、未知特征率、分数分布、参数范数和候选/稳定模型差异;标签回流后再看时间切片损失、校准和业务指标。一旦异常,暂停消费或冻结发布,保留出错批次,从最后一致的模型、优化器状态和数据游标回放。
- 误区:服务延迟低就是在线学习。 低延迟预测与参数是否持续更新是两回事。
- 误区:调用
partial_fit就完成了在线系统。 标签连接、幂等、状态恢复、评估和回滚才是主要工程难点。 - 误区:概念漂移时学习率越大越好。 大步长也会放大噪声和故障,需按时间回放选择。
- 追问:为什么不能只保存权重? SGD momentum、Adam 或 FTRL 的下一步依赖优化器历史;缺失状态无法等价恢复。
- 追问:新特征第一次出现怎么办? 用稳定哈希空间或受版本控制的字典初始化坐标,确保训练服务一致并监控碰撞/未知率。
- 追问:高风险业务能在线学吗? 可以增量训练,但通常把“训练候选”和“审批发布”分开,采用微批、人工门禁和严格回滚。
九、加强记忆
用“预测—等标签—评价—受限更新—影子发布—回滚”记住在线线性模型。SGD 给出基本增量公式,FTRL 适合高维稀疏与 L1/L2 正则;真正的红线是标签按事件正确连接、训练服务特征一致、模型与优化器状态一起版本化。Prequential 评估必须先预测后学习,错误批次要能熔断,任何候选版本都要与稳定基线比较并可从检查点和数据游标完整回放。