最近一段时间,由于工作需要一直在研究推荐算法。
通过对互联网信息的搜刮和对现有开源推荐算法的实践,总结出一些心得
遂吐个槽,发表出来与广大网友探讨,希望能得到应用推荐的正确姿势
先说问题吧:
目前推荐算法存在的问题
1.算法多杂:
推荐领域的门槛较低,掌握一定业务规则即可进行目标导向的推荐,从而导致各种算法多如牛毛,鱼龙混杂,让人无所适从;
2.思想混乱:
自从亚马逊推出协同过滤思想后,推荐领域便开始迅速发展,并呈现出百家争鸣、万花齐放的态势,但推荐领域不像其他领域具备明确的思想路径(比如NLP先做分词再做语义理解,比如图像特征金字塔等),各自都能说出自己的1、2、3,而且都声称自己有效果;
3.结果不透明:
目前不管是媒体还是电商,推荐算法的效果都是不透明的,各家只有各家自己心里清楚,也只有从业的专业人士有一些经验概数,这就导致谁都能出来说上两句,但到底对不对?你猜
推荐领域的原罪
推荐领域的上述问题,又导致了以下“原罪”:
1.我们需要那么多声音吗?
适当的观点表达有利于领域技术正确发展,但太多的声音,则让研究者犹如“小马过河”,而大量的噪音,让研究者真假难辨,陷入了不断打假的斗争中,浪费大量时间
2.我们抓住了问题的本质吗?
协同过滤已成为推荐的标配和金科玉律,但我们是否抓住了推荐问题的本质?用户的需求和商品特征间的关联是不是可以不局限在协同过滤的基调下?我们是不是应抓住问题的根本,围绕问题去建模,而不是抓住一两个细节就写一个“有提升”的论文?
3.理论与实际的脱节
当你打开任何一本介绍推荐算法的书籍或资料,研究人员总是给你列举一大堆指标,可当你实际应用时,你会发现大量无用甚至无法计算的指标,比如新颖度等等,这样形而上学的知识究竟有什么意义?
4.我们的算法有进步吗?
当你花了大量时间去研究CF,FM,DeepFM及其各种变体后,你会发现,算法并未取得实质性的进展,效果的好坏,完全取决于研究人员控制的结果,而不是算法的实际产出
好了,说了这么多,很多网友也会说,既然摆出这么多问题,你有什么解决方案?毕竟大道理谁都会讲
推荐算法的发展态势
从目前了解到的推荐算法设计思路,可以归纳为以下三种思路:
1.以业务为中心的建模方式:
业务规则提炼 -> 因果图 -> 贝叶斯网络
现状:目前的很多推荐系统,还停留在“业务规则提炼”+简单的“因果图”阶段,暂未发现成熟的贝叶斯网络推荐系统
优势:系统可以很好的与业务规则兼容,天生具备可解释性,可以让更多的业务人员参与进来,不浪费业务经验
劣势:建模过程需要参与的人较多,建模过程比较漫长,无法快速发现数据中的隐含规律
关键点:业务规则提炼成因果关系
2.以统计为中心的建模方式:
数据分析 -> 变量设计 -> 决策树模型
现状:这块的发展较为成熟,逐渐从普通的决策树随机森林,上升到梯度提升树(AdaBoost),集成提升树(XgBoost)等等
优势:通过将经验转化为变量的形式,来快速应用到模型,能自动从变量学习到隐含规则
劣势:变量构建过程漫长,需要建模人员熟悉并理解业务规则,模型的好坏很大程度上取决于特征工程
关键点:变量设计中对业务的理解
3.端到端的建模方式:
数据获取 -> 变量选择 -> 神经网络模型
现状:这块的算法变体发展也很快速,尤其是以阿里、京东等为代表的电商派,各种变体层出不穷
优势:算法实现快速,现有的数据可以直接入模处理,可快速落地,快速迭代
劣势:结果的可解释性差,算法的可提升空间有限,好坏只有自己知道
关键点:模型结构设计中对业务的理解
小结
以上3种路径实质代表了三种思想:
1.经验主义+因果推断思想;
2.统计和概率思想;
3.神经连接思想;(其实这种有点不伦不类,神经网络自编码器与FM矩阵分解结合,感觉有点奇怪)
但仔细观察上述优化的过程,都绕不开业务的理解,都是在不断刻画用户行为,而对模型的升级改造也只是为了能更好的处理用户行为变量
所以,本质上推荐算法其实是在不断建立“用户画像”的过程
从模型的可持续发展以及可解释性的角度出发,我认为第1种思想是最稳妥的发展方式
与其用高级晦涩难懂的变量或模型将“业务”包装起来,不如直接暴露在因果图中,这样显得更平易近人
从人机结合的角度来看,基于因果图的贝叶斯网络也是一种可靠的交互方式,最终要攻克的难点在于因果推理
个人心得
从现有推荐模型的研究方向来看:
1.神经网络的发展方向(已经完全跑偏,试图用固化的复杂的模型结构去表达对业务的理解,这种已经偏离了模型对事物客观规律本质的刻画,相信在未来很长一段时间,神经网络的推荐研究进展将会很缓慢)
2.集成学习和模型融合的思想(集成学习在特定明确问题的解决上,效果很好,但我认为,目前并不适用推荐这一领域,推荐系统实际是在不断捕捉用户喜好,不断刻画用户兴趣的过程,和稀泥的做法,只会使效果适得其反)
目前的推荐系统研究,大多停留在和现有模型的比较及提升方面,并未从问题本质上去思考和改进,并且鱼龙混杂,结果又很难复现,短期内是很难取得有效的改观的
希望个人的一些浅见,对大家一起提升推荐算法会有帮助