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