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