原始视频:七月在线公开课《图神经网络在推荐广告场景中的应用》,课件可以打开视频页面下载
分享老师:推荐吴老师,推荐/广告算法专家,曾任部门算法负责人,年薪....不低
字幕校对:天保,全程校对了字幕,但因为是公开课,互动性很强,所以去掉了很多互动性的语句
笔记撰写:July,在原有公开课/课件基础上做了大量的解读、补充、说明、深入、扩展
交流讨论:涉及到多名同事、讲师,包括且不限于推荐吴老师、北邮团博士、助教杜老师等等
下午在社区上看到一篇面经《本科毕业10年从传统IT转风控:曾自学后通过集训营拿下多个40 50万offer》,面经作者在文章里面提到:“我早在2014年左右就关注July的csdn,他的很多博文受益匪浅”,包括之前有一学员在其朋友圈提到:“七月在线的July老总写的理解SVM的三层境界和掌握比赛大杀器Xgboost很好,多揣摩是很好的”,便激发了自己想再度更新博客的想法。毕竟我这个两千万访问量级的博客,历经过去十年,影响力还是足够大的。
加之,最近图神经网络很火,我们还特地开了个《实战CV下的图神经网络》课,且去年10月底,推荐吴老师专门做了一次GNN公开课,耳濡目染中,总会有点想法,故本文基于吴老师的GNN公开课成文,既是笔记、备忘录,更会在笔记基础上不断扩展、深入,以成为了解图神经网络和其在推荐/广告上应用的一篇综合导论性的文章。
本文先后涉及如下内容:
之后则是Q&A,比如做推荐算法工作需要具备什么样的能力,以及如何提升工程能力等等。最后,若有疑问/问题,欢迎留言/指正哦。
今天这个公开课,主题是图神经网络在推荐广告场景中的一个应用,分享的内容分为三大块
在了解图神经网络之前,我们有必要了解一下为何会有图神经网络这个结构。
一般而言,一个技术的诞生都是伴随着解决某个或某类问题的,那图神经网络解决什么问题呢?已有的倚天屠龙CNN、RNN不香了么?这个问题问得好!
众所周知,CNN主要用于图像类数据的处理(详细了解可看此文:CNN通俗笔记),RNN则主要用于时序类数据的处理(详细了解请看此文:从RNN到LSTM)。然现实中,在越来越多的应用程序中,数据是从非欧几里得域生成的,并表示为具有复杂关系和对象之间相互依赖的图形。图数据的复杂性给现有的机器学习算法带来了巨大的挑战。
比如下图左为图像(欧几里得空间),右为图(非欧几里得空间):
传统的神经网络结构如CNN、RNN等都是接受欧几里得空间的数据作为输入,他们无法处理非欧几里得空间的数据结构。而对于图这类数据,图神经网络就更加适合处理,也导致了近年来图神经网络的研究热度不断提升,如下图所示:
总之,图是一个非常常用的数据结构,包括典型的我们的社交网络、用户商品图、蛋白体结构,以及交通路网知识图谱,这些都是可以描述成Graph的一个结构,然后甚至规则的网格数据,它其实也是图的一种特殊形式。因此,图是一个非常值得研究的领域。
第二,我们说Graph的研究一般分类有哪几种:
然后第三个说一下图神经网络,他从18年开始是一个非常火热的研究方向,然后这里边有几个原因,第一个就是深度学习在其他领域的一个成功,包括CV以及NLP,然后这些都是规则的一些网格数据,而在不规则的网络数据自然也想有一个拓深。
那么第二个就是广泛的使用场景,上面也说到了,很多的场景都可以建成Graph的一个问题,这边我列了一个KDD2020的一个选题,GNN它其实是力压群雄的,他就是排名第一,并且这一个是从18年大概就一直是这样一个趋势,这边附赠大家一个CV的全景图:
这边是我总结的到2018年左右的,这个图给大家show出来其实有两个目的吧:
举个最简单的例子,比如我们现在在用的Relu优化器,最近在工作中其实我们都知道NLP、Transformer、BERT,他用了GLUE,我们换成GLUE的时候他就是在某些场景它能够有个一定的提升、带来一定的业务收益。
当然还有这个Attention。这里我给大家提一个问题,大家都知道这个注意力机制,那我想问一下注意力机制最开始来源于哪里呢?CV、NLP还是推荐呢,大家有人知道吗?对,其实是CV啊。我看到有同学回答对了,它其实是CV先有了这样一个思想,然后到了NLP,在NLP里我们都知道是RNN加这个Attention,这个Attention在NLP领域发扬光大后又反哺给了CV。
注意,考虑到本篇文章侧重图神经网络在推荐/广告中的应用,故关于图神经网络的一些基础概念可以看下这篇文章,比如
我们接着往下看图神经网络,首先介绍Graph Embedding,那么我们先说一下什么是Embedding。
第一个问题就是他随你的物料、随你的词汇增大而增大,比如你去做Word2Vector,那么你的corpus假设有10万个单词,那你OneHot编码就得有10万维,如果有1000万,那么你的OneHot编码就是1000万维,所以它是不固定的;
然后第二个问题就是OneHot编码是一个讨巧的方式,它每一个单词或者每一个 Item它只有一个 1,对不对。这样的话你没有办法去表示谁和谁相近的这样一个这样一个关系,但是Embedding它是可以做到,现在Embedding用的很成熟了,从Word2Vec开始然后到 Item2Vec、Node2Vec以及今天我们讲的这个 Graph Embedding都算Embedding的范畴。
我这里只是show出来,我这里不再单独讲了,大家只需要看一下,最右边这个式子这个是最原始的推导,大家看到这个式子的时候有没有很熟悉,我想问一下,我想问一下这个式子跟softmax有什么关系(点我了解什么是softmax)?
有同学知道吗,看着是不是很像一个softmax 的一个回归?其实Word2Vec呢,它本身最终优化的一个式子就是一个softmax的形式,但是他跟softmax的区别是什么呢?
第二个,我们要增加大家一定的敏感度,大家知道上图右下角小圈圈起来的那个式子叫什么吗?不管是softmax还是Word2Vec,下面那个我们通常就叫做Z,这个Z表示的是配分函数,就是你对全局做一个计算、全局做一个求和,这个计算是不是很耗时,那Word2Vec是怎么做的,我们知道负采样对不对,负采样其实它的学名叫做NCE,即噪声对比估计(给大家一个提醒,就是以后你只要遇到这样一个配分函数的计算,那么首先想到的就是噪声对比估计),也就是我们常说的负采样。
关于负采样为什么最后的优化是跟原来的式子优化是等价的呢,这样一个证明,有兴趣的同学可以再看一下:噪声对比估计杂谈。
更多关于word2vec的理解可以看下此文:如何通俗理解word2vec。
现在我们就来看一下Graph Embedding的一个全景图
当然这个Graph Embedding从16年开始到现在,它已经有很多的这样一个分支了,这里边甚至还没考虑知识图谱的TransE、TransR、TransH等技术,我们今天只介绍一些特别重要特别必要掌握的,不管你是在工作中还是你去面试,只要你说学过或者了解过Graph Embedding,那么这些东西一定会被问到的,我们就讲这些最必要的东西。
第一个就是DeepWalk,这个就是Graph Embedding的始祖了啊,他的思想非常的简单,他就是纯粹借鉴了Word2Vec,我们想象一下,假设我现在有一个图,我要让你去做Graph Embedding,那么参照Word2Vec,你有什么想法呢,它缺什么?
在展开之前先说下相关公式符号,比如上图公式里面的是一个从到的非正规化的转移概率,最简单的一种计算方式就是,对于无权图,,而Z是一个正规化常量。
Word2Vec首先有几个要素:
那么DeepWalk其实就是解决了这三个要素。那我怎么去从 Graph 上去做这三个要素,做成一批句子以及语料库、词表,然后去按照Word2Vec的方法去优化呢?它的思想其实非常简单,就是随机游走,这其实也能看得出来,就是在一个领域初始的时候,我们想做出一点贡献是相对简单些的,像这篇论文引用量应该已经非常高了。
接下来,LINE这个算法在工业界中已经用的非常多了,这个方法虽然跟DeepWalk在建模上是一个思路,但其实已经很不一样了,比如它已经不借鉴Word2Vec,它的思想是定义两种相似度,一个是一阶相似度,一个是二阶相似度。
如浅梦所说,LINE也是一种基于邻域相似假设的方法,只不过与DeepWalk使用DFS构造邻域不同的是,LINE可以看作是一种使用BFS构造邻域的算法。此外,LINE还可以应用在带权图中(DeepWalk仅能用于无权图)。
一阶相似度用于描述图中成对顶点之间的局部相似度,形式化描述为若和之间存在直连边,则边权能看出两个顶点的相似度,若不存在直连边,则一阶相似度为0。 如下图,节点6和7之间存在直连边,且边权较大,则认为两者相似且一阶相似度较高,而节点5和6之间不存在直连边,则两者间一阶相似度为0。
一阶相似度的具体计算过程如下(上图右侧的第一套公式就是一阶相似度):
其中
表达的意思为节点和的边权值在所有边权值之和里所占的权重;
其中,、分别为顶点、的低维向量表示,整个式子可以看作一个内积模型,计算两个顶点之间的相近程度;
故两个分布之间的差异性可以用KL-散度来进行表示,使用KL散度并忽略常数项后,得到最终的一阶相似度的目标函数为
喜欢刨根问底的同学可能问了,上面最后一步是怎么一个计算过程呢?以下是详细推导(注:因为、加个下标1只是为了与后面二阶相似度公式区分开,没别的特殊含义,为推导方便,下述推导过程中下标1省去):
考虑到
仅有一阶相似度就够了吗?显然不够,如下图:
那二阶相似度的计算流程是什么呢?
二阶相似度假定具有大量相同邻接顶点的两个顶点是相似的,在这种情况下,每个顶点可以看作是一个特定的上下文/邻居(context),从而可以认为具有相同或相似上下文分布的顶点被认为是相似的。换言之,因此,在这种场景下,每个顶点既是顶点本身,也是其他顶点的上下文。
- 基于此,作者提出了两种向量表示和,其中为顶点作为顶点本身时的向量表示,而为该顶点作为其他顶点的上下文时的向量表示。
- 对于每个有向边,作者定义了给定顶点的条件下,产生上下文/邻居顶点的条件概率为,其中|V|为顶点的上下文顶点的个数,其实就是对于,各节点为其context的概率(分母可以看作是归一化因子)。比如的邻居 ,的邻居 ,如果和的概率分布是相似的(即两个顶点和的context相似),那么这两个节点就second-order proximity而言是相似的。
- 所以,为了保留Second-order Proximity,我们希望每个顶点在其上下文上的条件分布能最大程度的拟合其经验分布,自然而然,则需要最小化这个目标函数:,其中为控制节点重要性的因子,可以通过顶点的度数或者PageRank等方法估计得到。其中表示两个分布之间的距离,作者同样采用了KL散度来度量,另外作者通过引入来表示不同的顶点在网络或图中的重要性,该值可以通过PageRank等考察顶点重要性的方法来获得。
- 而上式中的经验分布可以表示为,其中表示边的权重,表示顶点的出度,对于带权图,,其中是节点的“出”邻居(从i节点出发的邻节点);
- 假设,然后使用KL散度(采用KL散度作为距离函数,即使用KL距离代替),并忽略常数项,有:
从而通过学习每个节点的两个向量表示、来最小化这个目标函数,最终得到每个节点的维向量表示。
我把本篇笔记发到推荐高级班的群里后,有同学对上面第5步的计算有疑问,另一位李同学马上就手推了一下
首先,我们要求解的目标是
根据,可得
使用KL距离代替,从而有
二阶相似度相比一阶相似度确实要抽象。举个例子
就是看两个node的一阶邻居有多么相似,这两个node可以不直接相连。再比如一个极端的例子,a1的邻居和b1的邻居完全相同,边权也完全相同,那么a1和b1二阶相似度就是1。
接下来,我们考虑另外一个问题。我不知道LINE这个算法你们有没有实操过?对于LINE,我们能不能两个相似度一起优化,也就是 loss 一阶相似度加 loss 二阶相似度直接加起来一起优化呢?
其实是不可以的,因为我们回顾一下这个例子
比如5和6在一阶相似度的时候,他们相似度是 0 对不对,它没有边权,但是你在二阶相似度的时候,他们是完全相似的,也就是相似度是 1,相当于一个 loss 使得他们俩无限的接近,另一个 loss 使他们俩无限地推远,这样你是学不出来的。
所以正常的做法,我们是分别优化的,也就是通过一阶相似度求一个Embedding,通过二阶相似度求另外一个Graph Embedding,两个Graph Embedding可以通过Pooling的方法,不管是concat,还是 Average pooling或Sum pooling ,给弄在一起,最后得到一个Graph Embedding(如果面试中你说了解LINE的话,这个很容易被问到)。
然后这样还有一个启发,就是我们这里考虑了一阶相似度,二阶相似度,那么我们可不可以考虑,3阶相似度、4阶相似度呢?如果你聊一聊算法肯定会问你。
答案是完全可以考虑,比如上图中所有的上一行,a 比 e 、b 比 f 、c 比 g 和 d 比 h,相似度都比下一行大,比如第一个a是因为权值大,第二个b是因为他们的路径多,比如从A1到A2有4条路径可以走,但是下面这个只有一条,这些都是类似的。
下面介绍另一个在工业界特别常用的一个算法,叫Node2Vec
展开之前,说一下相关公式符号的表达,比如就是节点 到节点的最短路径,这个最短路径的取值只能是{0,1,2},因为二阶的随机游走只看两层。
这个算法肯定很多人也听说过,我在这里也给大家再简单地介绍一下。这个Graph Embedding的方法来源还是Word2Vec,不过改进了,它最重要的一个贡献就是改进了DeepWalk。
我们知道DeepWalk的Graph Embedding方法是可以理解为基于DFS的。比如下面这个图,从U到s4到s5到s6,这是一个DFS一直往前走,通过DFS找到一个序列然后再去做Word2Vec,这是很明显的DFS走法。
然后第二个叫内容相似性,内容相似性的假设就是我跟谁的边权越大,我跟谁就越相似,LINE就是一个典型的这种算法,因为它去优化U 跟 s1 s2 s3 s4 的相似度,且在一阶相似性的情况下使用BFS构造邻域。
那么Node2Vec呢,它是定义了一个二阶的一个Random Walk,平衡了DFS与BFS,我们看这个图
这个图 t 是刚刚上一次采样到的节点,V是当前这次采样到的节点, 已经是下次他要采样的结点;
那么P和Q就控制着采样的一个算法
这里边其中有两个应用,一个是腾讯的,一个是Facebook的,他们都是一个广告的应用,LookaLike大家可能都了解吧,我再简单复述一遍,就是广告主给你了一批种子用户,也就是我想把这个广告只投在种子用户上,但是广告主的思维是有限的,他只了解这些种子用户,其实我们平台上有更多的用户,我们可以去给它智能的放量,这在字节跳动叫做智能放量,在其他公司里面可能叫 LookaLike,定制化受众,对不对?我可以自动给你放大我的量,就是你给了一批人,然后我给你再寻找一批,跟他相似的人也给你投放,然后你的收益是不是就更高了,这是Node2Vector在这上面的一些应用。
有同学问:Node2Vec有什么Trick ,实际效果用起来微乎其微?
Node2Vec Trick 的话,一般我们都是直接用的,像LINE用的也比较多,办法对样本加权,这个就是构图的方法了,不是你去在算法上做改进,而是你在构图上做改进。
我举个例子,比如你在广告领域,那么我们可以用点击图,以及点击边和转化边,那么我们转化边跟点击边,它应该有一个权值的兑换,比如你点击的权值是1,那么你转化的权值可能是5,也可以是10或20,这个需要调,然后对应一个采样的概率。
比如你一个User,对某些广告有着非常高的点击,但是对他们转化很低,但是你对另一些广告你转化很高,所以其实所谓广告的优化最终优化的是广告主的价值,更希望是转化的价值大,所以要让他们去更多的往肯转化的这样一个广告上去随机游走。
所以Graph Embedding,其实最重要的不是这些算法,而是你构图,构图是最底层的基础建设。
然后我们就去看一下这个Struc2Vec。首先,再次回顾下结构相似性(DFS)与内容相似性(BFS)的区别。
刚才我们介绍了,内容相似性的定义就是说相邻的节点它更相似,类似于BFS。
那么结构相似性的局限性体现在哪呢?比如我们看这个U和这个V:
他们在图中的地位周围的环境相似,那么他们应该具有更大的相似度,这是结构相似性。那么DFS能不能解决这样的问题呢,一定程度上能,因为你的随机游走,可以游走的比较长,但是呢,如果这个图很大U和V中间隔了很多,那么你U是游走不到V的,所以DFS解决结构相似性有一定的问题。
那么Struc2Vec怎么做的,它在Node2Vec的基础上更进一步,通过一个分层定义了一种结构相似性。
Struc2Vec的一个最大的应用是在风控领域,算是一个标配了(比如这是蚂蚁金服的一个在人工智能大会上的介绍,他们相对于Node2Vec,AUC从70到90,有了质的飞跃,这个我们一会解释一下为什么)。Struc2Vec相对于Node2Vec,在风控这样一个场景下,有更好的这样一个适用性。
我们先介绍一个Struc2Vec是怎么做的。比如在我们有这样一个图之后,我们怎样去定义结构相似性呢?
咱们去比较这个U和V,但换个角度,我们去比较U和V他的邻居相不相似,如果他的一阶邻居相似,那么我们就去比较它的二阶邻居是不是相似,如果他的二阶邻居还相似,我们就去比较三阶对不对,总能比较到一个不相似,假设U和V在第10层,都是很相似的,那他们确实很相似了;
如果U和另一个节点比如 X 节点他们在一阶相似、二阶相似,但是在三阶就不怎么相似了,那U和X的相似度是不是没有U和V的相似度大,对不对,就是这样一个思想啊。
必须进一步讲细致些。如果u的第一层邻居用表示(图出自此处)
Struc2Vec就是去比较u、v各自不同阶层邻居R_k(u)、R_k(v)的相似性
- 另用 s(S) 对某个节点集合V中的节点按照度的从小到大顺序排序后形成的序列,S的取值范围是[0,n-1];
- 是距离u点最短路径为k的节点集合,是距离v点最短路径为k的节点集合;
- 就是距离u,v相距为k的那些节点之间的结构距离,则表示考虑k-1跳邻域时的距离,再加上只考虑k跳邻居的距离,就形成了k跳邻域的距离了,初始值;
- g(D1,D2)用来度量两个经过排序的度序列D1、D2之间的距离,、分别表示与u,v距离为k的节点按照度数大小排序后的度序列(当然,包含的元素个数可能会不一样,可以用DTW可以用来计算两个有序的度序列之间的距离)
则有:
所以当K变大的时候(K就是我说的几阶相似度),K变大是不是等价于CNN的感受野变大,一阶的时候感受野只有 1,对不对,二阶的时候感受野变成 2,所以自底向上地比较一个相似度。
实话说,吴老师讲到这里的时候,我一时半会没反应过来。其实直白来讲,有点类似比较两个倒立的金字塔;更直白点讲,有点类似分别比较在二环、三环、四环、五环的朋友,如果二到五环的朋友都相似,考虑到物以类聚人以群分,那他俩本身能不相似么?
ok,上面得到了每个节点对在不同的k上的结构距离,接下来怎么操作呢?
第一步,首先构建分层网络。为进一步解释,援引下陌上疏影凉的说明:
- 在同一层里边,两个节点之间的边的权重的计算公式为:,代表临近区域的直径。根据“ 如果u,v越相似,那么它们的结构距离就越小,或者越趋向于0 ”,那么(u,v)在图中的权重越大,当时权重达到最大值1。也就是说,在每层的图中,边表示任意两个节点的结构相似性,相似性越大的权重越大。
- 层与层之间是通过有向边相连的,具体的,对于第k层的任意节点 ,都有有向边和 ,权重分别为:,;
其中表示第k层中,所有指向u的边中权重大于该层平均权重的数量,具体的式子为,其中表示第层所有边权的平均值。
直白讲,实际上表示了第k层中有多少节点是与节点u相似的,如果u与很多节点都相似,说明此时一定处于低层次,考虑的信息太少,那么将会很大,即 ,对于这种情况,就不太适合将本层中的节点作为上下文了,应该考虑跳到更高层去找合适的上下文。
第二步,上一步多层网络M的构建就是为了寻找合适的上下文,而寻找上下文的方法与DeepWalk一样是采样随机游走的方式。
再次援引陌上疏影凉的说明:
具体的,假设随机游走走到了节点,那么它下一步可能的节点为、、、(见上图左半边)。留在本层继续游走的概率为q,自然跳层的概率就是1-q。
在本层中,向其他节点游走的概率跟边的权重有关,也就是对权重做一次归一化得到概率:
分母是归一化因子:
如果跳层,同样分两个方向,概率也跟边的权重有关:
注意到当层数越高,因为考虑的邻域更广,节点间的结构相似性计算越苛刻,因此在底层计算出两个节点结构相似的,在高层则不一定相似,并且高层很多节点之间的可能根本没有定义。这就导致如果随机游走在某个节点u跳到了更高的层,那么在随机游走的序列中,其左边的节点是k层,而右边的节点是k+1层的。而左右两边的取值范围是不同的。
换言之,某个节点可能会出现在左边,但不会出现在右边,因为虽然它跟中间那个节点u在k层是相似的,但在k+1层可能无定义或者太大导致随机游走在k+1层走到这个节点的概率几乎可以忽略。
另外从源码可以发现,当在节点u处跳层时,只会添加一次节点,而不会将、都添加到随机游走中。有了上一步采样出来的随机游走,之后直接套用word2vec中SGNS(skip-gram with negative sampling)就可以学习模型了。
————————————————
下面就可以讨论一下,为什么风控场景下Struc2Vec相对于Node2Vec有提升。比如当你在蚂蚁金服的时候,你看到Struc2Vec,这样一个算法之后,你说你用不用呢?其实最本质的原因是这样的,Node2Vecr它是通过平衡DFS和BFS采样得到一个序列,然后做Graph Embedding,他无法获得长距离的这样一个结构相似性,Struc2Vec可以,那么风控场景就需要这种结构相似性。
现在目前我们基本常用都是NCE了,Softmax很少提了,这里边为什么,他可以用 Softmax 而不是 NCE 呢,首先可不可以用 NCE ,那其实肯定可以的。只要看到这个 Z_k 都是可以用 NCE 的,但是这里也可以用Softmax,为什么?
你们想象一下,Word2Vec的层次softmax是怎么构图的、怎么建这个树的,通过哈夫曼树是不是?那哈夫曼树的权值是什么?词频,那你在NLP领域,词频天然就是不公平的,I love,以及 it、you 这些单词频非常的高,但是有一些词appreciate以及一些非常长的词,它的这个词频就低,那么它构建的哈夫曼树一定是不怎么平衡的。
但是对于Graph Embedding这样,一个图,每个节点出现的词频都是一,所以他构建的哈夫曼树一定是平衡的,所以他可以用,你在Word2ec的话,效果就没有那么理想,这是一个本质的原因。
接下来,介绍这个GraphSAGE算法
刚才给大家介绍Struc2Vec,不是说他在推荐系统应用广泛,而是想给大家介绍一个结构相似性以及内容相似性的一个概念,而GraphSAGE就是在推荐系统、广告大规模落地的情况下一个非常犀利的武器。
这里再介绍一个概念归纳式学习和直推式学习,刚才所有的介绍的算法都叫直推式学习
下面,再更具体的看一下GraphSAGE,它相对于前面那几个非常的好理解,这个算法分两步,第一个采样,第二个聚合。
我们具体看下这个算法
这个h0,这个 x_v 就是我输入的这个原始的embedding,比如,如果你是推荐的场景下,那就是推荐的原始的embedding,你用其他的方法,第一开始先学到了embedding,然后你再用GraphSAGE去让他去学到网络的结构,然后V就是所有的结点了,大K就是你要采样的这个层次;
我们简单说一下,这个采样算法。
采样算法,一般我们就是Random采样了,采样K阶的一定数量的节点就行了,然后聚合算法我们一般有几种,一个是MeanPooling,一个是MaxPooling,以及LSTM(了解什么是LSTM,请点击此文),这是论文中提到的。
LSTM的话这里边要提醒一下,每次要 shuffle 一下,因为是LSTM,它是一个序列的算法,但是我们采样是需要跟序没有关系的,因为Random采样的时候就跟序没关系,你第一次可能采要1234,你第二次可能采到同样的这几个点,但是可能采到的是4 2 3 1,对不对,所以你需要shuffle一下,你shuffle一下就可以解决了。
GraphSAGE后面会介绍,他在推荐中的一个逻辑就是PinSage算法,这个算法目前在很多的推荐场景都有落地。
最后一个,我只简单的给大家show出来,也不再给大家讲,这个也是结构相似性的一个假设,问题是非监督、完全非监督的。
回顾一下 Struc2Vec。Struc2Vec 我们的假设是什么呢,一个先验的知识是节点的结构相似性可以由它邻居节点的度的序列来表达,并且可以分层的表达,这是你输入的一个先验,但是GraphWave是不需要任何先验的,你只要给我一个图,我通过一些方式就能够得到你的Embedding的一个函数。
大家可以看一下这个效果啊,左边是今天没有讲的一个算法,中间是Struc2Vec,然后最右边这个是GraphWave,我们可以看到,他把这个结点分的特别清,每个颜色其实代表,一类他能够分的特别清,所以这个效果还是很不错的,并且不需要学习速度非常的快,如果有需要在某些场景中,需要结构相似性的话大家可以试一下。
这个理论部分我们也过了一会了,Graph Embedding其实最主要的问题就是你要怎么选,因为 Graph Embedding 到现在,我从一开始给大家show的那个,大家族里边它有很多的算法,实际上一定要跟你的实际问题相关,从而决定你选择什么样的模型。
总之,你选用什么样的模型取决于你的问题,然后最重要的是构图,大家一定要记住这句话,在图神经网络领域你不是所有的图都是天然成的、包括社交网络,它虽然是个天然的图,但是这个图你需要去做一定的 refine,比如你的权值需要做一些先验的加工,电商领域也是,你一定要把这个图构好了,图构好是你解决问题的过程中最关键的。
GCN,此处不做过多介绍,因为GCN涉及到普图理论、普图卷积,所以这方面这个背景知识更多,我只给大家类比下
有小伙伴说GCN性能太慢了,因为它要在全图领域做一个卷积,GCN在工业界暂时没有很好的落地场景,这方面的理论有兴趣的可以去看下。
然后这个Github里面有PPT,还有这个文档都有,想了解理论的可以去看一下,然后我给大家稍微说一下,这个GCN是怎么回事,GCN分为两大类:
然后我们就进入今天的这个实践部分
先给大家说一下这个范式,就是GNN在推荐广告中的应用有这么两大范式
对于End to End
然后这里边中间这一部分,还是有两种方式:
然后两阶段的呢,两阶段目前在工业界没有特别成熟的应用,它标上有一些应用都是不是特别公开的,不是特别好讲。
比如这有一个Graph,我先通过一个pretrain的,一个GNN然后去得到一个Graph Embedding,这个是存起来的,你可以理解为存一个KV,也可以存数据库。
假设我们存的是KV吧,比如user一个Embedding ad,一个Embedding这样存上了,或者是这个Item 一个 Embedding,然后这样一个Other feature,然后你这个东西,是作为主模型的一个特征进去的,然后比如你在精排里边,作为主模型的一个特征,然后主模型可以进行对它一个 fine-tune ,然后model在跑,就一直在更新记忆,GNN那边也在更新,但是这两个更新,你这个更新怎么去解决他们更新的一个冲突,这是一个关键的问题。然后上面可以做 Ranking,做其他的事。
这是一个范式,目前所有的工业界的应用不会跑出这两个范式的范围,下面给大家介绍这个是2018年的一个文章。
这个文章思想就很简单了,我们去在做推荐的时候,推荐的最核心的一个理论就是这个矩阵填充。
你所有的推荐都可以理解为矩阵填充的一个问题,一些有值的这就是你的 ground truth,有一些 0 的,就是你要去填的。
我把这个建成了一个二部图User 侧和 Item 侧,有一些连接,连接完了之后,我去对这个图做一个Graph Embedding 或者 GCN,反正你最终能得到User的一个Embedding UE,然后 Item 也能得到一个 Embedding IE是吧,然后你就可以去做另一个prediction,User u_i 跟 item_i之间它们的一个相似度。
比如你对于这个吧,我这个叫做 1,这个叫做 1,这个叫做 2,那么 跟 ,它们的相似度边权是1 是吧,那么你需要去求解,他们的 Embedding 之后的相似度也是 1,当然这个 1 我说的,它不是真正的 1 啊,你这个 它只跟 相连,那就是 1 了,如果你 还跟 相连它是 3,那么你应该让他去Embedding之后得到的值应该是1/4,做的就是这样一个事情,忘了说一句,这个文章的GAE用的就是多层级GCN,它不具备落地性。
为什么不具备落地性,刚才有同学已经说了,普通理论的GCN是在拉普拉斯算子上的,拉普拉斯算子是在等于整个Graph的,他没有办法去做一个采样什么的,所以每一次的运算都是在全图上的,在整张图上做消息传递,所以耗时太严重了,工程复杂性太高了,没办法落地,这只是PR的一个文章,大家可以简单的理解一下GCN在召回,是怎么用的就行了。
下面,这个文章我们主要介绍一下,叫PinSage,这个是基于 GraphSAGE 的,这也是一个落地,并且工业界的推荐广告都在用他们这个方法,在各自的业务场景在落地,这个算法是Pinterest 和 Stanford 共同研究的,一个大规模Graph GNN 的一个落地,推荐长期下的一个落地。
这篇论文非常值得推荐,大家可以看一下,因为这篇论文里边有很多的工程实践。
我们做算法工程师,不是说我们去研究这些数学,研究这些算法就好了,我们的 title 是工程师,也就是我们在正常的工作中,你要有很强的工程能力的,现在在大厂你有一篇一作的 paper甚至顶会的一作 paper,这个只能作为加分项。
最终面试的时候,还是要求你的工程能力、算法能力都要很强,不管是字节跳动还是阿里还是腾讯 面过试的同学,大家都知道如果应届生的话可能要求会低一点,但是如果社招的话,你的工程能力一定要很强。
首先我们对这个仔细的讲一下,首先就是构图,他怎么构图的呢?下图左侧代表图片,右侧代表收藏夹。
这个业务场景是一个图片推荐,你可以理解为刷抖音,抖音上你滑过去的不是一个视频,而是一个一个的图片,然后你看到很多图片之后,你可以加到你的收藏夹里边,这个 pins就是一个个的图片,这个 boards 就一个个的收藏夹,然后一个图片如果位于一个收藏夹内,它就连一个线,如果多个图片位于同一个收藏夹内,它们可能具有相似性,对不对,它就是这样一个二部图。
这样有一个思考,还是最基本的问题是怎么构图的问题,这个是影响我们最终效果的一个图网络。比如电商场景如何构图:
新闻推荐如何构图呢?新闻推荐点击,然后以什么停留时长,转发、评论是吧,这些构图,都会相对于 PinSage 的构图都要更复杂一些,我们传统的推荐还是蛮复杂的一个工作。
它的基因模型是什么?我们先看左边这个图,它首先是基于GraphSAGE,而GraphSAGE 我们已经知道是基于采样以及聚合的,其次给大家形象的解释一下
具体我们看一下这个算法,给大家详细的介绍一下。
首先,你有所有的节点,这个是V,然后你有一个 batch_size,就是M个节点,你这个 batch_size 处理M个节点,然后你有一个参数K,这个K可以就是说刚才我们说的采样的深度,刚才我们是 2 是不是。最终是想得到本 batch_size 里边所有的结点的 Embedding,然后它采样。
所以,整个过程相当于分为两部分,一个是采样,一个是聚合,那么先是采样算法:
然后是它的聚合算法,从外向内,因为你S0最大,你S0包含了最边界的情况,也就是你S0相当于包含了 A C A B这些东西嘛,你要先把这些给它聚合好了,因为后边聚合再往内聚合的时候,他们就不动了。具体看一下吧:
以上,是他的GNN模型的一个描述。
然后我们说他训练,他这个是一个有监督的训练啊,其实 PinSage、GraphSAGE都既可以做有监督的,也可以做无监督的,然后这篇文章是做有监督的,它的正例是什么呢,就是用户在点击了item_q 之后,如果马上点击了,他设了一个时间,比如5秒之内又点击了item_i,那么我认为 i 是 q 的好的候选,即(q, i)是一个正例,那么其他的就是负例,它最终优化的是max-margin ranking loss。
这里说一句,这种 ranking loss 其实有很多,你还可以是ranknet 的一个 loss,这个 loss 的说法就是去让正例比较接近,然后让负例拉远就行了,负例就是通过负采样。
刚才 train 说完了,我们接下来说下Servering。Servering 它有一个优化,它是通过一个MapReduce生成这个Embedding,然后进而进行ANN的一个检索,ANN检索我就不说了,就是召回的常用套路,比如最近邻相似的一个检索,他这个东西为什么要用 MapReduce生成 Embedding 呢?
为什么 Servering 的时候跟Training的时候不一致呢,因为正常的网络,我们知道正常的不管是DNN还是什么乱七八糟的模型,我们Training跟Servering 唯一的区别就是不做 backward,是不是,这里有一点不同,为什么不同,是因为它有一个很多的重复计算。
比如,你现在要按 Training 的方式去求解这一组所有的最终的Embedding,那么你会去计算上图最左侧第一个图里的那个绿点,你去计算了一次,这是第一层,计算完之后,第二层你计算到左侧第二个小图里的又一个绿点,你又去算了一次,是吧,它有很多的冗余计算,绿点在这又计算一次,在图很大的时候,你这个是无法有效地满足Servering 的,所以他做了一个 MapReduce这个任务比较简单的,我给大家解释一下。
把上图中最底部的第一层所有的节点都做一个 Embedding,然后去一下重,都做这样一个聚合,然后再往上,相当于不是说为了谁单独算一次,而是我对所有的这些节点只算一遍算完之后存下来(因为它们是同样的计算),然后我再往上算,如果你要是有10层,我就每一层这样算,下一层的结果是用的上一层的,下一层的输入是上一层的输出,就这样,因为MapReduce是一个K嘛,我们的K就直接能够达到去重的效果。
而这个文章里边,之所以推荐大家读是因为它有很多工业上的优化,是一个非常诚意满满的论文最佳的工业实践,我给大家举几个例子:
上面提到的Hard negative 是怎么做的?比如正例不是 q_i 吗,那么负例呢?假设你 q 是 query ,你去查询的时候,你对每个 item都会有一个排名,然后你可以选择i 在1000~2000的一个 rank来作为他的困难样本,你在这里面选一些,然后再随机负采样,再采几个,这样你就加入了困难样本,使得 q 能够更好地去跟 i 去区分。
然后这里给大家提一个问题,因为困难采样,负采样这个东西在工业界也是一个非常好的优化的Trick。大家想一想,为什么,他这个文章里边第一开始的时候,不是 Hard negativ而是用一步一步地增加的,你一开始用的纯的Random 负采样,然后你会慢慢地去增加Hard negative 的一个比例。
如果只用 Hard negative会出现什么问题呢,为什么不一下子最难分的负样本,然后让他学得更好呢?有了解吗,其实是有一个问题的,如果你实践过你会发现,如果你一开始就用所有的都是 Hard negatives,那这个网络会学不好。因为一开始他的Embedding是初始化的,是没有区分能力的,在你没有区分能力的时候你就加大难度是不可取的,一般的话就是慢慢的去加入,这是一个常见的做法。
有同学可能问了,怎么考量Embedding 效果好?
所以还是最终再强调一句PinSage 这个算法,我这边讲的可能也没有特别的好、特别的细致,里边还有很多的内容,还是推荐大家课后去读一读。
然后再介绍一下这个淘宝怎么做的Graph Embedding。刚才说了电商怎么构图,这里给大家介绍一个方案,这篇文章说的是一个Session,一个Session的概念就是,你可以理解为比如30秒一个Session,也可以理解为他一连串的操作,然后隔了一段时间停了,然后又回来操作,那就换了一个Session这样一个概念。
这是淘宝的原来的Embedding,也就是在18年之前,他这个文章发出来之前,应该是在16年 17年的时候用的是这种Graph Embedding来做召回的,召回一般我们都是多路召回,这个肯定是其中的一路。
然后在2018年的时候或者17年,他们升级了淘宝的Graph Embedding,他们只做前面,这个就考虑很简单,你只有实体的信息,你没有任何附加的一个信息,他们后面考虑了一个 Side Info。Side Info 指的就是商品的一些其他的一个属性,比如价格、品牌之类的。不知道这里还记得吗,这个范式,他就用的第二种范式,GNN作为主模型,其他的 feature作为 Graph 里边的一个内容一些属性。
这里边就是说,SI 指的就是第 i 个 item的一个 Embedding,就是我们刚才用最原始的这个方法求出的Embedding,然后他求完这个 Embedding 之后,它又把它的一些属性,比如你这个商品是某个品牌的,那么它本身是一个OneHot的,是不是它往上做一个 Embedding,然后你是有哪些关键词、什么价格,价格一般做分桶、做OneHot、做Embedding,然后往上Concate起来,当然你可以直接去做。
Word2Vec也就是那个softmax最后要求解的那个东西,你已经可以做了,它这里还做了一个优化,就是一个Attention的概念。
因为你某些属性可能没有那么重要,有些属性是非常重要的,所以他就是有一个Attention的操作。总之,这个实践还是非常的好的,在很多公司都有类似的做法。
然后两阶段建模,但是两阶段大家可以知道因为很多公司都是在用的,我给大家举个例子,比如对阿里来说,阿里有很多的数据,你在淘宝、天猫里面的数据,虽然是相通的,但是你在淘宝线的话,你去训练模型,你用的就是淘宝的数据,你在天猫的时候,你用的就是天猫的数据,1688、口碑,这些数据都是不通的,但是你可以用全站的数据去建一个Graph,并且用GNN去Train出一个GE,然后你这个GE就可以赋能各个产品的推荐了。
你要小体量的一个公司,就一个App,你没必要对不对,这一部分大家有什么想问的吗,看看大家的问题。
有同学问到,Side Concat 起来构建样本吗?
不是构建样本,是你的样本已经确定的情况下,你会把 Side Info的 Embeding 考虑进来作为你的优化的一个点,你去学习 Graph Embedding 的同时,你也去学习了它的品牌的Embedding、学习了它的价格的Embeeding,这些都考虑进去了,Margin怎么选取一般都是工业界的调参了。
最后一部分我们介绍一下GNN在工业界落地的时候,有哪些必要的组件
一般对于大公司来说倾向于自研,对于一些中小公司来说,他们会使用开源的软件作为一个基础,然后在开源上面做一些二次开发。比如你在字节、阿里,这个都是自研的,你在其他的公司它可能会用一些开源的。
对于GNN来说,除了算法,还有很多问题要解决
因为阿里的高性能服务Euler做的也不错,而且开源了,我就基于它给大家介绍下,很多公司自研的也都是这一套,这个地方偏向一些工程
我先说一下这个图分布式引擎
我给大家举个例子ABCD现在有这样一个图,你在分布式存储的时候,有两种做法
第一个,上面这就是按点分布式,我们在每个shard上去存,首先你要是点的分布式的话,你会对每个点做一个哈希,然后去哈希完了之后去存到某一个shard上,比如你这个shard1上存了A和B,然后为了采样的方便,我会把他的一阶邻居也顺便存上去
比如A这个地方存了A这个结点,我顺便也会把它的一阶邻居B和C存上,然后B就存B了,然后shard2上存了C、D这两个节点,C 有一个一阶邻居叫D也一块存上来。
然后第二个是按边这个partition,按边 partition 的话是,这个就很简单了,你对边作编号,然后对边做完编号之后,再做一个哈希存上就行了。
比如第一个shard 存的是A到B这个边,以及A到C这个边,然后第二个shard 存的是C到D这个边,这两个 Partition,一般都有各自的好处。
但是 Node Partition 上有一个问题,它受到一些热点的一个限制,比如你在推荐上非常常见,你有一些结点就非常的热,有一些用户就天然喜欢点广告,有一些用户就天然喜欢,它活跃度非常高,然后有很多的冷用户,那么你把这个用户,存到了某个shard上,你这个shard上会附带它的很多的一阶邻居节点会导致shard支持不住。
这种一般工业界是怎么做的呢,其实也没有什么好的办法,我们就是对他的一阶邻居做一个限制,比如说不超过1万个,然后超过1万个了之后,就做一些随机的裁剪,就是这样一个方法,然后Edge Partition的话不存在这样一个倾斜问题,不会受到一些热点的影响。
我怎么去做高性能的邻居采样,实践是怎么实现的,比如Euler 里边怎么实现的,对吧。一般这个图我们都是异构图,现在 Euler 不管,其他公司都是支持这种异构图的,我给大家画了这个图
大家看一下这个user-item的一个图,user这个0代表一种边,1代表另一种边,0代表一种边,1代表另一种边,0怎么理解呢?比如在广告场景0 可以理解为点击编,1 理解为转化边,0这个边它有各自的权值。比如你点击了某个item点击的次数,可以用次数作为边权的一个衡量,比如0.5、1、0.8,然后这个转化也可以有边权,你转化的边权怎么设计呢?你可以以转化这个广告带来的最终的收益为边权,也可以是转化的次数,也可以别的什么,这个需要你设计了。
还是那句话构图是非常重要的,这个图一定要构建的,符合你的业务场景,一旦你把图构建完了,你的工作完成了80%,甚至超过80%,图构建完了,图构建的好,那么直接决定你最终能不能做出收益。
有这样一个图之后,我们怎么做采样的呢,首先它存了一些东西
然后就是GQL语言,这个GQL语言不详细讲了,大概就是它会设计一个类似于SQL的一个语言,因为你在SQL的时候,我们都知道,你SQL语言,写完之后他的底层可以做各种各样的优化的。
GQL语言也一样的,你写完之后,他会给你,首先给你建成一个 D A G,有向无环图,然后在图上给你进行一些操作,一些采样,一些取属性这样一个操作
建完这个图之后,它还会给你进一步的优化,比如说你采样的一些重复点,然后你这个属性,然后是不是可以做一些剪枝,他都会在这个GQL语言里边设计的时候就会给你优化。
然后第三个模块就是 MP 抽象层。我们说了所有的 GNN 都可以理解为GCN 我们先不考虑,因为GCN那个东西,现在还没有真实的落地场景。
我们以Graph SAGE来看的话,就分为三个模块吧。
第三个模块一般我们不要
第一个模块就是子图抽样,子图抽样就是采样,首先你采几个结点,然后结点再采几个邻居,这就是走的方向,然后就是图卷积层、图卷积技术,就是做Graph SAGE 真正的聚合的,你有了邻居怎么聚合
然后第三个就是可选的池化模块,一般我们不要,目前我们工业界落地的时候大部分都不需要。
这边给大家列了一些,他们都是哪种类型的这样一个,这样一个东西。
首先我们来说一下子图抽样,子图抽样,就是刚才说的,我们结合,因为MP下层有几个支撑,一个GQL,一个是这个图分布式存储,以及高性能采样的一个模块。
你采样了这个黄色的点,采样之后,这首先是随机采样,然后随机采样之后,他再给你采样邻居。
我们刚才回过来看这个,这个其实比如 sampleN,就是采样N个结点,随机采样N个节点,然后 sampleNB 呢,就是在这N个节点的基础上,B就是neighbor的意思采样,每个再在采样一个 NB count,一个neighbor,就这个意思。
对应这里边,就是先采样这个黄点,然后每个黄点再采样一些邻居,然后就最终得到这样一个东西,是不是得到这样一个东西之后。
你再接下来进行这个卷积操作,这一步就完成了,子图采样这一部分就完成了。
然后图卷积这一块,你有了采样的东西,这一块已经采样好了,我们只有一个结点,我们只采用了一个黄色的结点 x1,然后它采样了三个邻居结点,那么它有三种方法需要实践。
最后的算法层实现了很多算法,包括知识图谱的、异构图的,一些常见的表征学习的这些都会实现,你可以选用。
一般我们现在正常的
我们现在的召回一般都是双塔在做的,目前这阶段都是双塔
然后有一些公司不公开的,比如字节跳动、阿里,他们有一些自研的高效的一个召回的算法,因为召回我们用双塔的话,它其实有一些限制,你user侧和item侧自己做计算,但是没有match,没有match的话,你就跟精排的精度差很多,现在各大公司都在研究,怎么使用match特征,这是一种方法;
第二种就是一些自研的,Structural learning,这个词在最近的学术界工业界都有,就是你学的不是最终的一个Embedding,然后去做点积、去做召回,而是你对每一个Embedding,Embedding他召回的时候去学了一个路径 structure,然后你这个 user 也学了一个 structure,然后这个 item 学了一个 structure,然后 structure 做一些那个什么。
然后还有一些工程的优化
给大家稍微说一下,广告的召回,我先从上往下看,Euler单机版10万条样本,这个不知道,我们都是分布式的,一般一个结点也就是几十万个,因为我们的单机,每一个 pod 都不大
GNN在推荐场景做了半年,比如GNN好像在阿里貌似还是一个挺大的部门的,因为 Euler他们做的都挺不错的,别的就不多说了。
刚开始上图模型,最简单的,你就直接去用LINE去train一个,或者 GraphSAGE train一个,看你是想做两阶段建模,还是一阶段建模,刚才那个范式我已经给大家介绍了,大家可以按照那个范式去,去建模就行了。
这个同学回答的不错
但是整体的架构都是一样的。你比如字节跳动。他们做中台的这种。广告、推荐。他们中台都是同一套。
首先,我花几分钟给大家介绍一下七月在线的这个推荐系统高级班,目前现在是我了解到是到第7期了(截止到21年q2 是第九期),每一期的就业率最终都是 100%,而且每个老师后面可以帮助大家内推,一般我们的老师我了解,还是都很棒的,级别也都不错,内推的话会有一定的效果。
而且第7期推荐课的内容,我看内容还是蛮丰富的,除了会讲一些推荐系统的常用方法召回、精排,还会结合业界一些前沿的,你不能光讲一些现在在用的。
我说一下我来面试的经验。就是说对于看你的经验。如果你的经验少。比如你校招。或者是你就刚做一年,那么其实我不太care你的项目。你的项目其实在我们眼中,除非你在大厂确实做得不错,否则的话,一般你们的项目,我们就听一听,不是特别重要
我们会非常在意你的基础
然后这边推荐课,一般还会有几个项目,就是实战老师带着大家去真正地去实践,工业中的,这样一个做法,一般我们都是在工业界,现在在打磨的,我们了解工业界该怎么做,所以我们给你们讲的也都是最实用的,不管你们面试还是以后工作呢都是很受用的。
如果你们读过研究生你们就知道研究生的课
对了,我待会会选几名同学,送每人1000块钱的视频课。
因为现在我们是一个开放时间,比如你以前不是做推荐的,你想做推荐有什么路径,或者是GNN有什么想问的,或者说广告啊,这些都可以问一问,包括七月在线的这些,我看校长也在,你们要是有什么问题的话,还可以问一下。
有同学问,阿里社招P7年包有100么这个东西还是要看,要是看你的面试效果这个 range 比较大,可能60万到150万之间都有的。
因为这次是个公开课,然后具体的这些 trick、实践这些东西,也是在正式课里面,肯定是更清楚的,因为是要上手的。
构图有一些技巧的话,就是你要对业务有一个深刻的理解,假如说我举个例子,你在做广告,你做的时间长了,你就知道click 点击跟转化需要一个什么样的比例,你是确定1:3的还是1:10呢,这个东西就是工业的一个业务的经验。
构图考虑有哪些维度一般构图实践中,,一般是两种维度
第一种维度是,你纯考虑这种行为,比如广告,就是点击、转化是吧;
然后你还可以考虑一种跟业务目标相关的,比如你转化了多少钱,你转化之后,带来的收益是多少,这个东西你可以加进去。
点击也是一样一般是两种维度,一个是不考虑最终的目标,一个是考虑最终目标。
刚才我也给大家说了,采样的时候你可以按边采样,你可以按,比如你每一个batch,你可以采样,假设是电商推荐啊,我给大家先说一下,这个图怎么构的,这个图就是,点击、加购、购买,然后退货,这样一个图
然后你可以采样啊,你可以采样的是,比如你每个batch,你采样三个购买,然后5个点击,然后两个退货,这样总共10个,你可以按不同的边来采样,还可以是这样子
一般我们现在倾向于,如果好做的话就做异构图
看时间也快两小时了,今天还是万圣节,要是没什么问题,我们就先到此为止,然后后面如果想报名七月在线的高级班的话,里边很多内容会讲得更细。
因为这次公开课,第一时间有限,第二毕竟是个公开课,我也不了解大家的基础,所以很多内容,也不是说有的放矢,你说基础理论讲不讲的,有的同学他可能知道,有的同学他可能不知道,是不是。
如果你现在是一个在校生的话,Kaggle比赛,天池比赛去参加参加,这些是一个实践的机会,但是真正的工程能力提升,还是要去大厂实习,由于大厂的那些,首先你这个数据量,你在比赛或者什么东西都是没有办法的,所以你真正的工程能力还是要去大厂实习的,还是建议大家,可以去大厂实习看一看,真正的工业界是怎么做的。
因为你真正地参加一个比赛,他数据都给你弄好了,比如你在真正的工业界,比如流式训练怎么做的,流式训练他有很多的坑。
流式训练,我给大家举个简单的广告的例子,广告,你点击还行,你点击了之后,它马上就能回传了,是不是,我能知道你点击了,但是转化
比如我下载了,下载了某个游戏,你下载之后,回传是厂商,是游戏商他来决定的,他一般会成批量地给你回传,那么这时候,你就会遇到一个问题,你的正样本回传不过来,你每次你流失训练的时候,你每次见到一个正样本,你要等它是不是正样本、负样本,你要等一两天,甚至一周怎么办呢。
大家都会有一些优化,比如 emit,fast emit,只要来一个样本,我不管你是正样本,负样本,先当作负样本处理,然后等你真正传回来了正样本,我再把你当做正样本,再处理一遍,并且加了一些规则通过一些算法的推导,告诉你这样是无偏的
真正的算法工程师的工作内容有两大块
你算法的优化是一方面,然后如果你工程,提出一些工程内容,那也是很棒的,所以大家都是要平衡发展的,不是说你会写论文就行了啊,大家可能都知道,现在有些Lab发展的不是特别好,在公司内部,也没有什么人权,地位也比较低下,绩效也不高,高绩效的都是这些业务部门,因为它给公司带来的价值,Lab 部门不是光写论文,得往上赋能,能力不够的话还是不行。
最后一点,给大家找工作的一个建议,大家一定要摒弃掉业务不好的一个想法,做业务是非常好的,你在公司你就得做业务,你不做业务就去研究所做研究。
你要想在公司做研究,说实话你的发展一定不是特别好,除非你是业界的大佬,你要么就是在斯坦福读个博士,然后在业界非常有名,你去带一个团队,做 Lab 的实验室主任是吧,这可以,否则的话,建议大家去业务部门。
我之前找工作的时候,也是想做纯 reserch,但是 reserch 这个东西我做过,做完之后感受不是特别好,还是做业务跟算法的结合,是最能让你感受到一个满足感的。
你能有idea,idea之后上线完之后看到收益,你这个收益可能每天都给公司赚100万,虽然你的年薪可能也才一两百万、可能几百万,但是你每天都能给公司多挣100万,你再有个提升,每天又能给公司多赚几十万,这就是你的价值。
今天跟大家也聊了不少,现在也马上两个小时了,我们今天都先到这边,欢迎大家来参加七月在线的集训营/高级班,我这边结束了,也感谢同学们今天的参与。
我整理完这次公开课后,发现吴老师的视野确实广,每年关注顶会paper,对业界前沿熟练于心,最后也给了很多想做推荐同学的建议,比如算法工程要两不误,比如要深入业务 扎根业务,通过提升业务发挥技术的价值等等等,洋洋洒洒,长文一篇。
为了让本文的可读性更强、更通俗,以下是修改记录:
最后预告下,下一篇推荐方向的笔记,将针对另一位大牛老师推荐王老师的公开课《推荐系统算法技术发展(各模型的演进)》,欢迎期待。