在电商推荐系统中,有一种场景是根据一个商品(主商品)推荐相适度高的商品(推荐商品)。常用的方法有两种,一是利用协同过滤模型,二是利用商品的属性相似。
无论哪种方法,都是将商品转化为向量,将商品的相似度转化为向量的距离。属性相似直接采用了one-hot编码,而协同过滤利用了矩阵分解。
一天,某个同事突发奇想,如果把用户的浏览记录当成一段文字,即把商品看成词语,那就可以语言模型的方法来得到商品的词向量。
而word2vec算法可以很方便训练词向量,于是就把word2vec应用在开头说的那个场景中。
当时我们都觉得这个想法很好。而且线下试验时,挑了几个主商品,用这种方式得到的推荐商品和主商品也是同一类目的。
但经过AB测试,发现效果很差。后来分析发现,对于本身表现不好的主商品,推荐商品的转化表现也不行。这就必然会影响用户的转化,导致这个模块没能很好的承接住用户。
事实上,这并不是说明word2vec算法在计算商品相似度方面效果不好,而是word2vec算法的确能很好的找到相似商品,但这种相似性并不是我们推荐系统中需要的。
词向量与语言模型对应,训练了某个语言模型,也就能得到相应的词向量,反之易可。而语言模型其实是刻画了句子的合理性。
根据词向量相似得到的推荐商品,和主商品在整个语言库(用户浏览行为)中是处在同一地位的。于是长尾商品必然和长尾商品相似,热销商品和热销商品更为相似。
由于热销商品出现的概率非常大,可以看做语言中的常用词,比如自己、中国、社会、认为、时间。而长尾词对应收银台、哥德巴赫猜想、吾辈等词。
常用词和长尾词的相似度本身就会很低,所以对于长尾商品,word2vec算法得到的推荐商品就不会出现热销商品。
基于同样的理由,在计算类目相似性时也不能使用这种方法。
至于推荐商品和主商品大概率下能保持在同一类目,是由于我们app的特点,导致用户在某一小段连续的浏览行为中,曝光的商品主要来自同一类目,或者说同一类目的商品连续出现的可能性高。
所以两个同一类目的商品的地位更为一致,这就能保证相似商品和主商品类目大概率下是一样的。
word2vec的这次应用失败,是因为我们没能理解我们真正的目的。回到这个栏位的本质,其实我们实际是要预测用户点了主商品A之后,点推荐商品B的概率:P(AB)。
即选择使AB同时出现的概率最大的商品B做为推荐商品,但词向量相似性得到的推荐商品C满足的是与A最相似,显然有P(AB) >= P(AC)。
网友评论