2.recommend

下载本文pdf:https://github.com/daiwk/collections/blob/master/pdfs/recommend.pdf

推荐系统整体梳理

https://daiwk.github.io/posts/links-navigation-recommender-system.html

https://github.com/Doragd/Algorithm-Practice-in-Industry

王喆的机器学习笔记系列:

https://github.com/wzhe06/Reco-papers

https://github.com/wzhe06/Ad-papers

深度学习传送门系列:

https://github.com/imsheridan/DeepRec

推荐系统遇上深度学习系列:

链接: https://pan.baidu.com/s/1jZkJ2d9WckbZL48aGFudOA 密码:kme3

推荐系统技术演进趋势:召回->排序->重排

推荐系统的发展与2019最新论文回顾

深度推荐系统2019年度阅读收藏清单

推荐工业界实战角度详解TensorFlow中Wide & Deep源码(三)

常用机器学习基础

mse vs cross-entropy

不一定回归就用mse,分类才用交叉熵

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

https://www.zhihu.com/question/415245797/answer/1791746717

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

https://blog.csdn.net/u011508640/article/details/72815981

各种分布:

https://github.com/graykode/distribution-is-all-you-need

cross-entroy vs nllloss

聊一聊机器学习的MLE和MAP:最大似然估计和最大后验估计

贝叶斯公式:

P(θX)=P(Xθ)×P(θ)P(X)P(\theta \mid X)=\frac{P(X \mid \theta) \times P(\theta)}{P(X)}
  • 先验(prior):P(θ)P(\theta),没有观测到任数据时对θ\theta的预先判断,例如假设硬币很大概率是均匀的,很小概率不均匀;随着数据量的增加,先验的影响力越来越小。

  • 后验(posterior):P(θX)P(\theta \mid X),最终的参数分布

  • 似然(likelihood):P(Xθ)P(X \mid \theta),假设θ\theta已知后,我们观察到的数据应该是什么样的

结论:

  • 最大似然估计(MLE, max likelihood estimation):等价于NLL(negative log likelihood),即交叉熵

  • 最大后验估计(MAP, max a posteriori):假设参数服从高斯分布,等价于MLE+L2正则

https://blog.csdn.net/geter_CS/article/details/84857220

https://blog.csdn.net/qq_22210253/article/details/85229988

CrossEntropyLoss就是把Softmax–Log–NLLLoss合并成一步

特征、样本、数据流

浅谈微视推荐系统中的特征工程

推荐系统之数据与特征工程

稠密特征加入CTR预估模型的方法汇总

预估架构

HugeCTR

点击率预估的训练传统上存在着几个困扰着广大开发者的问题:巨大的哈希表(Embedding Table),较少的矩阵计算,大量的数据吞吐。

HugeCTR 是首个全部解决以上问题的开源 GPU 训练框架,与现有 CPU 和混合 CPU / GPU 解决方案相比,它的速度提高了 12 倍至 44 倍。HugeCTR 是一种端到端训练解决方案,其所有计算都在 GPU 上执行,而 CPU 仅用于 I / O。GPU 哈希表支持动态缩放。它利用 MPI 进行多节点训练,以支持任意大的嵌入尺寸。它还还支持混合精度训练,在 Volta GPU 及其后续版本上可以利用 Tensor cores 进一步加速。

如何解决点击率预估?英伟达专家详解HugeCTR训练框架(二)

Merlin HugeCTR 分级参数服务器简介

BOX

大规模深度学习广告系统的分布式分层GPU参数服务器

Distributed Hierarchical GPU Parameter Server for Massive Scale Deep Learning Ads Systems

索引架构

ANN索引

annoy hnsw faiss pq

暴力召回ANN加速

https://kexue.fm/archives/9336

大致思想,CUR分解:query和item的MxN打分矩阵,分解成F(Mxk1), G(k1xk2), H(k2xN)三个矩阵

  • Mxk1矩阵:原矩阵里搞k1列出来,即选出k1个种子item,得到F

  • k2xN矩阵:原矩阵里搞k2列出来,即选出k2个种子query,得到H

  • k1xk2矩阵:即矩阵1和矩阵2求交集,比如矩阵1是抽的第1,23,54列出来,矩阵2是抽的第4,80行出来,那交集元素就是(1,4),(1,80),(23,4),(23,80),(54,4),(54,80)这6个点,构成k1xk2矩阵,然后算一下伪逆得到G

建索引:

  • 挑出种子query,和所有item两两计算相似度,得到H矩阵

  • 挑出种子item,和种子query两两计算相似度,再算伪逆,得到G矩阵

  • 计算G*H,存起来

检索:

  • 输入的query和k1个种子item算一下相似度,得到1xk1的矩阵q

  • q和G*H相乘,就能得到q和每个item的相似度了

    • 【这步可以ann化】:GH就是k1*N,按列来看,就是N个k1维向量,相当于N个item向量,扔到annlib里去就行了,而输入的q也是一个k1维向量,就可以ann了

BLISS

BLISS: A Billion scale Index using Iterative Re-partitioning

召回

360展示广告召回系统的演进

推荐场景中深度召回模型的演化过程

https://github.com/imsheridan/DeepRec/tree/master/Match

精准推荐的秘术:阿里解耦域适应无偏召回模型详解对应Co-training Disentangled Domain Adaptation Network for Leveraging Popularity Bias in Recommenders

谈谈文本匹配和多轮检索

搜索中的深度匹配模型

协同

Swing

Large Scale Product Graph Construction for Recommendation in E-commerce

score(i,j) = 0

  • 找到同时点过i和j的用户集合A,对集合A里的用户两两组合

    • s=1/(这两个用户的共同点击数+1)(如果两个用户的交集很大,说明这个item并不独特,要惩罚,类似idf)

    • score(i,j) += s (累加每个pair对的得分得到最终得分)

内积、余弦和L2

给定a,找到和它最像的b

ab=acosθbab=||a||cos\theta ||b||

如果用内积,会找cosθbcos\theta ||b||最大的b出来,可能是夹角小,也可能是模大的b,所以可能偏热门

DSSM

参考Modeling Interestingness with Deep Neural Networks

对应的ppt

2013年CIKM的dssm

Learning Deep Structured Semantic Models for Web Search using Clickthrough Data

相当于一个q,和每个d分别算cos。

R(Q,D)=cosine(yQ,yD)=yQTyDyQyDR(Q,D)=cosine(y_Q,y_D)=\frac{y_Q^Ty_D}{\left \| y_Q \right \|\left \| y_D \right \|}

所以given Q点击D的概率就是:

P(DQ)=exp(γR(Q,D))DDexp(γR(Q,D))P(D|Q)=\frac{exp(\gamma R(Q,D))}{\sum _{D'\in \textbf{D}}exp(\gamma R(Q,D'))}

其中的γ\gamma是平滑因子。这里的D\textbf{D}是需要rank的Documents的集合,理想情况肯定是全集了。实际上定义(Q,D+)(Q,D^+)为一个query和点击文档的pair对,通过一个D+D^+和N个随机选的未点击的文档Dj,j=1,...,ND_j^-,j=1,...,N近似。

所以训练时,在训练集上,给定query,有点击doc的概率最大化就是我们的目标(其中的Λ\Lambda是网络参数):

L(Λ)=log(Q,D+)P(D+Q)L(\Lambda)=-\log \prod _{(Q,D^+)}P(D^+|Q)

Word Hashing:例如,一个英文单词是”good”,那么会先在头尾各补上一个”#”,处理成”#good#”,然后拆成n-gram(假设n=3,也就是tri-gram,那就是”#go”,“goo”,”ood”,”od#”这么多个”新”词)。这样,可以把原来500k的词典缩到300k,可以有效缓解词典太大的问题,而且因为英文就26个字母,这样做也解决了新单词的OOV问题。

https://blog.csdn.net/zjrn1027/article/details/80170966

相似度衡量可以使用cos,而最终的loss可以用hinge loss:

设置一个margin mm,query VQV_Q,正样本VA+V_{A^+},负样本VAV_{A^-},如果正负样本的相似度之差小于边界值,那就还需要优化,如果已经大于等于边界值了,说明模型已经能区分了,所以用hinge loss:

L=max(0,m(cos(VQ,VA+cos(VQ,VA))))L=max(0, m - (cos(V_Q,V_{A^+} - cos(V_Q, V_{A^-}))))

tf算cos

    def getCosineSimilarity(q, a):
        q1 = tf.sqrt(tf.reduce_sum(tf.multiply(q, q), 1))
        a1 = tf.sqrt(tf.reduce_sum(tf.multiply(a, a), 1))
        mul = tf.reduce_sum(tf.multiply(q, a), 1)
        cosSim = tf.div(mul, tf.multiply(q1, a1))
        return cosSim

tf算hinge

    def getLoss(trueCosSim, falseCosSim, margin):
        zero = tf.fill(tf.shape(trueCosSim), 0.0)
        tfMargin = tf.fill(tf.shape(trueCosSim), margin)
        with tf.name_scope("loss"):
            losses = tf.maximum(zero, tf.subtract(tfMargin, tf.subtract(trueCosSim, falseCosSim)))
            loss = tf.reduce_sum(losses)
        return loss

使用

        self.trueCosSim = self.getCosineSimilarity(question2, trueAnswer2)
        self.falseCosSim = self.getCosineSimilarity(question2, falseAnswer2)
        self.loss = self.getLoss(self.trueCosSim, self.falseCosSim, self.margin)

multiview dssm

A Multi-View Deep Learning Approach for Cross Domain User Modeling in Recommendation Systems

https://blog.csdn.net/shine19930820/article/details/78810984

现在很多公司都不仅仅只有一个产品,而是有多个产品线。比如微软可能就有搜索、新闻、appstore、xbox等产品,如果将用户在这些产品上的行为(反馈)统一在一起训练一个深度学习网络,就能很好的解决单个产品上(用户)冷启动、稀疏等问题。

概述

一个产品线就是一个view,一条训练样本只有user+1个view,其他view置0。

总体的优化目标是保证在所有视图上user和正向反馈的item的相似度大于随机选取的无反馈或者负向反馈的相似度,并且越大越好。

p=argmaxWu,W1,...Wvj=1Nexp(αacos(Yu,Ya,j)XRdaexp(αcos(Yu,fa(X,Wa)))p=\underset{W_u,W_1,...W_v}{argmax}\sum ^N_{j=1}\frac{exp(\alpha _a cos(Y_u,Y_{a,j})}{\sum _{X'\in R^{d_a}}exp(\alpha cos(Y_u,f_a(X',W_a)))}

其中的fi(Xi,Wi)f_i(X_i,W_i)XiX_iYiY_i的变换。有一个用户view,加上vv个辅助(auxiliary)的item view。XiRdiX_i\in R^{d_i},即每个view有自己的特征空间。对于第jj条样本,它只有第ii个auxiliary view是有值的,其他view都是0。

tf代码:https://github.com/InsaneLife/dssm/blob/master/multi_view_dssm_v3.py

降维

top features

对于user features,选取top-k最频繁的features。并通过TF-IDF过滤掉最常用的特征。

k means

kmeans的公式如下:

argminC1,...,Cki=1NminCj{C1,...,Ck}distance(Xi,Cj)\underset{C_1,...,C_k}{argmin}\sum ^N _{i=1} \min _{C_j\in \{C_1,...,C_k\}}distance(X_i,C_j)

通过K-means对相似的特征群分组为同一个cluster并生成新的特征,共生成k个新特征。生成的特征向量YiY_i是一个KK维的向量,第ii维是第ii个cluster中features的出现数。

具体地,使用一个长度为UU的vector fif_iUU是训练集中的用户数,fi(j)f_i(j)表示用户ii有feature jj的次数。将每个fif_i进行归一化。这样,对于每一个用户向量fif_i,可以产生它的降维了的用户向量YiY_i(假设feature aa分配给了cluster Cls(a)Cls(a)1Cls(a)K1\le Cls(a)\le K):

Yi(j)=a:Xi(a)>0&Cls(a)=jfi(a)Y_i(j)=\sum _{a:X_i(a)>0 \& Cls(a) = j}f_i(a)

想要抽出reasonable的feature数目,需要比较大的cluster数KK。因为如果cluster数比较少,那一个cluster里就会有非常多的用户feature,很难学到有用的pattern。在本文中,设置K=10000K=10000,平均每个cluster里大概有350个feature。因为cluster数比较大,所以用mr版的kmeans。

Local sensitive Hashing

通过一个随机的矩阵将数据映射到低维向量空间上,并且保持原始空间上的pairwis cos距离新的空间上仍然获得保留

原始矩阵dd维,降到kk维,所以对应的矩阵是ARd×kA\in R^{d\times k}。所以AA中有kk个映射,每个映射AiA_i都将XX映射到YiY_i,输出的YiRkY_i\in R^k。计算方式如下:

Yi={1,if AiX00,elseY_i=\left\{\begin{matrix} 1,&if\ A_iX\ge 0\\ 0,&else \end{matrix}\right.

计算X1X_1X2X_2的cos相似度是cos(H(Y1,Y2)kπ)cos(\frac{H(Y_1,Y_2)}{k}\pi),其中,X1,X2RdX_1,X_2\in R^dH(Y1,Y2)H(Y_1,Y_2)是LSH输出向量的汉明距离。为了保持cos相似度的高准确率,需要把kk设得比较大,这里和k-means一样,k=10000k=10000

因为对每个向量算LSH是相互独立的,所以这一步是可以高度并行化的。但是,在我们的case里,有10000的kk,有3.5M的dd,所以相当于要把包括了3.5M×1043.5M\times 10^4个服从N(0,1)N(0,1)浮点数的AA存到每个节点的内存里,也就是300G的内存消耗,这是肯定不行的。有很多解决方法,大部分方法是生成一个sparse的矩阵AA【kdd06的Very sparse random projections】。

而本文用了Online Generation of Locality Sensitive Hash Signatures里提到的pooling trick。

保存一个size是mm的pool BB,每个元素是从N(0,1)N(0,1)中随机出来的浮点数,m远小于transition matrix AA的size。要获取AijA_{ij}的一条记录,就是使用关于i,ji,j的一致性hash的方法在BB中找到一个index,然后查出它的值。在本文中,设置m=1000000m=1000000,将单节点的内存损耗从100G缩减到10M,可以直接用mr搞啦。

减少训练样本数

每个用户在每个域都有大量的日志数据,将每个用户在每个域只选取一个user-item对,具体为用户特征-用户在此域喜欢的所有item的平均分数

YoutubeDNN

https://daiwk.github.io/posts/dl-youtube-video-recommendation.html

参考http://www.sohu.com/a/155797861_465975

参考https://zhuanlan.zhihu.com/p/25343518

Deep neural networks for youtube recommendations

YouTube是世界上最大的视频上传、分享和发现网站,YouTube推荐系统为超过10亿用户从不断增长的视频库中推荐个性化的内容。整个系统由两个神经网络组成:候选生成网络排序网络。候选生成网络从百万量级的视频库中生成上百个候选,排序网络对候选进行打分排序,输出排名最高的数十个结果

候选生成网络(Candidate Generation Network)

候选生成网络将推荐问题建模为一个类别数极大的多分类问题:对于一个Youtube用户,使用其观看历史(视频ID)、搜索词记录(search tokens)、人口学信息(如地理位置、用户登录设备)、二值特征(如性别,是否登录)和连续特征(如用户年龄)等,对视频库中所有视频进行多分类,得到每一类别的分类结果(即每一个视频的推荐概率),最终输出概率较高的几百个视频。===>即,【使用用户特征,对所有视频进行分类,得到和这个用户最相关的几百个候选结果。

将推荐看成分类问题,用户UU在上下文CC中,选择视频ii的概率是:

P(wt=iU,C)=eviujVevjuP(w_t=i|U,C)=\frac{e^{v_iu}}{\sum _{j\in V}e^{v_ju}}

其中,viRNv_i\in R^N是第i个视频的emb,uRNu\in R^N是用户的emb,两个emb都是N维的,这里看起来是用内积viuv_iu把它们变成一个数。

由于视频有百万量级,所以做这么一个超大规模的分类,需要,并且使用的是到的样本通过importance sampling进行负采样(参考On using very large target vocabulary for neural machine translation)。对每一个example而言,他的cross-entropy是在true label和采样的负类中求min。在实践中,采样了数千个负类,比传统的softmax有将近100倍的速度提升。

另一种做法是hierarchical softmax(参考Hierarchical probabilistic neural network language model),但实践中效果没那么好。因为在hsoftmax中,遍历树里的每一个节点时,会引入对经常是毫无联系的类别的分辨,使得分类问题变得更困难以至于效果变差。

在线serving时,由于低延迟的要求,需要有对类别数是sublinear的时间复杂度的近邻检索方法,之前youtube的系统使用的是hashing的方法,即Label partitioning for sublinear ranking。因为在线的时候,softmax的输出没啥用,所以打分问题就变成了一个在点积的空间上进行最近邻检索的问题,有很多通用库可以用,例如基于LSH的ann算法: An Investigation of Practical Approximate Nearest Neighbor Algorithms

注:

item-embedding也可以参考https://zhuanlan.zhihu.com/p/24339183?refer=deeplearning-surfing里说的Item2vec: Neural Item Embedding for Collaborative Filtering的想法,把item视为word,用户的行为序列视为一个集合,item间的共现为正样本,并按照item的频率分布进行负样本采样,相似度的计算还只是利用到了item共现信息,缺点是:忽略了user行为序列信息; 没有建模用户对不同item的喜欢程度高低。

Modeling Expected Watch Time

训练用的是logistic regression加上cross-entropy,

假设第i个正样本的播放时长是TiT_i,使用weighted logistic regression,将正样本的权重设为播放时长,而负样本的权重设为1,这样,假设总共有N个样本,有k个被点击了,就相当于有了Ti\sum T_i个正样本,N-k个负样本。所以odds(注:一个事件的几率odds指该事件发生与不发生的概率比值)就是正样本数/负样本数=TiNk\frac{\sum T_i}{N-k}

而实际中,点击率P很低,也就是k很小,而播放时长的期望是E(T)=TiNE(T)=\frac{\sum T_i}{N},所以E(T)E(T)约等于E(T)(1+P)E(T)(1+P),约等于odds,即TiNk\frac{\sum T_i}{N-k}

最后在inference的serving中,直接使用eWx+be^{Wx+b}来产出odds,从而近似expected watch time。

参考https://en.wikipedia.org/wiki/Logistic_regression

odds是平均时长,训练时输入给sigmoid的是logit,

wx+b=logit=logoddswx+b = logit = log odds

所以,infer的时候:

E(T)=odds=elogit=elogodds=ewx+bE(T) = odds = e ^{logit} = e ^{log odds} = e^{wx+b}

参考tf的weighted sigmoid:weighted_cross_entropy_with_logits: https://www.tensorflow.org/api_docs/python/tf/nn/weighted_cross_entropy_with_logits

正常的sigmoid:

labels * -log(sigmoid(logits)) +
    (1 - labels) * -log(1 - sigmoid(logits))

weighted sigmoid只对正样本加权:

labels * -log(sigmoid(logits)) * pos_weight +
    (1 - labels) * -log(1 - sigmoid(logits))

代码实现

https://github.com/ogerhsou/Youtube-Recommendation-Tensorflow/blob/master/youtube_recommendation.py

关于数据集:

https://github.com/ogerhsou/Youtube-Recommendation-Tensorflow/commit/e92bac1b8b5deb0e93e996b490561baaea60bae8

使用的是https://github.com/facebookresearch/fastText/blob/master/classification-example.sh

在init_data函数中,给每个__label__xx编了个号,如:

__label__6 0
__label__12 1
__label__14 2
__label__7 3

然后read_data的时候,y就用这个编号来表示(假装是时长):

y.append(label_dict[line[0]])

而使用的是nce_loss(参考https://daiwk.github.io/posts/knowledge-tf-usage.html#tfnnnceloss):

ce_weights = tf.Variable(
    tf.truncated_normal([n_classes, n_hidden_1],
                        stddev=1.0 / math.sqrt(n_hidden_1)))
nce_biases = tf.Variable(tf.zeros([n_classes]))

loss = tf.reduce_mean(tf.nn.nce_loss(weights=nce_weights,
                     biases=nce_biases,
                     labels=y_batch,
                     inputs=pred,
                     num_sampled=10,
                     num_classes=n_classes))

cost = tf.reduce_sum(loss) / batch_size
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
out_layer = tf.matmul(pred, tf.transpose(nce_weights)) + nce_biases

采样

batch内shuffle采样(有放回)

On Sampling Strategies for Neural Network-based Collaborative Filtering

浅谈个性化推荐系统中的非采样学习

Sampling-Bias-Corrected Neural Modeling for Large Corpus Item Recommendations

NCE/负采样/sampled-softmax等

求通俗易懂解释下nce loss?

http://demo.clab.cs.cmu.edu/cdyer/nce_notes.pdf

自然语言处理-word2vec-负采样/Negative Sampling

https://www.tensorflow.org/extras/candidate_sampling.pdf

下载了一份:https://github.com/daiwk/collections/blob/master/assets/candidate_sampling.pdf

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型

召回常用Loss

表示学习中的7大损失函数梳理

Contrastive Loss

Triplet Loss

InfoNce Loss

Self-supervised Learning for Large-scale Item Recommendations

v3有两个图:https://arxiv.org/pdf/2007.12865v3.pdf

Focal Loss

Circle Loss

qalign

Spherical Graph Embedding for Item Retrieval in Recommendation System

自己下载了

代码:https://github.com/WNQzhu/Q-align

自己的注释:https://github.com/daiwk/llms_new/blob/main/demos/qalign.py

假设NK(u)N_K(u)是节点uuKK跳邻居,那么目标函数是最大化这些邻居的概率,即

maxfuVlogPr(NK(u)f(u))\max _f \sum_{u \in \mathcal{V}} \log \operatorname{Pr}\left(N_K(u) \mid f(u)\right)

label smoothing

https://spaces.ac.cn/archives/7359

Label smooth通过soft one-hot来加入噪声,减少了真实样本标签的类别在计算损失函数时的权重,而把剩余的权重均匀分配到其他类别上,使得模型不会盲目自信,最终在fine-grained任务上能有效抑制过拟合。

突破双塔

TDM->JTM

下一代深度召回与索引联合优化算法JTM

二向箔

xx

DR

字节最新复杂召回模型,提出深度检索DR框架解决超大规模推荐系统中的匹配问题

Deep Retrieval: An End-to-End Learnable Structure Model for Large-Scale Recommendations

多兴趣召回

推荐系统 多兴趣召回论文解读

sdim:https://zhuanlan.zhihu.com/p/560657191

transformer+召回

ICLR2020 cmu+google:

Pre-training Tasks for Embedding-based Large-scale Retrieval

粗排

COLD

CAN

poly-encoder

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

VIRT

虚拟交互:让双塔模型向单塔模型模仿如何分配注意力权重

VIRT: Improving Representation-based Text Matching via Virtual Interaction

精排

传统ctr

https://daiwk.github.io/posts/dl-traditional-ctr-models.html

lr for ctr

Simple and scalable response prediction for display advertising

Online Models for Content Optimization

gbdt for ctr

gbdt基础知识:

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

bagging全称叫bootstrap aggregating,每个基学习器都会对训练集进行有放回抽样得到子训练集,比较著名的采样法为0.632自助法。每个基学习器基于不同子训练集进行训练,并综合所有基学习器的预测值得到最终的预测结果。bagging常用的综合方法是投票法,票数最多的类别为预测类别。

boosting训练过程为阶梯状,基模型的训练是有顺序的,每个基模型都会在前一个基模型学习的基础上进行学习,最终综合所有基模型的预测值产生最终的预测结果,用的比较多的综合方式为加权法。

stacking是先用全部数据训练好基模型,然后每个基模型都对每个训练样本进行的预测,其预测值将作为训练样本的特征值,最终会得到新的训练样本,然后基于新的训练样本进行训练得到模型,然后得到最终预测结果。

bagging和stacking中的基模型为强模型(偏差低,方差高),而boosting中的基模型为弱模型(偏差高,方差低)。

bagging的特点:

  • 整体模型的期望等于基模型的期望,这也就意味着整体模型的偏差和基模型的偏差近似。

  • 整体模型的方差小于等于基模型的方差,当且仅当相关性为1时取等号,随着基模型数量增多,整体模型的方差减少,从而防止过拟合的能力增强,模型的准确度得到提高。

所以,bagging中的基模型一定要为强模型,如果bagging使用弱模型则会导致整体模型的偏差提高,而准确度降低。

boosting的特点:

  • 整体模型的方差等于基模型的方差,如果基模型不是弱模型,其方差相对较大,这将导致整体模型的方差很大,即无法达到防止过拟合的效果。因此,boosting框架中的基模型必须为弱模型。

  • boosting框架中采用基于贪心策略的前向加法,整体模型的期望由基模型的期望累加而成,所以随着基模型数的增多,整体模型的期望值增加,整体模型的准确度提高。

gbdt与Adaboost对比

相同:

  • 都是boosting,使用弱分类器;

  • 都使用前向分布算法;

不同:

  • 迭代思路不同:adaboost是通过提升错分数据点的权重来弥补模型的不足(利用错分样本),而GBDT是通过算梯度来弥补模型的不足(利用残差);

  • 损失函数不同:adaBoost采用的是指数损失,GBDT使用的是绝对损失或者Huber损失函数;

Learning the click-through rate for rare/new ads from similar ads

Using boosted trees for click-through rate prediction for sponsored search

Improving Ad Relevance in Sponsored Search

Stochastic Gradient Boosted Distributed Decision Trees

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

深度学习ctr

https://daiwk.github.io/posts/dl-dl-ctr-models.html

序列建模

一文看懂序列推荐建模的最新进展与挑战

从MLP到Self-Attention,一文总览用户行为序列推荐模型

Transformer在推荐模型中的应用总结

阿里妈妈点击率预估中的长期兴趣建模

DCN V2:Google提出改进版DCN,用于大规模排序系统中的特征交叉学习(附代码)

保序回归

参考https://zhuanlan.zhihu.com/p/88623159的代码,能画出下面的图

对于二分类问题,参考https://zhuanlan.zhihu.com/p/101766505

对lr+gbdt的负采样校准的方法

Practical Lessons from Predicting Clicks on Ads at Facebook

cvr预估

ecpc:用户给定一个粗粒度出价,模型可以在一定的范围内调价 ocpc:完全以模型出价为准

delay feedback https://zhuanlan.zhihu.com/p/555950153

时长预估

快手kdd 2022

Deconfounding Duration Bias in Watch-time Prediction for Video Recommendation

短视频推荐视频时长bias问题

拿物理时长(duration)分桶

D2Q 算法的具体做法如下:

  • 统计训练样本的 duration 分布,得到等频分桶分位点;

  • 将样本按照等频分桶分位点分成 k 个相互独立的分桶 DkD_k

  • 对不同 duration 分桶的样本,在组内统计时长分位数作为 label,得到 Duration-Aware Watchtime-Distribution label;

  • 分别在上述的分桶上训练时长预估模型 fkf_k

  • 图a:M个网络完全独立,分别学习各自的label,不共享特征 embedding,特征 embedding 空间随着分桶维度扩大线性增加,存储、训练的资源开销随之增加,实现成本较高,不符合工业界场景的要求;

  • 图b:M个网络共享底层特征,如果采用多输出的训练方式,则 batch 内样本分布不均的问题会导致子塔训练不稳定,收敛到局部最优。单塔单输出的训练方式在实际训练时效果稳定,收敛速度较快,是 D2Q 实现的基线版本。

  • 图c:单塔单输出模型中引入 Duration bias 模块,用于建模不同分桶下的样本差异(Res-D2Q),离线训练指标得到进一步的提升。

论文使用 XAUC、XGAUC 以及 MAE 等指标对时长回归效果进行评估。MAE 表示短视频预估时长与观看时长 label 的误差绝对值,表示模型回归精度,是回归任务的常用评估指标。

  • XAUC:将测试集中的样本两两组合,若组合的标签和预估值的序一致则为正序,否则为逆序,XAUC 是正序对数与总组合数的比值;

  • XGAUC:用户维度计算的 XAUC。

由于推荐系统主要优化候选集的排序,评估指标 XAUC 能够更加直观的反映预估时长序的好坏,与论文的优化目标更加适配。

多目标

多目标+推荐综述

Multi-task多任务模型在推荐算法中应用总结1

Multi-task多任务学习在推荐算法中应用(2)

多任务学习在推荐算法中的应用

阿里多目标

阿里提出多目标优化全新算法框架,同时提升电商GMV和CTR

Youtube多目标——MMoE

YouTube 多目标排序系统:如何推荐接下来收看的视频

https://daiwk.github.io/posts/dl-youtube-multitask.html

CGC

cgc参考paddle代码:cgc_demo.py

多场景

APG

APG: 面向CTR预估的自适应参数生成网络

摘要:目前基于深度学习的CTR预估模型(即 Deep CTR Models)被广泛的应用于各个应用中。传统的 Deep CTR Models 的学习模式是相对静态的,即所有的样本共享相同的网络参数。然而,由于不同样本的特征分布不尽相同,这样一种静态方式很难刻画出不同样本的特性,从而限制了模型的表达能力,导致次优解。在本文中,我们提出了一个高效率、高效果的通用模块,称为自适应参数生成网络(APG)。其可以基于不同的样本,动态的为CTR模型生成不同的模型参数。大量的实验表明,APG 能够被应用于各种 CTR 模型,并且显著的提升模型效果,同时能节省38.7%的时间开销和96.6%的存储。APG 已在阿里巴巴搜索广告系统部署上线,并获得3%的点击率增长和1%的广告收入增长。

APG: Adaptive Parameter Generation Network for Click-Through Rate Prediction

item冷启

poso

Personalized Cold Start Modules for Large-scale Recommender Systems

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

用户冷启

PeterRec

仅需少量视频观看数据,即可精准推断用户习惯:腾讯、谷歌、中科大团队提出迁移学习架构PeterRec

Parameter-Efficient Transfer from Sequential Behaviors for User Modeling and Recommendation

https://github.com/fajieyuan/sigir2020_peterrec

搞一个pretrain-finetune的架构,学好一套用户的表示,可以给各种下游任务用。

采用如下方式:

  • 无监督地学习用户表示:使用序列模型预测用户的下一次点击。为了能建模超长的u-i交互序列,使用类似NextItNet(A Simple Convolutional Generative Network for Next Item Recommendation)的模型

  • 使用预训练好的模型去有监督地finetune下游任务

  • 在各个下游任务间,想要尽可能共享更多的网络参数:参考learning to learn,即一个网络的大部分参数可以其他参数来预测(一层里95%的参数可以通过剩下的5%的参数来预测)。文章提出了model patch(模型补丁),每个模型补丁的参数量不到原始预训练模型里的卷积层参数的10%。通过加入模型补丁,不仅可以保留原来的预训练参数,还可以更好地适应下游任务。模型补丁有串行和并行两种加入方式。

序列推荐模型:

  • RNN:强序列依赖

  • CNN:可并行,能比RNN叠更多层,所以准确率更高。难以建模长序列是因为卷积核一般都比较小(如3x3),但可以通过空洞(dilated)卷积来解决,可以使用不变的卷积核,指数级地扩充表示域。

  • 纯attention:可并行,例如SASRec(Self-attentive sequential recommendation)。但因为时间和存储消耗是序列长度的平方的复杂度。

考虑到用户的点击序列往往成百上千,所以使用类似NextItNet的casual卷积,以及类似GRec(Future Data Helps Training: Modeling Future Contexts for Session-based Recommendation)的双向encoder的这种non-casual卷积。

与推荐系统现有的transfer learning对比:

  • DUPN:

    • 训练的时候就有多个loss。如果没有相应的loss和data,学好的用户表示效果就会很差。而本文只有一个loss,却能用在多个task上,所以算是一种multi-domain learning(Efficient parametrization of multi-domain deep neural networks)

    • DUPN在用户和item特征上需要很多特征工程,并没有显式地对用户的行为序列建模

    • DUPN要么finetune所有参数,要么只finetune最后一个分类层。PeterRec则是对网络的一小部分进行finetune,效果并不比全finetune差,比只finetune最后一个分类层要好很多

  • CoNet:杨强提出的Conet: Collaborative cross networks for cross-domain recommendation

    • cross-domain用于推荐的一个网络。同时训练2个目标函数,一个表示source网络,一个表示target网络。

    • pretrain+finetune效果不一定好,取决于预训练的方式、用户表示的表达能力、预训练的数据质量等

预训练时没有[TCL],fintune时加上。

  • 原domainSS:有大量用户交互行为的图文或视频推荐。一条样本包括(u,xu)S\left(u, x^{u}\right) \in \mathcal{S},其中,xu={x1u,,xnu}(xiuX)x^{u}=\left\{x_{1}^{u}, \ldots, x_{n}^{u}\right\}\left(x_{i}^{u} \in X\right)表示用户的点击历史

  • 目标domainTT:可以是用户label很少的一些预测任务。例如用户可能喜欢的item、用户性别、用户年龄分桶等。一条样本包括(u,y)T(u, y) \in \mathcal{T},其中yYy \in \mathcal{Y}是一个有监督的标签。

GNN+推荐

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

Graph Neural Networks in Recommender Systems: A Survey

Graph Neural Networks for Recommender Systems: Challenges, Methods, and Directions

https://daiwk.github.io/posts/dl-graph-representations.html

SIGIR2022 | SimGCL: 面向推荐系统的极简图对比学习方法

Are Graph Augmentations Necessary? Simple Graph Contrastive Learning for Recommendation

https://github.com/Coder-Yu/QRec

RL

快手强化学习与多任务推荐

bias v.s. debias

推荐系统炼丹笔记:推荐系统Bias大全 | Debias方法综述

position bias

搜索、推荐业务中 - position bias的工业界、学术界 发展历程 - 系列1(共计2)

推荐系统遇上深度学习(七十一)-[华为]一种消除CTR预估中位置偏置的框架

PAL

PAL: A Position-bias Aware Learning Framework for CTR Prediction in Live Recommender Systems

参考2007年的Predicting Clicks: Estimating the Click-Through Rate for New Ads一文中的推导,

给定位置pospos和对应的item xx,用户点击的概率可以分解为:

  • 给定posposxx,用户看到的概率P(seenx,pos)P(seen|x,pos)

  • 给定posposxx,用户看到后,点击的概率P(clkseen,pos,x)P(clk|seen, pos, x)

所以

P(clkx,pos)=P(seenx,pos)P(clkseen,pos,x)P(clk|x,pos) = P(seen|x,pos) * P(clk|seen, pos, x)

假设:

  • 用户没看到item,那么点击概率为0

  • 用户是否点击item和位置无关,只取决于用户是否看到item,即P(clkseen,pos,x)=P(clkx,seen)P(clk|seen, pos, x)=P(clk|x,seen)

  • item被看到的概率只和位置有关,和item本身无关,即P(seenx,pos)=P(seenpos)P(seen|x,pos) = P(seen|pos)

P(clkx,pos)=P(seenpos)P(clkx,seen)P(clk|x,pos)=P(seen|pos)P(clk|x, seen)

PAL就是搞两个塔:

  • 仅bias塔P(seenpos)P(seen|pos):输入pos等bias特征,预估用户会不会看到仅训练时使用

  • 无bias塔P(clkx,seen)P(clk|x, seen):输入item特征,预估无bias的点击率线上infer用

  • 带bias预估值:两个塔输出乘起来,预估有bias的点击率仅训练时使用

推荐系统之Position-Bias建模

工业界的一些推荐应用

dlrm

Facebook深度个性化推荐系统经验总结(阿里内部分享PPT))

instagram推荐系统

Facebook首次揭秘:超过10亿用户使用的Instagram推荐算法是怎样炼成的?

https://venturebeat.com/2019/11/25/facebook-details-the-ai-technology-behind-instagram-explore/

Instagram个性化推荐工程中三个关键技术是什么?

微信读书推荐系统

微信读书怎么给你做推荐的?

youtube推荐梳理

一文总览近年来YouTube推荐系统算法梳理

其他

混合推荐架构

混合推荐系统就是多个推荐系统“大杂烩”吗?

认知推荐

NeurIPS 2019 | 从感知跃升到认知,这是阿里在认知智能推荐领域的探索与应用

Learning Disentangled Representations for Recommendation

最后更新于