发现我司online learning 模式好像真的蛮牛逼的,许多公司都是 daily 全量更新或者增量更新。
1. 推荐系统模型上线3部曲
- offline
- 用7天数据,训练 base, exp 两个模型。用第八天的近接着的一个小时数据来测试,比较 user_auc。如果有提升,用一个月的数据训练一个 offline 模型,推到 nearline 准备做 ab。
- nearline
- nearline 大概存着两天的最新数据,需要将 offline 的数据到 nearline的数据做个衔接。进行滚动训练。一般 nearline的数据是一分钟产生一个。
- online
- online 模型是一个被动接受的状态,只有 nearline 参数达到一定更新频率以后,才会 push 给 online 模型。online 模型再更新。
- 更新方式
- mini_batch + ftrl
- 更新的时候会先从参数服务器上pull 参数值, push 后覆盖。(不是存的梯度吗???
2. 更新模式
- 全量更新
- daily 用全部数据进行训练,daily 迭代。时间窗口最长,时效性最差。
- 增量更新
- 在原有模型的基础上,按照新增样本batch跟新。
- 缺点:收敛到新增样本的最优解上。不是全部样本+新增样本的最优解上。(我理解这是因为,以前的模型状态其实就是相当于一个参数初始化值)
- 改善:几轮增量训练之后就用业务量较少的时间窗口进行全局更新(这不会有重复样本的问题吗?) ,纠正模型在增量更新过程中积累的误差。
- 在线更新
- 每获得一个样本就实时更新。(据同事介绍,flink 会 dump 到 hdfs 上传给模型)
- ftrl 可以在保证稀疏性的情况下,只针对部分特征进行更新。
- 局部更新
- “让尖子生能跑多快跑多快"
- 除了 GBDT,其他都可以支持增量训练。但是问过同事,我们只针对 LR 部分进行增量训练,那其他的部分还是 batch 优化?
参考资料:
https://github.com/wzhe06/Ad-papers/blob/master/Optimization%20Method/%E5%9C%A8%E7%BA%BF%E6%9C%80%E4%BC%98%E5%8C%96%E6%B1%82%E8%A7%A3(Online%20Optimization)-%E5%86%AF%E6%89%AC.pdf