聂宇威(如浦)
1. 为什么我们要做商品向量化?
1.1. 什么是向量化?
1986年,机器学习界一代大神Geoffrey Hinton提出embedding的概念,倡导采用机器学习方法进行人工智能研究,进而探索通过人脑运作方式来运作机器学习系统。而受人脑原理的启发,他与同僚们提出“人工神经网络” (artificial neural network),成为现代机器学习的基石。现在大家耳熟能详的,在工业界上大放异彩的word2vec,就是这个思想下的产物(在本文中我们也会将此方法作为基础多次提及)。而这个思想中最核心的一点就是向量化,把事物编码成向量,方便计算机进行各种运算,这也成为了目前工业界比较主流的一种解决问题的方式。
向量化也有多种方法,最简单的方法就是one-hot编码,但对于后续的运算会产生一些问题。例如要把汉字表示成向量,假设我们只编码8万个汉字,一个汉字的表示就需要一个8万维度的向量,大家凭直觉也能理解后续的存储和计算都绝非易事。究其原因,核心点在于这样的思路下,向量表示是稀疏化的且彼此之间相对独立。那么我们就需要走与之相反的一条路,让产出的向量尽可能多地保留住信息(类似压缩和编码),输出的结果通常是稠密的向量。这样的方法在业界多被称之为embedding,通常是事物在低维空间的向量化表示,也是本文所想要向大家阐述的向量化思路(通常辅以特征化的信息表示)。一个常见的embedding的例子就是颜色的RGB表示。自然界的颜色有成千上万种,但我们知道,任何一种可见光都可以由红色、绿色、蓝色这三种颜色的光混合而成,因此我们只需要一个三维的向量就可以表示所有色彩。颜色的RGB值就是这个三维向量,每一维的取值范围是0到255,分别表示三种原色光的强度。同理,对于汉字,我们也可以把它拆成指定数量的特征维度,字典中的每一个词都可以用这些维度组成的向量来表示。
Embedding的作用和优势在于:
使得物体之间可以方便的计算距离或相似度。
可以作为其他学习任务的输入。
那接下来我们讨论一下将平台上最重要的内容 - 商品,做embedding。
1.2. 商品embedding
To B电商平台的APP各场景中,商品当然是我们和门店打交道的核心武器,而且我们数据算法工作中大部分的门店行为都围绕着商品,通过大量的曝光、点击、加购、成交这些"门店对于商品的行为",提供后续我们判断门店对商品认知的依据。此外,商品自身的属性通常能在问题启动时为我们提供数据信息。因此,恰当地描述一个商品对我们工作的开展是十分重要的。
从商品本身角度出发,我们其实就可以用商品的名称、价格、类目、外观、功能等等信息来对其进行偏属性的描述,也能形成商品向量。这些属性有些是可以量化的数值(如价格),有些是分类别的(如类目),有些也可以是非结构化的数据(如商品标题或者商品主图、视频等)。但是为了方便后续的业务逻辑下的数据算法产出价值,电商平台通常会把商品表示成一个适合作为算法模型输入的向量,向量的每一维分量表示这个商品在该维度下的度量值,这些分量共同描述了商品的某些特征。这样,大家应该不难理解商品向量化和上述颜色的RGB表示之间存在的区别,颜色的RGB值具有物理含义,而商品的embedding通常不会有明确的含义,但是针对不同的商品编码成相同的长度,同时每一个维度都具备度量涵义,会让后续的模型计算产生方便而有效。那为了得到这种类型的商品向量,我们通常的做法是设计机器学习任务,把embedding当成模型参数的一部分,通过模型训练得到。
2. 基于海拍客电商平台的商品向量化
商品向量化的方法有很多,不同的业务场景以及业务目标需要我们设计不同的方法。这一章节,我们结合具体的业务需求和相应场景,一起来看看海拍客的商品向量化是怎么做的,又具体产生了怎样的效果。这里我们分两个场景展开,一方面谈谈推荐系统召回策略下的商品表达,另一方面介绍我们针对垂类电商所研发的(基于商品相似度判定下的)搜索扩展召回场景下的商品向量化,而这些过程中我们又分别使用了LFM和DeepQ2I模型。接下来请大家跟随我们一起来了解吧。
2.1. 推荐召回场景商品向量化(基于潜在因素LFM模型)
算法支持业务的诸多场景中,推荐系统应该是做数据算法的朋友们最熟悉的几大类别之一了。给用户(通常是给用户推荐事物,如商品、电影,我们to B场景下的用户就是母婴门店)推荐东西的过程都可以归结为匹配问题,和大多数匹配问题类似,需要通过“召回”加“排序”的方法来解决。其中,召回相对于排序,在多数场景下往往是更重要的一步,其功能主要是根据各类业务策略及数据特征,从海量数据里定位子集(例如我们的电商APP场景中,就是快速定位一小部分门店可能需要批发的商品)的过程。通常,召回需要面对的数据处理工作非常繁重,在权衡速度的同时我们还需要关注定位子集的精确程度,主流的解法中,协同过滤的思想是被最广泛认可和采纳的。
协同过滤 (CF, Collaborative Filtering) 通常分为两种,一种是基于邻域的协同过滤(通常通过相似度计算以及最近邻搜索等技术判断物品是否被召回,又分为以用户为基础 (user-based) 和以项目为基础 (item-based) 两种具体落地形式,简单来说,user-based CF的原理是找出与该用户相似的用户,然后为他推荐这些相似用户购买感兴趣的项目,例如购买的物品、看过的电影;而item-based CF在电商场景中则是从该用户之前的购买商品中推荐给他相似的商品),另一种方式则是基于模型的协同过滤,其中潜在因素/隐语义模型LFM (Latent Factor Model) 就是一类代表,其模型核心思路就是通过一些隐类来联系用户兴趣和项目,通过矩阵分解技术建立“用户和隐类”以及“隐类和项目”之间的关系,最终通过计算得到用户对项目的偏好程度,从而个性化地进行用户和项目之间的推荐。而由于采用了矩阵分解技术,内存方面的节省使得LFM更适合使用在大规模场景,结合该方法在计算逻辑上比较自动化(反正结果都是基于用户行为统计自动聚类,数据说话,算法同学不需要关心分类粒度,所以整体参数量也不大),矩阵生成后对于门店的覆盖率也非常高等等优点,该模型成为目前海拍客APP推荐场景最主要的召回策略。
上述提及的矩阵分解技术主要是指把用户对项目(这里我们拿门店对商品)的稀疏评分矩阵分解成“门店因子矩阵”和“商品因子矩阵”的乘积,通过模型求解得到这两类矩阵,推荐的时候再通过将两个矩阵的部分作相乘,就可以得到门店对商品的稠密评分结果矩阵。有了这样的思路,我们也就不难理解下述矩阵分解的示意图了:
那通过这样的方式生成的商品因子矩阵就可以作为商品的一种向量化表达。
接下来我们来谈谈为什么这样的方式能够达到我们预期的业务效果,答案主要是因为“归类”。存在于这个世界上的事物,由于我们审视其视角的不同,就可以有不同的归类方式,例如你可以判断出一位同学是一个男生,可以查明他是一个具有大学学历的人,可以认定他是一名中共党员,也可以猜测他热爱篮球足球等运动等等。那将这些信息应用在算法里,这些“类别归属”让我们能更好地判断上述user与item之间的关系 – 例如我们平台今年夏天卖爆的子初驱蚊液,除了该商品属于我们“防蚊液/防蚊喷雾”这个类目以外,其品牌知名程度,应季特性,效果与口碑,产品线宽度,甚至该商品长效驱蚊、无胺添加、简易包装等等特质,以及集赞换现金送原装等等营销卖点都能成为门店选择该类目下商品的视角。在这些不同的视角下,我们的门店也会因为“志同道合”而在商品选择方面表现出趋同的性质,让我们对于门店的商品召回更具备依据(通常表现为更精准),这也就是该算法模型在召回商品的过程中的贡献。当然,这个算法在这个过程中的一个明显的问题是生成的这些视角都是一些“隐类”,自然没有语言描述方面的可解释性,就跟夹在深度学习网络层中的特征一样,都可以被视作计算机才能理解的编码。但是这也为我们后续的研究开辟了一个新方向,去看看某隐类上具体关联了那些门店和商品,针对其实质特征进行分析,以期找出隐类可被解释的一些线索,来丰富我们的数据信息。
回到商品向量化这个点上,无论我们的隐类是否容易解释,我们生成的对于“商品-隐类”这个矩阵就比较好地诠释了我们目前的APP下商品应该被怎样表示,这样低存储的商品表示方式也是我们在互联网电商行业中面对时常变化的业务需求的一个较好的支撑方式。
2.2. 基于商品相似度判定下的搜索扩展召回场景下的商品向量化(过程中采用DeepQ2I模型)
刚刚谈了推荐,现在我们再来说说电商APP里流量最大的场景,搜索。在垂类电商搜索场景中,商品的丰富性一定是我们需要直面的一个老大难问题,例如行业大哥京东(3C商品起家)和当当(图书商品起家)也都立足于垂类,进而经历过扩品阶段。我们也不例外,品类上从奶粉纸尿裤,到母婴用品、周边,甚至成人服纺、洗护、手表等等;业务上也从跨境、保税仓发展到国内贸易、控区控货等等。扩品的过程中,无论是品牌还是品类下的商品丰富度(也比如品牌下品类/品类下品牌丰富度)都是一个逐步发展的过程。虽然我们辛勤耕耘的采购同学们还在积极拓宽品类,但是在门店实际对我们的平台逐渐加深认知的过程中,肯定会有些关键词搜索出来的商品数量不足以满足其预期,而且更重要的是我们很可能会损失一些潜在的交易。立项过程中,根据我们对之前一段时间的统计,我们APP里有25%的搜索次数召回商品不超过10个,38%的搜索次数召回商品不超过20个,且不说门店的真实需求没有得到满足,从搜索体验来看,“商品数不够”就可能会成为部分门店下次去其他平台搜索的缘由。
商品召回数量少主要存在两种可能,一种是站内确实没有门店想要的商品,这种情况需要采购去招商,扩充我们的商品,另一种是我们可以用站内真实存在的商品来“询问”门店的意向。为了解决这个问题,我们用一种“以品扩品”的思路,针对搜索结果较少的搜索回合,将与搜索结果中的商品有较高相似度的商品也给予呈现,在丰富门店可见的搜索结果商品数量的同时,也扩大了命中门店兴趣的可能。在这个过程中,我们自己提出了相应的DeepQ2I深度神经网络模型,目标设定为解决部分搜索关键词召回商品过少的问题。思路上是通过已经召回的商品进行i2i扩充,由于我们商品总量不多,可以离线算好商品之间的相似度,每个商品保存topK个最相似的商品,线上根据已召回的商品ID,查表召回相似商品再去重即可。
接下来,为了计算商品之间的相似度,我们需要把每个商品表示成稠密向量,因为向量之间可以直接采用公式计算各类相似度。而为了得到上述商品的向量,需要借助一个训练任务进行机器学习。最容易获得的监督信号 (label) 就是搜索后的点击行为了,那么训练任务就可以设置成预测搜索某个query后,给用户曝光某个item,用户会不会点击,抽象出这个二分类的问题。
模型上我们采用深度神经网络,分成query和item两个表征子模型,其中query通过BERT等NLP模型输出一个embedding,商品的标题通过NLP模型也输出一个embedding,再和商品类目、品牌等其他side information生成的embedding拼接成一个向量(目的是让具有相同side information的商品最终输出的向量更相似),两个子模型各自经过一些全连接层后输出最终的向量,两个向量的点乘越大表示点击的概率越大。
训练得到上述模型后,取出item部分的子模型,输入全站所有商品的标题、类目、品牌等特征就可以得到每个商品的向量表示,然后再计算pairwise向量之间的距离即可得到商品的相似度矩阵。同时,这个模型也提供了Q2I召回的解决办法,线上加载query部分的子模型,实时预测当前query的向量,然后通过faiss(快速向量检索工具)实时计算query向量和所有商品向量的距离,取top即可。这样,当query没有召回任何商品时也能扩召回,填补了i2i方案的不足。除了搜索扩召回,DeepQ2I模型产出的商品i2i相似度也用于商品详情页的推荐,用于补充item-cf的i2i推荐。
3. 商品向量化的业务效果分析(以搜索扩展召回场景为例)
基于上述2.2.的工作,对于DeepQ2I模型产出的向量计算的i2i结果,我们进行了一些商品的相关性分析来验证商品向量化的有效性。
这是不同类目匹配程度(两个商品子级类目相同,则父级类目一定相同)下商品向量距离的分布,可以看到类目匹配程度越高,向量距离也越近。
这是不同向量距离区间下,人工标注的“商品对”相关性分布情况,可以看到,向量距离越近,商品相关的比例也越高。
上述这些数据说明了DeepQ2I模型产出的商品向量可以用向量距离来衡量商品之间的相关性。在搜索扩召回工作全量上线后,召回商品数小于等于10个的搜索次数占比下降到不到1%, 搜索的pv-ctr*uv-cvr提升2-3%。
4. 总结与展望
如我们这篇文章所介绍的,商品向量化在搜索推荐等场景发挥了重要的业务支撑作用,并且也沉淀了一些方法和数据信息,那么对于商品(甚至其他数据主体)更精准的表达以及继续扩展商品向量的使用场景是我们后续努力的方向。
我们之前也提到过,针对不同的业务场景,商品向量化会有不同的表达方式,这主要是因为场景下所需要的数据信息不尽相同。例如针对数据信息的应用方面,商品质量评估、商品类目识别、精准营销等领域,商品都是我们理解这些场景的核心数据主体,因此存在很大的想象空间。因此对于商品质量、预分类、价格、优惠券、批发政策等等信息都可以成为我们商品向量的编码内容。
此外,在特定业务场景下,商品向量化还有一些值得尝试的方法,在to C电商中一个较为常见的理解用户的例子就是将用户在一个session内的商品点击序列进行编码(例如我们将其看作一个文档,其中的每个商品看作一个词,然后利用word2vec的思路学出每个商品的embedding)。此外,我们还可以将商品的点击序列构建成图,在图上随机游走生成更多序列样本,用以训练商品向量,也就是我们经常提到的Graph Embedding。
另外,随着商品数量的增加,离线计算向量距离的方式到后期可能不再适用,到时候需要在线上实时进行向量计算,大规模实时向量近邻检索的问题也将提上日程。