浅谈冷启动:从无到有的那种
往期回顾:
本打算这篇放在RS栏目里面,但是发现讨论的越来越广,就把栏目去掉啦。
很多文章和材料都谈到冷启动,就是用户冷启动和物品冷启动,可以根据物品标签或者是用户标签进行匹配拥有第一批推荐内容。但是,是否有想过当你没有任何的用户和产品数据的时候,你应该怎么办?这是一个项目刚开始初期非常艰难的问题。本文将从一个算法工程师角度去谈这个问题。
懒人目录
底层框架的支持
模型
规则-词典
监控与埋点
底层框架的支持
所谓“万丈高楼平地起”,任何一个项目都是从最基本的开始,底层的框架很大程度上决定了未来项目的可拓展性等重要性能,因此即使只是初版,选择合适的框架和技术方案是非常重要的。
作为一名算法工程师,平时的工作一般依托后端或者有关岗位的某个模块下进行算法开发,因此在商讨初步的技术方案时,要为有关的算法技术和数据入口留下接口,以便进行特征工程算法的迭代回滚、AB实验、模型更新等。
初始的项目一般很难有扎实的模型平台和数据流管理,因为项目初期是以实现功能,达到初步目标为落脚点的,模型平台和数据流管理仅仅停留在比较初步的阶段甚至不会特别设立,因此作为算法工程师本身,也需要自行做好模型管理,避免杂乱,要和数据端做好沟通,以便数据能够正常流入而不发生错误。
模型
算法工程师经常会陷入一个误区,那就是模型至上,其实在我看来,模型并不万能,它的实施需要一个很重要的东西,那就是数据,这个数据还要满足下面规则,必要条件:
数据量足够。不过千肯定不可,避不开深度学习,那不过万也肯定不可(这些参考都比较保守,有时候需要降采样之类的,可能需要的更多)
数据质量高。训练数据本身要可靠,标注要准确,各个类尽可能平衡
有关数据的获取。有的时候运气好的时候其实可以有数据,一种是之前项目的数据,可供本项目进行,另一种是网络爬虫+标注的方式获取一套数据集。前者比较简单,直接导入即可,但是对于冷启动,这个可能性不大;后者是目前比较常见的方式,可以考虑从一些平台爬取数据,根据爬取内容进行一定的标注,例如做情感分析,可以从豆瓣评论等获取,根据评论的打分得到标签,值得注意的是,爬虫方式要经过提前的确认,可能涉及到法律问题,需要谨慎。
模型能够解决绝大部分问题,所以很多系统中模型都是作为主干去开发和维护,但是光靠模型并不能解决很多实际问题,模型+策略才是处理一个问题的完善形式,需要众多策略甚至子模型完善模型所不能解决的问题。举个例子,推荐系统会为用户推荐用户喜欢的内容,但是,如果是不合法的内容,例如黄色、反动信息,那就需要过滤了,这是一个半人工的过程,一方面通过识别模型或者是黑名单的方式处理,另一方面对于异常的内容,可以通过监控和人工剔除的方式解决,从这里就看到了,大部分情况下,模型是大模块,但是外围还需要有大量的工作以完善整个系统。
继续谈冷启动,冷启动由于对用户的很多特性并未完全了解,特征构建也只是初步阶段,因此如果非如自然语言处理、图像的特别领域需要深度学习的,其他都可以考虑优先从基本的机器学习开始进行线下分析,根据有关经验,建议按照下面线路进行试验:LR-GDBT-DL,libsvm的one-hot模式是一个常见的特征工程构建形式。
总之要遵循下面几个原则:
不能迷信模型万能
系统的完全体一定是模型+规则
建模从简单开始
特征工程十分重要,甚至高于模型本身
规则-词典
对于数据极度缺乏的冷启动,只能考虑使用相对完备的规则和词典上线第一版本,这是一个耗时耗力但是能够走通的方法。
最简答的理解规则和词典,以推荐系统为例,就是给每个人和物品贴标签,然后根据人和物品的规则提供推荐,自然语言处理中,例如进行一些法律条文分类,规则的结果可能并不比模型要差,有时候很明显的关键词其实就有比较明显的分类指向,此时有比较完备的规则模板,就能有比较好的结果。当然的,要使规则和词典完备,将要付出巨大的人力代价,同时需要对业务本身有比较好的把握,例如法律条文分类,这种分类则需要专家进行,有时候算法工程师本身也不一定能够胜任,因此需要算法工程师牵头组织,明确评判和构建标准进行构建。
规则可能并非完备,但是可以通过有一定可靠性的模型(数据具有高置信度但是不一定完备的数据,例如意图识别中直接拿音乐资源作为音乐类型)做兜底,可以一定程度提升整体系统的完备性。在后续数据逐渐完善后,模型的重要性可以逐渐提升,慢慢转换身份,有模型主导,辅以规则进行正常运转。
还需要强调的是,规则后续由于可延展性不足,由于时间演化很多规则可能要修改,带来很大的维护压力,所以在项目上线后慢慢要开始向模型转化,当然,在规则上线开始就需要开始收集数据。如何收集,就是我下一节要谈的内容。
监控与埋点
幸运的地,项目可以上线,开始了由非入欧的进程,但是要注意的是,要从刀耕火种走向荣华富贵,要注重积累和管理,监控和埋点是非常重要的。
监控是各个领域都非常重要的一项,在算法领域,我们需要监控的就是模型的运转情况,这个监控必须尽量的无死角,每个过程的计算在条件允许的情况下都需要监控,但是监控的内容不宜太多,主要需要监控用户端反馈的内容,有关模型运算以整体结果为准进行监控,通过监控用户反馈,能够推一些突发事件尽快了解并且进行特定的处理。
而埋点,同样非常重要,埋点的目标在于记录过程。首先需要埋点的是用户行为,如点击、退出、滑动等,借助记录用户行为,最直接的是可以把用户行为整合为用户指标构件模型数据集,例如用点击、停留时间等来描述用户的喜好程度,毕竟不是每个用户都有意向点赞,而在更多的,还有诸如监控回溯、用户画像等重要功能。而在模型端,其实更需要丰富的数据,可以进行方法校验、AB实验、参数调整等,所以要对计算过程进行详细的埋点,计算结果至少要放在log中,否则方法是否生效都无从得知。
小结
今天主要是从算法工程师角度讲冷启动,从零开始的冷启动,在刀耕火种的环境下,在数据匮乏的环境下,如何开发原始第一版的项目,解决刀耕火种下资源匮乏的困难以及后续要拓展的方向,让一个系统从无到有地进化,从而达到日常运转的水平。
对待底层框架,要考虑算法和数据的接口,同时要注意自身的模型和数据要拓展管理。
模型需要依赖可靠严谨数据,在冷启动期间数据只能来源于外部,需要认真评估,而在模型的实验,也要尊崇“由简到繁”的过程。
规则-词典是一个无奈但是十分有用的过渡方案,需要付出人力物力的代价,后续再往模型方面过渡,建议长期保持规则+模型的状态,模型并不万能。
监控是保证系统正常运转的重要手段,埋点为目前的系统诊断与未来的迭代提供重要的分析依据。
最后,项目的启动想必是一个非常困难的工作,但千里之行始于足下,一步一个脚印,系统一定能正常运行甚至获得巨大收益,各位共勉。