关于推荐系统的综述

£可爱£侵袭症+ 提交于 2020-01-13 20:50:28

推荐系统中的深度匹配模型

辛俊波 DataFunTalk 今天


文章作者:辛俊波 腾讯 高级研究员

编辑整理:Hoh Xil

内容来源:作者授权

文章出品:DataFunTalk

注:转载请联系作者本人。


导读:推荐系统和搜索应该是机器学习乃至深度学习在工业界落地应用最多也最容易变现的场景。而无论是搜索还是推荐,本质其实都是匹配,搜索的本质是给定 query,匹配 doc;推荐的本质是给定 user,推荐 item。本文主要讲推荐系统里的匹配问题,包括传统匹配模型和深度学习模型。

深度学习之风虽然愈演愈烈,但背后体现的矩阵分解思想、协同过滤思想等其实一直都是贯穿其中,如 svd++ 体现的 userCF 和 itemCF 的思想,FM 模型本质上可以退化成以上大多数模型等。多对这些方法做总结,有助于更深刻理解不同模型之间的关联。

图1 推荐和搜索的本质,都是 match 的过程

PS:本文主要启发来源 SIGIR2018:Deep Learning for Matching in Search and Recommendation,重点阐述搜索和推荐中的深度匹配问题,非常 solid 的综述,针对里面的一些方法,尤其是 feature-based 的深度学习方法增加了近期一些相关 paper。

本文主要分为以下几部分:

❶ 推荐系统概述

❷ 推荐系统的传统匹配模型

❸ 基于 representation learning 的深度匹配模型

❹ 基于 match function learning 的深度匹配模型

01

推荐系统概述

1.1 推荐系统本质

推荐系统就是系统根据用户的属性 ( 如性别、年龄、学历、地域、职业 ),用户在系统里过去的行为 ( 例如浏览、点击、搜索、购买、收藏等 ),以及当前上下文环境 ( 如网络、手机设备、时间等 ),从而给用户推荐用户可能感兴趣的物品 ( 如电商的商品、feeds 推荐的新闻、应用商店推荐的 app 等 ),从这个过程来看,推荐系统就是一个给 user 匹配 ( match ) 感兴趣的 item 的过程。

1.2 推荐和搜索比较

推荐和搜索有很多相同又有很多不同的地方,放到一起的原因是两者其实都是一个 match 的过程,图1.1展示的是一个搜索引擎的架构,需要 match 的是 query 和相关的 doc;图1.2展示的是一个推荐系统的架构,需要 match 的是 user ( 可能会带有主动意图的 query ) 和相关的 item。

图1.1 搜索引擎架构

图1.2 推荐引擎架构

1.2.1 搜索和推荐不同之处

❶ 意图不同

搜索是用户带着明确的目的,通过给系统输入 query 来主动触发的,搜索过程用户带着明确的搜索意图。而推荐是系统被动触发,用户是以一种闲逛的姿态过来的,系统是带着一种 "猜" 的状态给用户推送物品。

简单来说,搜索是一次主动 pull 的过程,用户用 query 告诉系统,我需要什么,你给我相关的结果就行;而推荐是一次 push 的过程,用户没有明显意图,系统给用户被动 push 认为用户可能会喜欢的东西吧。

❷ 时效不同

搜索需要尽快满足用户此次请求 query,如果搜索引擎无法满足用户当下的需求,例如给出的搜索结果和用户输入的 query 完全不相关,尽是瞎猜的结果,用户体验会变得很差。

推荐更希望能增加用户的时长和留存从而提升整体 LTV ( long time value,衡量用户对系统的长期价值 ),例如视频推荐系统希望用户能够持续的沉浸在观看系统推荐的视频流中;电商推荐系统希望用户能够多逛多点击推荐的商品从而提高 GMV。

❸ 相关性要求不同

搜索有严格的 query 限制,搜索结果需要保证相关性,搜索结果量化评估标准也相对容易。给定一个 query,系统给出不同结果,在上线前就可以通过相关性对结果进行判定相关性好坏。例如下图中搜索 query 为 "pool schedule",搜索结果 "swimming pool schedule" 认为是相关的、而最后一个 case,用户搜索 "why are windows so expensive" 想问的是窗户为什么那么贵,而如果搜索引擎将这里的 windows 理解成微软的 windows 系统从而给出结果是苹果公司的 mac,一字之差意思完全不同了,典型的 bad case。

图1.3 部分 query 和 document 的相关性匹配

而推荐没有明确的相关性要求。一个电商系统,用户过去买了足球鞋,下次过来推荐电子类产品也无法说明是 bad case,因为用户行为少,推完全不相关的物品是系统的一次探索过程。推荐很难在离线阶段从相关性角度结果评定是否好坏,只能从线上效果看用户是否买单做评估。

❹ 实体不同

搜索中的两大实体是 query 和 doc,本质上都是文本信息。这就是上文说到的为什么搜索可以通过 query 和 doc 的文本相关性判断是否相关。Query 和 doc 的匹配过程就是在语法层面理解 query 和 doc 之间 gap 的过程。

推荐中的两大实体是 user 和 item,两者的表征体系可能完全没有重叠。例如电影推荐系统里,用户的特征描述是:用户 id,用户评分历史、用户性别、年龄;而电影的特征描述是:电影 id,电影描述,电影分类,电影票房等。这就决定了推荐中,user 和 item 的匹配是无法从表面的特征解决两者 gap 的。

图1.4 推荐系统的两大实体:user 和 item

❺ 个性化要求不同

虽然现在但凡是一个推荐系统都在各种标榜如何做好个性化,"千人千面",但搜索和推荐天然对个性化需求不同。搜索有用户的主动 query,本质上这个 query 已经在告诉系统这个 "用户" 是谁了,query 本身代表的就是一类用户,例如搜索引擎里搜索 "深度学习综述" 的本质上就代表了机器学习相关从业者或者对其感兴趣的这类人。在一些垂直行业,有时候 query 本身就够了,甚至不需要其他用户属性画像。例如在 app 推荐系统里,不同的用户搜索 "京东",并不会因为用户过去行为、本身画像属性不同而有所不同。

图1.5 应用宝搜索京东,不太需要很强的个性化结果

而推荐没有用户主动的 query 输入,如果没有用户画像属性和过去行为的刻画,系统基本上就等于瞎猜。

1.2.2 搜索和推荐相同之处

❶ 本质是都是 match 过程

如果把 user 比作 query,把 item 比作 doc,那么推荐和搜索在这个层面又是相同的,都是针对一个 query ( 一个 user ),从海量的候选物品库中,根据 query 和 doc 的相关性 ( user 过去的历史、画像等和 item 的匹配程度 ),去推荐匹配的 doc ( item )。

❷ 目标相同

搜索和推荐的目标都是针对一次 context ( 或者有明确意图,或者没有 ),从候选池选出尽可能满足需求的物品。两者区别只是挑选过程使用的信息特征不同。

❸ 语义鸿沟 ( semantic gap ) 都是两者最大的挑战

在搜索里表现是 query 和 doc 的语义理解,推荐里则是 user 和 item 的理解。例如,搜索里多个不同的 query 可能表示同一个意图;而推荐里用来表示 user 和 item 的特征体系可能完全不是一个层面的意思。

02

推荐系统的传统匹配模型

2.1 基于 Collaborative Filtering 的方法

2.1.1 CF 模型

说到推荐系统里最经典的模型,莫过于大名鼎鼎的协同过滤了。协同过滤基于一个最基本的假设:一个用户的行为,可以由和他行为相似的用户进行预测。

协同过滤的基本思想是基于 <user, item> 的所有交互行为,利用集体智慧进行推荐。CF 按照类型可以分为3种,user-based CF、item-based CF 和 model-based CF。

❶ User-base CF:通过对用户喜欢的 item 进行分析,如果用户 a 和用户 b 喜欢过的 item 差不多,那么用户 a 和 b 是相似的。类似朋友推荐一样,可以将 b 喜欢过但是 a 没有看过的 item 推荐给 a。

❷ Item-base CF: item A 和 item B 如果被差不多的人喜欢,认为 item A 和 item B 是相似的。用户如果喜欢 item A,那么给用户推荐 item B 大概率也是喜欢的。比如用户浏览过这篇介绍推荐系统的文章,也很有可能会喜欢和推荐系统类似的其他机器学习相关文章。

❸ Model-base CF: 也叫基于学习的方法,通过定义一个参数模型来描述用户和物品、用户和用户、物品和物品之间的关系,然后通过已有的用户-物品评分矩阵来优化求解得到参数。例如矩阵分解、隐语义模型 LFM 等。

CF 协同过滤的思路要解决的问题用数据形式表达就是:矩阵的未知部分如何填充问题 ( Matrix Completion )。如图2.1所示,已知的值是用户已经交互过的 item,如何基于这些已知值填充矩阵剩下的未知值,也就是去预测用户没有交互过的 item 是矩阵填充要解决的问题。

图2.1 用户对左图评分过的电影,可以用右图矩阵填充表达

矩阵填充可以用经典的 SVD ( Singular Value Decomposition ) 解决,如图2.1所示。

图2.2 SVD 矩阵分解

其中左侧 M=m*n 表示用户评分矩阵,m 矩阵的行表示用户数,n 矩阵的列表示 item 数,在大多数推荐系统中 m 和 n 规模都比较大,因此希望通过将 M 分解成右侧低秩的形式。一般来说 SVD 求解可以分为三步:

❶ 对 M 矩阵的 missing data 填充为0

❷ 求解 SVD 问题,得到 U 矩阵和 V 矩阵

❸ 利用 U 和 V 矩阵的低秩 k 维矩阵来估计

对于第二步种的 SVD 求解问题,等价于以下的最优化问题:

其中 yij 为用户 i 对物品 j 的真实评分,也就是 label,U 和 V 为模型预估值,求解矩阵 U 和 V 的过程就是最小化用户真实评分矩阵和预测矩阵误差的过程。

这种 SVD 求解方法存在以下问题:

❶ Missing data ( 在数据集占比超过99% ) 和 observe data 权重一样。

❷ 最小化过程没有正则化 ( 只有最小方差 ),容易产生过拟合。

因此,一般来说针对原始的 SVD 方法会有很多改进方法。

2.1.2 MF 模型 ( 矩阵分解 )

为解决上述过拟合情况,矩阵分解模型 ( matrix factorization ) 提出的模型如下:

MF 模型的核心思想可以分成两步:

❶ 将用户 u 对物品 i 的打分分解成用户的隐向量 vu,以及物品的隐向量 vi

❷ 用户 u 和物品 i 的向量点积 ( inner product ) 得到的 value,可以用来代表用户 u 对物品i的喜好程度,分数越高代表该 item 推荐给用户的概率就越大。

同时,MF 模型引入了 L2 正则来解决过拟合问题。

当然,这里除了用 L2 正则,其他正则手段例如 L1 正则,cross-entropy 正则也都是可以的。

2.1.3 FISM 模型

上述提到的两种模型 CF 方法和 MF 方法都只是简单利用了 user-item 的交互信息,对于用户本身的表达是 userid 也就是用户本身。2014年 KDD 上提出了一种更加能够表达用户信息的方法,Factored Item Similarity Model,简称 FISM,顾名思义,就是将用户喜欢过的 item 作为用户的表达来刻画用户,用数据公式表示如下:

注意到用户表达不再是独立的隐向量,而是用用户喜欢过的所有 item 的累加求和得到作为 user 的表达;而 item 本身的隐向量  vi 是另一套表示,两者最终同样用向量内积表示。

2.1.4 SVD++ 模型

MF 模型可以看成是 user-based 的 CF 模型,直接将用户id映射成隐向量,而 FISM 模型可以看成是 item-based 的 CF 模型,将用户交户过的 item 的集合映射成隐向量。一个是 userid 本身的信息,一个是 user 过去交互过的 item 的信息,如何结合 user-base 和 item-base 这两者本身的优势呢?

SVD++ 方法正是这两者的结合,数学表达如下:

其中,每个用户表达分成两个部分,左边 vu 表示用户 id 映射的隐向量 ( user-based CF 思想 ),右边是用户交互过的 item 集合的求和 ( item-based CF 思想 )。User 和 item 的相似度还是用向量点击来表达。

这种融合方法可以看成早期的模型融合方法,在连续3年的 Netflix 百万美金推荐比赛中可是表现最好的模型。

2.2 Generic feature-based 的方法

上述的方法中,无论是 CF,MF,SVD,SVD++,还是 FISM,都只是利用了 user 和 item 的交互信息 ( ratin g data ),而对于大量的 side information 信息没有利用到。例如 user 本身的信息,如年龄,性别、职业;item 本身的 side information,如分类,描述,图文信息;以及 context 上下文信息,如位置,时间,天气等。因此,传统模型要讲的第二部分,是如何利用这些特征,去构造 feature-based 的 model。

图2.3 特征体系三模块:用户信息、物品信息、交互信息

2.2.1 FM 模型

首先要介绍的是大名鼎鼎的 FM 模型。FM 模型可以看成由两部分组成,如图2.4所示,蓝色的 LR 线性模型,以及红色部分的二阶特征组合。对于每个输入特征,模型都需要学习一个低维的隐向量表达 v,也就是在各种 NN 网络里所谓的 embedding 表示。

图2.4 FM 模型的稀疏 one-hot 特征输入

FM 模型的数学表达如图2.5所示:

图2.5 FM 模型的数学表达分解

注意红色部分表示的是二阶特征的两两组合 ( 特征自己和自己不做交叉 ),向量之间的交叉还是用向量内积表示。FM 模型是 feature-based 模型的一个范式表达,接下来介绍的几个模型都可以看成是 FM 模型的特殊范例。

2.2.2 FM 模型和 MF 关系

假如只使用 userid 和 itemid,我们可以发现其实 FM 退化成加了 bias 的 MF 模型,如图2.6所示:

图2.6 FM 模型可以退化成带 bias 的 MF 模型

数学表达式如下:

2.2.3 FM 模型和 FISM 关系

如果输入包含两个变量,① 用户交互过的 item 集合;② itemid 本身,那么,此时的 FM 又将退化成带 bias 的 FISM 模型,如图2.7所示,蓝色方框表示的是用户历史交互过的 item ( rated movies ),右边橙色方框表示的是 itemid 本身的 one-hot 特征。

图2.7 FM 模型可以退化成带 bias 的 FISM 模型

此时的 FM 模型数学表达如下:

同样道理,如果再加上 userid 的隐向量表达,那么 FM 模型将退化成 SVD++ 模型。可见 MF,FISM,SVD++ 其实都是 FM 的特例。

2.3 传统模型总结

上面介绍的模型都是通过打分预测来解决推荐系统的排序问题,这在很多时候一般都不是最优的,原因有如下几个方面:

❶ 预测打分用的 RMSE 指标和实际的推荐系统排序指标的 gap:

预测打分用的 RMSE 拟合的是最小方差 ( 带正则 ),而实际面临的是个排序问题。

❷ 观察数据天然存在 bias

用户一般倾向于给自己喜欢的 item 打分,而用户没有打分过的 item 未必就真的是不喜欢。针对推荐系统的排序问题,一般可以用 pairwise 的 ranking 来替代 RMSE。

如上述公式所示,不直接拟合用户对 item 的单个打分,而是以 pair 的形式进行拟合;一般来说,用户打分高的 item > 用户打分低的 item;用户用过交互的 item > 用户未交互过的 item ( 不一定真的不喜欢 )。

03

基于 representation learning 的深度匹配模型

终于要讲到激动人心的深度学习部分了。深度学习匹配模型从大致方向上可以分为两大类,分别是基于 representation learning 的模型以及 match function learning 的模型。

本章主要讲述第一种方法,representation learning,也就是基于表示学习的方法。这种方法会分别学习用户的 representation 以及 item 的 representation,也就是 user 和 item 各自的 embedding 向量 ( 或者也叫做隐向量 ),然后通过定义 matching score 的函数,一般是简单的向量点击、或者 cosine 距离来得到两者的匹配分数。整个 representation learning 的框架如图3.1所示,是个典型的 user 和 item 的双塔结构:


图3.1 基于 representation learning 的匹配模型

基于 representation learning 的深度学习方法,又可以分为两大类,基于 CF 以及 CF + side info 的方法。下面的介绍将分别从 input 、representation function 和 matching function 三个角度分别看不同的模型有什么不同。

3.1 基于 Collaborative Filtering 的方法

3.1.1 CF 模型 ( collaborative filtering )

重新回顾下传统方法里的协同过滤方法,如果从表示学习的角度来看,就是个经典的 representation learning 的模型,分别学习 user 和 item 的隐向量。

❶ input layer:只有两个,分别是 userid ( one-hot ),itemid ( one-hot  )

❷ representation function:线性 embedding layer

❸ matching function:向量内积 ( inner product )

图3.2 CF 是 representation learning 最基础的模型

3.1.2 模型 ( Deep Matrix Factorization )

DMF 模型也就是深度矩阵分解模型,在传统的 MF 中增加了 MLP 网络,整个网络框架如图3.3所示。

❶ input layer

由两部分组组成,其中 user 由 user 交互过的 item 集合来表示,是个 multi-hot 的打分表示,如 [0 0 4 0 0 … 1 5 …],在矩阵中用行表示;item 也由交互过的 user 集合来表示,也是个 multi-hot 的表示,如 [5 0 0 3 … 1 3],在矩阵中用列表示。

图3.3 DMF 深度矩阵分解模型框架

可以发现这里的输入都是 one-hot 的,一般来说 M 用户数比较大,N 作为 item 数量假设是百万级别的。

❷ representation function

Multi-Layer-Perceptron,也就是经典的全连接网络。

❸ matching function

用 cosine 点击表示两个向量的匹配分数。

对比普通的 CF 模型,最大的特点是在 representation function 中,增加了非线性的 MLP,但是由于输入是 one-hot 的,假设用户规模是100万,MLP 的第一层隐层是100,整个网络光 user 侧的第一层参数将达到1亿,参数空间将变得非常大。

3.1.3 AutoRec 模型

借鉴 auto-encoder 的思路,AutoRec 模型对输入做重建,来建立 user 和 item 的 representation,和 CF 一样,也可以分为 user-based 和 item-based 的模型。对于 item-based AutoRec,input 为 R 里的每列,即每个 item 用各个 user 对它的打分作为其向量描述;对于 user-based AutoRec 则是用 R 里的每行来表示,即每个 user 用他打分过的 item 的向量来表达。

用 ru 表示用户向量,ri 表示 item 向量,通过 autoencoder 将 ru 或者 ri 投射到低维向量空间 ( encode 过程 ),然后再将其投射到正常空间 ( decode 过程 ),利用 autoencoder 中目标值和输入值相近的特性,从而重建 ( reconstruct ) 出用户对于未交互过的 item 的打分。

❶ input layer

和 DMF 一样,user 用 user 作用过的 item 集合表示,item 则用 itemid 本身表示,图中在原 slides 是说 user-autoencoder,但个人在看原始 autoRec 论文时,这块应该有误,应该是 item-based 的,因为 m 表示的是用户数,n 表示 item 数,下方的输入表示所有 user(1,2,3,…m) 对 item i 的交互输入。

图3.4 item-based 的 autoRec 模型

❷ representation function

通过 auto-encoder 的结构表示,其中,h(r; theta) 表示的是输入层到隐层的重建;由于输入的是用户交互过的 item(multi-hot),所以在隐层中的蓝色节点表示的就是 user representation;而输出的节点表示的是 item 的 representation,这样就可以得到 user 和 item 各自 representation,如下面公式所示:

损失函数为最小化预测的平方差以及 W 和 V 矩阵的 L2 正则:

❸ matching function

有了 user 和 item 的 representation,就可以用向量点击得到两者的匹配分数。

3.1.4 模型 ( Collaborative Denoising Auto-Encoders )

CDAE 模型类似 SVD++ 的思想,除了 userid 本身表达用户,也将用户交互过的 item 作为 user 的表达。

❶ input layer

用户 id,用户历史交互过的 item;以及 itemid。可以发现对比上述基础的 autoRec,用户侧输入同时使用了用户历史交互过的 item 以及 userid 本身这个 bias,思想很类似 SVD++。如图3所示的 input layer 节点,绿色节点表示每个用户交互过的 item,最下面的红色节点 user node 表示用户本身的偏好,可以认为是 userid 的表达。

❷ representation function

图3.5 CDAE 模型结构

其中,中间蓝色的隐层节点作为用户表示,其中 Vu 为 input layer 中的 user node 的 representation,针对所有用户 id 会学习一个和 item 无关的 Vu 向量表达,可以认为是用户本身的 bias,例如有些用户打分本身比较严格,再好的 item 打分也不会太高;有些用户打分很宽松,只要 item 别太差都会给高分,加上 Vu 可以更好的刻画用户之间天然的 bias。

而对于输出层的节点,可以认为是用户 u 对物品 i 的打分预测:

❸ matching function

使用向量点积作为匹配分数:

3.1.5 基于 CF 方法的深度模型总结

总结下以上基于 CF 的方法,有以下几个特点:

❶ User 或者 item 要么由本身 id 表达,要么由其历史交互过的行为来表达;

❷ 用历史交互过的行为来作为 user 或者 item 的表达,比用 id 本身表达效果更好,但模型也变得更复杂;

❸ Auto-encoder 本质上等同于 MLP+MF,MLP 用全连接网络做 user 和 item 的 representation 表达;

❹ 所有训练数据仅用到 user-item 的交互信息,完全没有引入 user 和 item 的 side info 信息。

3.2 基于 Collaborative Filtering+ side information 的方法

基于 CF 的方法没有引入 side information,因此,对于 representation learning 的第二种方法,是基于 CF + side info,也就是在 CF 的方法上额外引入了 side info。

3.2.1 DCF 模型 ( Deep Collaborative Filtering )

❶ input layer

除了用户和物品的交互矩阵,还有用户特征 X 和物品特征 Y。

❷ representation function

和传统的 CF 表示学习不同,这里引入了用户侧特征X例如年龄、性别等;物品侧特征 Y 例如文本、标题、类目等;user 和 item 侧的特征各自通过一个 auto-encoder 来学习,而交互信息 R 矩阵依然做矩阵分解 U,V。整个模型框架如图3.6所示。

图3.6 DCF 模型框架

损失函数优化,需要最小化用户侧特征的 reconstruction 和 item 侧的 encoder 部分,以及交互矩阵和预测矩阵的平方差,还有加上 L2 正则。如图3.7第一个公式。

其中 W1,表示的用户侧特征 X 在 auto-encoder 过程中的 encode 部分,也就是输入到隐层的重建,P1 表示的是用户特征到交互矩阵 R 的映射;而 W2 表示物品侧特征 Y 在 auto-encoder 过程中的 encode 部分。P2 表示的是物品特征到交互矩阵 R 的映射。

图3.7 CDAE 模型的损失函数分解

图3.7下面两组公式中,可以看出用户侧和物品侧特征都由两项 error 组成,第一项衡量的是 input 和 corrupted input 构建的预估误差,需要保证 W1 和 W2 对于 corrupted 后的 input x 和 y 不能拟合太差;第二项表达的是映射后的隐层特征空间 W1X 和投射到 U 矩阵的误差不能太大。

简单理解,整个模型的学习,既需要保证用户特征 X 和物品特征 Y 本身 encode 尽可能准确 ( auto-encoder 的 reconstruction 误差 ),又需要保证用户对物品的预估和实际观测的尽可能接近 ( 矩阵分解误差 ),同时正则化也约束了模型的复杂度不能太高。

3.2.2 DUIF 模型 ( Deep User and Image Feature Learning )

❶ input layer

除了用户和物品的交互矩阵,还有用户特征 X 和物品特征 Y。

❷ representation function

整个 match score 可以用下图表示:fi 表示原始图片特征,通过 CNN 网络提取的图片特征作为 item 的表达,然后用一个线性映射可以得到 item 的 embedding 表达。

❸ match function

通过模型学到的 pu 作为用户的 representation,以及通过 CNN 提取的图片特征作为 item 的 representation,两者通过向量点积得到两者的匹配分数。

3.2.3 ACF 模型 ( Attentive Collaborative Filtering )

Sigir2017 提出的 Attention CF 方法,在传统的 CF 里引入了 attention 机制。这里的 attention 有两层意思,第一层 attention,认为用户历史交互过的 item 的权重是不一样的;另一个 attention 意思是,用户同一个 item 里到的视觉特征的权重也是不一样的,如图3.8所示。

图3.8 ACF 模型结构

❶ input layer

① 用户侧:userid;用户历史交互过的 item。

② Item侧:itemid;item 相关的视觉相关特征。

❷ representation function

可以分为两个 attention,一个是 component 层级的 attention,主要是提取视觉特征;第二层是 item 层级的 attention,主要提取用户对物品的喜好程度权重。

① component-attention

在该 paper 里的推荐系统针对的是 multi-media 的,有很多图文和视频的特征信息提取,所以引入的第一层 attention 指的是 component attention,认为对于不同的 components 对 item representation 的贡献程度是不同的,如图3.9所示。

图3.9 component attention 框架

对第 l 个 item,输入为不同 region 本身的特征 xl1,xl2,xlm,表示的是 m 个不同的 item feature, 以及用户输入 ui,最终 item 的表达为不同的 region 的加权 embedding。

其中第一个公式表示用户 i 对物品 l 第 m 个 component ( 例如图片特征中的局部区域特征,或者视频中不同帧的特征 ) 的权重;第二个公式 softmax 对 attention 权重归一化。

② item attention

第二层 attention,认为用户作用过的 item 历史中,权重应该是不同的。这里文章使用了 SVD++ 的方式,用户本身的表达引入了 a(i, l),代表的是用户 i 对其历史交互过的物品 l 的权重。

用户 i 对第 l 个 item 的权重表达可以用如下的数据表示:

其中 ui 是用户本身的 latent vector,vl 是物品 l 的 latent vector,pl 是物品 l 的辅助 latent vector;xl 是表示前面提到的从图文信息提取的特征 latent vector。用户最终的表达是自身 ui 的 latent vector,以及历史行为的 attention 加权的 representation 表示。

模型使用的是 pairwise loss 进行优化:

❸ representation function

使用 user 和 item 的向量点击作为匹配分数。

3.2.4 CKB 模型 ( Collaborative Knowledge Base Embedding )

CKB 模型是在2016年 KDD 提出的,利用知识图谱做 representation learning,模型框架如图3.10所示。整个 CKB 模型框架其实思想比较简单,分别在结构化信息、文本信息和视觉信息中提取 item 侧特征作为 item 的 representation。

图3.10 CKB 模型框架

❶ input layer

① user侧:userid

② item侧:itemid;基于知识图谱的 item 特征 ( structural,textual,visual )

❷ representation function

主要是从知识图谱的角度,从结构化信息,文本信息以及图文信息分别提取 item 侧的表达,最终作为 item 的 embedding。

① 结构化特征 struct embedding: transR,transE

图3.11 struct embedding 框架

② 文本特征 Textual embedding: stacked denoising auto-encoders ( S-DAE )

图3.12 textual embedding 框架

③ 视觉特征 Visual embedding: stacked convolutional auto-encoders ( SCAE )

图3.13 visual embedding 框架

❸ matching function

得到用户向量和 item 向量后,用向量点击表示 user 和 item 的匹配分数;损失函数则用如下的 pair-wise loss 表示:

3.3 基于 representation 的深度匹配方法总结

总结上述基于 CF 的方法,可以用如下的范式作为表达:

图3.14 基于 CF 的深度匹配模型范式

❶ representation learning:目的是学习到 user 和 item 各自的 representation ( 也叫 latent vector,或者 embedding )。

❷ 特征表达:user 侧特征除了用户 id 本身 userid,可以加上其他 side info;item 侧特征除了物品 id 本身 itemid,还有其他文本特征、图文特征、视频帧特征等信息。

❸ 模型表达:除了传统的 DNN,其他结构如 Auto-Encoder ( AE ),Denoise-Auto-Encoder ( DAE ),CNN,RNN 等。

基于 representation learning 的深度匹配模型不是一个 end-2-end 模型,通过 user 和 item 各自的 representation 作为中间产物,解释性较好,而且可以用在出了排序阶段以外的其他环节,例如求物品最相似的 item 集合,召回环节等。

04

基于 match function learning 的深度匹配模型

对比 representation learning 的方法,基于 match function learning 最大的特点是,不直接学习 user 和 item 的 embedding,而是通过已有的各种输入,通过一个 neural network 框架,来直接拟合 user 和 item 的匹配分数。

图4.1 基于 match function learning 的深度匹配模型框架

简单来说,第一种方法 representation learning 不是一种 end-2-end 的方法,通过学习 user 和 item 的 embedding 作为中间产物,然后可以方便的计算两者的匹配分数;而第二种方法 matching function learning 是一种 end2end 的方法,直接拟合得到最终的匹配分数。本章主要介绍基于 match function learning 的深度学习匹配方法。

4.1 CF-based 的深度模型

前面传统匹配模型以及基于表示学习的模型,其 base 模型都离不开协同过滤,也可以称为基于矩阵分解的模型。基于 match function learning 的模型也不例外。

4.1.1 基于 NCF 框架的方法

基于神经网络的学习方法 ( NCF ) 为何向南博士在2017年提出,对比传统的 CF 网络,在得到 user vector 和 item vector 后,连接了 MLP 网络后,最终拟合输出,得到一个 end-2-end 的 model。这套框架好处就是足够灵活,user 和 item 侧的双塔设计可以加入任意 side info 的特征,而 MLP 网络也可以灵活的设计,如图4.2所示。

图4.2 基于神经网络的协同过滤框架

NCF 框架对比第三章所说的 CF 方法最主要引入了 MLP 去拟合 user 和 item 的非线性关系,而不是直接通过 inner product 或者 cosine 去计算两者关系,提升了网络的拟合能力。然而 MLP 对于直接学习和捕获从 mf 提取的 user 和 item vector 能力其实并不强。在 wsdm2018 的一篇文章质疑的就是 MLP 对特征组合的拟合能力。

图4.3 DNN 模型拟合数据实验

该 paper 做了一组实验,使用1层的 MLP 网络去拟合数据;实验证明对于二维一阶的数据,也需要100个节点才能拟合;如果超过2阶,整个 MLP 的表现将会非常差。文章因此说明了 DNN 对于高阶信息的捕捉能力并不强,只能捕捉低阶信息。

下文要讲的模型,也是在模型结构或者特征层面做的各种变化。

4.1.1.1 NeuMF 模型 ( Neural Matrix Factorization )

Neural MF,顾名思义,同时利用了 MF 和神经网络 MLP 的能力来拟合 matching score;MF 利用向量内积学习 user 和 item 的关联,同时 MLP 部分捕捉两者的其他高阶信息。这篇 paper 其实和 NCF 框架是出自同一篇 paper 的。模型可以分为 GMF 和 MLP 两个部分来看,如图4.4所示。

图4.4 NeuMF 模型结构框架

❶ GMF ( General Matrix Factorization ) 部分

User 和 item 都通过 one-hot 编码得到稀疏的输入向量,然后通过一个 embedding 层映射为 user vector 和 item vector。这样就获得了 user 和 item 的隐向量,一般可以通过向量点积或者哈达马积 ( element-wide product ) 得到交互,不过在 NeuMF 中多连接了一个连接层,也就是 GMF layer:

❷ MLP 部分

输入和 GMF 部分一样,都是 one-hot 的稀疏编码,然后通过 embedding 层映射为 user vector 和 item vector。注意到这里 user 和 item 的 vector  和 GMF 部分是不一样的,原因是 GMF 和 MLP 两个网络结构对隐层维度要求不同,MLP 部分会高一些 ( 个人感觉 share embedding 能更充分训练 embedding )。

Embedding 层之后就是几层常规的 MLP,这块没什么好说的,最后一层输出作为 MLP 的 output。

4.1.1.2 NNCF 模型 ( Neighbor-based NCF )

CIKM2017 提出的一种基于 neighbor 的 NCF 方法,最大的不同在于输入除了 user 和 item 的信息,还各自引入了 user 和 item 各自的 neighbor 信息。

图4.5 NNCF 模型框架

图4.5所示的输入由两部分组成,中间 xu 和 yi 为原始的 user 和 item 的 one-hot 输入,通过 embedding 层后映射为 pu 和 qi 的 embedding 向量,然后通过哈达马积作为 MLP 的输入。而输入层两侧的 nu 和 ni 是 user 和 item 各自的 neighbor 信息的输入,这里 nu 和ni 信息如何提取可以采用多种手段,如二部图挖掘,user-CF 或者 item-CF 等。

对于 neighbor 信息,由于每个用户和 item 的 neighbor 数不一致,输入是不定长的,通过卷积和 pooling 后提取得到定长的 embedding,然后和 user 以及 item 本身的向量 concat 后输入到模型中:

4.1.1.3 ONCF 模型 ( Outer-Product based NCF )

何向南博士2018年在 NCF 模型框架上提出了 outer-product based NCF,在原有的 NCF 框架上,引入了 outer product 的概念,如图4.6所示。

图4.6 ONCF 模型框架

在 embedding layer 之后,O-NCF 模型引入了 interaction map 也就是特征交叉层,对于用户 u 的向量 pu 和物品 i 的向量 qi,引入两者的 outer-product:

E 是一个 k*k 维的矩阵,其中的每个 element 两两相乘,得到2维的矩阵。到这,可以通过把二维矩阵展开变成一个 k维度的向量,作为 MLP 的输入。假设 k=64,那么 E 就是个4096的向量,每一层隐层单元个数设置为上一层的一半,那么第一层的维度为4096*2048约需要840万的网络参数需要训练,参数量非常巨大。

因此,文章提出了一种利用 CNN 局部连接共享参数的方法来减少 embedding layer 到 hidden layer 之间的参数,如图4.7所示。

图4.7 ConvNCF 模型框架

假设隐层维度 K=64,有6层 hidden layer,每一层有32个卷积核 ( feature map ),步长 stride=2,那么经过每个卷积核后的 feature map 大小为原来的1/4 ( 长和宽各少了一半 )。以第一层卷积为例:

那么第一层卷积后得到的网络是个32*32*32的3维 vector,其中最后一个32代表 feature map 个数。这里如何体现特征交叉的思想呢?ei,j,c 代表的就是在前一层的 feature map 中,第 i 个单元和第 j 个 element 的二阶交叉。第一层 feature map 中,每个单元提取的是上一层2*2区域的 local 连接信息,第三层提取的就是第一层4*4的信息,那么在网络的最后一层就能提取到原始 feature map 里的 global 连接信息,从而达到高阶特征提取的目的。

总结来说,使用原始的 outer-product 思想,在第一层网络处有近千万的参数需要学习,而使用 CNN 网络一方面能够减少参数量,另一方面又同时提取了低阶和高阶特征的组合。个人觉得引入 CNN 固然能节省内存,但也同时会带来训练和推理时间的增加,是一种时间换空间的思想。另外用 CNN 是否能够比原始 MLP 更有效拟合特征组合也需要结合数据分布去看。

4.1.1.4 小结

基于 NCF 框架的方法基础原理是基于协同过滤,而协同过滤本质上又是在做 user 和 item 的矩阵分解,所以,基于 NCF 框架的方法本质上也是基于 MF 的方法。矩阵分解本质是尽可能将 user 和 item 的 vector,通过各种方法去让 user 和 item 在映射后的空间中的向量尽可能接近 ( 用向量点击或者向量的 cosine 距离直接衡量是否接近)。

而另外一种思路,基于翻译的方法,也叫 translation based model,认为 user 和 item 在新的空间中映射的 vector 可以有 gap,这个 gap 用 relation vector 来表达,也就是让用户的向量加上 relation vector 的向量,尽可能和 item vector 接近。两种方法的区别可以用图4.8形象的表示。

图4.8 基于矩阵分解和基于翻译的模型区别

4.1.2 基于 translation 框架的方法

4.1.2.1 transRec 模型

2017年的 recsys 会议上提出的一种基于 "translate" 的推荐方法,要解决的是 next item 的推荐问题。基本思想是说用户本身的向量,加上用户上一个交互的 item 的向量,应该接近于用户下一个交互的 item 的向量,输入是 (user, prev item, next item),预测下个 item 被推荐的概率。

图4.9 transRec 模型框架

用户向量表达如下:

这里 ri 和 rj 表示的是用户上一个交互的 item i 和下一个交互的 item j,tu 为用户本身的向量表达。而在实际的推荐系统中,往往存在数据稀疏和用户冷启动问题,因此,作者将用户向量 tu 分解成了两个向量:

这里 t 可以认为是全局向量,表示的是所有用户的平均行为,tu 表示用户 u 本身的 bias,例如对于冷启动用户,tu 可以设置为0,用全局用户的表达 t 作为冷启动。

对于热门 item 由于出现次数非常多,会导致最终热门 item 的向量和绝大多数用户向量加上 item 向量很接近,因此文章对热门 item 做了惩罚,最终,已知上一个 item i,用户和下一个 item j 的匹配 score 表达为:

其中, 第一项 βj 表示的是物品 j 的全局热度;第二项 d 表示的是用户向量加上物品 i 的向量与物品 j 向量的距离;距离越小表示 i 和 j 距离越接近,被推荐的可能性就越大。

4.1.2.2 LRML 模型 ( Latent Relational Metric Learning )

前面讲到,基于 translation 框架的方法对比基于 CF 框架方法最大的不同,在于找到一个 relation vector,使得 user vector + relation vector 尽可能接近 item vector。WWW2018 提出的 LRML 模型通过引入 memory network 来学习度量距离。可以分为三层 layer,分别是 embedding layer, memory layer 和 relation layer。

图4.10 LRML 模型框架

❶ embedding layer

底层是常规的双塔 embedding,分别是用户 embedding 矩阵和物品的 embedding 矩阵,用户 one-hot 输入和 item 的 one-hot 输入通过 embedding 后得到用户向量 p 和物品向量 q。

❷ memory layer

记忆网络层是文章的核心模块,作者通过引入 memory layer 作为先验模块。这个模块可以分为三个步骤进行计算:

① 用户和物品 embedding 融合

Embedding 层得到的 user 和 item 向量 p 和 q 需要先经过交叉合成一个向量后输入到下一层,作者提到使用哈达码积效果优于 MLP 效果,也更简单:

② 用户-物品 key addressing

从第一步得到的向量 s 中,去和 memory 记忆网络模块中的各个 memory vector 挨个计算相似度,相似度可以用内积表达并做归一化:

得到的 ai 代表的是当前用户-物品输入对 (p,q) 与 memory-network 中的第 i 个向量的相似度。

③ 最终加权表达

最终得到的 relation vector 是第二步得到的 memory 记忆网络中不同 vector 的加权表达,如下所示:

❸ relation layer

从 memory layer 得到的 r 向量可以认为是用户向量 p 与物品向量 q 的 relation vector,最终的距离用平方损失衡量,如图4.11所示。

图4.11 LRML relation 层以及 loss 结构

由于解决的是推荐物品的排序问题,文章使用的是 pairwise loss,因此在网络的最后一层,对 user 和 item 分别进行负样本采样得到 p' 和 q',然后使用 pairwise hinge loss 进行优化:

4.2 feature-based 的深度模型

4.1介绍的基于 CF 的方法,对大多数推荐系统来说,输入的特征向量往往都是非常高维而且稀疏的,而特征之间的交叉关系对模型来说往往都是非常重要的。例如,用户一般会在一天快吃三餐的时候,打开和订餐相关的 app,这样,用户使用订餐 app 和时间存在着二阶交叉关系;又比如说,男性的青年群体,往往更喜欢射击类的游戏,性别、年龄以及类目之间存在着三阶的交叉关系。因此,如何捕捉特征之间的交叉关系,衍生了众多基于特征的模型,在这里将这些捕捉特征交叉关系的模型称为 feature-based model。

4.2.1 wide&deep 模型

提到深度学习模型,最经典的莫过于2016年 google 提出的 wide and deep 模型。说是模型,不如说是通用的一套范式框架,在整个工业界一举奠定了风靡至今的模型框架,如图4.12所示。

图4.12 wide&deep 模型框架

在这个经典的 wide&deep 模型中,google 提出了两个概念:generalization ( 泛化性 ) 和 memory ( 记忆性 )。

❶ 记忆性:wide 部分长处在于学习样本中的高频部分,优点是模型的记忆性好,对于样本中出现过的高频低阶特征能够用少量参数学习;缺点是模型的泛化能力差,例如对于没有见过的 ID 类特征,模型学习能力较差。

❷ 泛化性:deep 部分长处在于学习样本中的长尾部分,优点是泛化能力强,对于少量出现过的样本甚至没有出现过的样本都能做出预测 ( 非零的 embedding 向量 ),容易带来惊喜。缺点是模型对于低阶特征的学习需要用较多参数才能等同 wide 部分效果,而且泛化能力强某种程度上也可能导致过拟合出现 bad case。尤其对于冷启动的一些 item,也有可能用用户带来惊吓。

图4.13 wide&deep 模型特征框架

值得注意的是,虽然模型的 deep 部分拟合和泛化能力很强,但绝对不意味着把特征交叉都交给 MLP 就够了。实际证明,对于重要的一些人工经验的特征,对于提升整体效果还是非常重要的,如图4.13所示。这个人工特征的所谓缺点,也是后续各种模型结构想对其进行 "自动化" 的优化点。

4.2.2 deep crossing 模型

微软在2016年提出了一套框架 deep crossing,这篇文章在输入到 embedding 这里到是和 wide&deep 没有太多不同,主要区别在于 MLP 部分。

Google 的 wide&deep 模型里深度网络的 MLP 部分是全连接网络,每一层的网络输入都是前一层的输入出,受限于模型结构,越往后越难学习到原始输入的表达,一般深度不会太深,超过5层的网络在工业界已经算很少见了。为了解决这个问题,deep crossing 网络引入了 resnet 残差网络的概念,通过 short-cut,在 MLP 的深层网络,也能接收来自第一层的输入,这样可以使得模型的深度达到10层之多,如图4.14所示。

图4.14 deep crossing 模型框架

上述提到的 wide&deep 以及 deep crossing 框架更像是在模型结构做的改进,一个引入了 wide&deep,一个引入了 resnet,特征层面并没有做太多改造,如何体现 feature-base 呢?SigIR2017 就有一篇文章做了个实验,对 wide&deep 以及 Deep&Cross 实验按照 embedding 是否做初始化分别做了实验。实验发现,如果 embedding 是随机初始化的,两个深度模型连基础的 FM 模型都打不过;哪怕经过 FM 初始化了 embedding,wide&deep 模型效果也仅仅略好于 FM 模型,而 deep crossing 模型依然比不过 FM 模型,实验结果如图4.15所示。

图4.15 不同初始化对模型影响

这个结论也引出了关于 MLP 的一些思考,全连接网络表面上看对所有节点都进行了连接,理论上应该学习到了各个节点的交叉特征,但是从结果上来看,MLP 对这些特征交叉的学习能力确实非常差的。纠其原因,还是在模型结构的设计上。

图4.16 wide&deep 模型和 deep crossing 模型

图4.16里无论是 wide&deep 还是 deep crossing network,embedding 层之后到 MLP 之间,都是将 embedding 做 concat 的。这些 concat 后的信息其实能够表达的特征交叉信息其实是非常有限的,仅靠 MLP 想完全捕捉到特征的有效交叉其实是非常困难的。因此,有大量工作关于在 embedding 这里如何捕捉特征交叉,其实就是在 MLP 网络之前,利用更多的数学先验范式做特征交叉去提取特征,这也是本节提到的方法叫做 feature-based 的原因。

4.2.3 PNN 模型

Embedding layer 进入 MLP 之前,引入了 product layer 来显式的学习每个 field 的 embedding 向量之间的两两交叉,如图4.17所示。

图4.17 PNN 模型框架

左边 z 为 embedding 层的线性部分,右边为 embedding 层的特征交叉部分。这种 product 思想来源于,推荐系统中的特征之间的交叉关系更多是一种 and "且" 的关系,而非 add "加" 的关系。例如,性别为男且喜欢游戏的人群,比起性别男和喜欢游戏的人群,前者的组合比后者更能体现特征交叉的意义。根据 product 的方式不同,可以分为 inner product ( IPNN ) 和 outer product ( OPNN ),如图4.18所示。

图4.18 PNN 模型的两种不同交叉方式

其中,IPNN 模型每个特征是个 inner product,f 个 field 两两交叉,得到的新的特征组合有 f*(f-1)/2个;outer product 是两个向量的乘积,得到的新的特征组合有 f*(f-1)/2*k*k 个。

4.2.4 deepFM 模型

Google 的 wide&deep 框架固然强大,但由于 wide 部分是个 LR 模型,仍然需要人工特征工程。华为诺亚方舟团队结合 FM 相比 LR 的特征交叉的功能,在2017年提出了 deepFM,将 wide&deep 部分的 LR 部分替换成 FM 来避免人工特征工程,如图4.19所示。

图4.19 deepFM 模型框架

比起 wide&deep 的 LR 部分,deeFM 采用 FM 作为 wide 部分的输出,FM 部分如图4.20所示。

图4.20 deepFM 模型中的 FM 部分

除此之外,deepFM 还有如下特点:

❶ 更强的低阶特征表达

Wide 部分取代 WDL 的 LR,与4.2.1和4.2.2提到的 wide&deep 模型以及 deep crossing 模型相比更能捕捉低阶特征信息。

❷ Embedding 层共享

Wide&deep 部分的 embedding 层得需要针对 deep 部分单独设计;而在 deepFM 中,FM 和 DEEP 部分共享 embedding 层,FM 训练得到的参数既作为 wide 部分的输出,也作为 DNN 部分的输入。

❸ end-end 训练

Embedding 和网络权重联合训练,无需预训练和单独训练。

4.2.5 NFM 模型 ( Neural Factorization Machines )

DeepFM 在 embedding 层后把 FM 部分直接 concat 起来 ( f*k 维,f 个 field,每个 filed 是 k 维向量 ) 作为 DNN 的输入。Neural Factorization Machines,简称 NFM,提出了一种更加简单粗暴的方法,在 embedding 层后,做了一个叫做 Bi-interaction 的操作,让各个 field 做 element-wise 后 sum 起来去做特征交叉,MLP 的输入规模直接压缩到 k 维,和特征的原始维度 n 和特征 field 维度 f 没有任何关系,如图4.21所示。

图4.21 NFM 模型框架

这里论文只画出了其中的 deep 部分, wide 部分在这里省略没有画出来。Bi-interaction 所做的操作很简单:让 f 个 field 两两 element-wise 相乘后,得到 f*(f-1)/2 个维度为 k 的向量,然后直接 sum 起来,最后得到一个 k 维的向量。所以该层没有任何参数需要学习,同时也降低了网络复杂度,能够加速网络的训练;但同时这种方法也可能带来较大的信息损失。

4.2.6 AFM 模型 ( Attention Factorization Machines )

前面提到的各种网络结构中的 FM 在做特征交叉时,让不同特征的向量直接做交叉,基于的假设是各个特征交叉对结果的贡献度是一样的。这种假设往往不太合理,原因是不同特征对最终结果的贡献程度一般是不一样的。Attention Neural Factorization Machines,简称 AFM 模型,利用了近年来在图像、NLP、语音等领域大获成功的 attention 机制,在前面讲到的 NFM 基础上,引入了 attention 机制来解决这个问题,如图4.22所示。

图4.22 AFM 模型框架

AFM 的 embedding 层后和 NFM 一样,先让 f 个 field 的特征做了 element-wise product 后,得到 f*(f-1)/2 个交叉向量。和 NFM 直接把这些交叉项 sum 起来不同,AFM 引入了一个 Attention Net,认为这些交叉特征项每个对结果的贡献是不同的,例如 xi 和 xj的权重重要度,用 aij 来表示。从这个角度来看,其实 AFM 其实就是个加权累加的过程。Attention Net 部分的权重 aij 不是直接学习,而是通过如下公式表示:

这里 t 表示 attention net 中的隐层维度,k 和前面一样,为 embedding 层的维度。所以这里需要学习的参数有3个,W,b,h,参数个数共 t*k+2*t 个。得到 aij 权重后,对各个特征两两点积加权累加后,得到一个 k 维的向量,引入一个简单的参数向量 hT,维度为 k 进行学习,和 wide 部分一起得到最终的 AFM 输出。

图4.23 AFM 模型中 attention 的可视化解释

关于 AFM 还有个好处,通过 attention-base pooling 计算的 score 值 aij 体现的是特征 vi 和 vj 之间的权重,能够选择有用的二阶特征,如图4.23所示。

4.2.7 DCN 模型 ( Deep Cross Network )

前面提到的几种 FM-based 的方法都是做的二阶特征交叉,如 PNN 用 product 方式做二阶交叉,NFM 和 AFM 也都采用了 Bi-interaction 的方式学习特征的二阶交叉。对于更高阶的特征交叉,只有让 deep 去学习了。为解决这个问题,google 在2017年提出了 Deep&Cross Network,简称 DCN 的模型,可以任意组合特征,而且不增加网络参数。图4.24为 DCN 的结构。

图4.24 DCN 模型结构

整个网络分4部分组成:

❶ embedding and stacking layer

之所以不把 embedding 和 stacking 分开来看,是因为很多时候,embedding 和 stacking 过程是分不开的。前面讲到的各种 XX-based FM 网络结构,利用 FM 学到的 v 向量可以很好的作为 embedding。而在很多实际的业务结构,可能已经有了提取到的 embedding 特征信息,例如图像的特征 embedding,text 的特征 embedding,item 的 embedding 等,还有其他连续值信息,例如年龄,收入水平等,这些 embedding 向量 stack 在一起后,一起作为后续网络结构的输入。当然,这部分也可以用前面讲到的 FM 来做 embedding。为了和原始论文保持一致,这里我们假设 x0 向量维度为 d ( 上文的网络结构中为 k ),这一层的做法就是简答的把各种 embedding 向量 concat 起来。

❷ deep layer network

在 embedding and stacking layer 之后,网络分成了两路,一路是传统的 DNN 结构。表示如下:

为简化理解,假设每一层网络的参数有 m 个,一共有 Ld 层,输入层由于和上一层连接,有 d*m 个参数 ( d 为 x0 向量维度 ),后续的 Ld-1 层,每层需要 m*(m+1) 个参数,所以一共需要学习的参数有 d*m+m*(m+1)*(Ld-1)。最后的输出也是个 m 维向量。

❸ cross layer network

Embedding and stacking layer 输入后的另一路就是 DCN 的重点工作了。每一层 l+1 和前一层l的关系可以用如下关系表示:

可以看到 f 是待拟合的函数,xl 即为上一层的网络输入。需要学习的参数为 wl 和 bl,因为 xl维度为 d,当前层网络输入 xl+1 也为 d 维,待学习的参数 wl 和 bl 也都是 d 维向量。因此,每一层都有 2*d 的参数 ( w 和 b ) 需要学习,网络结构如下。

图4.25 DCN 模型的 cross 原理

经过 Lc 层的 cross layer network 后,在该 layer 最后一层 Lc 层的输出为 Lc2 的 d 维向量。

❹ combination output layer

经过 cross network 的输出 XL1 ( d 维 ) 和 deep network 之后的向量输入 ( m 维 ) 直接做 concat,变为一个 d+m 的向量,最后套一个 LR 模型,需要学习参数为 1+d+m。

总结起来,DCN 引入的 cross network 理论上可以表达任意高阶组合,同时每一层保留低阶组合,参数的向量化也控制了模型的复杂度。Cross 网络部分的交叉学习的是特征向量中每一个 element 的交叉,本质上是 bit-wise 的。

4.2.8 xDeepFM 模型 ( extreme Deep Factor Machine )

xDeepFM 模型从名字上听好像是 deepFM 模型的升级,但其实更应该拿来和 DCN 模型做对比。DCN 模型引入了高阶特征交叉,但是特征的交叉本质上是在 bit-wise 的。而 xDeepFM 模型认为特征向量 i 和特征向量 j 的交叉过程中,i 本身的元素交叉没有意义,提取 i 和 j 的向量交叉才是更有效捕捉特征的方式,也就是 vector-wise 的交叉,整个模型的框架如图4.26所示,最核心的模块在于特征交叉的 CIN 模块。

图4.26 xDeepFM 模型结构

首先我们来看下整个 CIN 的整体框架图,如图4.27所示,假设特征 field 个数是 m,每个 field 的隐层维度为 d,那么原始 embedding 层的大小为 m*d,而 cross network 有 Hk层,提取的是特征的交叉。每一层网络在做什么事情呢?就是和第一层 x0 做特征交叉得到新的特征向量后,然后这 Hk 层 cross net 得到的特征向量 concat 到一起,作为 MLP 的输入。那么,这里面,每一层的特征 xk 到底是如何输入层 x0 发生交互的?

图4.27 CIN 模块结构

以 cross net 的第 k 层和原始输入 x0 为例,我们看下如何提取得到新的特征,图4.28是其特征交叉的过程。其中 xk 的维度为 Hk*D,表示的是第 k 层有 Hk 个 vector,而原始输入 x0的维度为 m*D,表示输入层有 m 个 D 维的 vector。

图4.28 CIN 模块中特征交叉过程

这里 Wk,h 表示的是第 k 层的第 h 个 vector 的权重,是模型需要学习的参数。整个公式的理解是整个 xDeepFM 理解的关键,我们具体看下发生了什么:

❶ 首先,从前一层的输入 Xk-1 ( 一共有 Hk-1 个 vector ),取出任意一个 vector;从原始输入 x0 ( 一共有 m 个 vector ),取出任意一个 vector,两者两两做哈达码积,可以得到 Hk-1*m 个 vector。

❷ 这 Hk-1*m 个交叉得到的 vector,每个 vector 维度都是 D,我们通过一个 W 矩阵做乘积进行加权求和,相当于是个带权重的 pooling,最终得到加权求和后的 vector Xh,k,表示的是第 h 层第 k 个 vector。这里的 W 矩阵就是模型要学习的。

❸ 为什么说是压缩,压缩体现在哪里?还是用图说话,这里我们看下原始论文给出的图示,有助于整个过程的理解。

图4.29 CIN 模块具体结构

在图4.29左图中,我们把 D 看成是原始二维平面的宽度,我们沿着 D 的方向挨个进行计算。先看 xk 向量中 D 的第一维,有 Hk 个数;x0 向量中 D 的第一维,有 m 个数,让 Hk 和 m 两两计算,就可以得到 Hk*m 的一个平面。一直沿着 D 方向,2,3,4,…D,我们就可以得到一个 Hk*m*D 的三维矩阵,暂且叫做 zk+1,注意这个过程只是简单的矩阵计算,没有参数需要学习。

在4.29右边的图中,我们开始提取前面 zk+1 的信息,还是以 D 方向的第一维为例,一个 m*Hk 的平面,乘以一个大小一样的 m*Hk 矩阵 W,然后加权求和,就可以得到这个平面最后压缩的一个实数。整个平面被 "压缩" 成为了一个一维的数。一直沿着 D 方向求解每个平面压缩后的数,就可以得到一个 D 维的向量。

这就是整个 "压缩" 的取名原因。整个过程非常类似 CNN 的 filter 卷积思想,W 就是卷积核,得到的每个特征映射的值就是 feature map。

4.2.9 FGCNN 模型 ( Feature Generate by CNN )

CNN 模型在图像,语音,NLP 领域都是非常重要的特征提取器,原因是对图像、视频、语言来说,存在着很强的 local connection 信息。而在推荐系统中由于特征输入都是稀疏无序的,很难直接利用 CNN 作为特征提取。华为诺亚方舟在2019年的 WWW 会议上提出了一种巧妙的利用 CNN 提取特征的方法 FGCNN,整个模型框架如图4.30所示。

图4.30 FGCNN 模型框架

其中利用 CNN 提取新特征是整个 paper 的核心模块,具体框架如图4.31所示,可以分为4个层,卷积层、池化层、重组层以及特征输出层。下面分别介绍这4个不同的层,分别看下各自的输入,输出以及具体的网络结构。

图4.31 CNN 模块从原始特征提取新特征

❶ 卷积层 Convolution Layer

图4.32 卷积层的特征卷积过程

原始 one-hot 特征经过 embedding 后,进入的是卷积层。卷积的思想和 TextCNN 类似,通过一个高度为 hp,宽度为 d 的卷积核进行卷积;其中高度 hp 代表的是每次卷积连接的邻域的个数,以图4.32为例,hp=2,表示二维特征的交叉,从上到下卷积,表示的是 N&A,A&H,H&G 卷积,分别表示名字和年龄、年龄和身高、身高和性别的交叉;而宽度方向 d 需要和 embedding 的维度 d 保持一致,这和 TextCNN 的思想是一致的,只在高度方向上进行卷积。

① Convolutional layer 输入

特征 one-hot 之后经过 embedding 层后的输出作为卷积层的输入,输入维度为 nf*k。nf为 field 个数,k 为隐层维度

② Convolutional layer 输出

经过二维平面大小不变,增加第三维卷积核大小,第一层卷积层的输出大小为 nf*k*mc1,C1为第1个卷积层的卷积个数,以 l=1 为例,C:,:,i 表示的是第一层卷积层第 i 个 feature-map,每个 feature map 的大小为 nf*k,Cp,q,i 表示的是第一层第 i 个 feature map 的坐标为 (p,q) 的元素:

❷ 池化层 Pooling Layer

特征经过第一层卷积层之后,从 nf*k 变成了 nf*k*mc1,维度反而扩了 mc1 倍,这和预期的特征降维不一致,解决办法和 CNN 里常用的套路一样,通过 pooling 做降维。该 paper 使用的是 max pooling,在原先卷积高度 hp 上选择最大值作为卷积后的特征表达,表达如下所示:

① pooling 层输入

卷积层的输出作为池化层的输出,以第一层为例,pooling 层的输入维度为 nf*k*mc1。

② pooling 层输出

卷积层输出的时候在高度方向上选择 max,只有高度方向维度发生变化,卷积输出后维度为nf/hp * k *mc1,hp 为卷积核高度,相当于沿着 field 的方向压缩了 hp 倍。

❸ 重组层 Recombination Layer

经过特征卷积层和特征池化层后,可以通过特征重组 Recombination layer 生成新的特征组了。还是以第一层的 Recombination layer 为例,mc1 为原始 feature map 的个数,mr1为新生成的特征 feature map 的个数:

其中 S1 为池化层的输出,而 WR1 和 BR1 为该层待学习的参数。

① Recombination 层输入

卷积层的输出 S1 为该层的输入,通过 WR1 的矩阵进行特征的 recombination

② Recombination 层输出

新生成的特征维度为 nf/hp*k*mr1

❹ 特征输出层 Concatenation Layer

第一层 Convolution layer -> pooling layer -> recombination layer 后,生成第一层的新特征 R1,连同第2,3,4,…,nc 层的新特征 R2,R3,R4,…,Rnc 层一起 concat 起来,组成新的特征 R=(R1,R2,…,Rnc)。之后 R 可以和原始特征一样做各种可能的交叉,例如和原始特征做二阶交叉等,再一起输入到模型层。

图4.33 FGCNN 新特征的生成

① concatenation 层输入

重组层 Recombination layer 输出的新特征 R1,R2,R3, Rnc,作为 concatenation layer 的输入

② concatenation 层输出

原有的特征E和新特征 R 连在一起作为 concatenation 的特征输出,作为 NN 层的输入

4.2.10 FiBiNet 模型 ( Feature Importance & Bilinear feature Interaction )

新浪微博张俊林团队2019年提出的结合特征重要性 ( Fi ) 和双线性特征交叉 ( Bi ) 的方法,Feature Importance & Bilinear feature Interaction,简称 FiBiNet,其实是两个相对独立的模块,两个模块可以独立套用在其他的网络结构上,整体框架如图4.34所示。

图4.34 FiBiNet 模型框架

❶ SENet:特征重要性提取层

该层作用主要是提取特征重要性。可以分为三层 Squeeze, Extract, Reweight,从原始的特征 e1,e2,e3,…,e提取到新的特征 v1,v2,v3,…, vf,其中 f 为特征 field 的个数,整体框架如下:

图4.35 SENet 框架

① Squeeze 层

特征压缩层,对每个特征组中的 embedding 向量进行汇总统计量的 pooling 操作,每个 field 的维度为 k,从中 squeeze 压缩提取最重要的1维。典型的方法一般有 Max pooling 或者 average pooling,在更原始的 SENet 里用的是 max pooling,但是在该 paper 里作者提到 average pooling 表现更好,个人其实也倾向于认为 average pooling 直觉上更加 make sense,只用 max pooling 从 d 维特征提取一维信息损失实在太大。当然具体表现也需要结合具体数据实验才知道:

经过 S 层,第 i 维特征从 ei 变成了 zi,从维度为 d 的向量变成了一个维度为1的实数。整个输入从 f*d 的矩阵变为 f 维的向量。

② Excitation 层

特征激活层,向量先做压缩 r ( r 为压缩的倍数 ),然后扩展恢复,类似 auto-encoder 思路:

W1 和 W2 为两个转换矩阵,先经过压缩然后恢复,最终得到的 A 还是一个维度为 f 的向量。

③ Reweight 层

经过前面 Squeeze 和 Excitation 得到的 A 相当于是原始特征 E 的权重向量,乘以原始的特征 E 后,可以得到最终加权提取的 V 向量,可以认为是原始特征的重要性表达:

总结来说:SENet,用两层全连接阶层提取每个 field 的特征重要性:

S 层:压缩提取 field 中最重要的特征 ( max 或者 average 特征 )

E 层:对 s 层提取的特征信息进行 auto-encoder 式的信息提取

R 层:SE 提取到的每个 field 特征重要性,进行加权提取

❷ Bilinear 特征交叉层

从 SENet 提取到的新特征 V,还有原始特征 E,可以组合成为新的特征一起输入到模型的 MLP 网络中。但是如前面提到的 MLP 对特征交叉很弱的学习能力一样,本文一样提出了一些做特征交叉的方法。我们回顾下在前面提到的两个向量的交叉,无非是向量内积,得到一个实数;或者是向量的哈达马积分如图4.36的 a 所示,得到的还是一个向量,如图中4.36的 b 方法所示。这两种方法都是直接计算的,没有新的参数学习。在该 paper 中,作者提出了另一种引入参数的方法,也就是 Bilinear 双线性特征交叉的方法,如图中4.36的 c 方法所示:

图4.36 不同特征交叉方法

假设特征 field 的个数是 f 个,每个 field 的隐层维度为 d。那么,如何确定需要学习的参数 W 呢?根据 W 的共享情况,可以分为以下三种类型:

① field type

W 在所有特征之间是完全共享的,也就是说在任意两个需要交叉的特征 i 和特征 j 之间 ( vi,vj ) 共享一个 W,W 的参数维度为 k*k:

② field each

对于每个特征 i 来说,都需要学习唯一的一个 Wi 矩阵,该 Wi 只和左乘的特征 vi 有关,和右乘特征 vj 无关,一共有 f 个 field,所以 W 的参数维度为 f*k*k:

③ field-interaction type

对于任意两个需要交叉的特征 vi 和 vj,都需要学习一个唯一的矩阵 Wij,Wij不仅和左乘的特征有关,也和右乘的特征有关,也就是说,vi 和 vj 的交叉,以及 vj 和 vi 的特征交叉,两者用到的 Wij 和 Wji 是不一样的,所以 W 的参数维度为 f*f*k*k:

当然,以上三种不同的特征类型没有绝对的谁好谁坏,不存在越复杂效果越好的情况,对于简单的数据集,可能 w 共享是最好的,具体还是需要实验才能知道。在文章里用了 criteio 和 avazu 数据集进行实验时,使用不同的模型,三种交叉方法也是各有千秋。

总结本文的两个核心工作,第一个工作,SENet,目的是从一个 f*d 的特征向量中,提取得到表达了特征重要性的同样维度为 f*d 的新特征向量,该网络结构可以和其他模型结构套用。第二个工作 bi-net,从输入的 embedding 特征中提出了几种不同的特征交叉的方法,也可以给其他网络模型做特征交叉提供一些不同的手段。

4.2.11 AutoInt 模型 ( Auto Feature Interaction )

目前为止讲到的模型中,使用到 attention 的是 AFM 模型,而在 AutoInt 文章中,作者除了 attention 机制,还使用了在 transform 中很火的 multi-head 和 self-attention 的概念,整体框架如图4.37所示。

图4.37 AutoInt 模型框架

文章中的输入没有什么特别需要讲的,就是常规的 one-hot 稀疏的特征经过 embedding 层得到 dense value。这里 embedding 层倒是值得一提,一般在大多数推荐系统里,对于 one-hot 做 embedding 是因为需要转成 dense 的特征,而原本就是 dense 的特征原本就是定长 dense 特征,比较少见到做 embedding 的,而在该文章中将连续值特征和 one-hot 一样去做 embedding 处理。不过这一块不影响 auto-int 部分的理解。

图4.38 embedding 层输入

该 paper 里提到的 attention 机制,才是文章里的核心亮点,在介绍文章的核心机制之前,先在这里简单介绍下 NLP 里的 attention 里涉及到的3个重要的概念,query,keys,value。想象一下,你在搜索引擎输入了一个搜索词,这个搜索词就是 query,假设你搜了 "应用宝",然后存在一堆候选结果就叫做 keys,例如 "下载 app 的地方","手机应用市场","app store","手机系统" 等等,对这里的每个 key,都去计算和候选词 query 的相似度,例如 "手机应用市场" 对 "应用宝" 的权重,显然是要高于 "手机系统",最终的表达,其实就是每个 keys 的 value 的加权求和,也就是说,谁和 query 的相似度高,在结果中 value 的权重占比就更高。经典的 QKV 结果表达如下:

回到本文的 attention 机制中,假设特征 field 个数为 M,对于第 m 个 field,在第 h 个 head 空间下的特征表达如下:

图4.39 特征 m 在空间 h下的 QKV 结构

❶ 特征 m 在空间 h 下的新映射

每个特征 m,在空间 h 下都有3组向量表示,分表代表特征 m 在空间 h 下的 query 向量 Equery、key 向量 Ekey、value 向量 Evalue:

这里需要学习的参数为 WQuery,Wkey,Wvalue,每个矩阵的维度为 d'*d,从而将特征从 d 维映射为 d'。W 在所有特征中都是共享的,并不是每组特征都需要学习3个 W。

❷ 特征 k 对特征 m 相似度表达,使用向量的点积:

❸ 特征 k 对特征 m 的归一化注意力 ( M 个特征做归一化 )

❹ 特征 m 在空间 h 下的加权新特征:

❺ 特征 m 的全空间表达:

有 H 个 head,特征 m 最终的表达为 H 个新特征的 concat,特征长度为 H*d'。

❻ 特征 m 最终表达:resnet 保留原始信息

作者为了保留更多信息,除了第5步得到的 multi-head 的新特征,也将原始的特征 em 引入到进来,其实就是一种 resnet 思路,所以在这里需要有个额外的参数 WRes 需要学习,需要将原始的特征维度 d 映射为和 em 一致的 H*d',所以 WRes 的参数维度为 d'*H*d。

4.2.12 DIN 模型 ( Deep Interest Network )

4.2.11提到的 AutoInt 里特征的 attention 机制有个特点,就是在计算特征的重要性的时候,所有特征都有机会成为 query, 将其他特征作为 keys 去计算和当前 query 的重要性从而得到权重的。而提到推荐系统里的 attention 机制,不得不提的就是阿里的这篇 deep interest network 了,简称 DIN。工业界的做法不像学术界,很多模型网络结构优化并不一味的追求模型的复杂和网络结构有多 fancy,每一步背后都有大量的业务思考后沉淀下来的。

阿里这篇 DIN 也如此。在了解 DIN 之前,我们先看下 DIN 前身的模型,GwEN 模型 ( Group-wise Embedding Network,阿里内部称呼 )。

图4.40 GwEN 模型结构 ( DIN 的 baseline )

前面讲到的很多模型,输入层都是大规模稀疏特征,经过 embedding 层后输入到 MLP 网络中。这里的一个假设就是,每个 field 都是 one-hot 的,如果不是 one-hot 而是 multi-hot,那么就用 pooling 的方式,如 sum pooling,average pooling,max pooling 等,这样才能保证每个特征 field embedding 都是定长的。DIN 的前身 GwEN 模型也一样,对于 multi-hot 特征的典型代表,用户历史行为,比如用户在电商系统里购买过的商品,往往都是几十几百甚至几千的,需要经过 sum pooling 和其他特征 concat 一起。

而这种数学假设其实往往都是和实际的发生场景不一致的。例如一个女性用户过去在淘宝买过白色针织衫、连衣裙、帽子、高跟鞋、单肩包、洗漱用品等,当前候选商品是一件黑色外套,白色针织衫对黑色外套的权重影响应该更大,洗漱用品权重应该更小。如果将这些历史行为过的商品做 sum pooling,那么无论对于当前推荐什么商品,用户都是一个固定向量的表达,信息损失很大,显然优化空间很大。

图4.41 DIN 模型框架

针对 sum/average pooling 的缺点,DIN 提出了一种 local activation 的思想,基于一种基本的假设:用户历史不同的行为,对当前不同的商品权重是不一样的。例如用户过去有 a,b,c 三个行为,如果当前商品是 d,那么 a,b,c 的权重可能是 0.8,0.2,0.2;如果是商品 e,那么 a,b,c 的权重可能变成了0.4,0.8,0.1。也就是说,不同的 query,激发用户历史行为不同的 keys 的权重是不一样的。

① query:用户历史行为,长度为 H,e1,e2,…,e表示用户历史行为的向量表示。

② keys:当前候选广告 ( 店铺、类目、或者其他 item 实体 )

关于 DIN 里的 activation weight 还有个可以稍微讲几句的点。两个向量的相似度,在前面讲各种 CF 的方法的时候基本是用的点积或者 cosine,2017年 DIN 挂在 arXiv 的版本中是使用了两个向量本身以及 concat 后进入 MLP 得到其相似度,2018发在 KDD 的版本中多了 outer product,以及向量相减,相当于引入和保留了更多特征的信息。另外作者在文章提到为了保持不同历史行为对当前 attention 的影响,权重也不做归一化,这个和原始的 attention 也有所不同。

图4.42 DIN 模型中的 Attention Unit

作为工业界的落地实践,阿里在 DIN 上很 "克制" 的只用了最能表达用户个性化需求的特征--用户行为 keys,而 query 也是当前候选的商品广告,与线上提升 ctr 的指标更为吻合,对工业界的推荐系统来说借鉴意义还是很大的。当然这不是说之前的其他 attention 机制模型没用,不同的数据集,不同的落地场景需求不一致,也给工业界更多的尝试提供了很多思路的借鉴。

4.2.13 DIEN 模型 ( Deep Interest Evolution Network )

在前面讲到的模型中,所使用的特征都是时间无序的,DIN 也如此,用户的行为特征之间并没有先后顺序,强调的是用户兴趣的多样性。但是实际用户的兴趣应该是在不断进化的,用户越近期的行为,对于预测后续的行为越重要,而用户越早期的行为,对于预测后续行为的权重影响应该小一点。因此,为了捕获用户行为兴趣随时间如何发展变化,在din提出一年后,阿里又进一步提出了 DIEN,引入了时间序列概念,深度兴趣进化网络。

DIEN 文章里提到,在以往的推荐模型中存在的序列模型中,主要利用 RNN 来捕获用户行为序列也就是用户历史行为数据中的依赖关系,比对用户行为序列直接做 pooling 要好。但是以往这些模型有两个缺点,第一是直接将 RNN 的隐层作为兴趣表达,而一般来隐层的表达和真正表达的商品 embedding 一般不是等价的,并不能直接反映用户的兴趣;另外一点,RNN 将用户历史行为的每个行为看成等权的一般来说也不合理。整个 DIEN 的整体框架,如图4.43所示。

图4.43 DIEN 模型框架

❶ 输入层

和 DIN 的输入一样。按照类型可以分为4大类

① 用户画像特征:如年龄、性别、职业等

② context 特征:如网络环境、时间、IP 地址、手机型号等,与 user 以及 item 无关

③ target ad 特征:当前候选广告

④ 用户行为特征:DIEN 里最重要的能体现用户个性化的特征,对于每个用户来说,假设有 T 个历史行为,按照发生的先后顺序依次输入模型

❷ embedding 层

将 one-hot 特征转为 dense 的 embedding 向量

❸ 兴趣抽取层 ( interest extractor layer )

该层的主要作用和 DIN 一样,为了从 embedding 层中抽取出用户的兴趣。该 paper 认为用户当前对候选广告是否感兴趣,是和历史行为 behavior 有关的,所以引入了 GRU 的序列模型来拟合抽取用户兴趣。

经过 GRU 结构后,商品的 embedding 表达从 e(t) 变成了 h(t),表示第 t 个行为序列的 embedding 表达。

图4.44 DIEN 中的辅助 loss 结构

除了 GRU 结构提取隐层的向量,DIEN 还引入了有监督学习,强行让原始的行为向量 e(t) 和 h(t) 产生交互。如图4.44所示,引入了辅助 loss(auxiliary loss),当前时刻 h(t) 作为输入,下一刻的输入 e(t+1) 认为是正样本 (click),负样本进行负采样 ( 不等于当前时刻 );然后让 h(t) 与正负样本分别做向量内积,辅助 loss 定义为:

最终的 loss 表达为:

其中 a 为超参数,代表的是辅助 loss 对整体 loss 的贡献。有了这个辅助 loss,t 时刻提取的隐层向量 h(t) 可以比原始的 h(t) 更有助于表达用户兴趣,也可以加速网络的训练过程。

❹ 兴趣进化层 ( interest evolving layer )

理论上来说,h(t) 如果替代 e(t) 作为商品的最终表达其实也是可以的,把用户序列 t=1,2,3,…,T 当成用户的 T 个行为过的商品,然后和当前的候选广告套用 DIN 的 attention 网络去计算每个行为和当前候选广告的权重,最终得到用户的历史行为加权表达也是完全 ok 的。但作者认为用户的行为模式是会发展的,因此引入了第二层 GRU 网络来学习每个历史行为序列和当前候选广告之间的权重。

对于每个历史行为 ht,当前候选广告 ea,通过 softmax 求出两者的权重。注意这里不是直接向量点击,而是引入了矩阵 W,可以认为是简单的一层全连接网络。

如何使用这里学习的 attention 作为兴趣进化层的输入,作者又提出了三种计算方法:

❶ AIGRU ( attention input with GRU )

最基础的版本,兴趣进化层第 t 个行为序列的 input 就是隐层 ht 的加权:

作者尝试后发现效果并不好,原因是如果是输入0,也会参与到隐层 ht 的计算和更新,相当于给用户兴趣的提取引入了噪音,不相关的用户行为会干扰模型的学习。

❷ AGRU ( attention base GRU )

这里作者使用了 attention 权重 at 来取代原始 GRU 中的更新门,表达如下:

❸ AUGRU ( GRU with attentional update gate )

这里作者依然对原始 GRU 做了改造,公式如下:

图4.45 AUGRU 结构

其中,ut' 引入了 at 来取代原有的更新向量 ut,表达的是当前 ut' 对结果的影响。如果当前权重 at 较大,ut' 也较大,当前时刻 ht' 保留更多,上一个时刻 ht-1 影响也会少一点。从而整个 AUGRU 结果可以更平滑的学习用户兴趣。

4.3 Feature-based 模型总结

Feature-based 的模型主要在于学习特征之间的交叉,是近年来整个推荐系统在排序层面的主流研究方向,按照不同维度,我个人把4.2列到的模型分为4个类型,同一个模型可能会分到不同的类型里。这里的分类仅仅代表个人的观点,欢迎探讨。

4.3.1 基于框架的模型

① wide&deep 模型

深度加宽度的模型范式,本身并不是一个具体的模型,wide 和 deep 部分可以用任意结构框架,wide 的 baseline 是 LR 模型;deep 的 baseline 是 MLP 模型。

② deep crossing 模型

和 wide&deep 最大的不同是 deep 部分引用了 res-net,但个人觉得在目前主流的模型里用的较少。虽然 res-net 理论上可以使用更深的模型提升效果,但在目前工业界大规模稀疏的推荐系统里,还没见到太多往 res-net 方向取得较大进展的工作。

4.3.2 基于 FM 特征二阶组合的模型

学习特征交叉的主要手段是将特征的 embedding 做交叉,特点是特征的交叉是二维的,无非是二阶交叉如何做。

① deepFM 模型

特征交叉使用的 element-wise product,最终得到的是一个实数。

② NFM 模型

交叉使用的 bi-interaction,可以理解成是所有 vector 的 sum pooling,最终得到的是一个向量。

③ AFM 模型

交叉使用的带权重的 bi-interaction,可以理解成所有 vector 的 weight sum pooling,然后使用一个简单的线性模型得到最终的值。

④ PNN 模型

PNN 模型放到基于 FM 的模型是因为本质上和 FM 一样,都是在学习特征的二阶组合。和 deepFM 不同的是,以 IPNN 为例,PNN 的所有特征两两 product 交叉学习得到的值 conat 后得到现实的 product vector 后进入 MLP 模型;而 deepFM 是直接将 FM 模型的 vector 输入到 MLP 模型中。

4.3.3 基于 attention 的模型

① AutoInt 模型

使用 multi head 机制,每个特征用 self-attention 得到其他特征和自己的 attention 权重。每个特征的所有 head 得到的特征 concat 起来作为新特征。

② DIN 模型

只使用户历史行为特征作为 keys,keys 之前没有时间序列;得到 keys 和当前候选 item 的 attention。

③ DIEN 模型

只使用用户历史行为特征作为 keys,keys 之间具有先后顺序,引入两层 GRU 表达,第一层 GRU 学习用户历史行为序列的信息,每个时刻 t 输出的隐层 embedding 为该时刻 item 的 embedding 表达;第二层 GRU 用来学习历史每个时刻 t 的历史行为和当前候选广告的权重。

④ FiBiNet 模型

把 FiBiNet 模型放在 attention 模型主要是它的 SENet 部分,通过 squeeze -> Excitation -> reweight 提取原始 embedding 的特征重要性,得到新特征,这里其实也体现了每个特征 embedding 的 attention。

4.3.4 基于特征高阶组合的模型

① DCN 模型

使用多层的 cross 来做特征交叉,对于 cross 网络中每一层的输入都由前一层以及第一层的输入组成,从这个维度上代表的是高阶特征的组合。比如说,第四层网络的输出包含了第三层和第二层的输入;而第三层又包含了第二层和第一层,因此这里就是个3阶的特征交叉。特征的交叉使用的是 bit-wise,也就是每个特征内部 embedding 的 element 也会两两交叉。

② xDeepFM 模型

使用 CIN 模型来提取特征交叉。和 DCN 模型一样的是,这里也使用了多层的 cross,每一层的输入也是由第一层和上一层的输入组成,不同的是,xdeepFM 模型的特征交叉是 vector wise 层级的,而 DCN 模型是 bit-wise 的。

③ FGCNN 模型

通过使用 CNN 模块,先是卷积层提取局部特征的连接,如高度等于3能够提取相邻3个 field 的特征的关系,因此具有高阶特征的交叉能力。然后又通过池化层提取 global 信息,确保特征的输入顺序对结果的影响能够被捕捉到。

05

总结

推荐和搜索的本质其实都是匹配,前者匹配用户和物品;后者匹配 query 和 doc。具体到匹配方法,分为传统模型和深度模型两大类,第二章讲的是传统模型,第三章和第四章讲的是深度模型。

对于传统模型,主要分为基于协同过滤的模型和基于特征的模型,两者最大的不同在于是否使用了 side information。基于协同过滤的模型,如 CF,MF,FISM,SVD++,只用到了用户-物品的交互信息,如 userid, itemid, 以及用户交互过的 item 集合本身来表达。而基于特征的模型以 FM 为例,主要特点是除了用户-物品的交互之外,还引入了更多的 side information。FM 模型是很多其他模型的特例,如 MF,SVD++,FISM 等。

对于深度模型,主要分为基于 representation learning 的深度模型以及 match function learning 的深度模型。基于 representation learning 的深度模型学习的是用户和物品的表示,然后通过匹配函数来计算,这里重点在与 representation learning 阶段,可以通过 CNN 网络,auto-encoder,知识图谱等模型结构来学习。

对于 match function learning 的深度模型,也分为基于协同过滤的模型和基于特征的模型。前者和传统 CF 模型一样,不同在于后面接入了 MLP 模型来增强非线性表达,目的是为了使得 user 和 item 的 vector 尽可能接近,这种方法就是基于 NCF 的模型;也有通过引入 relation vector 来是的 user vector 加上 relation vector 后接近 item vector,这种方法是基于翻译的模型。

对于 match function learning 另一种模型框架,是基于特征层面的,有基于 fm 模型的,基于 attention 的,以及高阶特征捕捉的,另外还有基于时间序列的文章中只提到了 DIEN 模型。

整理本篇综述主要基于原始 slides,对其中的 paper 部分粗读部分精读,收获颇多,在全文用如何做好推荐 match 的思路,将各种方法尽可能串到一起,主要体现背后一致的思想指导。多有错漏,欢迎批评指出。

06

参考资料

1. https://www.comp.nus.edu.sg/~xiangnan/sigir18-deep.pdf

2. Xiangnan He, Hanwang Zhang, Min-Yen Kan, and Tat-Seng Chua. Fast matrix factorization for online recommendation with implicit feedback. In SIGIR 2016.

3. Yehuda Koren, and Robert Bell. Advances in collaborative filtering. Recommender systems handbook. Springer, Boston, MA, 2015. 77-118.

4. Santosh Kabbur, Xia Ning, and George Karypis. Fism: factored item similarity models for top-n recommender systems. In KDD 2013.

5. Yehuda Koren. Factorization meets the neighborhood: a multifaceted collaborative filtering model. In KDD 2018.

6. Steffen Rendle. Factorization machines. In ICDM 2010.

7. Hong-Jian Xue, Xin-Yu Dai, Jianbing Zhang, Shujian Huang, and Jiajun Chen. Deep matrix factorization models for recommender systems. IJCAI 2017.

8. Suvash Sedhain, Aditya Krishna Menon, Scott Sanner, and Lexing Xie. Autorec: Autoencoders meet collaborative filtering. In WWW 2015.

9. Yao Wu, Christopher DuBois, Alice X. Zheng, and Martin Ester. Collaborative denoising auto- encoders for top-n recommender systems. In WSDM 2016.

10. Sheng Li, Jaya Kawale, and Yun Fu. Deep collaborative filtering via marginalized denoising auto- encoder. In CIKM 2015.

11. Xue Geng, Hanwang Zhang, Jingwen Bian, and Tat-Seng Chua. Learning image and user features for recommendation in social networks. In ICCV 2015.

12. Jingyuan Chen, Hanwang Zhang, Xiangnan He, Liqiang Nie, Wei Liu, and Tat-Seng Chua. Attentive collaborative filtering: Multimedia recommendation with item-and component-level attention. In SIGIR 2017.

13. Fuzheng, Zhang, Nicholas Jing Yuan, Defu Lian, Xing Xie, and Wei-Ying Ma. Collaborative knowledge base embedding for recommender systems. In KDD 2016.

14. Xiangnan He, Lizi Liao, Hanwang Zhang, Liqiang Nie, Xia Hu, and Tat-Seng Chua. Neural collaborative filtering. In WWW 2017.

15. Ting Bai, Ji-Rong Wen, Jun Zhang, and Wayne Xin Zhao. A Neural Collaborative Filtering Model with Interaction-based Neighborhood. CIKM 2017.

16. Xiangnan He, Xiaoyu Du, Xiang Wang, Feng Tian, Jinhui Tang, and Tat-Seng Chua. Out Product-based Neural Collaborative Filtering. In IJCAI 2018.

17. Tay, Yi, Shuai Zhang, Luu Anh Tuan, and Siu Cheung Hui. "Self-Attentive Neural Collaborative Filtering." arXiv preprint arXiv:1806.06446 (2018).

18. Ruining He, Wang-Cheng Kang, and Julian McAuley. Translation-based Recommendation. In Recsys 2017.

19. Yi Tay, Luu Anh Tuan, and Siu Cheung Hui. Latent Relational Metric Learning via Memory-based Attention for Collaborative Ranking. In WWW 2018.

20. Heng-Tze Cheng, Levent Koc, Jeremiah Harmsen, Tal Shaked, Tushar Chandra, Hrishi Aradhye, Glen Anderson et al. Wide & deep learning for recommender systems. In DLRS 2016.

21. Ying Shan, T. Ryan Hoens, Jian Jiao, Haijing Wang, Dong Yu, and J. C. Mao. Deep crossing: Web-scale modeling without manually crafted combinatorial features. In KDD 2016.

22. Xiangnan He,

推荐系统中的深度匹配模型

辛俊波 DataFunTalk 今天


文章作者:辛俊波 腾讯 高级研究员

编辑整理:Hoh Xil

内容来源:作者授权

文章出品:DataFunTalk

注:转载请联系作者本人。


导读:推荐系统和搜索应该是机器学习乃至深度学习在工业界落地应用最多也最容易变现的场景。而无论是搜索还是推荐,本质其实都是匹配,搜索的本质是给定 query,匹配 doc;推荐的本质是给定 user,推荐 item。本文主要讲推荐系统里的匹配问题,包括传统匹配模型和深度学习模型。

深度学习之风虽然愈演愈烈,但背后体现的矩阵分解思想、协同过滤思想等其实一直都是贯穿其中,如 svd++ 体现的 userCF 和 itemCF 的思想,FM 模型本质上可以退化成以上大多数模型等。多对这些方法做总结,有助于更深刻理解不同模型之间的关联。

图1 推荐和搜索的本质,都是 match 的过程

PS:本文主要启发来源 SIGIR2018:Deep Learning for Matching in Search and Recommendation,重点阐述搜索和推荐中的深度匹配问题,非常 solid 的综述,针对里面的一些方法,尤其是 feature-based 的深度学习方法增加了近期一些相关 paper。

本文主要分为以下几部分:

❶ 推荐系统概述

❷ 推荐系统的传统匹配模型

❸ 基于 representation learning 的深度匹配模型

❹ 基于 match function learning 的深度匹配模型

01

推荐系统概述

1.1 推荐系统本质

推荐系统就是系统根据用户的属性 ( 如性别、年龄、学历、地域、职业 ),用户在系统里过去的行为 ( 例如浏览、点击、搜索、购买、收藏等 ),以及当前上下文环境 ( 如网络、手机设备、时间等 ),从而给用户推荐用户可能感兴趣的物品 ( 如电商的商品、feeds 推荐的新闻、应用商店推荐的 app 等 ),从这个过程来看,推荐系统就是一个给 user 匹配 ( match ) 感兴趣的 item 的过程。

1.2 推荐和搜索比较

推荐和搜索有很多相同又有很多不同的地方,放到一起的原因是两者其实都是一个 match 的过程,图1.1展示的是一个搜索引擎的架构,需要 match 的是 query 和相关的 doc;图1.2展示的是一个推荐系统的架构,需要 match 的是 user ( 可能会带有主动意图的 query ) 和相关的 item。

图1.1 搜索引擎架构

图1.2 推荐引擎架构

1.2.1 搜索和推荐不同之处

❶ 意图不同

搜索是用户带着明确的目的,通过给系统输入 query 来主动触发的,搜索过程用户带着明确的搜索意图。而推荐是系统被动触发,用户是以一种闲逛的姿态过来的,系统是带着一种 "猜" 的状态给用户推送物品。

简单来说,搜索是一次主动 pull 的过程,用户用 query 告诉系统,我需要什么,你给我相关的结果就行;而推荐是一次 push 的过程,用户没有明显意图,系统给用户被动 push 认为用户可能会喜欢的东西吧。

❷ 时效不同

搜索需要尽快满足用户此次请求 query,如果搜索引擎无法满足用户当下的需求,例如给出的搜索结果和用户输入的 query 完全不相关,尽是瞎猜的结果,用户体验会变得很差。

推荐更希望能增加用户的时长和留存从而提升整体 LTV ( long time value,衡量用户对系统的长期价值 ),例如视频推荐系统希望用户能够持续的沉浸在观看系统推荐的视频流中;电商推荐系统希望用户能够多逛多点击推荐的商品从而提高 GMV。

❸ 相关性要求不同

搜索有严格的 query 限制,搜索结果需要保证相关性,搜索结果量化评估标准也相对容易。给定一个 query,系统给出不同结果,在上线前就可以通过相关性对结果进行判定相关性好坏。例如下图中搜索 query 为 "pool schedule",搜索结果 "swimming pool schedule" 认为是相关的、而最后一个 case,用户搜索 "why are windows so expensive" 想问的是窗户为什么那么贵,而如果搜索引擎将这里的 windows 理解成微软的 windows 系统从而给出结果是苹果公司的 mac,一字之差意思完全不同了,典型的 bad case。

图1.3 部分 query 和 document 的相关性匹配

而推荐没有明确的相关性要求。一个电商系统,用户过去买了足球鞋,下次过来推荐电子类产品也无法说明是 bad case,因为用户行为少,推完全不相关的物品是系统的一次探索过程。推荐很难在离线阶段从相关性角度结果评定是否好坏,只能从线上效果看用户是否买单做评估。

❹ 实体不同

搜索中的两大实体是 query 和 doc,本质上都是文本信息。这就是上文说到的为什么搜索可以通过 query 和 doc 的文本相关性判断是否相关。Query 和 doc 的匹配过程就是在语法层面理解 query 和 doc 之间 gap 的过程。

推荐中的两大实体是 user 和 item,两者的表征体系可能完全没有重叠。例如电影推荐系统里,用户的特征描述是:用户 id,用户评分历史、用户性别、年龄;而电影的特征描述是:电影 id,电影描述,电影分类,电影票房等。这就决定了推荐中,user 和 item 的匹配是无法从表面的特征解决两者 gap 的。

图1.4 推荐系统的两大实体:user 和 item

❺ 个性化要求不同

虽然现在但凡是一个推荐系统都在各种标榜如何做好个性化,"千人千面",但搜索和推荐天然对个性化需求不同。搜索有用户的主动 query,本质上这个 query 已经在告诉系统这个 "用户" 是谁了,query 本身代表的就是一类用户,例如搜索引擎里搜索 "深度学习综述" 的本质上就代表了机器学习相关从业者或者对其感兴趣的这类人。在一些垂直行业,有时候 query 本身就够了,甚至不需要其他用户属性画像。例如在 app 推荐系统里,不同的用户搜索 "京东",并不会因为用户过去行为、本身画像属性不同而有所不同。

图1.5 应用宝搜索京东,不太需要很强的个性化结果

而推荐没有用户主动的 query 输入,如果没有用户画像属性和过去行为的刻画,系统基本上就等于瞎猜。

1.2.2 搜索和推荐相同之处

❶ 本质是都是 match 过程

如果把 user 比作 query,把 item 比作 doc,那么推荐和搜索在这个层面又是相同的,都是针对一个 query ( 一个 user ),从海量的候选物品库中,根据 query 和 doc 的相关性 ( user 过去的历史、画像等和 item 的匹配程度 ),去推荐匹配的 doc ( item )。

❷ 目标相同

搜索和推荐的目标都是针对一次 context ( 或者有明确意图,或者没有 ),从候选池选出尽可能满足需求的物品。两者区别只是挑选过程使用的信息特征不同。

❸ 语义鸿沟 ( semantic gap ) 都是两者最大的挑战

在搜索里表现是 query 和 doc 的语义理解,推荐里则是 user 和 item 的理解。例如,搜索里多个不同的 query 可能表示同一个意图;而推荐里用来表示 user 和 item 的特征体系可能完全不是一个层面的意思。

02

推荐系统的传统匹配模型

2.1 基于 Collaborative Filtering 的方法

2.1.1 CF 模型

说到推荐系统里最经典的模型,莫过于大名鼎鼎的协同过滤了。协同过滤基于一个最基本的假设:一个用户的行为,可以由和他行为相似的用户进行预测。

协同过滤的基本思想是基于 <user, item> 的所有交互行为,利用集体智慧进行推荐。CF 按照类型可以分为3种,user-based CF、item-based CF 和 model-based CF。

❶ User-base CF:通过对用户喜欢的 item 进行分析,如果用户 a 和用户 b 喜欢过的 item 差不多,那么用户 a 和 b 是相似的。类似朋友推荐一样,可以将 b 喜欢过但是 a 没有看过的 item 推荐给 a。

❷ Item-base CF: item A 和 item B 如果被差不多的人喜欢,认为 item A 和 item B 是相似的。用户如果喜欢 item A,那么给用户推荐 item B 大概率也是喜欢的。比如用户浏览过这篇介绍推荐系统的文章,也很有可能会喜欢和推荐系统类似的其他机器学习相关文章。

❸ Model-base CF: 也叫基于学习的方法,通过定义一个参数模型来描述用户和物品、用户和用户、物品和物品之间的关系,然后通过已有的用户-物品评分矩阵来优化求解得到参数。例如矩阵分解、隐语义模型 LFM 等。

CF 协同过滤的思路要解决的问题用数据形式表达就是:矩阵的未知部分如何填充问题 ( Matrix Completion )。如图2.1所示,已知的值是用户已经交互过的 item,如何基于这些已知值填充矩阵剩下的未知值,也就是去预测用户没有交互过的 item 是矩阵填充要解决的问题。

图2.1 用户对左图评分过的电影,可以用右图矩阵填充表达

矩阵填充可以用经典的 SVD ( Singular Value Decomposition ) 解决,如图2.1所示。

图2.2 SVD 矩阵分解

其中左侧 M=m*n 表示用户评分矩阵,m 矩阵的行表示用户数,n 矩阵的列表示 item 数,在大多数推荐系统中 m 和 n 规模都比较大,因此希望通过将 M 分解成右侧低秩的形式。一般来说 SVD 求解可以分为三步:

❶ 对 M 矩阵的 missing data 填充为0

❷ 求解 SVD 问题,得到 U 矩阵和 V 矩阵

❸ 利用 U 和 V 矩阵的低秩 k 维矩阵来估计

对于第二步种的 SVD 求解问题,等价于以下的最优化问题:

其中 yij 为用户 i 对物品 j 的真实评分,也就是 label,U 和 V 为模型预估值,求解矩阵 U 和 V 的过程就是最小化用户真实评分矩阵和预测矩阵误差的过程。

这种 SVD 求解方法存在以下问题:

❶ Missing data ( 在数据集占比超过99% ) 和 observe data 权重一样。

❷ 最小化过程没有正则化 ( 只有最小方差 ),容易产生过拟合。

因此,一般来说针对原始的 SVD 方法会有很多改进方法。

2.1.2 MF 模型 ( 矩阵分解 )

为解决上述过拟合情况,矩阵分解模型 ( matrix factorization ) 提出的模型如下:

MF 模型的核心思想可以分成两步:

❶ 将用户 u 对物品 i 的打分分解成用户的隐向量 vu,以及物品的隐向量 vi

❷ 用户 u 和物品 i 的向量点积 ( inner product ) 得到的 value,可以用来代表用户 u 对物品i的喜好程度,分数越高代表该 item 推荐给用户的概率就越大。

同时,MF 模型引入了 L2 正则来解决过拟合问题。

当然,这里除了用 L2 正则,其他正则手段例如 L1 正则,cross-entropy 正则也都是可以的。

2.1.3 FISM 模型

上述提到的两种模型 CF 方法和 MF 方法都只是简单利用了 user-item 的交互信息,对于用户本身的表达是 userid 也就是用户本身。2014年 KDD 上提出了一种更加能够表达用户信息的方法,Factored Item Similarity Model,简称 FISM,顾名思义,就是将用户喜欢过的 item 作为用户的表达来刻画用户,用数据公式表示如下:

注意到用户表达不再是独立的隐向量,而是用用户喜欢过的所有 item 的累加求和得到作为 user 的表达;而 item 本身的隐向量  vi 是另一套表示,两者最终同样用向量内积表示。

2.1.4 SVD++ 模型

MF 模型可以看成是 user-based 的 CF 模型,直接将用户id映射成隐向量,而 FISM 模型可以看成是 item-based 的 CF 模型,将用户交户过的 item 的集合映射成隐向量。一个是 userid 本身的信息,一个是 user 过去交互过的 item 的信息,如何结合 user-base 和 item-base 这两者本身的优势呢?

SVD++ 方法正是这两者的结合,数学表达如下:

其中,每个用户表达分成两个部分,左边 vu 表示用户 id 映射的隐向量 ( user-based CF 思想 ),右边是用户交互过的 item 集合的求和 ( item-based CF 思想 )。User 和 item 的相似度还是用向量点击来表达。

这种融合方法可以看成早期的模型融合方法,在连续3年的 Netflix 百万美金推荐比赛中可是表现最好的模型。

2.2 Generic feature-based 的方法

上述的方法中,无论是 CF,MF,SVD,SVD++,还是 FISM,都只是利用了 user 和 item 的交互信息 ( ratin g data ),而对于大量的 side information 信息没有利用到。例如 user 本身的信息,如年龄,性别、职业;item 本身的 side information,如分类,描述,图文信息;以及 context 上下文信息,如位置,时间,天气等。因此,传统模型要讲的第二部分,是如何利用这些特征,去构造 feature-based 的 model。

图2.3 特征体系三模块:用户信息、物品信息、交互信息

2.2.1 FM 模型

首先要介绍的是大名鼎鼎的 FM 模型。FM 模型可以看成由两部分组成,如图2.4所示,蓝色的 LR 线性模型,以及红色部分的二阶特征组合。对于每个输入特征,模型都需要学习一个低维的隐向量表达 v,也就是在各种 NN 网络里所谓的 embedding 表示。

图2.4 FM 模型的稀疏 one-hot 特征输入

FM 模型的数学表达如图2.5所示:

图2.5 FM 模型的数学表达分解

注意红色部分表示的是二阶特征的两两组合 ( 特征自己和自己不做交叉 ),向量之间的交叉还是用向量内积表示。FM 模型是 feature-based 模型的一个范式表达,接下来介绍的几个模型都可以看成是 FM 模型的特殊范例。

2.2.2 FM 模型和 MF 关系

假如只使用 userid 和 itemid,我们可以发现其实 FM 退化成加了 bias 的 MF 模型,如图2.6所示:

图2.6 FM 模型可以退化成带 bias 的 MF 模型

数学表达式如下:

2.2.3 FM 模型和 FISM 关系

如果输入包含两个变量,① 用户交互过的 item 集合;② itemid 本身,那么,此时的 FM 又将退化成带 bias 的 FISM 模型,如图2.7所示,蓝色方框表示的是用户历史交互过的 item ( rated movies ),右边橙色方框表示的是 itemid 本身的 one-hot 特征。

图2.7 FM 模型可以退化成带 bias 的 FISM 模型

此时的 FM 模型数学表达如下:

同样道理,如果再加上 userid 的隐向量表达,那么 FM 模型将退化成 SVD++ 模型。可见 MF,FISM,SVD++ 其实都是 FM 的特例。

2.3 传统模型总结

上面介绍的模型都是通过打分预测来解决推荐系统的排序问题,这在很多时候一般都不是最优的,原因有如下几个方面:

❶ 预测打分用的 RMSE 指标和实际的推荐系统排序指标的 gap:

预测打分用的 RMSE 拟合的是最小方差 ( 带正则 ),而实际面临的是个排序问题。

❷ 观察数据天然存在 bias

用户一般倾向于给自己喜欢的 item 打分,而用户没有打分过的 item 未必就真的是不喜欢。针对推荐系统的排序问题,一般可以用 pairwise 的 ranking 来替代 RMSE。

如上述公式所示,不直接拟合用户对 item 的单个打分,而是以 pair 的形式进行拟合;一般来说,用户打分高的 item > 用户打分低的 item;用户用过交互的 item > 用户未交互过的 item ( 不一定真的不喜欢 )。

03

基于 representation learning 的深度匹配模型

终于要讲到激动人心的深度学习部分了。深度学习匹配模型从大致方向上可以分为两大类,分别是基于 representation learning 的模型以及 match function learning 的模型。

本章主要讲述第一种方法,representation learning,也就是基于表示学习的方法。这种方法会分别学习用户的 representation 以及 item 的 representation,也就是 user 和 item 各自的 embedding 向量 ( 或者也叫做隐向量 ),然后通过定义 matching score 的函数,一般是简单的向量点击、或者 cosine 距离来得到两者的匹配分数。整个 representation learning 的框架如图3.1所示,是个典型的 user 和 item 的双塔结构:


图3.1 基于 representation learning 的匹配模型

基于 representation learning 的深度学习方法,又可以分为两大类,基于 CF 以及 CF + side info 的方法。下面的介绍将分别从 input 、representation function 和 matching function 三个角度分别看不同的模型有什么不同。

3.1 基于 Collaborative Filtering 的方法

3.1.1 CF 模型 ( collaborative filtering )

重新回顾下传统方法里的协同过滤方法,如果从表示学习的角度来看,就是个经典的 representation learning 的模型,分别学习 user 和 item 的隐向量。

❶ input layer:只有两个,分别是 userid ( one-hot ),itemid ( one-hot  )

❷ representation function:线性 embedding layer

❸ matching function:向量内积 ( inner product )

图3.2 CF 是 representation learning 最基础的模型

3.1.2 模型 ( Deep Matrix Factorization )

DMF 模型也就是深度矩阵分解模型,在传统的 MF 中增加了 MLP 网络,整个网络框架如图3.3所示。

❶ input layer

由两部分组组成,其中 user 由 user 交互过的 item 集合来表示,是个 multi-hot 的打分表示,如 [0 0 4 0 0 … 1 5 …],在矩阵中用行表示;item 也由交互过的 user 集合来表示,也是个 multi-hot 的表示,如 [5 0 0 3 … 1 3],在矩阵中用列表示。

图3.3 DMF 深度矩阵分解模型框架

可以发现这里的输入都是 one-hot 的,一般来说 M 用户数比较大,N 作为 item 数量假设是百万级别的。

❷ representation function

Multi-Layer-Perceptron,也就是经典的全连接网络。

❸ matching function

用 cosine 点击表示两个向量的匹配分数。

对比普通的 CF 模型,最大的特点是在 representation function 中,增加了非线性的 MLP,但是由于输入是 one-hot 的,假设用户规模是100万,MLP 的第一层隐层是100,整个网络光 user 侧的第一层参数将达到1亿,参数空间将变得非常大。

3.1.3 AutoRec 模型

借鉴 auto-encoder 的思路,AutoRec 模型对输入做重建,来建立 user 和 item 的 representation,和 CF 一样,也可以分为 user-based 和 item-based 的模型。对于 item-based AutoRec,input 为 R 里的每列,即每个 item 用各个 user 对它的打分作为其向量描述;对于 user-based AutoRec 则是用 R 里的每行来表示,即每个 user 用他打分过的 item 的向量来表达。

用 ru 表示用户向量,ri 表示 item 向量,通过 autoencoder 将 ru 或者 ri 投射到低维向量空间 ( encode 过程 ),然后再将其投射到正常空间 ( decode 过程 ),利用 autoencoder 中目标值和输入值相近的特性,从而重建 ( reconstruct ) 出用户对于未交互过的 item 的打分。

❶ input layer

和 DMF 一样,user 用 user 作用过的 item 集合表示,item 则用 itemid 本身表示,图中在原 slides 是说 user-autoencoder,但个人在看原始 autoRec 论文时,这块应该有误,应该是 item-based 的,因为 m 表示的是用户数,n 表示 item 数,下方的输入表示所有 user(1,2,3,…m) 对 item i 的交互输入。

图3.4 item-based 的 autoRec 模型

❷ representation function

通过 auto-encoder 的结构表示,其中,h(r; theta) 表示的是输入层到隐层的重建;由于输入的是用户交互过的 item(multi-hot),所以在隐层中的蓝色节点表示的就是 user representation;而输出的节点表示的是 item 的 representation,这样就可以得到 user 和 item 各自 representation,如下面公式所示:

损失函数为最小化预测的平方差以及 W 和 V 矩阵的 L2 正则:

❸ matching function

有了 user 和 item 的 representation,就可以用向量点击得到两者的匹配分数。

3.1.4 模型 ( Collaborative Denoising Auto-Encoders )

CDAE 模型类似 SVD++ 的思想,除了 userid 本身表达用户,也将用户交互过的 item 作为 user 的表达。

❶ input layer

用户 id,用户历史交互过的 item;以及 itemid。可以发现对比上述基础的 autoRec,用户侧输入同时使用了用户历史交互过的 item 以及 userid 本身这个 bias,思想很类似 SVD++。如图3所示的 input layer 节点,绿色节点表示每个用户交互过的 item,最下面的红色节点 user node 表示用户本身的偏好,可以认为是 userid 的表达。

❷ representation function

图3.5 CDAE 模型结构

其中,中间蓝色的隐层节点作为用户表示,其中 Vu 为 input layer 中的 user node 的 representation,针对所有用户 id 会学习一个和 item 无关的 Vu 向量表达,可以认为是用户本身的 bias,例如有些用户打分本身比较严格,再好的 item 打分也不会太高;有些用户打分很宽松,只要 item 别太差都会给高分,加上 Vu 可以更好的刻画用户之间天然的 bias。

而对于输出层的节点,可以认为是用户 u 对物品 i 的打分预测:

❸ matching function

使用向量点积作为匹配分数:

3.1.5 基于 CF 方法的深度模型总结

总结下以上基于 CF 的方法,有以下几个特点:

❶ User 或者 item 要么由本身 id 表达,要么由其历史交互过的行为来表达;

❷ 用历史交互过的行为来作为 user 或者 item 的表达,比用 id 本身表达效果更好,但模型也变得更复杂;

❸ Auto-encoder 本质上等同于 MLP+MF,MLP 用全连接网络做 user 和 item 的 representation 表达;

❹ 所有训练数据仅用到 user-item 的交互信息,完全没有引入 user 和 item 的 side info 信息。

3.2 基于 Collaborative Filtering+ side information 的方法

基于 CF 的方法没有引入 side information,因此,对于 representation learning 的第二种方法,是基于 CF + side info,也就是在 CF 的方法上额外引入了 side info。

3.2.1 DCF 模型 ( Deep Collaborative Filtering )

❶ input layer

除了用户和物品的交互矩阵,还有用户特征 X 和物品特征 Y。

❷ representation function

和传统的 CF 表示学习不同,这里引入了用户侧特征X例如年龄、性别等;物品侧特征 Y 例如文本、标题、类目等;user 和 item 侧的特征各自通过一个 auto-encoder 来学习,而交互信息 R 矩阵依然做矩阵分解 U,V。整个模型框架如图3.6所示。

图3.6 DCF 模型框架

损失函数优化,需要最小化用户侧特征的 reconstruction 和 item 侧的 encoder 部分,以及交互矩阵和预测矩阵的平方差,还有加上 L2 正则。如图3.7第一个公式。

其中 W1,表示的用户侧特征 X 在 auto-encoder 过程中的 encode 部分,也就是输入到隐层的重建,P1 表示的是用户特征到交互矩阵 R 的映射;而 W2 表示物品侧特征 Y 在 auto-encoder 过程中的 encode 部分。P2 表示的是物品特征到交互矩阵 R 的映射。

图3.7 CDAE 模型的损失函数分解

图3.7下面两组公式中,可以看出用户侧和物品侧特征都由两项 error 组成,第一项衡量的是 input 和 corrupted input 构建的预估误差,需要保证 W1 和 W2 对于 corrupted 后的 input x 和 y 不能拟合太差;第二项表达的是映射后的隐层特征空间 W1X 和投射到 U 矩阵的误差不能太大。

简单理解,整个模型的学习,既需要保证用户特征 X 和物品特征 Y 本身 encode 尽可能准确 ( auto-encoder 的 reconstruction 误差 ),又需要保证用户对物品的预估和实际观测的尽可能接近 ( 矩阵分解误差 ),同时正则化也约束了模型的复杂度不能太高。

3.2.2 DUIF 模型 ( Deep User and Image Feature Learning )

❶ input layer

除了用户和物品的交互矩阵,还有用户特征 X 和物品特征 Y。

❷ representation function

整个 match score 可以用下图表示:fi 表示原始图片特征,通过 CNN 网络提取的图片特征作为 item 的表达,然后用一个线性映射可以得到 item 的 embedding 表达。

❸ match function

通过模型学到的 pu 作为用户的 representation,以及通过 CNN 提取的图片特征作为 item 的 representation,两者通过向量点积得到两者的匹配分数。

3.2.3 ACF 模型 ( Attentive Collaborative Filtering )

Sigir2017 提出的 Attention CF 方法,在传统的 CF 里引入了 attention 机制。这里的 attention 有两层意思,第一层 attention,认为用户历史交互过的 item 的权重是不一样的;另一个 attention 意思是,用户同一个 item 里到的视觉特征的权重也是不一样的,如图3.8所示。

图3.8 ACF 模型结构

❶ input layer

① 用户侧:userid;用户历史交互过的 item。

② Item侧:itemid;item 相关的视觉相关特征。

❷ representation function

可以分为两个 attention,一个是 component 层级的 attention,主要是提取视觉特征;第二层是 item 层级的 attention,主要提取用户对物品的喜好程度权重。

① component-attention

在该 paper 里的推荐系统针对的是 multi-media 的,有很多图文和视频的特征信息提取,所以引入的第一层 attention 指的是 component attention,认为对于不同的 components 对 item representation 的贡献程度是不同的,如图3.9所示。

图3.9 component attention 框架

对第 l 个 item,输入为不同 region 本身的特征 xl1,xl2,xlm,表示的是 m 个不同的 item feature, 以及用户输入 ui,最终 item 的表达为不同的 region 的加权 embedding。

其中第一个公式表示用户 i 对物品 l 第 m 个 component ( 例如图片特征中的局部区域特征,或者视频中不同帧的特征 ) 的权重;第二个公式 softmax 对 attention 权重归一化。

② item attention

第二层 attention,认为用户作用过的 item 历史中,权重应该是不同的。这里文章使用了 SVD++ 的方式,用户本身的表达引入了 a(i, l),代表的是用户 i 对其历史交互过的物品 l 的权重。

用户 i 对第 l 个 item 的权重表达可以用如下的数据表示:

其中 ui 是用户本身的 latent vector,vl 是物品 l 的 latent vector,pl 是物品 l 的辅助 latent vector;xl 是表示前面提到的从图文信息提取的特征 latent vector。用户最终的表达是自身 ui 的 latent vector,以及历史行为的 attention 加权的 representation 表示。

模型使用的是 pairwise loss 进行优化:

❸ representation function

使用 user 和 item 的向量点击作为匹配分数。

3.2.4 CKB 模型 ( Collaborative Knowledge Base Embedding )

CKB 模型是在2016年 KDD 提出的,利用知识图谱做 representation learning,模型框架如图3.10所示。整个 CKB 模型框架其实思想比较简单,分别在结构化信息、文本信息和视觉信息中提取 item 侧特征作为 item 的 representation。

图3.10 CKB 模型框架

❶ input layer

① user侧:userid

② item侧:itemid;基于知识图谱的 item 特征 ( structural,textual,visual )

❷ representation function

主要是从知识图谱的角度,从结构化信息,文本信息以及图文信息分别提取 item 侧的表达,最终作为 item 的 embedding。

① 结构化特征 struct embedding: transR,transE

图3.11 struct embedding 框架

② 文本特征 Textual embedding: stacked denoising auto-encoders ( S-DAE )

图3.12 textual embedding 框架

③ 视觉特征 Visual embedding: stacked convolutional auto-encoders ( SCAE )

图3.13 visual embedding 框架

❸ matching function

得到用户向量和 item 向量后,用向量点击表示 user 和 item 的匹配分数;损失函数则用如下的 pair-wise loss 表示:

3.3 基于 representation 的深度匹配方法总结

总结上述基于 CF 的方法,可以用如下的范式作为表达:

图3.14 基于 CF 的深度匹配模型范式

❶ representation learning:目的是学习到 user 和 item 各自的 representation ( 也叫 latent vector,或者 embedding )。

❷ 特征表达:user 侧特征除了用户 id 本身 userid,可以加上其他 side info;item 侧特征除了物品 id 本身 itemid,还有其他文本特征、图文特征、视频帧特征等信息。

❸ 模型表达:除了传统的 DNN,其他结构如 Auto-Encoder ( AE ),Denoise-Auto-Encoder ( DAE ),CNN,RNN 等。

基于 representation learning 的深度匹配模型不是一个 end-2-end 模型,通过 user 和 item 各自的 representation 作为中间产物,解释性较好,而且可以用在出了排序阶段以外的其他环节,例如求物品最相似的 item 集合,召回环节等。

04

基于 match function learning 的深度匹配模型

对比 representation learning 的方法,基于 match function learning 最大的特点是,不直接学习 user 和 item 的 embedding,而是通过已有的各种输入,通过一个 neural network 框架,来直接拟合 user 和 item 的匹配分数。

图4.1 基于 match function learning 的深度匹配模型框架

简单来说,第一种方法 representation learning 不是一种 end-2-end 的方法,通过学习 user 和 item 的 embedding 作为中间产物,然后可以方便的计算两者的匹配分数;而第二种方法 matching function learning 是一种 end2end 的方法,直接拟合得到最终的匹配分数。本章主要介绍基于 match function learning 的深度学习匹配方法。

4.1 CF-based 的深度模型

前面传统匹配模型以及基于表示学习的模型,其 base 模型都离不开协同过滤,也可以称为基于矩阵分解的模型。基于 match function learning 的模型也不例外。

4.1.1 基于 NCF 框架的方法

基于神经网络的学习方法 ( NCF ) 为何向南博士在2017年提出,对比传统的 CF 网络,在得到 user vector 和 item vector 后,连接了 MLP 网络后,最终拟合输出,得到一个 end-2-end 的 model。这套框架好处就是足够灵活,user 和 item 侧的双塔设计可以加入任意 side info 的特征,而 MLP 网络也可以灵活的设计,如图4.2所示。

图4.2 基于神经网络的协同过滤框架

NCF 框架对比第三章所说的 CF 方法最主要引入了 MLP 去拟合 user 和 item 的非线性关系,而不是直接通过 inner product 或者 cosine 去计算两者关系,提升了网络的拟合能力。然而 MLP 对于直接学习和捕获从 mf 提取的 user 和 item vector 能力其实并不强。在 wsdm2018 的一篇文章质疑的就是 MLP 对特征组合的拟合能力。

图4.3 DNN 模型拟合数据实验

该 paper 做了一组实验,使用1层的 MLP 网络去拟合数据;实验证明对于二维一阶的数据,也需要100个节点才能拟合;如果超过2阶,整个 MLP 的表现将会非常差。文章因此说明了 DNN 对于高阶信息的捕捉能力并不强,只能捕捉低阶信息。

下文要讲的模型,也是在模型结构或者特征层面做的各种变化。

4.1.1.1 NeuMF 模型 ( Neural Matrix Factorization )

Neural MF,顾名思义,同时利用了 MF 和神经网络 MLP 的能力来拟合 matching score;MF 利用向量内积学习 user 和 item 的关联,同时 MLP 部分捕捉两者的其他高阶信息。这篇 paper 其实和 NCF 框架是出自同一篇 paper 的。模型可以分为 GMF 和 MLP 两个部分来看,如图4.4所示。

图4.4 NeuMF 模型结构框架

❶ GMF ( General Matrix Factorization ) 部分

User 和 item 都通过 one-hot 编码得到稀疏的输入向量,然后通过一个 embedding 层映射为 user vector 和 item vector。这样就获得了 user 和 item 的隐向量,一般可以通过向量点积或者哈达马积 ( element-wide product ) 得到交互,不过在 NeuMF 中多连接了一个连接层,也就是 GMF layer:

❷ MLP 部分

输入和 GMF 部分一样,都是 one-hot 的稀疏编码,然后通过 embedding 层映射为 user vector 和 item vector。注意到这里 user 和 item 的 vector  和 GMF 部分是不一样的,原因是 GMF 和 MLP 两个网络结构对隐层维度要求不同,MLP 部分会高一些 ( 个人感觉 share embedding 能更充分训练 embedding )。

Embedding 层之后就是几层常规的 MLP,这块没什么好说的,最后一层输出作为 MLP 的 output。

4.1.1.2 NNCF 模型 ( Neighbor-based NCF )

CIKM2017 提出的一种基于 neighbor 的 NCF 方法,最大的不同在于输入除了 user 和 item 的信息,还各自引入了 user 和 item 各自的 neighbor 信息。

图4.5 NNCF 模型框架

图4.5所示的输入由两部分组成,中间 xu 和 yi 为原始的 user 和 item 的 one-hot 输入,通过 embedding 层后映射为 pu 和 qi 的 embedding 向量,然后通过哈达马积作为 MLP 的输入。而输入层两侧的 nu 和 ni 是 user 和 item 各自的 neighbor 信息的输入,这里 nu 和ni 信息如何提取可以采用多种手段,如二部图挖掘,user-CF 或者 item-CF 等。

对于 neighbor 信息,由于每个用户和 item 的 neighbor 数不一致,输入是不定长的,通过卷积和 pooling 后提取得到定长的 embedding,然后和 user 以及 item 本身的向量 concat 后输入到模型中:

4.1.1.3 ONCF 模型 ( Outer-Product based NCF )

何向南博士2018年在 NCF 模型框架上提出了 outer-product based NCF,在原有的 NCF 框架上,引入了 outer product 的概念,如图4.6所示。

图4.6 ONCF 模型框架

在 embedding layer 之后,O-NCF 模型引入了 interaction map 也就是特征交叉层,对于用户 u 的向量 pu 和物品 i 的向量 qi,引入两者的 outer-product:

E 是一个 k*k 维的矩阵,其中的每个 element 两两相乘,得到2维的矩阵。到这,可以通过把二维矩阵展开变成一个 k维度的向量,作为 MLP 的输入。假设 k=64,那么 E 就是个4096的向量,每一层隐层单元个数设置为上一层的一半,那么第一层的维度为4096*2048约需要840万的网络参数需要训练,参数量非常巨大。

因此,文章提出了一种利用 CNN 局部连接共享参数的方法来减少 embedding layer 到 hidden layer 之间的参数,如图4.7所示。

图4.7 ConvNCF 模型框架

假设隐层维度 K=64,有6层 hidden layer,每一层有32个卷积核 ( feature map ),步长 stride=2,那么经过每个卷积核后的 feature map 大小为原来的1/4 ( 长和宽各少了一半 )。以第一层卷积为例:

那么第一层卷积后得到的网络是个32*32*32的3维 vector,其中最后一个32代表 feature map 个数。这里如何体现特征交叉的思想呢?ei,j,c 代表的就是在前一层的 feature map 中,第 i 个单元和第 j 个 element 的二阶交叉。第一层 feature map 中,每个单元提取的是上一层2*2区域的 local 连接信息,第三层提取的就是第一层4*4的信息,那么在网络的最后一层就能提取到原始 feature map 里的 global 连接信息,从而达到高阶特征提取的目的。

总结来说,使用原始的 outer-product 思想,在第一层网络处有近千万的参数需要学习,而使用 CNN 网络一方面能够减少参数量,另一方面又同时提取了低阶和高阶特征的组合。个人觉得引入 CNN 固然能节省内存,但也同时会带来训练和推理时间的增加,是一种时间换空间的思想。另外用 CNN 是否能够比原始 MLP 更有效拟合特征组合也需要结合数据分布去看。

4.1.1.4 小结

基于 NCF 框架的方法基础原理是基于协同过滤,而协同过滤本质上又是在做 user 和 item 的矩阵分解,所以,基于 NCF 框架的方法本质上也是基于 MF 的方法。矩阵分解本质是尽可能将 user 和 item 的 vector,通过各种方法去让 user 和 item 在映射后的空间中的向量尽可能接近 ( 用向量点击或者向量的 cosine 距离直接衡量是否接近)。

而另外一种思路,基于翻译的方法,也叫 translation based model,认为 user 和 item 在新的空间中映射的 vector 可以有 gap,这个 gap 用 relation vector 来表达,也就是让用户的向量加上 relation vector 的向量,尽可能和 item vector 接近。两种方法的区别可以用图4.8形象的表示。

图4.8 基于矩阵分解和基于翻译的模型区别

4.1.2 基于 translation 框架的方法

4.1.2.1 transRec 模型

2017年的 recsys 会议上提出的一种基于 "translate" 的推荐方法,要解决的是 next item 的推荐问题。基本思想是说用户本身的向量,加上用户上一个交互的 item 的向量,应该接近于用户下一个交互的 item 的向量,输入是 (user, prev item, next item),预测下个 item 被推荐的概率。

图4.9 transRec 模型框架

用户向量表达如下:

这里 ri 和 rj 表示的是用户上一个交互的 item i 和下一个交互的 item j,tu 为用户本身的向量表达。而在实际的推荐系统中,往往存在数据稀疏和用户冷启动问题,因此,作者将用户向量 tu 分解成了两个向量:

这里 t 可以认为是全局向量,表示的是所有用户的平均行为,tu 表示用户 u 本身的 bias,例如对于冷启动用户,tu 可以设置为0,用全局用户的表达 t 作为冷启动。

对于热门 item 由于出现次数非常多,会导致最终热门 item 的向量和绝大多数用户向量加上 item 向量很接近,因此文章对热门 item 做了惩罚,最终,已知上一个 item i,用户和下一个 item j 的匹配 score 表达为:

其中, 第一项 βj 表示的是物品 j 的全局热度;第二项 d 表示的是用户向量加上物品 i 的向量与物品 j 向量的距离;距离越小表示 i 和 j 距离越接近,被推荐的可能性就越大。

4.1.2.2 LRML 模型 ( Latent Relational Metric Learning )

前面讲到,基于 translation 框架的方法对比基于 CF 框架方法最大的不同,在于找到一个 relation vector,使得 user vector + relation vector 尽可能接近 item vector。WWW2018 提出的 LRML 模型通过引入 memory network 来学习度量距离。可以分为三层 layer,分别是 embedding layer, memory layer 和 relation layer。

图4.10 LRML 模型框架

❶ embedding layer

底层是常规的双塔 embedding,分别是用户 embedding 矩阵和物品的 embedding 矩阵,用户 one-hot 输入和 item 的 one-hot 输入通过 embedding 后得到用户向量 p 和物品向量 q。

❷ memory layer

记忆网络层是文章的核心模块,作者通过引入 memory layer 作为先验模块。这个模块可以分为三个步骤进行计算:

① 用户和物品 embedding 融合

Embedding 层得到的 user 和 item 向量 p 和 q 需要先经过交叉合成一个向量后输入到下一层,作者提到使用哈达码积效果优于 MLP 效果,也更简单:

② 用户-物品 key addressing

从第一步得到的向量 s 中,去和 memory 记忆网络模块中的各个 memory vector 挨个计算相似度,相似度可以用内积表达并做归一化:

得到的 ai 代表的是当前用户-物品输入对 (p,q) 与 memory-network 中的第 i 个向量的相似度。

③ 最终加权表达

最终得到的 relation vector 是第二步得到的 memory 记忆网络中不同 vector 的加权表达,如下所示:

❸ relation layer

从 memory layer 得到的 r 向量可以认为是用户向量 p 与物品向量 q 的 relation vector,最终的距离用平方损失衡量,如图4.11所示。

图4.11 LRML relation 层以及 loss 结构

由于解决的是推荐物品的排序问题,文章使用的是 pairwise loss,因此在网络的最后一层,对 user 和 item 分别进行负样本采样得到 p' 和 q',然后使用 pairwise hinge loss 进行优化:

4.2 feature-based 的深度模型

4.1介绍的基于 CF 的方法,对大多数推荐系统来说,输入的特征向量往往都是非常高维而且稀疏的,而特征之间的交叉关系对模型来说往往都是非常重要的。例如,用户一般会在一天快吃三餐的时候,打开和订餐相关的 app,这样,用户使用订餐 app 和时间存在着二阶交叉关系;又比如说,男性的青年群体,往往更喜欢射击类的游戏,性别、年龄以及类目之间存在着三阶的交叉关系。因此,如何捕捉特征之间的交叉关系,衍生了众多基于特征的模型,在这里将这些捕捉特征交叉关系的模型称为 feature-based model。

4.2.1 wide&deep 模型

提到深度学习模型,最经典的莫过于2016年 google 提出的 wide and deep 模型。说是模型,不如说是通用的一套范式框架,在整个工业界一举奠定了风靡至今的模型框架,如图4.12所示。

图4.12 wide&deep 模型框架

在这个经典的 wide&deep 模型中,google 提出了两个概念:generalization ( 泛化性 ) 和 memory ( 记忆性 )。

❶ 记忆性:wide 部分长处在于学习样本中的高频部分,优点是模型的记忆性好,对于样本中出现过的高频低阶特征能够用少量参数学习;缺点是模型的泛化能力差,例如对于没有见过的 ID 类特征,模型学习能力较差。

❷ 泛化性:deep 部分长处在于学习样本中的长尾部分,优点是泛化能力强,对于少量出现过的样本甚至没有出现过的样本都能做出预测 ( 非零的 embedding 向量 ),容易带来惊喜。缺点是模型对于低阶特征的学习需要用较多参数才能等同 wide 部分效果,而且泛化能力强某种程度上也可能导致过拟合出现 bad case。尤其对于冷启动的一些 item,也有可能用用户带来惊吓。

图4.13 wide&deep 模型特征框架

值得注意的是,虽然模型的 deep 部分拟合和泛化能力很强,但绝对不意味着把特征交叉都交给 MLP 就够了。实际证明,对于重要的一些人工经验的特征,对于提升整体效果还是非常重要的,如图4.13所示。这个人工特征的所谓缺点,也是后续各种模型结构想对其进行 "自动化" 的优化点。

4.2.2 deep crossing 模型

微软在2016年提出了一套框架 deep crossing,这篇文章在输入到 embedding 这里到是和 wide&deep 没有太多不同,主要区别在于 MLP 部分。

Google 的 wide&deep 模型里深度网络的 MLP 部分是全连接网络,每一层的网络输入都是前一层的输入出,受限于模型结构,越往后越难学习到原始输入的表达,一般深度不会太深,超过5层的网络在工业界已经算很少见了。为了解决这个问题,deep crossing 网络引入了 resnet 残差网络的概念,通过 short-cut,在 MLP 的深层网络,也能接收来自第一层的输入,这样可以使得模型的深度达到10层之多,如图4.14所示。

图4.14 deep crossing 模型框架

上述提到的 wide&deep 以及 deep crossing 框架更像是在模型结构做的改进,一个引入了 wide&deep,一个引入了 resnet,特征层面并没有做太多改造,如何体现 feature-base 呢?SigIR2017 就有一篇文章做了个实验,对 wide&deep 以及 Deep&Cross 实验按照 embedding 是否做初始化分别做了实验。实验发现,如果 embedding 是随机初始化的,两个深度模型连基础的 FM 模型都打不过;哪怕经过 FM 初始化了 embedding,wide&deep 模型效果也仅仅略好于 FM 模型,而 deep crossing 模型依然比不过 FM 模型,实验结果如图4.15所示。

图4.15 不同初始化对模型影响

这个结论也引出了关于 MLP 的一些思考,全连接网络表面上看对所有节点都进行了连接,理论上应该学习到了各个节点的交叉特征,但是从结果上来看,MLP 对这些特征交叉的学习能力确实非常差的。纠其原因,还是在模型结构的设计上。

图4.16 wide&deep 模型和 deep crossing 模型

图4.16里无论是 wide&deep 还是 deep crossing network,embedding 层之后到 MLP 之间,都是将 embedding 做 concat 的。这些 concat 后的信息其实能够表达的特征交叉信息其实是非常有限的,仅靠 MLP 想完全捕捉到特征的有效交叉其实是非常困难的。因此,有大量工作关于在 embedding 这里如何捕捉特征交叉,其实就是在 MLP 网络之前,利用更多的数学先验范式做特征交叉去提取特征,这也是本节提到的方法叫做 feature-based 的原因。

4.2.3 PNN 模型

Embedding layer 进入 MLP 之前,引入了 product layer 来显式的学习每个 field 的 embedding 向量之间的两两交叉,如图4.17所示。

图4.17 PNN 模型框架

左边 z 为 embedding 层的线性部分,右边为 embedding 层的特征交叉部分。这种 product 思想来源于,推荐系统中的特征之间的交叉关系更多是一种 and "且" 的关系,而非 add "加" 的关系。例如,性别为男且喜欢游戏的人群,比起性别男和喜欢游戏的人群,前者的组合比后者更能体现特征交叉的意义。根据 product 的方式不同,可以分为 inner product ( IPNN ) 和 outer product ( OPNN ),如图4.18所示。

图4.18 PNN 模型的两种不同交叉方式

其中,IPNN 模型每个特征是个 inner product,f 个 field 两两交叉,得到的新的特征组合有 f*(f-1)/2个;outer product 是两个向量的乘积,得到的新的特征组合有 f*(f-1)/2*k*k 个。

4.2.4 deepFM 模型

Google 的 wide&deep 框架固然强大,但由于 wide 部分是个 LR 模型,仍然需要人工特征工程。华为诺亚方舟团队结合 FM 相比 LR 的特征交叉的功能,在2017年提出了 deepFM,将 wide&deep 部分的 LR 部分替换成 FM 来避免人工特征工程,如图4.19所示。

图4.19 deepFM 模型框架

比起 wide&deep 的 LR 部分,deeFM 采用 FM 作为 wide 部分的输出,FM 部分如图4.20所示。

图4.20 deepFM 模型中的 FM 部分

除此之外,deepFM 还有如下特点:

❶ 更强的低阶特征表达

Wide 部分取代 WDL 的 LR,与4.2.1和4.2.2提到的 wide&deep 模型以及 deep crossing 模型相比更能捕捉低阶特征信息。

❷ Embedding 层共享

Wide&deep 部分的 embedding 层得需要针对 deep 部分单独设计;而在 deepFM 中,FM 和 DEEP 部分共享 embedding 层,FM 训练得到的参数既作为 wide 部分的输出,也作为 DNN 部分的输入。

❸ end-end 训练

Embedding 和网络权重联合训练,无需预训练和单独训练。

4.2.5 NFM 模型 ( Neural Factorization Machines )

DeepFM 在 embedding 层后把 FM 部分直接 concat 起来 ( f*k 维,f 个 field,每个 filed 是 k 维向量 ) 作为 DNN 的输入。Neural Factorization Machines,简称 NFM,提出了一种更加简单粗暴的方法,在 embedding 层后,做了一个叫做 Bi-interaction 的操作,让各个 field 做 element-wise 后 sum 起来去做特征交叉,MLP 的输入规模直接压缩到 k 维,和特征的原始维度 n 和特征 field 维度 f 没有任何关系,如图4.21所示。

图4.21 NFM 模型框架

这里论文只画出了其中的 deep 部分, wide 部分在这里省略没有画出来。Bi-interaction 所做的操作很简单:让 f 个 field 两两 element-wise 相乘后,得到 f*(f-1)/2 个维度为 k 的向量,然后直接 sum 起来,最后得到一个 k 维的向量。所以该层没有任何参数需要学习,同时也降低了网络复杂度,能够加速网络的训练;但同时这种方法也可能带来较大的信息损失。

4.2.6 AFM 模型 ( Attention Factorization Machines )

前面提到的各种网络结构中的 FM 在做特征交叉时,让不同特征的向量直接做交叉,基于的假设是各个特征交叉对结果的贡献度是一样的。这种假设往往不太合理,原因是不同特征对最终结果的贡献程度一般是不一样的。Attention Neural Factorization Machines,简称 AFM 模型,利用了近年来在图像、NLP、语音等领域大获成功的 attention 机制,在前面讲到的 NFM 基础上,引入了 attention 机制来解决这个问题,如图4.22所示。

图4.22 AFM 模型框架

AFM 的 embedding 层后和 NFM 一样,先让 f 个 field 的特征做了 element-wise product 后,得到 f*(f-1)/2 个交叉向量。和 NFM 直接把这些交叉项 sum 起来不同,AFM 引入了一个 Attention Net,认为这些交叉特征项每个对结果的贡献是不同的,例如 xi 和 xj的权重重要度,用 aij 来表示。从这个角度来看,其实 AFM 其实就是个加权累加的过程。Attention Net 部分的权重 aij 不是直接学习,而是通过如下公式表示:

这里 t 表示 attention net 中的隐层维度,k 和前面一样,为 embedding 层的维度。所以这里需要学习的参数有3个,W,b,h,参数个数共 t*k+2*t 个。得到 aij 权重后,对各个特征两两点积加权累加后,得到一个 k 维的向量,引入一个简单的参数向量 hT,维度为 k 进行学习,和 wide 部分一起得到最终的 AFM 输出。

图4.23 AFM 模型中 attention 的可视化解释

关于 AFM 还有个好处,通过 attention-base pooling 计算的 score 值 aij 体现的是特征 vi 和 vj 之间的权重,能够选择有用的二阶特征,如图4.23所示。

4.2.7 DCN 模型 ( Deep Cross Network )

前面提到的几种 FM-based 的方法都是做的二阶特征交叉,如 PNN 用 product 方式做二阶交叉,NFM 和 AFM 也都采用了 Bi-interaction 的方式学习特征的二阶交叉。对于更高阶的特征交叉,只有让 deep 去学习了。为解决这个问题,google 在2017年提出了 Deep&Cross Network,简称 DCN 的模型,可以任意组合特征,而且不增加网络参数。图4.24为 DCN 的结构。

图4.24 DCN 模型结构

整个网络分4部分组成:

❶ embedding and stacking layer

之所以不把 embedding 和 stacking 分开来看,是因为很多时候,embedding 和 stacking 过程是分不开的。前面讲到的各种 XX-based FM 网络结构,利用 FM 学到的 v 向量可以很好的作为 embedding。而在很多实际的业务结构,可能已经有了提取到的 embedding 特征信息,例如图像的特征 embedding,text 的特征 embedding,item 的 embedding 等,还有其他连续值信息,例如年龄,收入水平等,这些 embedding 向量 stack 在一起后,一起作为后续网络结构的输入。当然,这部分也可以用前面讲到的 FM 来做 embedding。为了和原始论文保持一致,这里我们假设 x0 向量维度为 d ( 上文的网络结构中为 k ),这一层的做法就是简答的把各种 embedding 向量 concat 起来。

❷ deep layer network

在 embedding and stacking layer 之后,网络分成了两路,一路是传统的 DNN 结构。表示如下:

为简化理解,假设每一层网络的参数有 m 个,一共有 Ld 层,输入层由于和上一层连接,有 d*m 个参数 ( d 为 x0 向量维度 ),后续的 Ld-1 层,每层需要 m*(m+1) 个参数,所以一共需要学习的参数有 d*m+m*(m+1)*(Ld-1)。最后的输出也是个 m 维向量。

❸ cross layer network

Embedding and stacking layer 输入后的另一路就是 DCN 的重点工作了。每一层 l+1 和前一层l的关系可以用如下关系表示:

可以看到 f 是待拟合的函数,xl 即为上一层的网络输入。需要学习的参数为 wl 和 bl,因为 xl维度为 d,当前层网络输入 xl+1 也为 d 维,待学习的参数 wl 和 bl 也都是 d 维向量。因此,每一层都有 2*d 的参数 ( w 和 b ) 需要学习,网络结构如下。

图4.25 DCN 模型的 cross 原理

经过 Lc 层的 cross layer network 后,在该 layer 最后一层 Lc 层的输出为 Lc2 的 d 维向量。

❹ combination output layer

经过 cross network 的输出 XL1 ( d 维 ) 和 deep network 之后的向量输入 ( m 维 ) 直接做 concat,变为一个 d+m 的向量,最后套一个 LR 模型,需要学习参数为 1+d+m。

总结起来,DCN 引入的 cross network 理论上可以表达任意高阶组合,同时每一层保留低阶组合,参数的向量化也控制了模型的复杂度。Cross 网络部分的交叉学习的是特征向量中每一个 element 的交叉,本质上是 bit-wise 的。

4.2.8 xDeepFM 模型 ( extreme Deep Factor Machine )

xDeepFM 模型从名字上听好像是 deepFM 模型的升级,但其实更应该拿来和 DCN 模型做对比。DCN 模型引入了高阶特征交叉,但是特征的交叉本质上是在 bit-wise 的。而 xDeepFM 模型认为特征向量 i 和特征向量 j 的交叉过程中,i 本身的元素交叉没有意义,提取 i 和 j 的向量交叉才是更有效捕捉特征的方式,也就是 vector-wise 的交叉,整个模型的框架如图4.26所示,最核心的模块在于特征交叉的 CIN 模块。

图4.26 xDeepFM 模型结构

首先我们来看下整个 CIN 的整体框架图,如图4.27所示,假设特征 field 个数是 m,每个 field 的隐层维度为 d,那么原始 embedding 层的大小为 m*d,而 cross network 有 Hk层,提取的是特征的交叉。每一层网络在做什么事情呢?就是和第一层 x0 做特征交叉得到新的特征向量后,然后这 Hk 层 cross net 得到的特征向量 concat 到一起,作为 MLP 的输入。那么,这里面,每一层的特征 xk 到底是如何输入层 x0 发生交互的?

图4.27 CIN 模块结构

以 cross net 的第 k 层和原始输入 x0 为例,我们看下如何提取得到新的特征,图4.28是其特征交叉的过程。其中 xk 的维度为 Hk*D,表示的是第 k 层有 Hk 个 vector,而原始输入 x0的维度为 m*D,表示输入层有 m 个 D 维的 vector。

图4.28 CIN 模块中特征交叉过程

这里 Wk,h 表示的是第 k 层的第 h 个 vector 的权重,是模型需要学习的参数。整个公式的理解是整个 xDeepFM 理解的关键,我们具体看下发生了什么:

❶ 首先,从前一层的输入 Xk-1 ( 一共有 Hk-1 个 vector ),取出任意一个 vector;从原始输入 x0 ( 一共有 m 个 vector ),取出任意一个 vector,两者两两做哈达码积,可以得到 Hk-1*m 个 vector。

❷ 这 Hk-1*m 个交叉得到的 vector,每个 vector 维度都是 D,我们通过一个 W 矩阵做乘积进行加权求和,相当于是个带权重的 pooling,最终得到加权求和后的 vector Xh,k,表示的是第 h 层第 k 个 vector。这里的 W 矩阵就是模型要学习的。

❸ 为什么说是压缩,压缩体现在哪里?还是用图说话,这里我们看下原始论文给出的图示,有助于整个过程的理解。

图4.29 CIN 模块具体结构

在图4.29左图中,我们把 D 看成是原始二维平面的宽度,我们沿着 D 的方向挨个进行计算。先看 xk 向量中 D 的第一维,有 Hk 个数;x0 向量中 D 的第一维,有 m 个数,让 Hk 和 m 两两计算,就可以得到 Hk*m 的一个平面。一直沿着 D 方向,2,3,4,…D,我们就可以得到一个 Hk*m*D 的三维矩阵,暂且叫做 zk+1,注意这个过程只是简单的矩阵计算,没有参数需要学习。

在4.29右边的图中,我们开始提取前面 zk+1 的信息,还是以 D 方向的第一维为例,一个 m*Hk 的平面,乘以一个大小一样的 m*Hk 矩阵 W,然后加权求和,就可以得到这个平面最后压缩的一个实数。整个平面被 "压缩" 成为了一个一维的数。一直沿着 D 方向求解每个平面压缩后的数,就可以得到一个 D 维的向量。

这就是整个 "压缩" 的取名原因。整个过程非常类似 CNN 的 filter 卷积思想,W 就是卷积核,得到的每个特征映射的值就是 feature map。

4.2.9 FGCNN 模型 ( Feature Generate by CNN )

CNN 模型在图像,语音,NLP 领域都是非常重要的特征提取器,原因是对图像、视频、语言来说,存在着很强的 local connection 信息。而在推荐系统中由于特征输入都是稀疏无序的,很难直接利用 CNN 作为特征提取。华为诺亚方舟在2019年的 WWW 会议上提出了一种巧妙的利用 CNN 提取特征的方法 FGCNN,整个模型框架如图4.30所示。

图4.30 FGCNN 模型框架

其中利用 CNN 提取新特征是整个 paper 的核心模块,具体框架如图4.31所示,可以分为4个层,卷积层、池化层、重组层以及特征输出层。下面分别介绍这4个不同的层,分别看下各自的输入,输出以及具体的网络结构。

图4.31 CNN 模块从原始特征提取新特征

❶ 卷积层 Convolution Layer

图4.32 卷积层的特征卷积过程

原始 one-hot 特征经过 embedding 后,进入的是卷积层。卷积的思想和 TextCNN 类似,通过一个高度为 hp,宽度为 d 的卷积核进行卷积;其中高度 hp 代表的是每次卷积连接的邻域的个数,以图4.32为例,hp=2,表示二维特征的交叉,从上到下卷积,表示的是 N&A,A&H,H&G 卷积,分别表示名字和年龄、年龄和身高、身高和性别的交叉;而宽度方向 d 需要和 embedding 的维度 d 保持一致,这和 TextCNN 的思想是一致的,只在高度方向上进行卷积。

① Convolutional layer 输入

特征 one-hot 之后经过 embedding 层后的输出作为卷积层的输入,输入维度为 nf*k。nf为 field 个数,k 为隐层维度

② Convolutional layer 输出

经过二维平面大小不变,增加第三维卷积核大小,第一层卷积层的输出大小为 nf*k*mc1,C1为第1个卷积层的卷积个数,以 l=1 为例,C:,:,i 表示的是第一层卷积层第 i 个 feature-map,每个 feature map 的大小为 nf*k,Cp,q,i 表示的是第一层第 i 个 feature map 的坐标为 (p,q) 的元素:

❷ 池化层 Pooling Layer

特征经过第一层卷积层之后,从 nf*k 变成了 nf*k*mc1,维度反而扩了 mc1 倍,这和预期的特征降维不一致,解决办法和 CNN 里常用的套路一样,通过 pooling 做降维。该 paper 使用的是 max pooling,在原先卷积高度 hp 上选择最大值作为卷积后的特征表达,表达如下所示:

① pooling 层输入

卷积层的输出作为池化层的输出,以第一层为例,pooling 层的输入维度为 nf*k*mc1。

② pooling 层输出

卷积层输出的时候在高度方向上选择 max,只有高度方向维度发生变化,卷积输出后维度为nf/hp * k *mc1,hp 为卷积核高度,相当于沿着 field 的方向压缩了 hp 倍。

❸ 重组层 Recombination Layer

经过特征卷积层和特征池化层后,可以通过特征重组 Recombination layer 生成新的特征组了。还是以第一层的 Recombination layer 为例,mc1 为原始 feature map 的个数,mr1为新生成的特征 feature map 的个数:

其中 S1 为池化层的输出,而 WR1 和 BR1 为该层待学习的参数。

① Recombination 层输入

卷积层的输出 S1 为该层的输入,通过 WR1 的矩阵进行特征的 recombination

② Recombination 层输出

新生成的特征维度为 nf/hp*k*mr1

❹ 特征输出层 Concatenation Layer

第一层 Convolution layer -> pooling layer -> recombination layer 后,生成第一层的新特征 R1,连同第2,3,4,…,nc 层的新特征 R2,R3,R4,…,Rnc 层一起 concat 起来,组成新的特征 R=(R1,R2,…,Rnc)。之后 R 可以和原始特征一样做各种可能的交叉,例如和原始特征做二阶交叉等,再一起输入到模型层。

图4.33 FGCNN 新特征的生成

① concatenation 层输入

重组层 Recombination layer 输出的新特征 R1,R2,R3, Rnc,作为 concatenation layer 的输入

② concatenation 层输出

原有的特征E和新特征 R 连在一起作为 concatenation 的特征输出,作为 NN 层的输入

4.2.10 FiBiNet 模型 ( Feature Importance & Bilinear feature Interaction )

新浪微博张俊林团队2019年提出的结合特征重要性 ( Fi ) 和双线性特征交叉 ( Bi ) 的方法,Feature Importance & Bilinear feature Interaction,简称 FiBiNet,其实是两个相对独立的模块,两个模块可以独立套用在其他的网络结构上,整体框架如图4.34所示。

图4.34 FiBiNet 模型框架

❶ SENet:特征重要性提取层

该层作用主要是提取特征重要性。可以分为三层 Squeeze, Extract, Reweight,从原始的特征 e1,e2,e3,…,e提取到新的特征 v1,v2,v3,…, vf,其中 f 为特征 field 的个数,整体框架如下:

图4.35 SENet 框架

① Squeeze 层

特征压缩层,对每个特征组中的 embedding 向量进行汇总统计量的 pooling 操作,每个 field 的维度为 k,从中 squeeze 压缩提取最重要的1维。典型的方法一般有 Max pooling 或者 average pooling,在更原始的 SENet 里用的是 max pooling,但是在该 paper 里作者提到 average pooling 表现更好,个人其实也倾向于认为 average pooling 直觉上更加 make sense,只用 max pooling 从 d 维特征提取一维信息损失实在太大。当然具体表现也需要结合具体数据实验才知道:

经过 S 层,第 i 维特征从 ei 变成了 zi,从维度为 d 的向量变成了一个维度为1的实数。整个输入从 f*d 的矩阵变为 f 维的向量。

② Excitation 层

特征激活层,向量先做压缩 r ( r 为压缩的倍数 ),然后扩展恢复,类似 auto-encoder 思路:

W1 和 W2 为两个转换矩阵,先经过压缩然后恢复,最终得到的 A 还是一个维度为 f 的向量。

③ Reweight 层

经过前面 Squeeze 和 Excitation 得到的 A 相当于是原始特征 E 的权重向量,乘以原始的特征 E 后,可以得到最终加权提取的 V 向量,可以认为是原始特征的重要性表达:

总结来说:SENet,用两层全连接阶层提取每个 field 的特征重要性:

S 层:压缩提取 field 中最重要的特征 ( max 或者 average 特征 )

E 层:对 s 层提取的特征信息进行 auto-encoder 式的信息提取

R 层:SE 提取到的每个 field 特征重要性,进行加权提取

❷ Bilinear 特征交叉层

从 SENet 提取到的新特征 V,还有原始特征 E,可以组合成为新的特征一起输入到模型的 MLP 网络中。但是如前面提到的 MLP 对特征交叉很弱的学习能力一样,本文一样提出了一些做特征交叉的方法。我们回顾下在前面提到的两个向量的交叉,无非是向量内积,得到一个实数;或者是向量的哈达马积分如图4.36的 a 所示,得到的还是一个向量,如图中4.36的 b 方法所示。这两种方法都是直接计算的,没有新的参数学习。在该 paper 中,作者提出了另一种引入参数的方法,也就是 Bilinear 双线性特征交叉的方法,如图中4.36的 c 方法所示:

图4.36 不同特征交叉方法

假设特征 field 的个数是 f 个,每个 field 的隐层维度为 d。那么,如何确定需要学习的参数 W 呢?根据 W 的共享情况,可以分为以下三种类型:

① field type

W 在所有特征之间是完全共享的,也就是说在任意两个需要交叉的特征 i 和特征 j 之间 ( vi,vj ) 共享一个 W,W 的参数维度为 k*k:

② field each

对于每个特征 i 来说,都需要学习唯一的一个 Wi 矩阵,该 Wi 只和左乘的特征 vi 有关,和右乘特征 vj 无关,一共有 f 个 field,所以 W 的参数维度为 f*k*k:

③ field-interaction type

对于任意两个需要交叉的特征 vi 和 vj,都需要学习一个唯一的矩阵 Wij,Wij不仅和左乘的特征有关,也和右乘的特征有关,也就是说,vi 和 vj 的交叉,以及 vj 和 vi 的特征交叉,两者用到的 Wij 和 Wji 是不一样的,所以 W 的参数维度为 f*f*k*k:

当然,以上三种不同的特征类型没有绝对的谁好谁坏,不存在越复杂效果越好的情况,对于简单的数据集,可能 w 共享是最好的,具体还是需要实验才能知道。在文章里用了 criteio 和 avazu 数据集进行实验时,使用不同的模型,三种交叉方法也是各有千秋。

总结本文的两个核心工作,第一个工作,SENet,目的是从一个 f*d 的特征向量中,提取得到表达了特征重要性的同样维度为 f*d 的新特征向量,该网络结构可以和其他模型结构套用。第二个工作 bi-net,从输入的 embedding 特征中提出了几种不同的特征交叉的方法,也可以给其他网络模型做特征交叉提供一些不同的手段。

4.2.11 AutoInt 模型 ( Auto Feature Interaction )

目前为止讲到的模型中,使用到 attention 的是 AFM 模型,而在 AutoInt 文章中,作者除了 attention 机制,还使用了在 transform 中很火的 multi-head 和 self-attention 的概念,整体框架如图4.37所示。

图4.37 AutoInt 模型框架

文章中的输入没有什么特别需要讲的,就是常规的 one-hot 稀疏的特征经过 embedding 层得到 dense value。这里 embedding 层倒是值得一提,一般在大多数推荐系统里,对于 one-hot 做 embedding 是因为需要转成 dense 的特征,而原本就是 dense 的特征原本就是定长 dense 特征,比较少见到做 embedding 的,而在该文章中将连续值特征和 one-hot 一样去做 embedding 处理。不过这一块不影响 auto-int 部分的理解。

图4.38 embedding 层输入

该 paper 里提到的 attention 机制,才是文章里的核心亮点,在介绍文章的核心机制之前,先在这里简单介绍下 NLP 里的 attention 里涉及到的3个重要的概念,query,keys,value。想象一下,你在搜索引擎输入了一个搜索词,这个搜索词就是 query,假设你搜了 "应用宝",然后存在一堆候选结果就叫做 keys,例如 "下载 app 的地方","手机应用市场","app store","手机系统" 等等,对这里的每个 key,都去计算和候选词 query 的相似度,例如 "手机应用市场" 对 "应用宝" 的权重,显然是要高于 "手机系统",最终的表达,其实就是每个 keys 的 value 的加权求和,也就是说,谁和 query 的相似度高,在结果中 value 的权重占比就更高。经典的 QKV 结果表达如下:

回到本文的 attention 机制中,假设特征 field 个数为 M,对于第 m 个 field,在第 h 个 head 空间下的特征表达如下:

图4.39 特征 m 在空间 h下的 QKV 结构

❶ 特征 m 在空间 h 下的新映射

每个特征 m,在空间 h 下都有3组向量表示,分表代表特征 m 在空间 h 下的 query 向量 Equery、key 向量 Ekey、value 向量 Evalue:

这里需要学习的参数为 WQuery,Wkey,Wvalue,每个矩阵的维度为 d'*d,从而将特征从 d 维映射为 d'。W 在所有特征中都是共享的,并不是每组特征都需要学习3个 W。

❷ 特征 k 对特征 m 相似度表达,使用向量的点积:

❸ 特征 k 对特征 m 的归一化注意力 ( M 个特征做归一化 )

❹ 特征 m 在空间 h 下的加权新特征:

❺ 特征 m 的全空间表达:

有 H 个 head,特征 m 最终的表达为 H 个新特征的 concat,特征长度为 H*d'。

❻ 特征 m 最终表达:resnet 保留原始信息

作者为了保留更多信息,除了第5步得到的 multi-head 的新特征,也将原始的特征 em 引入到进来,其实就是一种 resnet 思路,所以在这里需要有个额外的参数 WRes 需要学习,需要将原始的特征维度 d 映射为和 em 一致的 H*d',所以 WRes 的参数维度为 d'*H*d。

4.2.12 DIN 模型 ( Deep Interest Network )

4.2.11提到的 AutoInt 里特征的 attention 机制有个特点,就是在计算特征的重要性的时候,所有特征都有机会成为 query, 将其他特征作为 keys 去计算和当前 query 的重要性从而得到权重的。而提到推荐系统里的 attention 机制,不得不提的就是阿里的这篇 deep interest network 了,简称 DIN。工业界的做法不像学术界,很多模型网络结构优化并不一味的追求模型的复杂和网络结构有多 fancy,每一步背后都有大量的业务思考后沉淀下来的。

阿里这篇 DIN 也如此。在了解 DIN 之前,我们先看下 DIN 前身的模型,GwEN 模型 ( Group-wise Embedding Network,阿里内部称呼 )。

图4.40 GwEN 模型结构 ( DIN 的 baseline )

前面讲到的很多模型,输入层都是大规模稀疏特征,经过 embedding 层后输入到 MLP 网络中。这里的一个假设就是,每个 field 都是 one-hot 的,如果不是 one-hot 而是 multi-hot,那么就用 pooling 的方式,如 sum pooling,average pooling,max pooling 等,这样才能保证每个特征 field embedding 都是定长的。DIN 的前身 GwEN 模型也一样,对于 multi-hot 特征的典型代表,用户历史行为,比如用户在电商系统里购买过的商品,往往都是几十几百甚至几千的,需要经过 sum pooling 和其他特征 concat 一起。

而这种数学假设其实往往都是和实际的发生场景不一致的。例如一个女性用户过去在淘宝买过白色针织衫、连衣裙、帽子、高跟鞋、单肩包、洗漱用品等,当前候选商品是一件黑色外套,白色针织衫对黑色外套的权重影响应该更大,洗漱用品权重应该更小。如果将这些历史行为过的商品做 sum pooling,那么无论对于当前推荐什么商品,用户都是一个固定向量的表达,信息损失很大,显然优化空间很大。

图4.41 DIN 模型框架

针对 sum/average pooling 的缺点,DIN 提出了一种 local activation 的思想,基于一种基本的假设:用户历史不同的行为,对当前不同的商品权重是不一样的。例如用户过去有 a,b,c 三个行为,如果当前商品是 d,那么 a,b,c 的权重可能是 0.8,0.2,0.2;如果是商品 e,那么 a,b,c 的权重可能变成了0.4,0.8,0.1。也就是说,不同的 query,激发用户历史行为不同的 keys 的权重是不一样的。

① query:用户历史行为,长度为 H,e1,e2,…,e表示用户历史行为的向量表示。

② keys:当前候选广告 ( 店铺、类目、或者其他 item 实体 )

关于 DIN 里的 activation weight 还有个可以稍微讲几句的点。两个向量的相似度,在前面讲各种 CF 的方法的时候基本是用的点积或者 cosine,2017年 DIN 挂在 arXiv 的版本中是使用了两个向量本身以及 concat 后进入 MLP 得到其相似度,2018发在 KDD 的版本中多了 outer product,以及向量相减,相当于引入和保留了更多特征的信息。另外作者在文章提到为了保持不同历史行为对当前 attention 的影响,权重也不做归一化,这个和原始的 attention 也有所不同。

图4.42 DIN 模型中的 Attention Unit

作为工业界的落地实践,阿里在 DIN 上很 "克制" 的只用了最能表达用户个性化需求的特征--用户行为 keys,而 query 也是当前候选的商品广告,与线上提升 ctr 的指标更为吻合,对工业界的推荐系统来说借鉴意义还是很大的。当然这不是说之前的其他 attention 机制模型没用,不同的数据集,不同的落地场景需求不一致,也给工业界更多的尝试提供了很多思路的借鉴。

4.2.13 DIEN 模型 ( Deep Interest Evolution Network )

在前面讲到的模型中,所使用的特征都是时间无序的,DIN 也如此,用户的行为特征之间并没有先后顺序,强调的是用户兴趣的多样性。但是实际用户的兴趣应该是在不断进化的,用户越近期的行为,对于预测后续的行为越重要,而用户越早期的行为,对于预测后续行为的权重影响应该小一点。因此,为了捕获用户行为兴趣随时间如何发展变化,在din提出一年后,阿里又进一步提出了 DIEN,引入了时间序列概念,深度兴趣进化网络。

DIEN 文章里提到,在以往的推荐模型中存在的序列模型中,主要利用 RNN 来捕获用户行为序列也就是用户历史行为数据中的依赖关系,比对用户行为序列直接做 pooling 要好。但是以往这些模型有两个缺点,第一是直接将 RNN 的隐层作为兴趣表达,而一般来隐层的表达和真正表达的商品 embedding 一般不是等价的,并不能直接反映用户的兴趣;另外一点,RNN 将用户历史行为的每个行为看成等权的一般来说也不合理。整个 DIEN 的整体框架,如图4.43所示。

图4.43 DIEN 模型框架

❶ 输入层

和 DIN 的输入一样。按照类型可以分为4大类

① 用户画像特征:如年龄、性别、职业等

② context 特征:如网络环境、时间、IP 地址、手机型号等,与 user 以及 item 无关

③ target ad 特征:当前候选广告

④ 用户行为特征:DIEN 里最重要的能体现用户个性化的特征,对于每个用户来说,假设有 T 个历史行为,按照发生的先后顺序依次输入模型

❷ embedding 层

将 one-hot 特征转为 dense 的 embedding 向量

❸ 兴趣抽取层 ( interest extractor layer )

该层的主要作用和 DIN 一样,为了从 embedding 层中抽取出用户的兴趣。该 paper 认为用户当前对候选广告是否感兴趣,是和历史行为 behavior 有关的,所以引入了 GRU 的序列模型来拟合抽取用户兴趣。

经过 GRU 结构后,商品的 embedding 表达从 e(t) 变成了 h(t),表示第 t 个行为序列的 embedding 表达。

图4.44 DIEN 中的辅助 loss 结构

除了 GRU 结构提取隐层的向量,DIEN 还引入了有监督学习,强行让原始的行为向量 e(t) 和 h(t) 产生交互。如图4.44所示,引入了辅助 loss(auxiliary loss),当前时刻 h(t) 作为输入,下一刻的输入 e(t+1) 认为是正样本 (click),负样本进行负采样 ( 不等于当前时刻 );然后让 h(t) 与正负样本分别做向量内积,辅助 loss 定义为:

最终的 loss 表达为:

其中 a 为超参数,代表的是辅助 loss 对整体 loss 的贡献。有了这个辅助 loss,t 时刻提取的隐层向量 h(t) 可以比原始的 h(t) 更有助于表达用户兴趣,也可以加速网络的训练过程。

❹ 兴趣进化层 ( interest evolving layer )

理论上来说,h(t) 如果替代 e(t) 作为商品的最终表达其实也是可以的,把用户序列 t=1,2,3,…,T 当成用户的 T 个行为过的商品,然后和当前的候选广告套用 DIN 的 attention 网络去计算每个行为和当前候选广告的权重,最终得到用户的历史行为加权表达也是完全 ok 的。但作者认为用户的行为模式是会发展的,因此引入了第二层 GRU 网络来学习每个历史行为序列和当前候选广告之间的权重。

对于每个历史行为 ht,当前候选广告 ea,通过 softmax 求出两者的权重。注意这里不是直接向量点击,而是引入了矩阵 W,可以认为是简单的一层全连接网络。

如何使用这里学习的 attention 作为兴趣进化层的输入,作者又提出了三种计算方法:

❶ AIGRU ( attention input with GRU )

最基础的版本,兴趣进化层第 t 个行为序列的 input 就是隐层 ht 的加权:

作者尝试后发现效果并不好,原因是如果是输入0,也会参与到隐层 ht 的计算和更新,相当于给用户兴趣的提取引入了噪音,不相关的用户行为会干扰模型的学习。

❷ AGRU ( attention base GRU )

这里作者使用了 attention 权重 at 来取代原始 GRU 中的更新门,表达如下:

❸ AUGRU ( GRU with attentional update gate )

这里作者依然对原始 GRU 做了改造,公式如下:

图4.45 AUGRU 结构

其中,ut' 引入了 at 来取代原有的更新向量 ut,表达的是当前 ut' 对结果的影响。如果当前权重 at 较大,ut' 也较大,当前时刻 ht' 保留更多,上一个时刻 ht-1 影响也会少一点。从而整个 AUGRU 结果可以更平滑的学习用户兴趣。

4.3 Feature-based 模型总结

Feature-based 的模型主要在于学习特征之间的交叉,是近年来整个推荐系统在排序层面的主流研究方向,按照不同维度,我个人把4.2列到的模型分为4个类型,同一个模型可能会分到不同的类型里。这里的分类仅仅代表个人的观点,欢迎探讨。

4.3.1 基于框架的模型

① wide&deep 模型

深度加宽度的模型范式,本身并不是一个具体的模型,wide 和 deep 部分可以用任意结构框架,wide 的 baseline 是 LR 模型;deep 的 baseline 是 MLP 模型。

② deep crossing 模型

和 wide&deep 最大的不同是 deep 部分引用了 res-net,但个人觉得在目前主流的模型里用的较少。虽然 res-net 理论上可以使用更深的模型提升效果,但在目前工业界大规模稀疏的推荐系统里,还没见到太多往 res-net 方向取得较大进展的工作。

4.3.2 基于 FM 特征二阶组合的模型

学习特征交叉的主要手段是将特征的 embedding 做交叉,特点是特征的交叉是二维的,无非是二阶交叉如何做。

① deepFM 模型

特征交叉使用的 element-wise product,最终得到的是一个实数。

② NFM 模型

交叉使用的 bi-interaction,可以理解成是所有 vector 的 sum pooling,最终得到的是一个向量。

③ AFM 模型

交叉使用的带权重的 bi-interaction,可以理解成所有 vector 的 weight sum pooling,然后使用一个简单的线性模型得到最终的值。

④ PNN 模型

PNN 模型放到基于 FM 的模型是因为本质上和 FM 一样,都是在学习特征的二阶组合。和 deepFM 不同的是,以 IPNN 为例,PNN 的所有特征两两 product 交叉学习得到的值 conat 后得到现实的 product vector 后进入 MLP 模型;而 deepFM 是直接将 FM 模型的 vector 输入到 MLP 模型中。

4.3.3 基于 attention 的模型

① AutoInt 模型

使用 multi head 机制,每个特征用 self-attention 得到其他特征和自己的 attention 权重。每个特征的所有 head 得到的特征 concat 起来作为新特征。

② DIN 模型

只使用户历史行为特征作为 keys,keys 之前没有时间序列;得到 keys 和当前候选 item 的 attention。

③ DIEN 模型

只使用用户历史行为特征作为 keys,keys 之间具有先后顺序,引入两层 GRU 表达,第一层 GRU 学习用户历史行为序列的信息,每个时刻 t 输出的隐层 embedding 为该时刻 item 的 embedding 表达;第二层 GRU 用来学习历史每个时刻 t 的历史行为和当前候选广告的权重。

④ FiBiNet 模型

把 FiBiNet 模型放在 attention 模型主要是它的 SENet 部分,通过 squeeze -> Excitation -> reweight 提取原始 embedding 的特征重要性,得到新特征,这里其实也体现了每个特征 embedding 的 attention。

4.3.4 基于特征高阶组合的模型

① DCN 模型

使用多层的 cross 来做特征交叉,对于 cross 网络中每一层的输入都由前一层以及第一层的输入组成,从这个维度上代表的是高阶特征的组合。比如说,第四层网络的输出包含了第三层和第二层的输入;而第三层又包含了第二层和第一层,因此这里就是个3阶的特征交叉。特征的交叉使用的是 bit-wise,也就是每个特征内部 embedding 的 element 也会两两交叉。

② xDeepFM 模型

使用 CIN 模型来提取特征交叉。和 DCN 模型一样的是,这里也使用了多层的 cross,每一层的输入也是由第一层和上一层的输入组成,不同的是,xdeepFM 模型的特征交叉是 vector wise 层级的,而 DCN 模型是 bit-wise 的。

③ FGCNN 模型

通过使用 CNN 模块,先是卷积层提取局部特征的连接,如高度等于3能够提取相邻3个 field 的特征的关系,因此具有高阶特征的交叉能力。然后又通过池化层提取 global 信息,确保特征的输入顺序对结果的影响能够被捕捉到。

05

总结

推荐和搜索的本质其实都是匹配,前者匹配用户和物品;后者匹配 query 和 doc。具体到匹配方法,分为传统模型和深度模型两大类,第二章讲的是传统模型,第三章和第四章讲的是深度模型。

对于传统模型,主要分为基于协同过滤的模型和基于特征的模型,两者最大的不同在于是否使用了 side information。基于协同过滤的模型,如 CF,MF,FISM,SVD++,只用到了用户-物品的交互信息,如 userid, itemid, 以及用户交互过的 item 集合本身来表达。而基于特征的模型以 FM 为例,主要特点是除了用户-物品的交互之外,还引入了更多的 side information。FM 模型是很多其他模型的特例,如 MF,SVD++,FISM 等。

对于深度模型,主要分为基于 representation learning 的深度模型以及 match function learning 的深度模型。基于 representation learning 的深度模型学习的是用户和物品的表示,然后通过匹配函数来计算,这里重点在与 representation learning 阶段,可以通过 CNN 网络,auto-encoder,知识图谱等模型结构来学习。

对于 match function learning 的深度模型,也分为基于协同过滤的模型和基于特征的模型。前者和传统 CF 模型一样,不同在于后面接入了 MLP 模型来增强非线性表达,目的是为了使得 user 和 item 的 vector 尽可能接近,这种方法就是基于 NCF 的模型;也有通过引入 relation vector 来是的 user vector 加上 relation vector 后接近 item vector,这种方法是基于翻译的模型。

对于 match function learning 另一种模型框架,是基于特征层面的,有基于 fm 模型的,基于 attention 的,以及高阶特征捕捉的,另外还有基于时间序列的文章中只提到了 DIEN 模型。

整理本篇综述主要基于原始 slides,对其中的 paper 部分粗读部分精读,收获颇多,在全文用如何做好推荐 match 的思路,将各种方法尽可能串到一起,主要体现背后一致的思想指导。多有错漏,欢迎批评指出。

06

参考资料

1. https://www.comp.nus.edu.sg/~xiangnan/sigir18-deep.pdf

2. Xiangnan He, Hanwang Zhang, Min-Yen Kan, and Tat-Seng Chua. Fast matrix factorization for online recommendation with implicit feedback. In SIGIR 2016.

3. Yehuda Koren, and Robert Bell. Advances in collaborative filtering. Recommender systems handbook. Springer, Boston, MA, 2015. 77-118.

4. Santosh Kabbur, Xia Ning, and George Karypis. Fism: factored item similarity models for top-n recommender systems. In KDD 2013.

5. Yehuda Koren. Factorization meets the neighborhood: a multifaceted collaborative filtering model. In KDD 2018.

6. Steffen Rendle. Factorization machines. In ICDM 2010.

7. Hong-Jian Xue, Xin-Yu Dai, Jianbing Zhang, Shujian Huang, and Jiajun Chen. Deep matrix factorization models for recommender systems. IJCAI 2017.

8. Suvash Sedhain, Aditya Krishna Menon, Scott Sanner, and Lexing Xie. Autorec: Autoencoders meet collaborative filtering. In WWW 2015.

9. Yao Wu, Christopher DuBois, Alice X. Zheng, and Martin Ester. Collaborative denoising auto- encoders for top-n recommender systems. In WSDM 2016.

10. Sheng Li, Jaya Kawale, and Yun Fu. Deep collaborative filtering via marginalized denoising auto- encoder. In CIKM 2015.

11. Xue Geng, Hanwang Zhang, Jingwen Bian, and Tat-Seng Chua. Learning image and user features for recommendation in social networks. In ICCV 2015.

12. Jingyuan Chen, Hanwang Zhang, Xiangnan He, Liqiang Nie, Wei Liu, and Tat-Seng Chua. Attentive collaborative filtering: Multimedia recommendation with item-and component-level attention. In SIGIR 2017.

13. Fuzheng, Zhang, Nicholas Jing Yuan, Defu Lian, Xing Xie, and Wei-Ying Ma. Collaborative knowledge base embedding for recommender systems. In KDD 2016.

14. Xiangnan He, Lizi Liao, Hanwang Zhang, Liqiang Nie, Xia Hu, and Tat-Seng Chua. Neural collaborative filtering. In WWW 2017.

15. Ting Bai, Ji-Rong Wen, Jun Zhang, and Wayne Xin Zhao. A Neural Collaborative Filtering Model with Interaction-based Neighborhood. CIKM 2017.

16. Xiangnan He, Xiaoyu Du, Xiang Wang, Feng Tian, Jinhui Tang, and Tat-Seng Chua. Out Product-based Neural Collaborative Filtering. In IJCAI 2018.

17. Tay, Yi, Shuai Zhang, Luu Anh Tuan, and Siu Cheung Hui. "Self-Attentive Neural Collaborative Filtering." arXiv preprint arXiv:1806.06446 (2018).

18. Ruining He, Wang-Cheng Kang, and Julian McAuley. Translation-based Recommendation. In Recsys 2017.

19. Yi Tay, Luu Anh Tuan, and Siu Cheung Hui. Latent Relational Metric Learning via Memory-based Attention for Collaborative Ranking. In WWW 2018.

20. Heng-Tze Cheng, Levent Koc, Jeremiah Harmsen, Tal Shaked, Tushar Chandra, Hrishi Aradhye, Glen Anderson et al. Wide & deep learning for recommender systems. In DLRS 2016.

21. Ying Shan, T. Ryan Hoens, Jian Jiao, Haijing Wang, Dong Yu, and J. C. Mao. Deep crossing: Web-scale modeling without manually crafted combinatorial features. In KDD 2016.

22. Xiangnan He, and Tat-Seng Chua. Neural factorization machines for sparse predictive analytics. In SIGIR 2017.

23. Jun Xiao, Hao Ye, Xiangnan He, Hanwang Zhang, Fei Wu, and Tat-Seng Chua. Attentional factorization machines: Learning the weight of feature interactions via attention networks. IJCAI 2017.

24. He. Deepfm: A factorization-machine based neural network for CTR prediction. IJCAI 2017.

25. Ruoxi Wang, Gang Fu, Bin Fu, Mingliang Wang. Deep & Cross Network for Ad Click Predictions. ADKDD2017.

26. Jianxun Lian, Xiaohuan Zhou, Fuzheng Zhang, Zhongxia Chen, Xing Xie, Guangzhong Sun. xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems. KDD2018.

27. Bin Liu, Ruiming Tang, Yingzhi Chen, Jinkai Yu,Huifeng Guo, Yuzhou Zhang. Feature Generation by Convolutional Neural Network for Click-Through Rate Prediction. WWW2019.

28. Tongwen Huang, Zhiqi Zhang, Julin Zhang. FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction. Recsys2019.

29. Weiping Song, Chence Shi, Zhiping Xiao, Zhijian Duan, Yewen Xu, Ming Zhang,Jian Tang. AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks. CIKM2019.

30. Guorui Zhou, Xiaoqiang Zhu, Chengru Song, Ying Fan, Han Zhu, Xiao Ma,Yanghui Yan,Junqi Jin,Han Li, Kun Gai. Deep Interest Network for Click-Through Rate Prediction. KDD2018.

31. Guorui Zhou, Na Mou, Ying Fan, Qi Pi,Weijie Bian, Chang Zhou, Xiaoqiang Zhu and Kungai. Deep Interest Evolution Network for Click-Through Rate Prediction. AAAI2019.

原文链接:

https://zhuanlan.zhihu.com/p/101136699

and Tat-Seng Chua. Neural factorization machines for sparse predictive analytics. In SIGIR 2017.

23. Jun Xiao, Hao Ye, Xiangnan He, Hanwang Zhang, Fei Wu, and Tat-Seng Chua. Attentional factorization machines: Learning the weight of feature interactions via attention networks. IJCAI 2017.

24. He. Deepfm: A factorization-machine based neural network for CTR prediction. IJCAI 2017.

25. Ruoxi Wang, Gang Fu, Bin Fu, Mingliang Wang. Deep & Cross Network for Ad Click Predictions. ADKDD2017.

26. Jianxun Lian, Xiaohuan Zhou, Fuzheng Zhang, Zhongxia Chen, Xing Xie, Guangzhong Sun. xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems. KDD2018.

27. Bin Liu, Ruiming Tang, Yingzhi Chen, Jinkai Yu,Huifeng Guo, Yuzhou Zhang. Feature Generation by Convolutional Neural Network for Click-Through Rate Prediction. WWW2019.

28. Tongwen Huang, Zhiqi Zhang, Julin Zhang. FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction. Recsys2019.

29. Weiping Song, Chence Shi, Zhiping Xiao, Zhijian Duan, Yewen Xu, Ming Zhang,Jian Tang. AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks. CIKM2019.

30. Guorui Zhou, Xiaoqiang Zhu, Chengru Song, Ying Fan, Han Zhu, Xiao Ma,Yanghui Yan,Junqi Jin,Han Li, Kun Gai. Deep Interest Network for Click-Through Rate Prediction. KDD2018.

31. Guorui Zhou, Na Mou, Ying Fan, Qi Pi,Weijie Bian, Chang Zhou, Xiaoqiang Zhu and Kungai. Deep Interest Evolution Network for Click-Through Rate Prediction. AAAI2019.

原文链接:

https://zhuanlan.zhihu.com/p/101136699

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!