-->

深度学习推荐系统实战_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的模型。

那你是这样的吗?或者说你认可这种现象吗?欢迎你把你的想法写在园区,我们一起讨论,谢谢大家,我们下次再见。