这篇文章主要分享一下模型训练的一般流程,这里将其命名为【独孤九剑】,哈哈尊重风清扬老前辈,目的是让大家明白做一个算法模型过程中会涉及的流程和数据特征在算法模型中的重要性。
作为一名算法工程师训练模型可谓是家常便饭,不管是做推荐中的召回模型、排序模型还是其他领域的分类模型等,都应该有一个规范化的流程,这样在做模型的过程中也会更加清晰,当然也不一定完全遵循这个流程,只是说基本过程应该是一致的。
1、总诀式——定义问题
What,How,Why。首先要弄清楚自己要干什么,然后调研相关的技术确定怎么解决问题,最后反思自己为什么要用这个方案解决这个问题,有没有更好的思路方法。以电商推荐系统中的点击率预估为例。首先明确我们的目标是优化线上的商品点击率,其次可以通过点击率预估算法来离线训练模型,线上进行预估,将点击率较高的商品推荐给用户,这样做的原因是点击率预估是目前业界比较成熟的解决方案,且能够取得不错的效果,如果在实践中遇到问题,也便于解决问题。当然也会有一些其他的方案,比如通过深度学习来做CTR,但是使用深度学习成本较大,所以从成熟的基于机器学习的CTR来做,并逐渐过渡到深度学习。
2、破剑式——选定模型
在明确问题之后,要选定用什么算法来解决,在相同的数据特征的前提下,不同的算法带来的效果是不一样的,而且应用的成本也是不一样的。因此选定适合自己业务的算法才是最重要的,而不是选择最高大上的。同样以电商推荐为例,比如进行了综合考虑,选定了CTR预估中常用的树模型算法-XGBoost。
3、破刀式——构造数据
确定算法模型之后,则是结合业务特性明确模型所需要的训练数据。脱离业务的特征数据是没有灵魂的,比如电商业务中的商品和信息流产品中的新闻背景是不一样的,很多细节性的数据和特征需要去考虑和构造,因此要构造适合自己业务的数据,才能最大化的发挥算法模型的作用。比如CTR预估场景中我们要构造的训练数据为 <features, label>,那么如何去确定label呢?不同的kpi指标对应的label是不一样的,比如追求点击率的我们的label可能是0,1;但如果追求的是GMV(商品成交额),制定的label可能是商品下单率。同样制定features的过程中也要结合用户在业务内的数据表现。
4、破鞭式——模型训练
模型是基于基础数据进行更好的维度的问题抽象和解决,CTR模型旨在构建features和label之间的隐含关系,通过参数调整,特征优化以追求更好的效果表达。在构建好数据之后就是算法模型进行的舞台了,目前大数据环境下最普遍的则是基于Spark分布式平台进行模型训练和调优。
5、破索式——模型评估
训练模型往往需要拟合的是一个目标函数,以追求最小的误差,最大的效果。CTR场景下常见的模型评估指标有:准确率、精确率、F值、AUC、NDCG等。同样是选择适合自己业务和算法模型的评估指标,通过评估指标来调整模型的参数以达到离线最优的效果,但具体的最终效果还是需要进行模型上线,进行ABTest验证模型的优劣。在ABTest过程中,新上的模型往往由于其不确定性,会给予较小的流量进行效果的测试,如果效果优于base组模型,则会分配更多的流量,以追求线上整体效果的最优。更多关于模型效果的评估可以关注后续章节内容。
6、破枪式——模型优化
模型优化的过程则是对模型和数据进行迭代升级的过程,但是这里需要明确的是影响模型的线上效果的因素有很多,从基础数据到构造的特征,从算法选择到实验策略的影响,从给出的排序结果到前端的位置展示,都可能产生影响。在应用算法模型的整个过程中,发生的每个动作或者做的每个修改都会影响模型的效果表达,因此算法工程师一定要注意的是切勿只重视算法和特征,在出现问题的时候往往要从多方面进行问题的定位和解释。为了避免其他非数据算法方面的影响,要充分利用ABTest实验,即保证其他因素的一致性,通过实验效果的优劣验证实验改进点的有效性。
7、破箭式——模型部署
把模型搞定之后需要考虑的是怎么部署模型,当然不同作用的模型、不同类型的模型部署方式也是不同的。比如用户离线计算的用户偏好模型,则不需要进行线上部署,训练好模型之后,保存一下,直接对数据集进行偏好预测,当然也可以不保存,直接进行预测。对于线上使用的排序模型,机器学习和深度学习的主流部署方式也是不同的,比如排序的树模型,通常情况下会保存成obj文件,然后写入到固定的地方,线上使用时直接加载到内存进行线上实时的特征拼接和计算即可,对于DL类模型,当然也可以保存成固定格式的文件供线上使用,但更通用的做法是借助于框架本身封装的服务,比如基于Tensorflow的DL模型,可以借助tf-serving进行部署,线上使用时,直接调相应的API接口,传入需要的参数进行计算排序。
8、破掌式——效果跟踪
模型部署上线之后并不是终点,一个更重要的步骤则是对上线之后的效果进行追踪。通常情况下,新上模型一般会进行白名单测试(一般是内部人员),测试是否能正常返回数据,返回的数据是否正常、是否可信服,确定没问题之后会进行小流量的测试(一般在5%左右),观察一天的效果,如果效果正向,则会扩大流量(一般扩到50%左右),经过一段时间的效果观察(主要是和base组模型进行效果对比)如果效果正向,则会考虑全扩或者扩充接近100%。不要小看扩流流程,如果新上模型直接扩充到全量或者大部分流程,是会引起很严重的问题的,比如效果不好,性能不好等,所以要谨慎对待。
9、破气式——数据保存
数据保存是指将线上使用的特征数据通过一定的方式进行保存,目的是方便后续模型的训练和优化,形成一个完整的数据闭环。保存数据时需要注意的是每条数据的唯一性,即保证最后关联特征数据和label的时候保证是对应的,否则会引起样本误差,引起模型的训练效果。至此模型的训练流程已经介绍完事。