降维算法:把事物特征一般化

  不过,用户关联算法和物-物关联算法还存在一个比一致性更大的问题:它们太死了。是说,它们能发现都喜欢同一样东西的人,但却忽略了爱好非常相似的潜在用户组合。比如说你喜欢莫奈的睡莲。那么,在这个法国印象派大师画的 250 幅睡莲中,你喜欢哪一幅?在一群喜欢莫奈的人当中,完全可能每个人喜欢的睡莲都不相同,而基本的算法有可能识别不出这些人都有着共同的爱好。

  大约十年前,研究者们想出了一个办法,通过一个叫降维(Dimensionality Reduction)的过程,把事物更一般化的表现出来。这种方法在计算量上比用户关联和物-物关联算法要密集得多,因此也没有那么快的得到采用。但随着计算机变更快更便宜,降维算法也逐步取得了一些进展。

  为了弄清降维算法是怎么工作的,我们来看看你爱吃的东西,以及如何把它跟其他一百万人爱吃的东西做比较。你可以把这些信息用一个巨型矩阵表示出来,每一条竖线代表一样食物,每个人爱吃什么东西自然形成了一行。在你的这一行上面或许会显示你给了烤牛排 5 颗星、红烧小排 4 星半、烤鸡翅 2 颗星、冻豆腐卷 1 颗星、奶酪烤蘑菇 5 颗星、盐水毛豆 4 颗星,等等。

  然而,使用这个矩阵的推荐算法并不关心你给哪种食物评了多少颗星。它想要了解的是你一般而言的喜好,这样它可以将这个信息应用到更丰富多样的食物上。比如说,基于你上面给出的信息,算法可能会认为你喜欢牛肉、咸的东西和烤制菜品,不喜欢鸡肉和任何油炸的东西,不喜欢也不讨厌蔬菜,依此类推。你爱吃的食物所拥有的特点或者说维度,它的数量和符合你要求的食物的数量比起来要小得多——至多可能 50 或 100。通过查对这些维度,推荐算法可以迅速决定你是否会喜欢一种新的食物(比方说盐?排骨),方法是把这种食物的各项维度(咸的、牛肉做的、不是鸡肉、不是炒的、不是蔬菜、不是烤的)同你的资料进行比对。这种更为一般性的呈现使得推荐算法能准确的发现有着相似但不同喜好的用户。而且,它大幅压缩了矩阵的规模,使算法变得更加高效。

  这是一个很酷的解决方案。不过,你爱吃的食物的维度该上哪儿去找呢?肯定不是去问厨师。推荐系统会使用一种称为奇异值分解的数学方法来计算维度。这种方法涉及到把初的一个巨型矩阵分解为两个 “口味矩阵”——其中一个包含了所有的用户和 100 项口味维度,另一个则包含了所有的食物和 100 项口味维度——再加上第三个矩阵,当乘以前面两个矩阵中的任意一个时,会得到初的那个矩阵(※此处已更改)。

  不像上面例子中说的那样,计算用的维度既不是描述性的,也一点儿都不直观;它们是纯抽象的值。这并没有什么,只要这些值终生成准确的推荐结果行了。这种方法的主要缺点是,创建矩阵所需要的时间会随着客户和产品数量的增多而飞速增长——创建一个拥有 2.5 亿名客户和 1000 万种产品的矩阵,需要花上创建一个 25 万名客户和 1 万种产品的矩阵 10 亿倍那么多的时间。而且这一过程还需要经常重复。一旦收到新的评分,矩阵已经过时;在像亚马逊这样的公司,每一秒钟都会收到新的评论。幸运的是,算略微过时,矩阵仍然能以一个挺不错的水平运作。研究人员们也已经在设计新的算法,为奇异值分解提供可用的近似值并显著缩短计算时间。

  Joseph A. Konstan 和 John Riedl 都是美国明尼苏达大学的计算机科学教授。身为 IEEE 高级会员的 Konstan 和 IEEE 会士的 Riedl 参与创建了 MovieLens 推荐系统。在接下来的文章里面,两位作者将继续介绍, 推荐算法不会向你推荐的是什么 。