- 《架构师》2018年5月
- InfoQ中文站
- 1587字
- 2020-06-26 06:03:12
卷首语
机器学习:调参之外的那些事儿
作者 Pinterest工程师孙彦
处在当今大数据机器学习盛行的年代,我们作为算法工程师,似乎简历上不放出几个闪亮的机器学习项目是说不过去的,然而工作中也经常听到对机器学习相关工作的质疑:“不就是调参数吗?”。今天我们就来简单聊聊工业界里机器学习中调参数之外的那些事儿。
1.分析目前的问题:鉴于机器学习的火爆程度,相信大家在公司都经历过更新后端传统非机器学习的算法,把已有系统加入机器学习模型的过程。这么做的初衷,有可能是纯粹的跟风,认为机器学习听起来就高大上(但愿没人经历这种悲催的事情),或者是看到其他团队应用了机器学习,效果很好,或者是现有的算法有局限,维护更新牵扯很多精力时间,等等。通常在最开始,我们要问自己几个问题:我们的算法目前在产品应用的表现如何,有多大提升空间,这个提升是不是应用机器学习模型就能做到的,评价算法改进的标准是什么,有没有足够大的数据来进行训练,等等。
2.产生分析可能的训练集数据:这一阶段就需要我们对现有的数据进行查找分析,大致要知道训练的特征集合里会需要哪些用户/产品的信息。多数公司都会把相关信息从log中提取,存放在hbase/hive table里,大多数情况下我们可能就是需要写几个hadoop job来dump一下自己需要的数据,也有可能需要加些步骤到log过程来获取我们需要的某些特定信息。终于,我们成功得到了需要的训练数据,通常我们需要先检查一下看看特征分布,特征向量是否稀疏,有什么明显规律,是否有重复特征,正负例子比例多少……这个过程可以帮助我们判断是否需要对数据预处理,以及要选择什么样的模型进行训练。比如通过分析发现我们的问题是一个很明显的线性问题,类似于浏览相关商品时间和最后是否购买,那就可以尝试简单的logistic regression,如果特征很多而且没有明显规律,可以尝试GBDT,如果特征全是图片相关的,可能要考虑深度学习CNN。
3.开始最初轮的训练:这个时候往往我们会做一些短平快的训练,比如单机版调用sklearn库函数对random sample过的训练数据进行快速的训练迭代,得出一个最初的结果来验证一下我们的最初的设想是否成立,如果模型表现不如预期,可能我们要考虑调整特征集,改变训练模型,查看文献借鉴前人在类似领域的做法,等等。如果模型表现不错,我们可以一方面考虑对全部训练数据进行分布式训练,另一方面开始调参数:调整学习速率,步衰减,loss function,树层高,隐含层等等。
4.线下评估:训练出来的模型一般都要经过审核才能上线试验。评估的方法很多,常用的有在测试阶段ROC,或者precision-recall曲线的AUC分数等。如果我们的问题是可视化的,比如以图搜图这类情况,我们就可以用一个visualization工具来显示模型预测的结果,从而对模型可靠程度做一个人眼的评估。另外还有很多公司利用human evaluation来评测结果。
5.模型上线预测:这个根据具体情况来看,有的时候我们并不需要实时预测,只需要产生预测结果存到HDFS上面,那就可以用hadoop job来产生预测结果。也有的时候我们是要求实时预测的,这个通常对延迟时间要求很高,很多时候需要对特征向量进行优化,比如把稀疏高维向量投射到低维空间做成embedding,以便计算时读取更有效。另外也要考虑新的模型给系统带来的extra cost,尽可能提高效率减少对计算和储存系统的消耗(毕竟aws都是要钱的啊)。
6.开始试验:这是比较激动人心的时刻!通常线上实验能带给我们很多有效的信息,但缺点是通常线上实验要取得统计上的有效值都需要一定的时间以及足够大的用户数量,所以我们通常可以训练几个不同的模型一起上线试验,以便快速有效的根据用户反馈的信息,分析用户的行为,对特征提取,模型训练作出相应的调整。
说了这么多,相信大家也在平时工作中感觉得到,一个完整的机器学习模型从开始采集数据到成功应用到线上产品,都会经历比较复杂的过程,调参数只是其中一小部分。在AI时代,要想对机器学习领域有深刻理解,需要掌握的技能还是很多的,幸运的是当今信息共享的互联网给大家提供了极大的便利,希望我们大家都能与时俱进!