查看原文
其他

深度 | 谷歌新开源「宽度&深度学习」框架:结合记忆和归纳实现更优推荐(附论文)

2016-06-30 机器之心

选自 Google Research Blog

作者:Heng-Tze Cheng

机器之心编译

参与:杜夏德、吴攀


记忆能用来提供与主题关联的推荐,归纳能用来探索从未或很少在过去出现的新的特征组合。谷歌提出新的宽度&深度学习框架将两者结合到了同一个模型之中,从而显著提升了 Google Play 商店应用推荐的成功率。本文前半部分编译自谷歌的研究博客,后半部分节选编译自谷歌的相关论文。原论文请点击文末「阅读原文」下载。


像专家一样学会规则,你才能像艺术家一样打破规则。——巴勃罗·毕加索


人类大脑是复杂的学习机器,能通过记忆日常生活的种种事件(「云雀会飞」和「企鹅能飞」)形成规则,并归纳这些学习以应用到我们从未见过的事物上(「有翅膀的动物会飞」)。也许更强大的是,记忆能让我们使用例外(「企鹅不会飞」)来进一步精炼我们归纳的规则。当我们探索推进机器智能的方法时,我们是在问自己这样一个问题 —— 通过结合记忆(memorization)和归纳(generalization)的力量,我们能教计算机学会人类的学习方式吗?


这个问题很难回答,但通过将深度神经网络(用于归纳)与宽线性模型(用于记忆)联合进行训练,可以结合这两种力量让我们更进一步。在谷歌,我们称它宽度&深度学习(Wide & Deep Learning)。这对于带有稀疏输入的一般大规模回归和分类问题(带有大量可能特征值的类别特征)很有用,比如推荐系统、搜索和排名问题。




今天我们将我们的宽度&深度学习实现方法作为 TF.Learn API 的一部分进行了开源,这样你自己也能轻松地训练一个模型。请查阅 TensorFlow 教程中关于线性模型和宽度&深度学习的内容 ,以及查看我们的研究论文了解更多。


https://v.qq.com/txp/iframe/player.html?vid=d031038ngrs&width=500&height=375&auto=0


宽度&深度学习的工作方式


举个例子,某天你一觉醒来,有了一个叫做 FoodIO 的新应用的想法。这个应用的用户只需要大声说出他/她想要吃的食物(查询(query)) 。这个应用就能魔法般地预测出这个用户最喜欢吃的菜,之后菜就被送到用户门口(项目(item))。这里关键的指标就是消费率——如果一道菜被用户吃了,就得 1 分,否则就是0分(标签(label))


你可以从一些简单的规则入手,比如返回匹配查询中大多数特征的项目,然后放出 FoodIO 的第一个版本。不幸的是,你发现因为匹配太模糊导致了消费率非常低(有人喊出「炸鸡」,最后却得到了「炸鸡饭」),所以你决定增加机器学习以理解数据。


宽度模型


在第二个版本中,你想记住哪些项目与每次查询的匹配效果最好。所以,你在 TensorFlow 上用一个跨产品特性转换的宽泛集合训练一个线性模型,以了解查询-项目对的共现(co-occurrence )与目标标签(一个项目是否被消费)的关联方式。这个模型预测每一个项目的消费概率 P(消费 | 查询,项目),然后 FoodIO 根据预测出的最高消费率发布出最受欢迎的项目。比如说,学习了特征 AND(query="fried chicken", item="chicken fried rice") (查询「炸鸡」,得到项目「炸鸡和华夫饼」)的模型效果非常好;尽管  AND(query="fried chicken", item="chicken fried rice")(查询「炸鸡」,得到「炸鸡饭」)的匹配度也很好但消费率不高。也就是说,FoodIO 2.0 可以很好地记忆用户的喜好,它开始对用户越来越有吸引力。




深度模型


之后你发现,很多用户都在说他们已经对应用中的推荐感到厌烦了。他们渴望发现类似但又不同的能让他们眼前一亮的新菜品。所以你又刷开了你的 TensorFlow 工具包,为 FoodIO 3.0 训练一个深度前馈神经网络 。通过深度模型,你学习了每一个查询和项目的低维密集表征(通常被称为嵌入向量(embedding vector))。通过这种方式,FoodIO 能通过在嵌入空间中匹配彼此相隔较近的项目和查询来进行归纳。例如,你发现那些想要「炸鸡」的人通常不介意也来个「汉堡」。




结合宽度和深度模型


但是,你发现深度神经网络有时会归纳出太多东西和推荐不相关的菜品。然后你会去发掘之前的历史数据,发现事实上数据中存在查询-项目关系的两种不同类型。


第一种类型的查询指向了准确的目标。对着应用喊出「脱脂无咖啡因冰拿铁」的人就是想要「脱脂无咖啡因冰拿铁」。因为即便「脱脂无咖啡因冰拿铁」与嵌入空间中的「全脂热拿铁」接近,但并不意味着后者就是一个可接受的选项。有数百万个嵌入的传递的规则可能造成的伤害比好处更多。另一方面,像「海鲜」和「意大利食品」这类更具探索性的查询可能需要更多归纳和发现不同的相关项目。意识到这些后,你顿悟出:为什么我一定要在宽度和深度模型中选择一个呢?为什么不是两个都选呢?


最后,你在 TensorFlow 上用宽度&深度学习开发了FoodIO 4.0 版本。在上面图表所示,像 query="fried chicken" (查询=「炸鸡」)和 item="chicken fried rice" (项目=「炸鸡饭」)这样的稀疏特征同时被用在宽度部分(左边)和深度部分(右边)模型中。在训练过程中,错误预测被反向传播到两边来训练模型参数。宽度模型部件中的交叉特征转换(cross-feature transformation)能够记忆所有稀疏的特定规则,而深度模型部件能够通过嵌入归纳出类似的项目。


更宽 更深 共同进步


我们很高兴和大家分享 TensorFlow API 和宽度&深度学习的实现方法,你可以利用它们来尝试你的各种想法,和大家分享你的发现。可以在 GitHub 上查询代码,以及查阅 TensorFlow 教程中关于线性模型和宽度&深度学习的部分。


源码地址:


  • https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/learn/python/learn


教程地址:


  • https://www.tensorflow.org/tutorials/wide/

  • https://www.tensorflow.org/tutorials/wide_and_deep/



论文介绍




摘要


带有非线性特征变换的广义线性模型(generalized linear model)被广泛用于带有稀疏输入的大规模回归和分类问题。通过种类宽泛的跨产品特征实现特征交互(feature interaction)的记忆形成(memorization)是有效的和可解读的,尽管归纳(generalization)需要更多的特征工程方面的工作。特征工程做得较少时,深度神经网络可以通过从稀疏特征中学习到的低维密集嵌入(dense embeddings )更好地归纳未见过的特征组合。但是,当用户-项目交互(user-item interaction)是稀疏的和高排名的时,带有嵌入的深度神经网络可能会过度归纳且推荐相关度更低的项目。在本论文中,我们提出了宽度&深度学习(Wide & Deep learning)——共同训练宽线性模型(wide linear model)和深度神经网络——在推荐系统上将记忆(memorization)和归纳(generalization)的优点结合到一起。我们在Google Play上将这个系统产品化了,并对它进行了评估。Google Play 拥有超过10亿个活跃用户,里面的 app 超过100万个。


导语


推荐系统可被看作是搜索排序系统,其输入的查询是一组用户信息和语境信息,然后输出的是一个经过排序的项目列表。给定一个查询后,推荐任务开始在数据库中找到相关的项目,然后基于特定的目的(如点击或购买)对这些项目进行排序。


和一般的搜索排序问题类似,推荐系统所面临的一大挑战是,同时实现记忆形成(memorization)和归纳(generalization)。记忆形成可以宽泛地定义为学习项目或特征的频繁共现(co-occurrence)和利用历史数据中可用的关联(correlation)。而归纳则是基于关联的传递,以及探索从未或过去很少出现的现的新的特征组合。基于记忆的推荐通常更贴近主题,且与用户过去已经执行过动作的项目直接相关。和记忆相比,归纳更倾向于提高推荐项目的多样性。在这篇论文中,我们关注的重点是 Google Play 商店的应用推荐问题,但该方法也应该适用于普通的推荐系统。


在产业背景下规模庞大的在线推荐和排序系统中,逻辑回归(Logistic Regression)这样的广义线性模型得到了广泛的使用,因为这些模型很简单、易扩展且可以解读。这些模型通常在带有独热编码(one-hot encoding)的二元稀疏特征上进行训练;如:如果用户安装了 Netflix 应用,二元特征「user_installed_app=netflix」就取值为 1。记忆可以使用稀疏特征之上的跨产品变换来有效地实现,例如 AND(user_installed_app=netflix, impression_app=pandora),如果用户安装了 Netflix 应用,其取值为 1,然后展示出 Pandora 应用。这解释了一个特征对的共现与目标标签关联的方式。归纳可以通过使用粒度更低的特征而添加进去,例如 AND(user_installed_category=video, impression_category=music)(如果用户安装了视频类应用,则展示音乐类应用),但这往往需要人工参与的特征工程。我们的跨产品转换的限制是它们并不会归纳成未在训练数据中出现过的查询-项目特征对。


如分解机(factorization machine)或深度神经网络等基于嵌入的模型,可以通过学习每个查询和项目特征的低维密集嵌入向量,归纳出之前并未见过的查询-项目特征对,其对特征工程的负担更少。但是,当潜在的查询-项目矩阵是稀疏和高排名的时候(例如有特殊的偏好或范围狭窄需求的利基项目的用户),要高效地学习查询和项目的低维表征是很困难的。在这样的案例中,大部分查询-项目对之间不应该存在交互,但密集嵌入将会得到所有的查询-项目对的非零预测,从而导致过度归纳和做出相关度更低的推荐。另一方面,带有跨产品特征变换的线性模型可以使用少得多的参数记住这些「例外规则」。


在这篇论文中,我们提出了能在同一个模型中同时实现记忆和归纳的宽度&深度学习框架,方法如图 1 所示:将一个线性模型组件和一个神经网络组件联合起来进行训练。本论文的主要贡献有:


  • 用于联合训练带有嵌入的前馈神经网络和带有特征变换(用于有稀疏输入的一般推荐系统)的线性模型的宽度&深度学习框架。

  • 在 Google Play 上实现了宽度&深度推荐系统的产品化及其评估;Google Play 是一个拥有超过十亿活跃用户和超过 100 万款应用的商用移动应用商店。

  • 我们在 TensorFlow 框架中开源了我们的实现方法,并提供了高层的 API。


尽管这个想法很简单,但我们证明宽度&深度框架能显著提升 Google Play 商店中的应用购买率,同时也能满足训练和服务的速度要求。


结论


对推荐系统而言,记忆形成和归纳两者都非常重要。使用产品间的特征转换,宽线性模型能有效的记忆稀疏特征交互,同时深度神经网络能通过低维度嵌入推广到先前未见过的特征交互。我们提出的宽度&深度学习框架结合了这两类模型的优势。在大型的商业应用商店 Google Play 推荐系统上,我们对这一框架进行了投入产品的测试以及评估。在线测试结果显示宽度&深度学习模型相比于单一的宽度或者深度模型,在应用购买上有了极大的改进。



©本文由机器之心编译,转载请联系本公众号获得授权。

✄------------------------------------------------

加入机器之心(全职记者/实习生):hr@almosthuman.cn

投稿或寻求报道:editor@almosthuman.cn

广告&商务合作:bd@almosthuman.cn


点击「阅读原文」,下载此论文↓↓↓

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存