数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
- 线性模型
- 支持向量机
- 朴素贝叶斯
- 决策树
- knn
- 集成学习
- 梯度提升树
- 数据预处理
- 模型评估
- 降维
- 聚类
- 半监督学习
- EM 算法
- 最大熵算法
- 隐马尔可夫模型
- 概率图与条件随机场
- 边际概率推断
- 主题模型
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- CRF ++
- lightgbm
- xgboost
- xgboost 使用指南
- scikit-learn
- spark
- numpy
- matplotlib
- matplotlib 使用指南
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
十八、Latent Cross [2018]
-
推荐系统长期以来一直用于预测用户会喜欢什么内容。随着
Facebook, Netflix, YouTube, Twitter
等在线服务的不断增长,拥有一个高质量的推荐系统来帮助用户筛选不断扩大和日益多样化的内容变得越来越重要。推荐系统的大部分研究都集中在有效的机器学习技术上:如何最好地从用户的行为(如点击、购买、观看、评分)中学习。在这个方向上,有大量关于协同过滤
collaborative filtering
和推荐算法的研究。与此同时,人们越来越显著地认识到对推荐的上下文
context
进行建模的重要性:不仅仅是正在寻找视频的用户,还包括一天中的时间time of day
、位置location
、用户的设备device
等。人们已经在分解factorization
的setting
中提出了许多相关的模型,例如用于location
的张量分解、用于不同类型的用户动作的unfolding tensor
、或者关于时间效应的手工制作的特征。随着深度学习的日益普及,如何将这些上下文特征
contextual feature
整合到神经推荐系统中的直接研究较少。先前关于deep neural network: DNN
推荐系统的工作在很大程度上依赖于将上下文作为模型中的直接特征、或者依赖于具有多任务的目标。一个值得注意的例外是使用recurrent neural network: RNN
来建模时间模式temporal pattern
。 在论文《Latent Cross: Making Use of Context in Recurrent Recommender Systems》
中,作者将contextual collaborative filtering
文献和神经推荐器文献联系起来。作者探索了如何在深度神经推荐器(尤其是在RNN
模型中)中利用上下文数据contextual data
,并证明主流技术遗漏了这些特征中的大量信息。作者探索了在
YouTube
使用的RNN-based
的推荐系统中,使用上下文数据的能力。与大多数生产production
的setting
一样,YouTube
拥有大量重要的上下文数据,其中包括:请求和观看时间request and watch time
、设备类型、网站或移动app
上的页面page
。在论文中,首先作者对建模上下文作为直接特征的局限性提供了理论解释,尤其是使用feed-forward neural network: FFN
作为示例的baseline DNN
方法。然后作者提供了一种易于使用的技术来整合这些上下文特征,从而提高预测准确性,即使在更复杂的RNN
模型中也是如此。论文的贡献是:
- 一阶挑战
First-Order Challenges
:论文展示一阶神经网络建模低秩关系low-rank relationship
的挑战。 - 生产模型
Production Model
:论文描述了如何为YouTube
构建了一个大规模的RNN
推荐系统。 - 潜在交叉
Latent Cross
:论文提供了一种简单的技术,称作Latent Cross
,以便在模型中更expressively
包含上下文特征。具体而言,latent cross
在context embedding
和神经网络hidden state
之间执行逐元素乘积elementwise product
。 - 经验结果
Empirical Result
:论文提供的经验结果证实了所提出方法提高了推荐的准确性。
- 一阶挑战
-
相关工作:我们首先对各种相关研究进行调研,
overview
参考下表。-
上下文推荐
Contextual Recommendation
:大量研究集中在推荐过程中使用上下文数据。具体而言,某些类型的上下文数据已被深入探索,而其它类型的上下文数据已被抽象地处理treated abstractly
。例如,推荐中的时间动态
temporal dynamics
已被广泛探索。在Netflix Prize
期间,《Collaborative filtering with temporal dynamics》
在Netflix
数据集中发现了重要的长期时间动态long-ranging temporal dynamics
,并在他的协同过滤模型中添加了时间特征temporal features
来解释这些影响。研究人员还探索了偏好
preference
如何在较短的时间尺度内(如session
)演变evolve
。更一般的抽象已被用于对推荐的偏好演变进行建模,如point processes
和RNN
。类似地,使用概率模型、矩阵分解、张量分解来建模带地理数据geographical data
的用户行为也得到了广泛的探索。各种方法都建立在矩阵分解和张量分解的基础上,用于跨域学习
cross domain learning
。分解器factorization machine
和其它上下文推荐器等方法提供了这些协同过滤方法的推广。 -
神经推荐系统
Neural Recommender Systems
:随着神经网络在计算机视觉和自然语言处理natural language processing: NLP
任务中的普及,推荐系统的研究人员已经开始将DNN
应用于推荐。早期的迭代侧重于将协同过滤直接应用于神经网络,例如通过自编码器、或者联合
deep and CF models
。人们已经设计出更复杂的网络来融合更广泛的输入特征。《Wide & deep learning for recommender systems》
在模型的DNN
部分之外,通过线性模型处理上下文特征之间的交互interaction
从而解决这个问题。最近,使用
RNN
进行推荐的情况越来越多:《Neural Survival Recommender》
和《Rurrent Recommender Networks》
在他们的模型中包括时间信息temporal information
作为特征和监督supervision
,而《Modelling Contextual Information in Session-Aware Recommender Systems with Neural Networks》
包含一般上下文特征。然而,在这两种情况下,这些特征都与输入相拼接concatenated
,我们将展示这种方式提供的好处有限。- 并行的、独立的研究
《What to Do Next: Modeling User Behaviors by Time-LSTM》
通过乘法性地融合multiplicatively incorporate
时间信息来改善LSTM
,但是它没有将这种方法推广到其它上下文数据。
-
二阶神经网络
Second-order Neural Networks
:本文的一个主要重点是神经推荐器中乘法关系multiplicative relation
的重要性。这些二阶单元second-order unit
出现在神经网络的一些地方。- 循环单元
recurrent unit
,如LSTM
和GRU
,是常见的带逐元素乘法elementwise multiplication
的门控机制的二阶单元。 - 此外,用于分类的、网络顶部的
softmax layer
是DNN
产生的embedding
与label class embedding
之间的显式双线性层bi-linear layer
。该技术已在多篇论文中得到扩展,包括DNN
之上的user-item
双线性层。
与本文中描述的技术类似的是乘法模型
multiplicative model
。这些乘法结构最常用于NLP
。这些NLP
方法被应用于评论的个性化建模(具有稍微不同的数学结构)。最近,《Neural Survival Recommender》
不是在上下文数据上,而是直接在用户上使用乘法技术,类似于张量分解。PNN
和NFM
将这一思想推向了一个极端,将输入端的所有的特征pair
对进行相乘,并在通过前馈神经网络之前拼接、或者平均相乘的结果。这些模型的直觉与我们的相似,但不同之处在于:- 我们关注上下文数据和用户动作之间的关系。
- 我们的
latent crossing
机制可以应用于、并且已经被应用于整个模型。 - 我们证明了这些交互的重要性,即使是在一个
RNN
推荐系统内。
更复杂的模型结构(如注意力模型
attention model
、记忆网络memory network
、元学习meta-learning
)也依赖于二阶关系,并且越来越受欢迎。例如,注意力模型使用通过乘法调制modulate
hidden state
的注意力向量。然而,这些方法在结构上明显更加复杂,并且通常更难训练。相比之下,我们发现本文提出的latent cross
技术在实践中易于训练并且有效。 - 循环单元
-
18.1 模型
18.1.1 基础知识
-
考虑一个推荐系统,其中我们有一个包含事件
event
$ e $ 的数据库 $ \mathcal E $ ,这些事件 $ e $ 是k-way
元组。我们定义 $ e_s $ 为元组中的第 $ s $ 个值, $ e_{\bar s} $ 为元组中的剩余 $ k-1 $ 个值。例如,
Netflix Prize
的setting
将由元组 $ e :=(i,j,R) $ 来描述,它表示用户 $ i $ 为电影 $ j $ 的评分为 $ R $ 。我们还可能有诸如时间和设备之类的上下文,如 $ e:=(i,j,t,d) $ ,它表示用户 $ i $ 在时间 $ t $ 在设备类型 $ d $ 上观看了视频 $ j $ 。注意,每个值可以是离散
discrete
的categorical
变量(例如,用户编号 $ i $ ),也可以是连续continuous
的变量(例如,时间 $ t $ 为unix
时间戳)。连续变量通常在预处理步骤中进行离散化,例如将 $ t $ 转换为事件发生的日期day
。 -
有了这些数据,我们可以将推荐系统构建为:试图在给定事件其它值的情况下预测该事件中的某一个值。例如,在
Netflix Prize
中,我们使用 $ (i,j) $ 来预测 $ R $ 。从机器学习的角度来看,我们可以将元组 $ e $ 拆分为特征 $ \mathbf x $ 和标签 $ y $ ,使得 $ \mathbf x = (i,j) $ 和标签 $ y=R $ 。我们可以通过定义
$ \mathbf x = (i,t) $ 和 $ y=j $ 进一步将推荐问题重新定义为:预测用户在给定时刻观看的视频。再次注意,根据标签是类别值categorical value
的还是实数值real value
,机器学习问题分别是分类问题或回归问题。 -
在分解模型中,所有输入值都被认为是离散的,并且被嵌入
embedded
、被相乘multiplied
。当我们embed
一个离散值时,我们学习一个稠密的latent representation
,例如,用户 $ i $ 由稠密的latent vector
$ \mathbf{\vec u}_i $ 来描述、item
$ j $ 由稠密的latent vector
$ \mathbf{\vec v}_j $ 来描述。在矩阵分解模型中,通常基于
$ \mathbf{\vec u}_i\cdot \mathbf{\vec v}_j $ 来进行预测。在张量分解模型中,通常基于 $ \sum_{r}u_{i,r}\times v_{j,r}\times w_{t,r} $ 来进行预测,其中 $ \mathbf{\vec w}_t $ 为时间或者其它某个上下文特征的稠密的embedding
向量。为了符号简便,我们用 $ <\cdot> $ 来表示多维内积,即 $ \left <\mathbf{\vec u}_i,\mathbf{\vec v}_j,\mathbf{\vec w}_t \right> = \sum_{r}u_{i,r}\times v_{j,r}\times w_{t,r} $ 。 -
神经网络通常还嵌入离散的输入。即,给定一个输入
$ (i,j) $ ,网络的输入将是 $ \mathbf{\vec x} = \left[\mathbf{\vec u}_i|| \mathbf{\vec v}_j\right] $ ( $ [\cdot||\cdot] $ 为向量拼接算子),其中 $ \mathbf{\vec u}_i $ 和 $ \mathbf{\vec v}_j $ 拼接起来并且也都是可训练的。因此,我们考虑 $ e_s = f(e_{\bar s}) $ 形式的神经网络,其中网络将元组中除了 $ e_s $ 之外的所有值作为输入,并且网络被训练从而预测 $ e_s $ 。我们稍后将扩展此定义,从而允许模型将相关的
previous events
也作为网络的输入,就像在序列模型中一样。
18.1.2 动机:一阶 DNN 的挑战
-
为了了解神经推荐器如何利用拼接的特征,我们首先探查
inspecting
这些网络的典型构建块building blocks
。如上所述,神经网络,尤其是前馈神经网络,通常建立在一阶运算first-order operation
之上。更准确而言,神经网络通常依赖于 $ \mathbf W\mathbf{\vec h} $ 形式的矩阵向量乘积matrix-vector product
。其中, $ \mathbf W $ 是一个学到的权重矩阵, $ \mathbf{\vec h} $ 为输入(整个网络的输入、或者上一层last layer
的输出)。在前馈神经网络中,全连接层通常具有以下形式:其中:
$ g(\cdot) $ 是一个逐元素操作(如sigmoid
或ReLU
), $ \mathbf{\vec h}_{l-1} $ 是上一层的输出。我们认为这是一个一阶单元,因为该
layer
仅仅将 $ \mathbf{\vec h}_{l-1}\in \mathbb R^d $ 不同维度的元素根据权重 $ \mathbf W $ 来计算加权和,但是从未将元素相乘。即,输入
$ \mathbf{\vec h}_{l-1} $ 的各维度元素之间是加法关系,而不是乘法关系。尽管具有此类
layer
的神经网络已被证明能够逼近任何函数,但它们的核心计算在结构上与协同过滤的直觉有很大不同。如前所述,矩阵分解模型采用一般形式general form
$ \mathbf{\vec u}_i\cdot \mathbf{\vec v}_j $ ,导致模型学习不同类型输入(即用户、item
、时间等等)之间的低秩关系low-rank relationship
。鉴于低秩模型low-rank model
已在推荐系统中取得成功,我们提出以下问题:一阶神经网络对低秩关系的建模效果如何? -
为了测试一阶神经网络是否可以建模低秩关系,我们生成人工合成的低秩数据并研究不同大小的神经网络对这些数据的拟合程度。更具体而言,我们考虑一个
m-mode
的张量(即,m
个输入),每个输入都是离散的并且取值空间大小都是 $ N $ 。对于这 $ m $ 个离散的输入,我们使用如下的方程来生成长度为 $ r $ 的随机向量 $ \mathbf{\vec z}_i $ :结果是我们的数据是一个秩
$ r $ 的矩阵或张量,具有大致相同的scale
(均值为零、经验方差接近1
)。例如,当 $ m=3 $ 时,我们可以使用这些embedding
来表示形式为 $ \left(i,j,t,\left<\mathbf{\vec z}_i,\mathbf{\vec z}_j,\mathbf{\vec z}_t\right>\right) $ 的事件。注意,这里的
$ \mathbf{\vec z}_i $ 并不是embedding
,而是用于生成label
。 -
我们尝试使用这些数据来拟合不同大小的模型。具体而言,我们考虑一个将离散特征嵌入并拼接为输入的模型。该模型有一个带
ReLU
激活函数的hidden layer
,这在神经推荐系统中很常见,然后是一个final linear layer
。我们使用TensorFlow
实现该模型,使用Adagrad
优化器来优化均方误差mean squared error: MSE
损失,并且训练模型直到收敛。我们通过训练数据和模型预测之间的Pearson correlation (R)
来衡量和报告模型的准确性。- 我们使用
Pearson
相关性,使其不受数据方差的微小差异的影响。 - 我们针对训练数据报告准确性,因为我们正在测试这些模型结构与低秩模式
low-rank pattern
的匹配程度。
即,我们在训练数据上评估(而不是测试数据),因为我们想评估这些模型对训练数据的拟合程度。
我们使用
Pearson correlation
指标(而不是MSE
),因为该指标不受数据方差的影响。 - 我们使用
-
为了建模低秩关系,我们想看看模型对单个乘法
individual multiplication
(代表了变量之间的交互interaction
)的逼近程度。所有数据都是在 $ N=100 $ 时生成的。在 $ m=2 $ 时,我们检查hidden layer
必须有多大时才能建模两个标量的乘法。在 $ m=3 $ 时,我们检查hidden layer
必须有多大时才能建模三个标量的乘法。我们使用
$ r\in \{1,2\} $ 来观察模型的大小如何随着需要更多的乘法而增长。我们将每个离散特征嵌入为一个 $ 20 $ 维向量,其中 $ 20\gg r $ ,但是我们发现模型的准确性与embedding
维度无关。我们测试hidden layer
的隐层维度 $ \in \{1,2,5,10,20,30,50\} $ 。 $ r $ 控制了:为了得到label
,我们需要多少个乘法。实验结果如下图和下表所示,我们发现:
- 首先,随着隐层维度的增加,模型地更好地逼近数据。鉴于网络逼近乘法的直觉,更宽的网络(即隐层维度更高)应该给出更好的逼近
approximation
。 - 其次,我们观察到,当我们将数据的秩
$ r $ 从 $ 1 $ 增加到 $ 2 $ 时,我们看到隐层维度大概需要翻倍从而获得相同的准确性。这也符合我们的直觉,因为增加 $ r $ 意味着要添加更多的交互。 - 更有趣的是,我们发现即使对于
$ r=1 $ 和 $ m=2 $ ,也需要一个大小为 $ 5 $ 的隐层才能获得 “高” 的准确性估计。考虑到协同过滤模型通常会发现秩为 $ 200 $ 的relation
(即, $ m=200 $ ),这直观地表明:现实世界的模型需要非常宽的layer
来学到单个two-way relation
。 - 此外,我们发现建模超过
two-way relation
会增加逼近的难度。也就是说,当我们从 $ m=2 $ 变为 $ m=3 $ 时,我们发现模型需要从宽度为 $ 5 $ 的隐层变为宽度为 $ 20 $ 的隐层,从而获得大约 $ 0.005 $ 的MSE
或 $ 0.99 $ 的Pearson correlation
。
总之,我们观察到
ReLU layer
可以逼近乘法交互multiplicative interaction
(即,cross
),但是这样做的效率很低。这激发了对能够更轻松地表达和处理乘法关系multiplicative relation
的模型的需求。我们现在将注意力转向使用RNN
作为baseline
。这是一个更强的baseline
,因为与前馈神经网络相比,RNN
可以更好地表达乘法关系。 - 首先,随着隐层维度的增加,模型地更好地逼近数据。鉴于网络逼近乘法的直觉,更宽的网络(即隐层维度更高)应该给出更好的逼近
18.1.3 Youtube Recurrent Recommender
-
以上述分析为动力,我们现在描述对
YouTube
的RNN
推荐系统的改进。RNN
是优秀的baseline
模型,因为它们已经是二阶神经网络,比上面探索的一阶神经网络复杂得多,并且处于动态推荐系统dynamic recommender system
的前沿。我们首先概述我们为
YouTube
构建的RNN
推荐器,然后描述我们如何改进这个推荐器从而更好地利用上下文数据。 -
公式描述:在我们的
setting
中,我们观察到用户 $ i $ 在时刻 $ t $ 观看视频 $ j $ (由用户 $ \psi(j) $ 上传)形式的事件。(我们稍后将介绍额外的上下文特征。)为了对用户偏好和行为的演变进行建模,我们使用recurrent neural network: RNN
模型,其中模型的输入是用户 $ i $ 的事件集合 $ \mathcal X_i =\{e=(i^\prime,j,\psi(j),t)\in \mathcal E\mid i^\prime = i\} $ 。我们使用 $ \mathcal X_{i,t} $ 表示用户 $ i $ 在时刻 $ t $ 之前的所有观看事件:该模型经过训练以产生序列预测
$ Pr(j\mid i,t,\mathcal X_{i,t}) $ ,即用户 $ i $ 在给定时刻 $ t $ 基于时刻 $ t $ 之前的所有观看事件来预测观看视频 $ j $ 的概率。为简单起见,我们将使用 $ e^{(\tau)} $ 表示序列中的第 $ \tau $ 个事件, $ \mathbf{\vec x} ^{(\tau)} $ 表示 $ e^{(\tau)} $ 转换的输入, $ y^{(\tau)} $ 表示试图为第 $ \tau $ 个事件预测的标签。在上面的例子中,如果
$ e^{(\tau)}=(i,j,\psi(j),t) $ ,并且 $ e^{(\tau+1)} = \left(i,j^\prime,\psi\left(j^\prime\right),t^\prime\right) $ ,那么输入 $ \mathbf {\vec x}^{(\tau)}=\left[\mathbf{\vec v}_j||\mathbf{\vec u}_{\psi(j)}||\mathbf{\vec w}_t\right] $ ,并且预测 $ y^{(\tau+1)} =j^\prime $ 。其中, $ \mathbf{\vec v}_j $ 为video embedding
, $ \mathbf{\vec u}_{\psi(j)} $ 为uploader embedding
, $ \mathbf{\vec w}_t $ 是context embedding
。注意,这里
$ \mathbf{\vec x}^{(\tau)} $ 是作为RNN
的输入。对于RNN
而言,这意味着我们基于 $ \left\{\mathbf{\vec x}^{(1)},\cdots,\mathbf{\vec x}^{(\tau)}\right\} $ 来预测 $ y^{(\tau+1)} $ 。但是我们忽略了 $ \tau+1 $ 时刻的上下文信息作为输入。当预测
$ y^{(\tau)} $ 时,我们当然不能使用对应事件 $ e^{(\tau)} $ 的label
作为输入,但是我们可以使用来自 $ e^{(\tau)} $ 的上下文,我们将其表示为 $ c^{(\tau)} $ ,如 $ c^{(\tau)} = \left[\mathbf{\vec w}_t\right] $ 。 -
Baseline RNN
模型的结构:我们的RNN
模型diagram
如下图所示。RNN
对一系列动作进行建模。对于每个事件 $ e^{(\tau)} $ ,模型处理该事件并更新hidden state vector
$ \mathbf{\vec h}^{(\tau-1)} $ 。更准确而言:
-
每个事件首先由神经网络
$ \tilde{\mathbf{\vec x}}^{(\tau)} = f_i\left(\mathbf{\vec x}^{(\tau)}\right) $ 处理(下标 $ i $ 代表input
)。在我们的setting
中,这将是一个恒等映射或者全连接的ReLU layer
。 -
网络的循环部分是函数:
即,我们使用循环单元(如,
LSTM
或GRU
)从而将上一步的state
和变换后的输入 $ \tilde{\mathbf{\vec x}}^{(\tau)} $ 作为新的输入。 -
为了预测
$ y^{(\tau)} $ ,我们使用 $ f_o\left(\mathbf{\vec o}^{(\tau-1)},\mathbf{\vec c}^{(\tau)}\right) $ ,它是另一个可训练的神经网络并产生关于 $ y^{(\tau)} $ 可能取值的概率分布。在我们的setting
中,该网络将RNN
的输出、以及即将进行预测的上下文作为该网络的输入,最后以所有视频的softmax layer
而结束。这个网络可以包括多个全连接层。output network
越简单越好还是越复杂越好?个人感觉,如果output network
越复杂,那么迫使GRU
学到的representation
越简单。
-
-
上下文特征:该模型成功的核心是结合上下文数据,而不仅仅是观看的视频序列。我们将在下面讨论我们如何利用这些特征。
-
TimeDelta
:在我们的系统中,有效地结合时间对我们RNN
的准确性非常有价值。从历史上看,时间上下文time context
已经以多种方式被纳入协同过滤模型中。在这里,我们使用一种称为timedelta
的方法:也就是说,在考虑事件
$ e^{(\tau)} $ 时,我们会考虑需要多长时间到下一个事件、或下一个预测。这基本上等价于《Neural Survival Recommender》
和《What to Do Next: Modeling User Behaviors by Time-LSTM》
中描述的time representation
。这里是
$ \left(t^{(\tau+1)} - t^{(\tau)}\right) $ 而不是 $ \left(t^{(\tau)} - t^{(\tau-1)}\right) $ ,因为我们需要刻画当前的action
对未来的影响(而不是对过去的影响)。 -
Software Client
:YouTube
视频可以在各种设备上观看,如浏览器、iOS
、Android
、Roku
、Chromecast
等。将这些上下文视为等同equivalent
的,则会错失相关的关系relevant correlation
。例如,与通过Roku
设备相比,用户不太可能在手机上观看完整的故事片。类似地,像预告片这样的短视频可能相对更有可能在手机上观看。对software client
进行建模,特别是它如何与观看决策watch dicision
交互,这一点很重要。不同设备上呈现不同的交互特色。
-
Page
:我们还会在我们的系统中记录观看是从哪里开始的。例如,我们区分从主页开始的观看(即,Home Page Watches
),以及作为被推荐的follow-up watch
来初始化的观看(即,Watch Next Watches
)。Watch Next Watches
:当用户已经在观看一个视频时,系统提供一个推荐列表,然后用户从推荐列表选择一个视频并进行观看。这一点很重要,因为
Home Page Watches
可能对新内容更加开放open
,而Watch Next Watches
可能是因为用户想要更深入地挖掘某个主题。
-
-
Pre-Fusion
和Post-Fusion
:我们可以通过两种方式将这些上下文特征(统称为 $ c^{(\tau)} $ )用作直接输入。如下图所示,我们可以将上下文作为网络底部的输入,或者与RNN cell
的输出相结合。我们把在
RNN cell
之前包含上下文特征称作pre-fusion
,把在RNN cell
之后包含上下文特征称作post-fusion
。尽管可能是一个精巧的点subtle point
,但这个决定可能会对RNN
产生重大影响。具体而言:- 通过
pre-fusion
包含一个特征,该特征将通过它如何修改RNN
的state
来影响预测。 - 但是,通过
post-fusion
包含一个特征,该特征可以更直接地对该time step
的预测产生影响。
为了解决这个问题,在预测
$ y^{(\tau)} $ 时,我们通常使用 $ c^{(\tau)} $ 作为post-fusion
的特征,并使用 $ c^{(\tau-1)} $ 作为pre-fusion
的特征。这意味着 $ c^{(\tau-1)} $ 将影响RNN
状态,但 $ c^{(\tau)} $ 将用于预测 $ y^{(\tau)} $ 。随后,在下一步预测 $ y^{(\tau+1)} $ 时, $ c^{(\tau)} $ 现在将是一个pre-fusion
特征,并且开始影响RNN
的状态。由于
GRU
的递归特性,这里相当于是:cell state
捕获了序列 $ \left\{c^{(1)},\cdots,c^{(\tau-1)}\right\} $ ,并且 $ c^{(\tau)} $ 直接地对该时刻的预测产生影响。 - 通过
-
实现&训练:我们的模型在
TensorFlow
中实现,并在许多分布式workers
和parameter servers
上进行了训练。训练使用一种可用的反向传播mini-batch
随机梯度下降算法,即Adagrad
或ADAM
。在训练期间,我们使用周期 $ (t_0-7\text{days},t_0] $ 期间最近的 $ 100 $ 次观看作为监督信息,其中 $ t_0 $ 是训练时间(即,训练时刻最近一周内的最近100
次观看)。这通常会优先考虑最近的观看,因为当学到的模型将被应用于实时流量live traffic
时,这种方式(即,优先考虑最近的观看)与预测任务更为相似。由于可用的视频数量非常多,因此我们限制了我们要预测的可能的视频集合、以及我们建模的这些
uploaders
的数量。在下面的实验中,这些集合的规模从50
万到200
万 。softmax layer
使用sampled softmax
进行训练,每个batch
采样2
万个负样本。我们在针对batch
内所有label
的交叉熵损失中使用这个sampled softmax
的预测。即,每个
batch
内的所有样本共享同一组负样本。
18.1.4 带 Latent Cross 的上下文建模
-
在上面对我们的
baseline
模型的描述中应该很清楚,上下文特征的使用通常是作为简单的全连接层的拼接输入concatenated input
来进行的。然而,正如我们在前面所解释的,神经网络在建模拼接输入特征之间的交互interaction
方面效率很低。这里我们提出一个简单的替代方案。 -
单个上下文特征:我们从包含单个上下文特征的情况开始。为了清楚起见,我们将时间作为上下文特征的一个例子。我们并不是将该特征与其它相关特征拼接起来作为输入从而执行融合,而是在网络的中间执行一个逐元素乘积
element-wise product
。也就是说,我们执行:其中,我们使用零均值的高斯分布来初始化
$ \mathbf{\vec w}_t $ 。因此, $ \left(1 + \mathbf{\vec w}_t\right) $ 被初始化为均值为1
的高斯分布。乘法项的均值为
1
,这可以解释为在representation
上提供一个mask
机制或者一个注意力机制的上下文。但是,它也enable
了输入的previous watch
与time
之间的低秩关系(矩阵分解代表了一种低秩关系)。注意,我们也可以在
RNN
之后应用这个操作:《A multiplicative model for learning distributed text-based attribute representations》
中提供的技术可以被视为一种特殊情况,其中乘法关系multiplicative relation
与softmax
函数一起被包含在网络的最顶部,从而改善NLP
任务。在这种情况下,该操作可以被视为张量分解,其中一种模态的embedding
是由神经网络产生的。 -
多个上下文特征:在许多情况下,我们想要包含不止一个上下文特征。当包含多个上下文特征时,例如时间
$ t $ 和设备 $ d $ ,我们执行:我们使用这种形式有几个不同的原因:
- 使用零均值的高斯分布来初始化
$ \mathbf{\vec w}_t $ 和 $ \mathbf{\vec w}_d $ ,那么乘法项的均值为1
,因此可以类似地充当hidden state
的mask/atttention
机制。 - 通过将这些项相加,我们可以捕获
hidden state
和每个上下文特征之间的2-way
关系。这遵循了分解机factorization machine
设计中的观点。 - 使用简单的加法函数易于训练。像
$ \mathbf{\vec w}_t*\mathbf{\vec w}_d*\mathbf{\vec h}^{(\tau)} $ 这样更复杂的函数将随着每个额外的上下文特征从而显著增加非凸性。类似地,我们发现学习一个函数 $ f\left(\left[\mathbf{\vec w}_t||\mathbf{\vec w}_d\right]\right) $ 更难训练并且给出更差的结果(即,拼接多个上下文特征的效果更差)。
根据前文的结论,我们是否可以把常规的
input field
也视为上下文,然后进行latent cross
,从而更好地捕获2-way
关系? - 使用零均值的高斯分布来初始化
-
效率:我们注意到使用
latent cross
的一个显著优势是:它们的简单性和计算效率。使用 $ N $ 个上下文特征和 $ d $ 维的embedding
,可以在 $ O(Nd) $ 复杂度内计算latent cross
,并且不会增加后续layer
的宽度。
18.2 实验
-
我们进行两个实验:
- 第一个实验是在时间作为唯一上下文特征的数据集上,我们比较了几个模型。
- 第二个实验是在我们的生产模型上,并根据我们如何融合上下文特征来探索相对的效果提升。
18.2.1 对比分析
-
数据集:我们使用一个数据集,该数据集的观看序列来自于数亿用户。用户被拆分为训练集、验证集、测试集,其中验证集和测试集都有数千万的用户。
观看被限制在
50
万个流行视频的集合中。所有用户的序列中至少有50
个观看。序列是由观看视频的列表、以及每个观看的时间戳给出的。任务是预测用户序列中最近5
次观看。 -
评估指标:在测试集上的
Mean-Average-Precision-at-k (MAP@k)
,其中 $ k=1 $ 和 $ k=20 $ 。 -
模型配置:对于这个实验,我们使用带
LSTM
的RNN
。我们在循环单元之前或之后没有ReLU cell
,并使用一个pre-determined
的hierarchical softmax: HSM
来预测视频。在这里,我们使用序列中除了第一个观看之外的所有观看作为训练期间的监督。模型使用ADAM
优化算法来训练。由于时间是该数据集中唯一的上下文特征,我们使用视频
embedding
$ \mathbf{\vec v}_j $ 作为输入,并使用timedelta
值 $ \mathbf w_{\Delta t} $ 执行latent cross
,使得LSTM
的输入为 $ \mathbf{\vec v}_j*\mathbf{\vec w}_{\Delta t} $ 。这是一个pre-fusion
的例子,我们称之为RNNLatentCross
。注意,这里仅评估了
pre-fusion
的效果。 -
baseline
方法:我们将上述RNNLatentCross
模型与其它baseline
方法进行比较:RRN
:使用 $ \left[\mathbf{\vec v}_j||\mathbf{\vec w}_{\Delta t}\right] $ (即,拼接操作)作为RNN
的输入。RNN
:直接在 $ \mathbf{\vec v}_j $ 上应用RNN
,没有时间信息作为输入。BOW
:作用在用户观看历史的视频集合、以及用户的人口统计学特征上的bag-of-watches
模型。BOW+Time
:一个三层的前馈神经网络模型,将bag-of-watches
、最近观看的三个视频中的每一个、 $ \Delta t $ 、以及请求时间的week
这些特征的拼接作为输入。该模型使用softmax
对与最近观看last watch
共现次数最多的50
个视频进行训练。Paragraph Vector (PV)
:使用《Document embedding with paragraph vectors》
学习每个用户的无监督embedding
(基于用户人口统计,以及历史的观看)。使用学到的embedding
以及最后一个观看的embedding
作为一个单层前馈神经网络分类器的输入,其中该分类器通过sampled softmax
来训练。Cowatch
:根据序列中的last watch
推荐共现次数最多的其它视频。
除非另有说明,否则所有模型都使用一个
hierarchical softmax
。所有模型及其超参数都进行了调优。注意,只有BOW
和PV
模型使用了用户人口统计学数据。 -
实验结果:我们在下表中报告了该实验的结果。从中可以看到,我们的模型在
Precision@1
和MAP@20
上都表现最佳(注意,MAP@1
就是Precision@1
)。- 可能更有趣的是模型的相对性能。我们在
BOW
模型(对比BOW with time
)和RNN
模型(对比RNN with time
)中都观察到建模时间的重要性。 - 此外,我们观察到执行
latent cross
而不是仅仅拼接 $ \Delta t $ 时的提升完全大于将 $ \Delta t $ 作为输入特征的提升。
- 可能更有趣的是模型的相对性能。我们在
18.2.2 YouTube 模型
-
配置:在这里我们使用用户观看的生产数据集
production dataset
。我们的序列由观看的视频以及视频创建人(即uploader
)组成。我们使用了百万级最近流行的视频和uploader
的更大的vocabulary
。我们根据用户和时间将数据集拆分为训练集和测试集。
- 首先,我们将用户分为两组:
90%
的用户在我们的训练集中,10%
在我们的测试集中。 - 其次,为了根据时间来拆分,我们选择截止
cut-off
时间 $ t_0 $ 并且在训练期间仅考虑 $ t_0 $ 之间的观看。在测试期间,我们考虑 $ t_0 + 4\text{ hours} $ 后的观看。同样地,视频的vocabulary
是基于 $ t_0 $ 之前的数据。
我们的模型考虑嵌入和拼接上面定义的所有特征作为输入,然后是一个
256
维的ReLU
层、一个256
维的GRU cell
,然后是另一个256
维的ReLU
层,最后再输入到softmax
层。如前所述,我们使用区间 $ (t_0- 7\text{ days}, t_0] $ 期间最近的100
个观看作为监督信息。在这里,我们使用Adagrad
优化器在多个workers
和parameter servers
上进行分布式训练。为了测试我们的模型,我们仍然使用
MAP@k
指标。对于不在我们vocabulary
中的观看,我们总是将预测标记为不正确。这里报告的评估MAP@k
得分是使用大约45000
个观看来度量的。 - 首先,我们将用户分为两组:
-
Page
作为上下文的价值:我们通过以不同方式融合Page
来开始分析准确性的改善。具体而言,我们比较了不使用Page
、使用Page
与其它特征拼接来作为输入、使用Page
来执行post-fusion latent cross
。注意,当我们将Page
作为被拼接的特征时,它在pre-fusion
和post-fusion
都被拼接。如下图所示,使用
Page
来执行latent cross
可以提供最佳准确性。此外,我们看到同时使用latent cross
和特征拼接并没有额外提高准确性,这表明latent cross
足以捕获Page
的信息。 -
整体提升:最后,我们测试了在完整生产模型之上添加
latent cross
对准确性的影响。在这种情况下,模型知道每次观看的page
、设备类型、时间the time
、观看时长watch time
、视频年龄watch age
(即,视频从上传到现在过了多久)、uploader
。具体而言,我们的baseline YouTube
模型使用page
、设备类型、观看时长、timedelta
数据作为pre-fusion
的拼接特征,并且还使用page
、设备类型、视频年龄作为post-fusion
的拼接特征。为什么
pre-fusion
特征和post-fusion
特征不同、latent-cross
的特征也不同?个人猜测是经过反复实验得到的结论。我们测试包含
timedelta
和page
作为pre-fusion
的latent cross
,以及设备类型和page
作为post-fusion
的latent cross
。从下图可以看到,尽管所有这些特征都已通过拼接包含在内,但将它们作为latent cross
可以进一步提高baseline
模型的准确性。这也证明了具有多个特征的pre-fusion
和post-fusion
能够共同工作并提供强大的准确性提升。
18.3 讨论
-
我们在下面讨论了这项工作提出的一些问题以及对未来工作的影响。
-
DNN
中的离散关系Discrete Relation
:虽然本文的大部分内容都集中在enable
特征之间的乘法交互multiplicative interaction
,但是我们发现神经网络也可以逼近离散交互discrete interaction
,这是factorization
模型更困难的领域。例如,在《Improving User Topic Interest Profiles by Behavior Factorization》
中,作者发现当用户 $ i $ 对item
$ j $ 执行动作 $ a $ 时, $ \left<\mathbf{\vec u}_{i,a},\mathbf{\vec v}_j\right> $ 要比 $ \left<\mathbf{\vec u}_i,\mathbf{\vec v}_j,\mathbf{\vec w}_a\right> $ 具有更好的准确性。但是,人们很难发现将用户和行为进行联合索引的表现会更好,因为这需要对数据的良好洞察。与 “一阶DNN的挑战” 的实验类似,我们按照
pattern
$ X_{i,j,a} = \left<\mathbf{\vec u}_{i,a},\mathbf{\vec v}_j\right> $ 生成合成数据,并测试不同的网络架构在给定 $ i,j,a $ 作为独立的拼接特征作为输入的条件下,对 $ X_{i,j,a} $ 的预测效果如何。我们初始化 $ \mathbf{\vec u}\in \mathbb R^{100},\mathbf{\vec v}\in \mathbb R^{100} $ ,使得 $ X $ 是一个秩为1
的矩阵。我们遵循与 “一阶DNN的挑战” 相同的实验程序,测量具有不同隐层深度、不同隐层宽度的网络的Pearson correlation (R)
。我们以0.01
的学习率训练这些网络,比上面使用的学习率小十倍。作为baseline
,我们还测量了不同秩的张量分解( $ \left<\mathbf{\vec u}_i,\mathbf{\vec v}_j,\mathbf{\vec w}_a\right> $ )的Pearson
相关性。从下图可以看出:
- 在某些情况下,深度模型获得了相当高的
Pearson
相关性,这表明它们实际上能够逼近离散交叉discrete cross
。同样有趣的是,学习这些交叉需要具有宽隐层的深度网络,对于数据规模而言特别大(即,对于小数据集就需要很宽的网络了)。此外,我们发现这些网络很难训练。 baseline
张量分解性能很有趣。我们观察到分解模型可以很好地逼近数据,但是需要相对较高的秩。然而,即使在这么高的秩下,张量分解模型需要的参数也比DNN
少,而且更容易训练。
因此,与前面的结果一样,
DNN
可以逼近这些pattern
,但这样做可能很困难,并且模型包含低秩交互low-rank interaction
有助于提供易于训练的逼近approximation
。 - 在某些情况下,深度模型获得了相当高的
-
二阶
DNN
:阅读本文时自然要问的一个问题是,为什么不尝试更宽的层、或者更深的模型、或者更多的二阶单元second-order unit
(如GRU
和LSTM
)?所有这些都是合理的建模决策,但根据我们的经验,模型的训练变得更加困难。latent cross
方法的优点之一是它易于实现和训练,同时仍然提供显著的性能提升,即使与LSTM
和GRU
等其它二阶单元结合使用也是如此。整个深度学习的趋势似乎是使用更多的二阶交互。例如,这在注意力模型
attention model
和记忆网络memory network
中很常见。虽然更多二阶交互导致更难训练,但我们相信这项工作展示了神经推荐系统在这个方向上的前景。如果将加法 类比于
or
操作、将乘法类比于and
操作,那么这意味着推荐算法会涉及大量的and
,而and
难以设计和优化?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论