文 / Ruoxi Wang、Phil Sun、Rakesh Shivanna 和 Maciej Kula,Google
9 月,我们开源了 TensorFlow Recommenders,这个库能够帮助您轻松构建最先进的推荐系统模型。现在,我们高兴地宣布 TensorFlow Recommenders (TFRS) 的新版本 v0.3.0。
新版本引入了两项重要功能,二者对于构建和部署高质量、可扩展的推荐模型至关重要。
第一项新增功能是对快速可扩展近似检索提供内置支持。通过利用 ScaNN,TFRS 现已能够构建在数毫秒内即可从数以百万计的条目中检索出最佳候选条目的深度学习推荐模型,同时又保留了部署单个 “输入查询特征即可输出建议” 的 SavedModel 对象的便利性。
第二项新增功能是支持用于特征交互建模的更出色技术。新版本 TFRS 包含了 Deep & Cross Network 的实现:一种高效架构,用于学习深度学习推荐模型中使用的所有不同特征之间的交互。
如果您迫切希望尝试新增功能,可以直接前往我们的 高效检索 和 特征交互 建模教程。或继续阅读以了解详情!
高效检索(粗排)
许多推荐系统的目标都是要从数百万或数千万的候选条目中检索出少量的优质推荐。推荐系统的粗排阶段将解决 “大海捞针” 式的问题,从整个候选列表中获取一份简短且有价值的候选列表。
正如我们在之前的 文章 中所讨论的那样,TensorFlow Recommenders 使构建 双塔检索模型 变得更加方便。此类模型执行检索分为两个步骤:
- 将用户输入映射到嵌入向量
- 在嵌入向量空间内寻找最佳候选条目
第一步的计算成本很大程度上取决于查询塔模型的复杂性。例如,如果用户输入为文本,那么使用 8 层转换器的查询塔的计算成本大约是使用 4 层转换器的查询塔的两倍。稀疏、量化 和 架构优化 等技术都有助于降低这一计算成本。
但是,对于具有数百万个候选条目的大型数据库而言,第二步通常对于实现快速推断更为重要。我们的双塔模型使用用户输入和候选嵌入向量的点积来计算候选条目相关性,尽管点积的计算成本相对较低,但需要针对数据库中的每个嵌入向量各计算一次,计算量会随数据库的大小呈线性增长,因此很快便会丧失计算可行性。因此,快速最近邻搜索 (NNS) 算法对于提高推荐系统的性能而言至关重要。
这正是 ScaNN 的价值所在。ScaNN 是由 Google Research 提供的最先进 NNS 库。它明显优于其他标准水平的 NNS 库。此外,它可与 TensorFlow Recommenders 无缝集成。如下所示,ScaNN Keras 层可无缝取代暴力检索粗排:
# Create a model that takes in raw query features, and
# recommends movies out of the entire movies dataset.
# Before
# index = tfrs.layers.factorized_top_k.BruteForce(model.user_model)
# index.index(movies.batch(100).map(model.movie_model), movies)
# After
scann = tfrs.layers.factorized_top_k.ScaNN(model.user_model)
scann.index(movies.batch(100).map(model.movie_model), movies)
# Get recommendations.
# Before
# _, titles = index(tf.constant(["42"]))
# After
_, titles = scann(tf.constant(["42"]))
print(f"Recommendations for user 42: {titles[0, :3]}")
由于是 Keras 层,因此 ScaNN 索引会序列化并自动与 TensorFlow Recommenders 模型的其余部分保持同步。另外,也不需要在模型和 ScaNN 之间来回传送请求,因为所有内容都已搭配好。随着 NNS 算法的改进,ScaNN 的效率只会不断提高并进一步优化检索准确率和延迟。
ScaNN 可以将大型检索模型提速 10 倍以上,同时仍能提供与暴力矢量检索几乎相同的检索准确率
我们相信,ScaNN 的功能将在部署最先进的深度检索模型方面带来巨大的变革,使其更为便利。如果您有兴趣深入了解如何构建和应用基于 ScaNN 的模型,请查看我们的 教程。
Deep & Cross Network
对于许多预测模型而言,有效的特征交叉都是成功的关键。设想我们正在构建一个基于用户过往购买历史记录来销售搅拌机的推荐系统。诸如香蕉和食谱购买数量一类的单个特征能够为我们提供一些与用户意愿有关的信息,但将同时购买了香蕉和食谱这两项特征相结合,我们就得到了一个极为强烈的信号,表明用户可能想要购买搅拌机。特征的这种组合即称为特征交叉。
在大规模互联网应用中,数据大多是类别型的,这导致特征空间庞大而稀疏。要在这种背景下确定有效的特征交叉,通常需要进行人工特征工程或穷举搜索。传统的前馈多层感知器 (MLP) 模型是通用的函数逼近器。但是,正如 Deep & Cross Network 和 Latent Cross 两篇论文中指出的那样,它们甚至无法有效地逼近二阶或三阶特征交叉。
什么是 Deep & Cross Network (DCN)?
DCN 旨在帮助更加有效地学习显式和有限阶交叉特征。它们始于输入层(通常是嵌入向量层),然后是对显式特征交互建模的交叉网络,最后是对隐式特征交互建模的深度网络。
交叉网络
这是 DCN 的核心。它会在每个层上显式应用特征交叉,最高多项式次数(特征交叉阶数)随着层深度的增加而提高。下图显示了第 (i+1) 个交叉层。
交叉层呈现效果。x0 为基础层(通常设置为嵌入向量层),xi 为交叉层的输入,☉ 表示逐元素相乘,矩阵 W 和向量 b 为要学习的参数
只有一个交叉层时,将在输入特征之间创建二阶(成对)特征交叉。在上文的搅拌机示例中,交叉层的输入将为串联三项特征的向量:[country, purchased_bananas, purchased_cookbooks]。然后,输出的第一维将包含国家 / 地区与所有三项输入特征之间成对交互的加权和,第二维将包含 purchased_bananas 与其他所有特征的加权交互,以此类推。
这些交互项的权重构成了矩阵 W:如果交互重要性低,则其权重将接近于零;如果重要性高,则将远离零。
要创建更高阶的特征交叉,我们可以堆叠更多的交叉层。例如,我们现在知道单个交叉层会输出二阶特征交叉,例如 purchased_bananas 与 purchased_cookbook 之间的交互。我们可以将这些二阶交叉进一步传递至另一个交叉层。然后,特征交叉部分会将那些二阶交叉与原始(一阶)特征相乘,从而创建三阶特征交叉,例如,国家 / 地区、purchased_bananas 和 purchased_cookbooks 之间的交互。剩余连接将继续作用于在上一层中已经创建的那些特征交叉。
如果我们将 k 个交叉层堆叠在一起,那么 k 层交叉网络将创建高达 k+1 阶的所有特征交叉,其重要性由权重矩阵和偏差向量中的参数来表征。
深度网络
Deep & Cross Network 中的深度网络部分是传统的前馈多层感知器 (MLP)。
然后,将深度网络和交叉网络进行组合便构成了 DCN。通常,我们可以在交叉网络顶部堆叠深度网络(堆叠结构);我们也可以将其并行放置(并行结构)。
Deep & Cross Network (DCN) 呈现效果。左:并行结构;右:堆叠结构
模型理解
充分理解学习的特征交叉有助于提高模型的可理解性。幸运的是,交叉层中的权重矩阵揭示了模型所学特征交叉的重要性水平。
以向客户销售搅拌机为例。如果同时购买了香蕉和食谱是数据中最具预测性的信号,则 DCN 模型应能捕获这种关系。下图展示了包含一个交叉层的 DCN 模型的学习矩阵,该模型基于合成数据训练,其中联合购买特征的重要性最高。我们看到,在没有应用任何人工特征工程的情况下,模型自身已经学习 “purchased_bananas” 和 “purchased_cookbooks” 之间的交互具有很高的重要性。
交叉层中学习的权重矩阵
TensorFlow Recommenders 中现已 实现交叉层,您可以轻松地将其用作模型的构建块。要了解操作方法,请查看我们的 教程 以获取示例用法和实际课程。如果您有兴趣深入了解更多内容,请参阅我们的研究论文 DCN 和 DCN v2。
致谢
我们要特别感谢 Derek Zhiyuan Cheng、Sagar Jain、Shirley Zhe Chen、Dong Lin、Lichan Hong、Ed H. Chi、Bin Fu、Gang (Thomas) Fu 和 Mingliang Wang 对 Deep & Cross Network (DCN) 所做的重要贡献。 我们还要感谢在从研究构想到生产化的各个环节中,为 DCN 工作提供帮助和支持的所有人士:Shawn Andrews、Sugato Basu、Jakob Bauer、Nick Bridle、Gianni Campion、Jilin Chen、Ting Chen、James Chen、Tianshuo Deng、Evan Ettinger、Eu-Jin Goh、Vidur Goyal、Julian Grady、Gary Holt、Samuel Ieong、Asif Islam、Tom Jablin、Jarrod Kahn、Duo Li、Yang Li、Albert Liang、Wenjing Ma、Aniruddh Nath、Todd Phillips、Ardian Poernomo、Kevin Regan、Olcay Sertel、Anusha Sriraman、Myles Sussman、Zhenyu Tan、Jiaxi Tang、Yayang Tian、Jason Trader、Tatiana Veremeenko、Jingjing Wang、Li Wei、Cliff Young、Shuying Zhang、Jie (Jerry) Zhang、Jinyin Zhang、Zhe Zhao 以及更多参与人士(按字母顺序排序)。我们还要感谢 David Simcha、Erik Lindgren、Felix Chern、Nathan Cordeiro、Ruiqi Gu o、Sanjiv Kumar、Sebastian Claici 和 Zonglin Li 对 ScaNN 所做的贡献。
原文:TensorFlow Recommenders: Scalable retrieval and feature interaction modelling
中文:TensorFlow 公众号