深度学习推荐系统实战_30_特别加餐_银弹不可靠最优的模型结构该怎么找
你好,我是王哲。
今天我们来聊一个轻松的话题,说一说算法工程师的工作方法。
那推荐模型篇的课程到现在已经接近尾声了,我们已经学习,并且实践了五六种深度学习推荐模型。
最近我发现很多同学会在留言区提出类似这样的问题,说老师,我的YND模型在我的数据集上的效果不好怎么办呢?还有这样的,是不是DFM模型的效果会比neuro CF好呢?啊,以及DIEN模型是不是现在效果最好的模型呢?那这样的问题有很多,其实我完全理解同学们提问题的心情,就是希望通过不断的改进模型,能够找到一个最强的模型来尽快的提升推荐效果。
那在我们的团队中,几乎所有的新人也都有这样的想法,但是真的存在一个万能的模型结构,能在所有推荐系统上达成最好的推荐效果吗?这节课我希望咱们能够放缓脚步,务虚一点,好好思考一下,到底什么才是最好的模型结构,以及算法工程师正确的工作方法应该是怎样的。
好,我们先来思考一个问题,到底有没有解决推荐问题的银弹?在软件工程领域的著作人院神话中,作者brooks凭借自己在IBM管理两千人完成大型项目的经验,得出了一个结论,没有任何技术或者管理上的进展,能够独立的许诺。
十年内使软件项目生产率可靠性或者简洁性获得数量级上的进步。
Brooks用没有银弹来形容这个结论,这里所说的银弹是什么呢?那在欧洲的古老传说里啊,银色的子弹是能够一击杀死狼人这种怪物的特效办器。
我们也可以把银弹理解成是最好的万能的解决办法。
当时没有银弹这个结论,让很多期待技术大型软件开发捷径的管理者和工程师们深感失望。
那距离人猿神话出版已经四十五年的,今天们找到银弹弹吗?本呀看不仅在大型软件开发这个领域,没有淫弹的观念深入人心。
而且我要说的是在推荐系统领域,也同样不存在能够一劳永逸解决问题的银弹,或者说根本不存在一种模型结构,它能够依次解决推荐效果问题,做到总是最优。
为什么这么讲呢?那我们拿阿里的DIEN模型做一个例子。
我们在二十一讲曾经详细讲过DIEN模型,这里我再做一个简要的回顾。
那DIEN模型的整体结构是一个加入了GRU序列模型的深度学习网络。
其中序列模型部分主要负责利用用户的历史行为序列。
那预测用户的下一步的购买兴趣模型的其他部分就是embedding MLP的结构,用来把用户的兴趣向量跟其他特征连接后进行预测。
由于阿里巴巴在业界巨大的影响力,DIEN模型自从二零一九年被提出以来啊,就被很多从业者认为是解决推荐问题的银弹都争相尝试进行应用。
但是在应用的过程中,DIEN在很多场景下并没有体现出银弹的效果。
在这个时候,大家又都习惯于从自身上找原因。
比如说是不是embedding层的维度不够啊,是不是应该在增加兴趣演化层的状态数量,是不是哪个模型参数没有调好等等。
包括我自己在实践的过程中,也会因为DIEN没有产生预期的推荐效果提升而去思考,是不是因为我们没有完整的复现DIEN模型。
说了这么多,我想强调的其实是所有提出类似问题的同行都默认了一个前提。
假设就是在阿里巴巴推荐场景下,能够提高效果的DIEN模型,在其他应用场景下应该同样有效。
然而,这个假设真的合理吗? Dien模型是推荐系统的淫弹吗?当然不是,接下来我就带你一起分析一下。
那既然DIEN的要点是模拟,并既然假户兴趣进化的过程,那模型应用的前提必然是应用场景中存在着兴趣进化的过程。
阿里巴巴的电商场景下,因为用户的购买兴趣在不同时间点有变化,所以有着明显的兴趣进化的趋势。
比如说用户在购买了电脑后,就会有一定概率购买电脑周边的产品。
用户在购买了某些类型的服装后,就会有一定的概率选择和他搭配的其他矩阵。
这些都是兴趣进化的直观例子,也是阿里巴巴电商场景下非常典型的情况。
除此之外,我们还发现,在阿里巴巴的应用场景下,用户的兴趣进化购径能够被整个数据流几乎完整的保留。
作为中国最大的电商集团,阿里各产品线组成的产品矩阵,几乎能够完整的抓住用户购物过程中兴趣迁移的过程。
当然,用户有可能去京东、拼多多等其他的电商平台购物,从而打断阿里的兴趣进化过程。
但是从统计意义上来说,大量用户的购物过程还是可以被阿里的数据体系捕获的那这样一来,我们就总结出了DIEN有效的前提,那就是他的应用场景必须满足两个条件,一是应用场景确实存在着兴趣的进化。
二是用户的兴趣进化过程能够被数据完整的捕获。
如果他们中有一个条件不成立,DNEN,就很可能不会带来很大的收益。
为什么这么说呢?还是以我自身的实践经历为例,为现在工作的公司入口是北美最大的视频流媒体平台。
那在使用的过程中,用户既可以选择我们自己的频道和内容,容可可以选择观nenef、 IX、 youtube或者其他流媒体频道的内容。
但是用户一旦进入到neffix或者其他第三方应用,我们就无法得到应用中的具体数据了。
在这样的场景下,我们只能获取用户一部分的观看,点击数据,而且这部分的数据也只占用户全部数据的百分之十左右。
那既然用户的整个行为过程我们没有完全获取,又怎么构建起整个兴趣进化的链条呢?另外一点也很关键。
通过分析我们发现长视频用户的兴趣点,相比电商而言,其实是非常稳定的。
电商用户可以今天买一套衣服,明天买一套化妆品。
兴趣的变化非常快,但你很难想象,长视频用户今天喜欢科幻电影,明天他的兴趣就变成了喜欢看爱情片。
那绝大多数用户喜好其实非常稳定的集中在一个或者几个兴趣点上,或也是序列模型,并不能给我们公司提高效果的另一个主要原因。
总的来说,通过DIEN的例子,我们可以看出,到底怎样的模型结构是最优的。
模型结构给你的业务特点和数据特点是强相关的,因此在模型结构的选择上并没有淫弹,没有最优,只有最合适。
那有没有可供参考的方法论来指导模型结构的选择呢?或者说更广义一点,指导各种模型参数的选优呢当然是有的。
但是在谈论这个方法之前,我想先纠正一个工作中非常有害的思维方式。
特别是对于刚工作一两年的同学,我们最应该纠正的就是工作中的学生思维。
学生思维最典型的表现就是总是在寻求一个问题的标准答案。
因为在我们的学生时代,所有的题目都是有标准答案的,会就是会不会就是不会,但是工作中就不一样了。
举个例子来说,在讲embedding的部分,很多同学问我,embedding到底应该取多少维呢?那在实际的工作中,这就是一个典型的没有标准答案的问题。
实际工作中它应有的决策链条应该是下面这样的。
我们先取一个初始值,比如说十来尝试一下效果。
在以十维的embedding的效果作为baseline进行一定程度的参数调优。
比如说尝试五维或者二十维的embedding比较,它跟识维的效果确定更好的维度数。
当然,如果项目时间和硬件条件允许的话,我们还可以尝试fine tuning找到最优的维度设置。
最后,在上线前,我们还需要再次评估embedding线上存储所需的存储量的限制。
如果线上存储的可用空间有限,可是通过适当降低维度数,缩小embedding所需的存储空间。
你从这个过程中肯定能够体会到所谓embedding的维度到底取多少。
这个问题根本没有标准答案。
最优的答案跟你的数据量embedding模型本身的结构都有关系,甚至还要受到工程环境的制约。
类似的问题还有局部敏感哈希到底要选择几个桶?那召回层的套盘中n应该取多少?Y的d模型中可不可以加入什么新的用户特征?那要不要在模型中加入正则画像、dropout等等,这些问题都没有标准答案。
你只有通过实践中的尝试才能得到到优的设定。
其实这也是我在讲解这门课所一直秉承的原则。
我希望把业界主流的方法告诉你,希望你建立起来的是一套知识体系和方法论,而不是一套让你一劳永逸的波形参数。
因为银弹并不存在,我们刚刚否定了学生思维,那该怎么建立起一套正确的算法工程师思维呢?下面我总结出了一套通用的算法工程师的工作流程。
虽然不能说我一定掌握了正确的方法,但这些方法都是我从多年的工作经验中总结出来的,也都得到了验证。
你完全可以借助他们来完善自己的工作方法。
首先在接到一个业务或者某一个工作的时候,但是在清楚领导提出的问题,或者我们自己要能从中发现问题,有的问题还有目标才能动手开始解决。
但是在解决这个问题之前,我们一定要花时间弄清楚业务的相关逻辑,并且动手用一些脚本程序弄清楚自己可利用数据的数据量、数据特点,提取出一些特征,并分析特征和标签之间的相关性。
根据得到的数据和对业务的探索结果,我们要提出初始的解决方案。
接着,我们就要结合自己的业务特点,在初始解决方案之上不断迭代。
那具体来说就是进行技术选型和参数调优,确定最终的技术方案。
那在有了这个最终的方案之后,就到了工程落地的环节。
那针对工程的限制,我们要务实的调整,落地的技术方案,尽量做到能简勿繁、能稳定和冒险。
经过最终的调整之后,就要在生产环境上上线。
那最后我们还要根据生产环境的结果进行迭代优化,并复盘整个过程继续去发现问题、解决问题。
最后我还想补充一点,我一直认为,做算法工程师首先要有扎实、全面的技术功底,但更重要的其实是自信和务实的精神。
不迷信所谓的权威模型,不试图寻找万能的参数。
从业务出发,从用户的真实行为出发,才能够构建出最适合你业务场景的推荐模型。
好了,今天的内容讲完了,我们最后做个总结,不要解决。
推荐问题上我认为是没有银弹的。
特别是在模型结构这个点上,我们必须综合考虑自己的业务特点和数据特点,在实践中不断进行参数调优,才能找到最合适自己业务场景的模型。
事实上也不只是推荐问题。
对于其他问题来说,我也不建议同学们去追求所谓的银弹。
换句话说,我们必须要尽量避免学生思维,不要总是试图去寻找标准答案,而是应该尽可能多的掌握业界的主流技术手段,丰富自己的器库,建立自己的知识框架。
这样我们才能在面对实际工作中复杂问题的时候,找到最合适的兵器。
除此之外,作为一名算法工程师,我建议你在工作中按照问题提出数据和业务,探索初始解决方案解决方案,调优工程落地、调整、生产环境上线迭代与复盘的顺序,去完成整个的项目周期,这是能帮助你快速建立起正确方法论的有效途径。
总的来说,算法工程师是一份极有挑战的工作,相比于研发岗非常确定的项目目标,算法的优化工作往往需要我们自己去找到那个可以提升的点,自己去找到那组最合适的参数,并且可以完成生产环境的工程实践。
这给了我们极大的灵活性,也给了我们不小的业绩压力。
那希望这节课可以帮助你纠正一些误区与以共勉。
最后呢我还想让你思考一个问题,那推荐模型的研究可以说是层出不穷,很多同学都热衷于追求实现最前沿的技术,最fancy的模型。
那你是这样的吗?或者说你认可这种现象吗?欢迎你把你的想法写在园区,我们一起讨论,谢谢大家,我们下次再见。