概念
Online Learning是一种模型训练的方法,能够根据线上反馈数据,实时快速的进行模型调整,使得模型及时反映线上的变化,提高线上预测的准确率。
传统学习算法的缺点:
1、传统学习算法占用内存大和更新周期慢的问题。
2、训练出的模型参数多导致预测慢。模型参数多的情况下,线上predict的时候需要内存大,QPS无法保证。
3、无法真正稀疏,浮点运算精度。传统的SGD很难得到真正的稀疏模型(浮点运算很难是真的0,无线接近于0)。
一、目标
1、最小化损失函数,即使得整体的损失函数最小化
2、快速求解,即快速求目标函数的最优解。
二、流程
1、将模型预测结果展现给用户
2、收集用户的反馈数据
3、再次训练模型
重复以上步骤形成闭环的系统。
问题:
在线学习与在线优化的问题范围是否一致?
在线学习与在线预估工程中如何有效衔接?
算法
一、从在线梯度下降说起
(online gradient descent)是传统梯度下降的在线版本。
t表示第t轮迭代,注意上式中的学习率$η_t$每轮都会变,一般设为$ η_t= \cfrac{1} {\sqrt{t}} $
二、FTL
(Follow the Leader)。使用任何在过去回合中损失最小的向量,最小化累积损失。
三、FTRL
借鉴于FTL,但是在 FTL 的基础上加上了正则化项。
考虑了训练样本本身在不同特征上分布的不均匀性。
当某个条件满足时,好像是小于L1正则的参数,直接令某个特征的参数w为0。
学习出的模型具有稀疏性。
1、FTRL 使用所有学习轮次的梯度代替某一轮次的梯度
2、每个特征采用不同的学习率。
如果一个特征变化快,则对应的学习率也会下降得快,反之亦然。
学习η率越大,则参数w更新幅度越大。
3、加入L1正则
工程实战
一、参数服务器
引入原因:
模型的维度提升至千万维,当模型维度冲击到亿维时。
非并行模型时,过高的模型维度会导致海森矩阵呈指数级上涨。
导致内存和网络I/O的极大开销。
作用:
解决模型并行问题。
将高维模型平均分配到参数服务器集群中的每一台机器,
将CPU计算、内存消耗、存储、磁盘I/O、网络I/O等负载和开销均摊。
手段:
将参数分片以分布式形式存储和访问。
架构:
主从架构,Master负责记录和维护每个参数服务器的心跳和状态;
参数服务器则负责参数分片的存储、梯度计算、梯度更新、副本存储等具体工作。
两种实现方式:
全同步:
能够在理论层面保证模型收敛。
各节点执行任务节奏不一致,会互相等待,引入通信边界,
从而造成计算资料的浪费和开销。
全异步:
无需等待,充分利用资源。
理论上无法验证模型一定收敛(但实践效果好,迭代速度会更快,AUC的加速度会更高,模型效果可以满足业务和线上的要求)
二、 spark
spark.mllib中模型的持久化可以直接存入hdfs文件系统。
缺点:
目前spark原生支持的机器学习模型比较少;
使用第三方的算法模型的话,需要spark集群的2.3以上;
而且spark训练出来的模型往往比较复杂,实际线上运行的时候,对内存以及QPS的压力比较大。
三、tensorflow
模型上线一般选择tensorflow serving或者client API库来上线,
前者适合于较大的模型和应用场景,
后者则适合中小型的模型和应用场景。
四、通过PMML实现模型跨语言跨平台共享
缺点是超大模型不适合,不如建立一个单独的环境。
如果是tensorflow平台建议使用自带的serving或者tensorflow的java库来实现。
参考:
用PMML实现机器学习模型的跨平台上线
spark.mllib中模型的持久化
tensorflow机器学习模型的跨平台上线
基于Spark的大规模机器学习在微博的应用
FTRL算法解决的问题
FTRL与模型稀疏性问题
FTRL在线学习是什么
在线优化算法 FTRL 的原理与实现
在线学习和在线凸优化(online learning and online convex optimization)—FTL算法5
各大公司广泛使用的在线学习算法FTRL详解
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。