m6
0、推荐系统
推荐系统本质上是一个过滤系统,是将海量的信息进行逐步过滤,最终为用户(user)在特定场景呈现他最可能喜欢的东西。事实上所有的推荐系统都是围绕着用户、场景及物品这三点来做文章。无论是推荐、电商抑或是广告系统,都是在充分利这三点信息的情况下,最大程度地去逼近各自的目标(留存、点击等)
【推荐系统的偏差问题】
-
选择偏差:用户的主观选择使数据带有偏向,比如用户倾向于选择和评价他们喜欢的内容,用户更有可能评价特别差或好内容,但这不是真实表现的无偏估计,可以采用插值方式对为打分的样本人工赋值,并在损失函数中降低人工处理过的样本权重
-
一致性偏差:用户打分会有从众现象,可以给模型输入对物品 I 的打分人数、平均分等,让模型学习到这些社会因素
-
曝光偏差:未曝光的数据认为不感兴趣,对于那些未被曝光的内容,并不能表示用户不喜欢。
-
流行度偏差:流行度高的物品越来越流行,降低了个性化程度,尤其是小众偏好的用户
-
公平性问题:对特定群体有偏袒,比如性别
-
循环偏差:偏差的恶性循环
-
位置偏差:用户倾向与列表头部的内容交互,而不太管这些内容是否真的是自己喜欢的
详细:https://zhuanlan.zhihu.com/p/470852961
【推荐系统的设计】
1️⃣数据
有用户数据、物品数据、所处的上下文信息等
用户数据:第一类是用户的自有属性,包括年龄、性别、住址、职业、婚恋状态、受教育程度、消费水平等。第二类是用户的行为数据,分为隐式反馈(如浏览、点击、收藏、购买)和显示反馈(如对物品的评分、评价)两类,但其中隐式反馈要比显示反馈更有价值,可用性更强。因为前者一定程度上能够代表用户真实的心理诉求,且数据量庞大,而后者数据较为稀疏。第三类是用户的关系数据,分为强关系(如互相关注)与弱关系(互相点赞、评论),关系数据一般也可用于召回策略。
物品数据:一般代表物品的自有属性,比如商品的分类、型号、标签、文章长度、关键词等。除此之外还有一些统计类数据,例如商品/内容点击率,历史点赞数等等
上下文信息:描述推荐行为产生时的场景的信息,我们最常用的一般是时间、地点、天气等等。
2️⃣存储
推荐系统所依赖的数据是由离线、近线和实时数据三部分组成。这三部分数据又互相渗透,彼此交互,共同组成推荐系统的数据支持体系。对于离线数据,通常需要线下对数据进行清洗、过滤及存储,离线处理数据主要使用Hadoop,Spark等技术,数据经过清洗处理后,存入以HDFS为典型代表的离线存储系统,供离线模型读取使用;同时会将其中部分数据导入到Redis用于线上进行实时计算。近线计算从消息队列里订阅数据,如Kafka。
3️⃣模型,有很多个模型可以供选择
4️⃣ 传统的离线估计
拿到样本后,将样本划分为训练集和测试集,用训练集训练模型,用测试集评估模型效果。常用的方法是handout,K折交叉验证,留一验证、自助法(bootstrap)
其中handout:将整个数据集分成三份,70%训练集,10%验证集,20%测试集,Holdout检验的缺点也很明显,即在验证集上计算出来的评估指标与训练集和测试机的划分有直接关系
k-fold交叉验证:先将全部样本划分成 k 个大小相等的样本子集,依次遍历这 k 个子集,每次都把当前子集作为验证集,其余所有子集作为训练集,进行模型的训练和评估,最后将所有 k 次的评估指标的平均值作为最终的评估指标,在实际经验中,k 经常取值为 10。
留一验证:每次留下1个样本作为验证集,其余所有样本作为测试集,样本总数为n ,进行 n 次验证,再将评估指标求平均得到最终指标。
自助法:不管是holdout检验还是交叉检验,都是基于划分训练集和测试集的方法进行模型评估的,当样本规模比较小时,将样本集进行划分,会进一步缩小训练集,有影响模型的训练效果。自助法(Bootstrap)是基于自助采样法的检验方法:对于总数为n 的样本集合,进行 n 次有放回的随机抽样,得到大小为 n 的训练集,在 n 次采样过程中,有的样本会被重复采样,有的样本没有被抽出过,将这些没有被抽出的样本作为验证集进行模型验证,就是自助法的验证过程。
然后需要设计多个指标从不同的维度评价模型,可以应用分类和回归的评价指标,此外还有NDCG、GAUC、mAP(平均精度均值):
然后快速迭代改进模型
5️⃣replay,离线仿真,模拟线上环境
以时间为维度保存线上流量数据并构造样本,模型按照时间轴,不断进行增量训练,并不断进行模型的离线评估。
6️⃣ Interleaving+AB Test 两级实验结构筛选模型
Interleaving:假定有2个推荐模型分别得到了2个推荐序列,将它们混合生成多个序列,如A1,B1,A2,B2,A3...,B1,A1,B2,A2,...,观察同一组用户对于混合序列的评价指标,然后比较模型的好坏
AB+test:将用户无差别的分成数量一样的2组,一组观看模型1的推荐序列,另一组是模型2,然后记录并比较指标,最后取出较好的模型
⑦ 在线学习
比如Wide&Deep模型采用了 FTRL 算法+L1正则化,而不是梯度下降,它兼顾了模型稀疏性(更错参数=0)和精度:
0、基于评论的推荐系统,它的基本目标就是评分预测 (Rating Prediction),因此本质上是一个回归问题,有十几个模型可供选择
【DeepCoNN】Deep Cooperative neural Networks
DeepCoNN是第一个使用评论以联合方式表示用户和项目的深度模型。分为2部分,左边处理用户,右边处理评论,左边的输入是用户 i 写的所有评论,连成文档,右边是商品 j 收到的所有评论,连成文档
以左边为例,假定文档有n个词,先通过embeding,形成 n * c 的矩阵,然后通过卷积和池化层,也就是textCNN,假定有 m 个核,每个核大小为 t*c,以其中一个核为例,通过该核卷积后
形成 (n-t+1) * 1的向量,然后通过池化层变成1个数,m个核的结果拼接为一个向量,再通过一层神经网络降维成xu向量。对评论也是同样处理,生成yi,这两个向量做拼接,形成z
z 的每个元素就作为样本的每个特征,标签是用户 i 对商品 j 的评分,接一个 FM 模型来训练
详细:https://blog.csdn.net/beginerToBetter/article/details/108804429
1、gcn
无向图模型,解决的问题是:已知节点向量(可以是词袋向量)、标签、节点之间的关系来训练网络,预测的时候输入新的节点向量和关系,来预测标签
图卷积神经网络是指在图结构中做卷积操作的神经网络,它解决的是对图中的节点进行分类的问题,其中仅有一小部分节点有标签。
工程(空域)角度理解gcn:
假定每个节点有个V维向量,邻接矩阵是A,全图的节点特征X是N*C大小,即有N个节点则N行,仅有一层GCN,对于节点x1
1️⃣先进行图卷积(聚合周围邻居)
比如对所有的邻居向量和自己求平均:
即 度矩阵D̃的逆矩阵 * Ã * X,Ã = A + I,若不同节点的重要程度不同,可以加个可以训练的 lambda 参数:
补充知识点:邻接矩阵按行求和可以得到度矩阵
为了能够加权平均,将低度数节点的权重提高,高度数的降低,同时由于归一化了两次,所以将"-1 "改为"-1/2",因此:
X左边的记为A^
2️⃣然后通过神经网络,最后接一个softmax,
1层 gcn 公式:activation(A^ * X * W+b)
2层 gcn 就是:
这个神经网络对所有节点都是共享的,若是多层GCN,则中间的GCN层输出是个向量。层数越大,则节点能够聚合到更多的节点信息,若为6-7层,任何网络的节点都能看到整个图的信息了,一般用2层或3层的模型可以得到最好的结果
数学(频域)角度理解gcn:
【离散卷积】
结果是一个序列,其中的第n个元素是2个无限维度的向量点积结果,第二个向量做了翻转又平移:
几何理解:第一个是个无限维向量f,第二个是经过翻转过的向量g,做一个点积后得到一个结果,然后第二个向量平移一个单位,再做一次点积得到第二个结果.....
【连续卷积】
把离散的求和换成了积分,结果是一个函数,当x=n时:
【CNN卷积】
离散卷积的特殊情况,此时离散卷积的n表现为位置(i,j),g是卷积核,f是具有规则结构的数据(如图像),其中卷积核是已经翻转过的,所以做一次点积能得到结果矩阵一个元素,然后移动一下卷积核,再做一次卷积得到结果矩阵的第二个元素....
【早期的时域图卷积】
针对图这样不规则的数据,这里没有明确的卷积核的概念了,节点 i 的值=邻居节点(包括i)的值的加权和,权重是边权重,值是上一层的值
缺点:非常明显,没有卷积核作为共享参数,只是简单进行了特征的汇聚;另外,当图的规模很大时,计算量也是非常大的。
【第一代图卷积】
设图中的节点值为f,时域(空间域)卷积为g,因为时域卷积不好直接计算,根据卷积定理,f和g在时域上的卷积=两者变换到频域上的表示做相乘后再做傅里叶逆变换:
(证明:
)
根据傅里叶变换公式:
所以 f 在频域上的表示F(f)即 f 的傅里叶变换可以看做 f 分别与傅里叶变换的每个基向量e-iwt做内积后再拼接起来所形成的无限维向量,即(f*e-iw1t,f*e-iw2t,f*e-iw3t...)
又因为傅里叶变换的基向量e-iwt是拉普拉斯算子的特征向量
(证明:
)
且拉普拉斯算子与拉普拉斯矩阵是等价的
(证明:
首先需要从谱图理论说起:
的拉普拉斯算子:
从几何角度上可以视作:所有自由度上进行微小变化后所获得的函数增益,或者各个自由度的函数增益之和
类似的,可以在图里面定义节点的增益是它和各个邻居节点的增益和,并把这个和叫做拉普拉斯算子在节点 处的值
那两个节点的增益怎么定义呢?
在网络中,节点 i 和邻居 j 之间的增益定义为 ,考虑进边的权重,增益就定义为 ,记为
其中 表示网络中节点 的值, 包含所有节点的值:
若是加权图,则图中的点 的度 并不是和该点相连的点的数量,而是和其相连的边的权重之和,也就是邻接矩阵的每一行的值加起来,即:
所以对于节点 来说,它从它的每个邻居节点所获得的总增益就是拉普拉斯算子在节点 处的值:
拉普拉斯算子在所有的节点上的作用结果就是:
就是图的拉普拉斯矩阵(Graph Laplacian),记作 ,W是邻接矩阵,或者记为A,D是度矩阵。所以图拉普拉斯算子作用在由图节点信息构成的向量 上得到的结果等于图拉普拉斯矩阵 * 向量 。所以拉普拉斯算子与拉普拉斯矩阵是等价的
另外拉普拉斯矩阵是实对称阵,所以可以对角化,且存在正交矩阵U,使得:
因为对于任意向量 ,有:
所以拉普拉斯矩阵是半正定的(或者通过证明瑞雷商>=0)实对称阵,并且其最小的特征值为
当 f 为图节点的标签向量时,该式子还可以刻画图的平滑度。
)
所以傅里叶变换的基向量e-iwt是拉普拉斯矩阵L的特征向量,即U的列向量
U来自于对L进行对角化的结果,L = U*l*U'
所以 f 在频域上的表示,即图的傅里叶变换 F(f) = U' f,在U'中每行对应傅里叶变换中的一个基向量
根据正交性,图的傅里叶变换就是对频域表示左乘U:U *F(f) = f,F-1(x) = U*x,所以:
这就是第一代图卷积,其缺点十分明显:需要从拉普拉斯矩阵的特征分解来获得U,当N很大时,拉普拉斯矩阵L的维度N*N,特征分解的计算量就很大。同时,矩阵相乘的复杂度也很高,最后,没有使用归一化的拉普拉斯矩阵,也就会存在度很大的节点影响过大。后面的二代GCN和三代GCN就是对上述缺点的解决。
【第二代图卷积】
令g为对角阵的K次多项式函数,f=x,可得:
此时没有U了,不用特征分解了,但是计算L的k次方复杂度很大,且没有使用归一化的拉普拉斯矩阵
【第三代图卷积】
归一化拉普拉斯矩阵:Lsym(或者叫拉普拉斯矩阵L的对称规范化):
同样根据瑞雷商可以证明拉普拉斯矩阵的对称规范化Lsym的特征值在[0,2]之间,也是半正定的实对称阵
g 采用了切比雪夫多项式的线性组合,切的定义:
根据cos那个公式可以看出,幂次n转移成一个系数,这样就不需要求矩阵的n次方了,但是切要求特征值在[-1,1]之间,所以定义 F(A) = Lsym - I ,原来的U和g里面的对角阵都得换
新的U 和对角阵来自于对 F(A) 做的对角化:
所以可以推导:
(图中的D是度矩阵,A是邻居矩阵,或者W表示,后面又为了简化运算,不考虑二阶以上的切比雪夫多项式,于是令k=1,结尾把 I 移到了 A 里面和A相加)
总而言之,就是先把图上节点X通过傅里叶变换(左乘U')映射到频域,再经过 g 处理,再逆变换返回空间域(左乘U),这里用到了傅里叶变换的思想,由于在空间域问题上不好解决,所以映射到频域做处理,处理好了再映射回空间域,这种思想也类似于FFT,对多项式乘积问题,不直接相乘,而是先做点值表示,乘完后,再求出系数。
【图卷积层】
定义为:经过图卷积后再经过一层神经网络,即activation(A^ * X * W+b)
gcn主要缺点:1.融合时边权值是固定的,不够灵活。2.可扩展性差,因为它是全图卷积融合,全图做梯度更新,当图比较大时,这样的方式就太慢了,不合适。3.层数加深时,结果会极容易平滑,每个点的特征结果都十分相似。
2、GraphSAGE
无向图模型,若是有向图,则需要添加反向边变成无向图,给定节点和他们的局部邻居向量(可以是词袋向量),节点标签,训练网络,预测时,输入预测节点和其部分邻居向量,能得到结果
GraphSAGE主要解决了两个问题:1.不需要所有nodes的图数据,不用看到全图。2.解决了图规模较大,全图进行梯度更新,内存消耗大,计算慢的问题。以上两点都是通过一个方式解决的,也就是采子图的方式,由于采取的子图是局部图且是随机的,从而大大增加模型的可扩展性
假定节点 A、B、C 处于目标集合中,想要他们最后的embedding以便输入新的网络或者它们的softmax向量,那如何得到它们的embedding呢?
分为两大步:先采样、后聚合
1️⃣采样:每个点先随机采样 n 个邻居,邻居不必是挨着的全部邻居,得到了3个点的邻居们,把这些邻居们和3个点做为新集合,记为第1跳,得到新集合的邻居2,记为第2跳邻居
以此类推,为方便假定只有2跳
2️⃣聚合:从最后一跳往前走,利用聚合函数+映射 从第二跳邻居的初始 embedding (可以是词袋向量)得到第一跳集合的 embedding,再由第一跳集合的embedding得到目标3个点的embedding
以方框中的为例,聚合函数+映射的操作如下:
先将1的邻居(2个2)分别降个维,然后通过聚合函数聚合为1个向量,然后和1的旧向量(和邻居处于同一时刻的向量)拼接,拼接结果乘以矩阵W并加上激活函数(即,拼接结果通过一层神经网络),在除以自己模长做归一化,该结果向量作为1的新向量
聚合函数有多种:
a.平均聚合:邻居embedding取平均
b. 归纳式聚合:对目标节点和邻居emebdding取平均
c. LSTM聚合:LSTM函数不符合“排序不变量”的性质,需要先对邻居随机排序,然后将随机的邻居序列embedding 作为LSTM输入,最后的输出就是聚合结果。
3、GAT
适用于有向图+无向图
GCN每次做卷积时,边上的权重每次融合都是固定的,那能不能灵活一点,加个attention,让模型自己去学,那GAT就来干这个事了。它采用了多头注意力机制,多个头学到的注意力侧重点不同,能更好的增强模型表现力。
解释:图注意力层的输入与输出都是向量,假定有K个头,输入节点 i 向量,每个头的输出结果取平均,再通过一个激活函数得到输出向量。
对于单个头的计算,先得到 节点 i 对每个邻居(包括它自己)的注意力权重,然后加权求和,注意力权重的计算方式如下:
两个向量通过W得到2个新向量,拼接后再通过神经网络得到一个值,激活函数用leakyrel,再通过一层softmax,即:
详细:https://zhuanlan.zhihu.com/p/404826711
4、rgcn
对图中的边进行了分类,1个类别对应一种关系,所以每条边属于一种关系,从而能实现边预测和节点预测,如
假定1个节点的邻居按照关系分为5类,它自己算单独一类,它的邻居都指向它,每个类的神经网络不同,针对一个类的一个邻居而言:
先让它经过神经网络:先通过一层简单的映射,再规范化,即除以这个类的大小,其他类也同样处理(圆角矩形框)
如果有门机制的话,处理结果前面乘以1个权重,这个权重的计算是节点向量*该边类型参数矩阵(1个类型对应1个参数矩阵)
然后相加(绿框)
最后全部类的结果加起来再通过激活函数(relu),就得到该节点的下一层表示向量,图形化表示:
公式化表示:
为方便假定神经网络就是个线性映射,为了应对关系太多导致参数量特别大的情况,文中提出2种方法,第一个是,基函数分解法:将对应关系的参数矩阵表示成基的线性组合,基是所有关系共享的,只有基的系数与关系有关,即:
第二个是块对角矩阵:将参数矩阵用块对角矩阵表示,即用B个小矩阵组成分块对角矩阵,这样就会有很多0出现了,就减少计算量了:
rgcn可以完成节点分类和关系预测的任务,对于关系预测,每个关系对应一个关系矩阵,训练时,用初始节点向量*关系矩阵*末尾节点向量(f),再通过sigmoid(l),得到是正确三元组的概率,通过替换节点可以形成负样本,最后损失函数就基于负采样:
预测关系时,带入两个节点,然后遍历所有的关系,取最大的
评价:gcn,graphsage,gat都会使得和邻居节点向量趋同,rgcn也是,不过它还考虑了边类型(关系类型)
5、VGAE
即GCN+vae
考虑单个节点(所有节点共享参数),编码阶段设置两个gcn,分别输出节点的均值向量和log方差向量,后面就和vae一样了,然后生成Z,只不过这个Z包含了图的所有节点,然后输入到解码器:激活函数(ZZ'),得到重构(reconstruct)出来的邻接矩阵,损失是重构损失和分布(噪音)损失,图形表示:
4、取样使得满足某种特定分布 f(x)
【取舍采样法】
构造mq<=f,求出mq的累积积分Q(x)=积分 mq (负无穷到x),然后在(0,1)随机取 n 个值,如一个值是 i ,求 xi 使得 Q(xi) = i,xi 要不要呢?
以概率 p = f/mq 要,即 ( 0,1 ) 随机取一点 t ,t<p ,则要,否则扔到
最后留下来的样本都几乎服从 f 分布
缺点是 mq 不好找
4、多标签分类问题
1️⃣ 若总共有n个标签,拆分成 n 个二分类问题分别独立训练,缺点是没有考虑标签之间的关联性,是一阶策略分类算法
2️⃣ 将多标签分类问题转换为多分类问题。把个可能的标签对,映射成个自然数。其映射函数记为,则原数据集变为:
根据新构建的数据集训练一个多分类器,给定一个测试样本后,多分类器输出一个自然数,根据输出的自然数映射回标签集,该算法被称为LP(Label Powerest)算法
详细:https://blog.csdn.net/qq_32797059/article/details/94175324