深度神经网络在电子商务产品目录分类问题中的应用---MingLiu美国eBay软件开发经理(数据科学)我叫刘明,来自美国ebay,我在ebay领导一个数据科学家的小团队,我们做的是很多关于目录分类、大数据上的数据挖掘和发现的一些项目,很高兴这次能够收到集团数据委员会以及集团研究中心举办的这次西湖品学大数据峰会的邀请,给大家分享我们ebay在数据研究上的一些经验,我想中间很多问题也是我们阿里的朋友们所共同关心的。首先我讲一下为什么要做目录树的分类,它的主要动机是什么?接下来我们介绍一下基本情况,目录树在ebay是什么样一个情况?用户体验是什么状态?紧接着我们线上的产品系统是一个什么样的系统,都是有什么指标?基本指标是什么情况?接下来我们介绍一下我们的发展,用深度学习来实现进一步的提高。接下来是实验结果比较和分析,最后是总结。我们知道目录树结构是一个非常重要的结构化信息,ebay很多的招贴是通过不同的卖家收集上来的,不同的卖家有不同的规格不同的关键字不同的标题,来招贴同样的商标,中间有很多是非结构性的数据,怎么样让它变成结构化是一个很关键、很核心的问题。在这些所有的结构化数据当中,目录结构化数据是最基本的,因为所有的结构化数据都是依赖于数据。比如说衣帽类的,你想象的数据可能是材质、可能是颜色、可能是尺寸,但是这个数据并不见得适用于手机这一类商品。所以所有的结构化数据,是依赖于目录树、目录库,给所有的结构化数据提供一个骨干,这样才能够构建出ebay结构化数据的知识库。所以从这个意义上讲,目录树是一个最最基本的结构化信息。因为目录树这么重要,所以ebay是需要给每个商家提供这个结构化信息。这当中就带来很多很多不方便,对于商家来讲,因为最好是什么都不需要提供就可以卖。因为这个目录树这么重要,我们又没有办法完全自动的去做标注,所以我们是要求每一个商家在创立一个产品招贴的时候,必须给我们对应的目录树,而且必须到叶结点。所以迫使得我们必须给用户提供一些方便、工具,让他们能够比较快的比较省事的把叶结点标注上。另外我们需要整合一下大的卖家,零售店想在ebay做销售的话,他也必须提供这些目录,但是因为他的商品量数目太大,可能不太合适让他们一个一个去标注,所以我们想提供一个相对自动一些的,其中的一个解决方案是从他们目录到我们ebay目录的映射,这也是我们的动机,为什么要做这样一个项目。在进入很多技术细节之前,让我们有一些感性的认识。这是我们美国ebay网站部分的目录结构,这是一个非常非常小的快照,我们当中有**个叶子结点,而且中间有很多是容易混淆的目录。比方说皮带是一个目录,皮带扣是另外一个目录。如果卖家要卖家皮带和皮带扣的话,通常他可能会随机挑一个,把这个招贴放在两个目录中的一个。这中间目录树是有一个比较容易混淆带来的,有些是卖家不是特别容易找到一个合适的、正确的叶子结点。为什么我们需要这个目录?刚才讲了目录是所有结构化数据的骨干,是提纲挈领,我们必须要有一个纲。这当中其实是一个过滤的,这其中所有的属性都是基于目录,没有目录就没法做这样一个目录体验。其次对于容易比较容易产生歧义的关键字,怎么样去区分这个歧义?在目录这个层次上去做一些聚合,把用户的行为做一些聚合,可以让我们去区分比较容易发生歧义的搜集关键字,这也是为什么我们需要一个目录。另外一个如果有大的商家在ebay上销售,他们的所有商品都必须要要录到目录树结构中去,为他们提供一个更加方便快捷的工具也是我们的重中之重。现在我们来看一看现在如果一个卖家要生成一个招贴的话,他需要怎么样来标注这个目录?他可以有两种方案,他可以通过浏览的过程,一层一层的找到他认为合适的目录树结点。像这种情况下,比如说这个卖家要卖一个皮带,所以他通过三层的目录找到了他合适的目录树结点。但并不是所有卖家都会这么运气,像这个就经过了五层,甚至最长会通过七层八层。所以通过浏览找到合适的目录树结点,基本上不太现实,这也是我们为什么要提供一个相对来讲方便一点的工具,“目录推荐”就是这样一个工具。你敲一个招贴的标题,然后我们通过一些办法找到最可能的目录树结点,通过用户销户,这时候卖家挑一个中间他认为最合适的,这样的标注的话比前面的用户体验相比更加快捷、方便,同时也减少了错误的发生。有时候还是会有问题,因为我们的目录会有混淆,这当中有几个可能都是可以的,可能他还是需要从中间随机挑选一个,这是因为目录的混淆性带来的一些困难。目前我们的系统是基于KNN的系统。KNN系统大家应该很熟悉,很简单,你把输入的招贴,标题再加上一些属性,作为一个查询的雷达,查询的数据点,我们找一下相似的数据点,找已经知道的数据库里面相似的数据点。因为已经知道的库,是所有的已经标注的目录树结点的招贴,比方说找到这些相似的KNN以后,通过相似的KNN的目录树结点,我们就可以做一个简单的投票,相当于对查询的招贴的话,至少就可以产生一个排好序的目录树结点的列表。方法很简单,它利用了我们现有的搜索引擎的平台,可以搜索到的数据是很海量的,我们大概有5亿的商品列表,所以效果还不坏。现在结果是这样,第一个推荐的目录树结点准确率大概在60—80%,如果包含了前5个的话,准确率基本超过了90%。有这样一个性能的话,对于交互的性能来讲已经完全可以用了。因为只要正确的在头5个里面,一般就可以帮助用户选择到最后正确的目录。对于KNN五的分类器的话,对比较长的标题开头会有比较好的效果。因为比较长的标题,相当于查询的约束比较多,你找出来的相似的招贴,真的是比较相似。如果是非常短的关键词,比如说Ipad,这一个关键词的话,可能会找出很多含有这个关健词的招贴。很多招贴是从附件里来的,比如说Ipadkiss等等,有些是从真正的产品,从IpadPlayer这块回来的招贴。如果从招贴数量上来讲,可能IpadKiss会远远大于IpadPlayer招贴数目,如果只是做简单的投票的话,很有可能对于比较短的和比较常用的关键词,KNN会分类到附件这一大类里面去。对于这个问题,我们借用了用户的数据,因为我们知道关键字用户点击了哪些目录,在这个基础上我们可以做一些聚合。我们知道Ipad这个关键词,用户更多的是点击Player这个目录。对这方面,我们倾向于相信用户比较多一些。简单来说,如果有用户的话相信用户,如果没有用户的话,我们相信KNN的分类器。因为KNN利用了现有的分类的平台,基本上能够完成处理实时ebay的流量,基本上没有问题。正如刚才讲的,第一个推荐的准确率60—80%,对于一个完全自动的系统来讲是没有办法接受的,但是对于一个交互的系统,头5个准确的数据是可以接受的。如果我们想把这个系统做成自动,必须要提高Top1的利用,这是一个目标。为什么这么难达到高的准确率?,这中间有好几点,一个是ebay整个系统是一个不停变化的动态系统,不停有新的目录产生,不停有新的目录淘汰掉,另外每个目录里面产品也是动态的,不停有新的产品在卖,老的产品在淘汰,所以商品的招贴也是实时在变。这些因素都导致了这个原因,再加上KNN本身的局限性,导致了top1的准确率不是很高。回过头来我们讲讲现在的用户。对于我们ebay系统的用户来讲,更多是卖家要生成招贴的时候,必须要经过我们这样一个服务,我们给他提供一个目录列表,他从中间再去挑选,这对于我们来讲是一个最大的用户。去帮助大的商家把他的商品全部上载到ebay,这也是一个另外一个大的用户。还有一些针对广大外面开发者提供的一些API。我们了解了现在的局限性,我们讲一下KNN和我们现在做的深度学习的优缺点。优点,KNN是非常非常简单,它可以充分利用现有的搜索平台。缺点也很明显,因为KNN是基于现在的搜索平台,而搜索还是应用传统的算法。总之,所有的算法,它不是为了我们目录推荐这个目标的设计,它是为了比较通用的信息查询和文本排序所设计的。所以作为一个相似度的测度来讲,对于我们目录推荐这个问题,并不见得是最优的,这是它中间很大的一个局限性。相反,深度学习分类器,因为它是为了目录这个问题这个目标进行的学习、优化。所以它可以直接为最后的目标做一个优化,可以学到一个相似度的测度。同样它有一个特征挑选的功能,可以从很多特征功能中挑选比较重要的特征。同时它也有一些办法去降低混合的现象。它主要的问题是你必须要定期的做一些更新,因为商品本身是在更新的,所以必须要去重新训练它的定位模型。相当于KNN来讲,它的维护的费用要高一些。我们用的深度学习是基于Autoencoders,或者叫自编码的使用网络。自编码网络很简单,有用户的层,纬度是一样的,这个纬度是一个平行量,几乎可以忽略不计。这个自编码的目标是为了最大目标的重构输入情况,这个准则实际上是一个无监督的网络,因为它的准则是说我要使得我的输出尽可能的像我的输入,这是一个自编码的准则,这也是一个典型的非监督的组织。有了这样一个网络训练好了以后,中间的引层,可以作为下一层的输入,就是我们通常讲的堆叠的自编码的网络。堆叠的意思就是,将第一层的引层作为第二层的输入,这样的话你可以训练下一层的自编码网络。依次类推可以有很多很多层。堆叠的自编码网络好处是说,因为它可以有很多很深的网络结构,有更好的容量,可以描述更复杂的模式。这是我们现在网络结构,中间有三层堆叠的自编码网络。这是输入层,输入层大概取决于你做分词矢量化以后级别的大小。最后一层,有点像逻辑回归的模型。相对来讲,比传统网络规模大很多,主要训练是一个问题。因为网络比较大,模型的参数比较多,所以一般都会有一些无监督的学习,先去重构输入的本身,这相当于是ebay上所有的数据,哪怕是没有标注的,也可以用来去训练这样一个堆叠的自编码网络。因为这样一个特征,它可以尽可能利用所有的数据,不需要所有的数据都具备标注,所以可以用来训练相对比较大、比较复杂的网络,去聚合比较多的参数。同样的,我们数据级也是相对来讲比较大的,每得到一个新的参数以后,最后做一次聚合,聚合通常你可以简单认为是一个统计平均。这相当于是这几个步骤合在一起是一次迭代,然后通过多次迭代,希望得到一个相对合适的局部最优。这是我们观察到的一些现象,刚才讲了,KNN是基于普通的搜索引擎,而普通搜索引擎基本排序算法是IDF算法或者类似的算法。IDF算法如果这个词在你语料库里出现的越少,它认为越少量。所以,我们查询“coachscarf”,scarf是围巾的意思,coach我们大家都知道。如果查询的关键词是“Coachscarf”。我们简单比较一下这两个,如果我们知识库里面有这样两个招贴,coachcap帽子,一个是另外一个品牌。因为coach是0.068,scarf相对来讲更小,出现得更多,它更频繁地出现在语料库里面。因为KNN的方式,它会认为相对来讲,coach更不重要。如果是出现的是coachcap的话,会比另外一个品牌更加相关。我们知道对我们来讲,这是两种完全不同的商品,我们不应该把它看作是相同的招贴。反过来,深度学习,coach是一个关键字,这个关键字是0.49,scarf为0.42,有相近10倍的权重。也就是它认为对于目录分类这个问题,scarf远比coach重要。这也是我们说为什么深度学习它能力真正学到很好的相似度的测度。这是用一个例子来做一个佐证。基于这样一个想法,我们做了更多的数据量的收集,同样想法是类似的,我们收集coach类似的关键词,也就是说品牌的名称,另外一些是scarf等等这样的关键词。我们来看看神经网络的深度学习过程当中,它们的变化。第一层,基本上这两类是重叠在一起的,基本没有区分。第二层好象有点区分了,蓝色是coach的关键词,红色的是Scarf类似的关键词,慢慢它们分别大一些了。第三层分别更大一些,第四层完全可以看得出来。通过这样的数据,我们可以看出来在网络的层次当中,确确实实把相似度越来越优化在最后分类的问题上。有了这样一些数据点之后,比如说排序最高的,基本上都界定于跟目录联系很紧密的一些关键词。从第一层第二层第三层,其实从第三层就已经看出来有一点点分别了,这边都是0.8以上,这边都是0.75。这是我们现在的一个系统,很简单,当一个