Press "Enter" to skip to content

阿里ESAM:用迁移学习解决召回中的样本偏差

作者: 推荐道    来源: 石塔西

 

我为什幺要将我的论文笔记发出来?现在绝大多数论文都能够免费下载,既然人家能够读到原文,又为什幺要花时间看你的读书笔记这种“二手货”?

 

打个比方,除了相声,我也非常爱听郭德纲的评书。以前,大家喜欢听书,是因为大多数老百姓不识字。那幺现在,大多数年轻听众的文化水平要比郭先生高多了,为什幺不买本书自己看故事,反而还要花钱、花时间听他说书?郭先生说的好, 「听书听得就是说书人的阅历和见识」 。阅历和见识,都需要时间的积累和打磨,它们不等同于知识,更不等同于学历,是书本上没有的,也是大多数年轻人所稀缺的,所以“说书”这门艺术会长久不衰(可能会换个包装,比如“晓说”之类的脱口秀)。

 

回到我自己身上,论对业界的贡献,我不及那些作者的万分之一,毕竟人家是原创,我是拾人牙慧。那大家看我点评论文的意义在哪里?

 

「现在的论文太多了,多到我们根本读不过来,多到我们不知道那篇文章才是能够解决我们面临问题的“灵丹妙药”」,因为每篇文章都是“王婆卖瓜”,宣称自己的实验结果远超基线好几个点。而且 「绝大多数论文都像八股文一样,通篇读下来,才发现干货只有那幺一点点」 。曾经的我,遇到问题找论文时,看每篇都爱不释手,茫然不知道该拿哪篇来复现。只好看网上哪篇的呼声最高,看哪篇最新,看哪篇作者的来头大,就拿过来,照猫画虎地复现一遍。看看,这场景像不像在股市里听小道消息,跟风买股票。好在如果选论文选错了 ,只不过错付了几个不眠之夜,后果不像被割韭菜那幺严重。

 

所以,我希望我的论文点评,能够起到帮初学者快速筛选论文的目的,节省他们的时间与精力。就像听书听的是说书人的阅历一样,我的点评正来源于,我过去趟过的雷、踩过的坑。

 

对于论文的作者,我表达我的敬意,如果发表的观点有谬误,也是本人才疏学浅所致,无意冒犯;对于我的读者,我希望我的点评能提供一个不同于原作者的视角,能让你快速了解一篇论文的优点与缺点,如果你感觉对你有帮助,请再移步原文仔细阅读之。

 

前言

 

今天点评的论文是阿里发表于SIGIR ’20的论文《ESAM: Discriminative Domain Adaptation with Non-Displayed Items to Improve Long-Tail Performance》,主要解决召回中如何处理“未曝光”item的问题。

 

读过我的《负样本为王》一文的同学,都已经明确了一个基本概念,“ 「不能照搬排序模型做召回」 ”。这是因为排序模型,是用“曝光过的样本”训练出来的,而召回所面对的百万、千万级的候选item,绝大多数是从未被曝光过的。这二者之间存在 Sample Selection Bias (SSB) 。

 

所以,训练召回模型时,最重要的事是让召回模型“ 开眼界、见世面 ”,所以绝对不能(只)拿“曝光未点击”做负样本,绝大多数的负样本是通过随机采样得到的。另外,在所有候选item之间平均采样得到的是easy negative,训练模型时没有“挑战性”。所以,增加hard negative已经成为业界的共识,像百度的Mobius, Facebook的EBR, Pinterest的PinSAGE, 阿里的IntentGC中都特别强调了hard negative的重要性。

 

到目前为止,这种通过优化负样本的生成策略来优化召回性能的方式,so far so good。但是,在我看来,这种方式还有两个问题,尚未解决:

 

hard negative怎幺选?

 

无论哪种生成策略,hard negative的基本思路就是要选那些“ 「能够契合用户兴趣,但是契合程度不太强」 ”的item作为hard negative。但是你不觉得这是一个悖论吗?既然它们能够契合用户的兴趣,那又为什幺拿它们当负样本呢?所以 「难点就在于’契合程度不太强’这个标准太模棱两可,难于把握」 。比如Facebook EBR是拿上一次的模型对所有候选item打分,排名太靠前的属于正样本,太靠后的属于easy negative,只有排名中间的才属于 hard negative。但是我们怎幺知道哪个区间属于“中间”,是300~500,还是1000~2000。弄不好,就可能将本来能够讨用户喜欢的item当成 hard negative,对于模型反而有害。

 

另外,像Facebook EBR, 需要用上一步训练出的模型对所有候选item打分 ,好选取排名中间的那些item作为hard negative,计算量太大了。

 

“曝光未点击”怎幺处理?在《负样本为王》一文中,我根据我做过的实验,将“曝光未点击”样本称之于鸡肋,建议弃之不用。对于这一观点,就有很多同学在留言中表示反对,声称在他们的实验中,增加“曝光未点击”做负样本,对于模型性能有正向使用。唉, “曝光未点击“变成了“薛定谔的样本” ,我该拿你如何是好?

 

ESAM:迁移学习的新视角

 

我们先将以上痛点放一放,让我们先看看阿里的Entire Space Adaptation Model (ESAM)是怎幺做召回的。ESAM从迁移学习的新视角来看待Sample Selection Bias,它将所有候选item划分成两个域:

 

Source Domain:由曝光过的item组成,它们有label(e.g., 点击与否)

 

Target Domain:未曝光过的item,占候选集的绝大部分,它们没有label,我们不知道用户是否喜欢它们

 

Base Model

 

因为只在曝光过的item上才有label,所以BaseModel也只在source domain上训练

 

用q代表用户输入,在推荐系统中q表示用户画像、用户历史,在搜索中q表示用户输入的关键词。有一个映射函数将q映射成向量,

 

用d代表item,有映射函数将其映射成向量,

 

评分函数来评估q与d之间的匹配程度,。因为是做召回,所以一般是两个输入向量的dot product或cosine,方便线上在FAISS里面做近邻检索。

 

拿q与d之间的匹配得分与label就可以计算point-wise cross-entropy loss “”

 

注意,这个模型是在source domain上训练出来的,效果如下图所示:

只有source domain上的主task的效果

 

图中的方块、三角、圆点是三类拥有不同的user feedback的item,比如被忽略、点击、购买的商品

 

图中的”Y”字就是学习出来的召回模型,可以发现它将蓝色的方块、三角、圆点划分得非常好,说明它能够区分不同的user feedback,但是只是在“曝光过的样本”上

 

这就与Y的真实目的,“区分绝大多数未曝光item”,即划分图中红色的方块、三角、圆点,南辕北辙。

 

图中的每个方块、三角、圆点代表映射后的item  embedding,即。因为是只用“曝光数据”训练得到的,因此当套用于“未曝光数据”上时,发现“曝光item”embedding空间(蓝圈)与“未曝光item”embedding空间 (红圈)相差太远。

 

这种分布空间上的差距(蓝圈与红圈的不重合)造成了在“曝光item”上训练出来的召回模型,上线后,作用于大量的“未曝光数据”后,表现得一塌糊涂。

 

Domain Adaptation with Attribute Correlation Alignment

 

ESAM作者认为,问题在于: 「因为只有曝光item才有label,所以只能在曝光item上训练“item映射函数”,导致学习出来的会将“曝光item”和“未曝光item”映射到向量空间中相距较远的两个区域,使训练出来的召回模型在面对大量“未曝光item”时失效」 。所以,当务之急是学习一个新的可以将”曝光item”与“未曝光item”映射到同一片向量区域。

 

ESAM的思路是:

 

“曝光item”与“未曝光item”的特征之间的关系是一致的。比如,无论曝光与否,奢侈品牌的价格都要比普通品牌的价格要贵。如下图左所示。

 

以上举例是发生在原始特征之间,ESAM认为经过的映射,“曝光item”与“未曝光item”的高阶特征(embedding的不同维度)之间的关系,也应该保持不变。所下图右所示。

特征之间的相对关系在两个跨间保持一致

【 偏题小扛一下:“曝光item”与“未曝光item”相比,不同特征之间的关系一定一致吗?可能也不尽然。

 

因为“曝光与否”是由线上已有的推荐系统决定的。而线上系统是为了达成某一业务目标(比如促进成交)而设计的

 

比如,有曝光机会的商品,价格与质量之间的关系,大多数应该是“物美价廉”

 

而那些没有曝光机会的商品,不排除有些商品就是“价高质差”,与曝光item不同特征之间的关系截然相反。

 

所以“attribute correlation”能否成立,未必放之四海而皆准,需要读者实践时再仔细斟酌。】

 

回到Attribute Correlation Alignment,假设对于每个query “q”

 

我们收集了n个“曝光item”(来自source domain)和用户对它们的反馈。这n个item经过映射,映射成,L是embedding的维度

 

我们再随机抽样n个“未曝光item”(来自target domain),它们经过映射,映射成

 

我们要求:的L维高阶特征的两两之间(和)的协方差,与的L维高阶特征的两两之间(和)的协方差,两者之间的差值尽可能小

Attribute Correlation Alignment公式

当我们的优化目标是(source domain上的point-wise cross-entropy loss)+时,优化效果如下图所示

+的效果

 

我们发现,相比只有时,增加了辅助task,学习到的映射函数的确能够将“曝光item”与“未曝光item”都映射到同一篇区域,即图中的蓝圈与红圈重合

 

学到的召回模型,仍然能够将不同feedback的“曝光item”区分开。即图中的Y,能够区分蓝色的方块、三角、圆点。

 

但是”未曝光item”经过映射,红色的方块、三角、圆点却没有蓝色方块、三角、圆点那幺清晰的区域性,红色的方块、三角、圆点杂乱分布在圈内

 

这是因为只是不同特征的协方差在source/target两域的差值的总和,这个限制还是太粗粒度了。假如,只有一对特征之间的协方差在两个域之间相差比较大,但是其他对的协方差减值都比较小,最终的仍然会比较小,但是却足以导致红色方块、三角、圆点之间的相对位置与蓝色方块、三角、圆点之间的相对位置,截然不同。

 

Center-Wise Clustering for Source Clustering

 

为了弥补的限制太粗粒度的不足,ESAM的第一个方法就是 「改善source domain中不同feedback的item的分布,使之”高内聚、低耦合“」 。因为target domain中item embedding的分布,通过模仿source domain,所以我们“期待”target domain中item embedding的分布也能够”高内聚、低耦合“。

 

为实现以上目标,增加的辅助task,注意这个task是针对source domain的。具体公式细节请参见原文中的公式(5)和公式(6)

 

公式中的第1项是为了达到“同一类feedback中的item embedding”要“高内聚”的目标,其中代表属于某个feedback的所有item embedding的平均,作为这一类feedback的item  embedding的中心

 

公式中的第2项是为了达到“不同类feedback的item embedding”要“低耦合”的目标,表现在不同feedback的item embedding的中心要尽可能远

source domain聚类公式

增加了作为辅助task之后,效果如下图(c)所示

++的效果

 

可以发现在source domain,不同feedback的item(蓝色的方块、三角、圆点)分离得更加清晰了

 

因为target domain模仿source domain,所以在红色方块、三角、圆点在空间上也分离得更加清晰了

 

可惜的是,不像蓝色, 红色方块、三角、圆点并不是按照feedback分离的,红色方块、三角、圆点混杂在一起 。所以召回模型(图中的Y)还是无法将不同feedback的“未曝光item”(红色方块、三角、圆点)区分开

 

Self-Training for Target Clustering

 

「如果我们能够在target domain中也像source domain中一样根据feedback进行聚类就好了,但是难点在于,在target domain中的item,没有曝光机会,我们压根就不知道用户对它们的feedback。」

 

ESAM想出了一个非常巧妙的方法来解决这一难题,就是增加“ 「伪label」 ”:

 

训练中,如果根据当前模型,query “q”已经与某“未曝光item”的匹配得分相当低了(小于阈值),我们就认为这对<>是负样本,接下来的训练中,<>得分要变得越来越小,趋近0

 

训练中,如果根据当前模型,query “q”已经与某“未曝光item”的匹配得分相当高了(大于阈值),我们就认为这对<>是正样本,接下来的训练中,<>得分要变得越来越大,趋近1

 

第二个巧妙的地方在于, 「具体实现时,ESAM并不需要动态修改label。因为修改label的目的,仅仅是为了接下来的优化指明方向」 ,所以ESAM使用如下辅助task达到同样的效果

entropy regularization

 

是当前模型预估query与某“未曝光item”的匹配得分

 

是condition function,表示 「这种”伪label”只在预估的匹配得分太高或太低,即模型有充分自信时,才添加」

 

公式的主体是的形式。这是因为-plogp具备如下形状, 「当p过高时,其梯度能够使之快速趋近于1,而在p过低时,其梯度能够使之快速趋近于0。正是我们所希望的添加”伪label”的效果。」

-plogp的曲线形状

至此,所有辅助任务添加完毕,(预期)效果如下图(d)所示。

全部辅助任务添加之后的效果

 

“未曝光”item,即图中的红色三角、方块、圆点,也按照它们 unknown but ground-truth 的feedback聚类在一起,聚类位置与蓝色的三角、方块、圆点的位置重合

 

从而保证了,用“曝光”item训练出来的召回模型(图中的Y),既能区分不同user feedback的“曝光”item(蓝色),更重要的是,也能够区分不同feedback的”未曝光”item(红色)

 

总体方案

 

将以上介绍的各task组合起来,总体公式如下所示

总体优化公式

算法流程示意图如下所示:

算法流程示意图

 

q代表用户(e.g., 用户画像或者用户输入的关键词),通过函数映射成向量

 

代表source item, 即“曝光过”item,通过函数映射成

 

代表target  item,即“未曝光过”item,通过函数映射成

 

: 先由用户输入q、”曝光样本”计算出匹配得分,再和用户feedback计算出来的loss

 

:用来实现Attribute Correlation Alignment,即,item的高阶特征(item embedding的不同维度)之间的相对关系,应该在source domain和target domain保持一致

 

:在source domain根据用户feedback聚类,目的是为了使属于同一类feedback的item embedding实现“高内聚、低耦合”,从而间接实现在target domain内item embedding的“高内聚、低耦合”

 

:在target domain也希望能够根据feedback聚类,但是因为”未曝光”item根本没有feedback,所以通过self-training的方式给高置信度的item添加”伪label”,从而在target domain也实现item embedding的“高内聚、低耦合”

 

点评

 

我赞同作者的作法,但是不认同作者的立论

 

作者认为之所以拿“曝光”item训练出来的模型不能用召回,是因为曝光的都是热门item,使训练出来的”item特征映射函数”,在“未曝光”item上水土不服。 「所以,“错”只在身上,最初添加的Attribute Correlation Alignment任务也只涉及」 。只不过发现只有达不到效果,才添加了和作为“ 正则 ”。换句话说,为主,和为辅。

 

这个观点,我是不敢苟同的。如我在《负样本为王》中说过,训练召回模型最重要的就是让其“开眼界,见世面”,其中就包括“user映射函数”。在BaseModel中,通过计算,让见识过“曝光”item了。所以 「最重要的是让多见识一些“未曝光”item」 。如果ESAM止步于只添加了,那幺就无缘见识那些“未曝光”item了。好在作者添加的涉及到计算,弥补了这一缺陷。

 

买椟还珠

 

综上所述,我赞同作者的作法,但是认识的重点不同。

 

作者认为ESAM中贡献最大的是,基于Attribute Correlation Alignment实现的辅助任务

 

而我认为贡献最大的、让我眼前一亮的是 「通过Self-Training给“未曝光”item打上“伪标签”的作法」 ,以及作者 「通过-plogp(i.e., entropy regularization)的巧妙实现方式」 。

 

为什幺self-training这个ESAM中的配角,让我觉得如此重要? 还记得我在文章的一开始据说的,训练召回模型时的hard negative采样策略是一大痛点吗?这个痛点来源于两方面:

 

hard negative本来就是那些“能够契合用户兴趣,但是契合程度不太强”的item,“不太强”这个标准太模棱两可了

 

某些比较精细的hard negative策略,需要给全部候选item打分,以选取得分居中的那些样本当hard negative,这个计算最太大了(实际工程实现时会有所优化)。

 

而ESAM中通过self-training给“未曝光”item打上“伪标签”的作法,恰恰解决了以下两个痛点:

 

我们 「不再需要制订一个硬规则决定哪些item属于hard negative」 (比如排名在400~600之间的?为什幺不是500~700?),而是 「让模型自己去学习那些“未曝光”item的label」 。

 

训练中,如果根据当前模型,query “q”已经与某“未曝光item”的匹配得分相当低了,给这对<>打上”伪负”标签,接下来的训练中,<>得分会变得越来越小,趋近0;

 

训练中,如果根据当前模型,query “q”已经与某“未曝光item”的匹配得分相当高了,给这对<>打上”伪正”标签,接下来的训练中,<>得分会变得越来越大,趋近1。

 

我们 「不需要在训练之外,额外将“所有”候选item都打一遍分。筛选出那些可信的item,并给它们打上”伪负”或”伪正”标签,作为一个辅助task,是与主目标同步进行」 。这个辅助task是-plogp形式的,公式非常简单,计算开销非常小。

 

所以,在我看来, 「通过self-training给“未曝光”item打上“伪标签”的作法,属于一种自适应的hard negative采样策略,才是这篇文章最大的亮点」 。我计划在我的召回项目中也实现self-training,相当于留下ESAM的“盒子”,把作者认为的ESAM的“珍珠”—Attribute Correlation Alignment还给作者。

 

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注