召回04:离散特征处理
本博文引自王树森老师推荐系统。视频地址:召回04:离散特征处理_哔哩哔哩_bilibili课件地址: https://github.com/wangshusen/RecommenderSystem
前面几节课介绍几种协同过滤的召回方法,后面几节课要介绍向量召回,在讲向量召回之前,大家先熟悉一下离散特征的处理,这节课的重点是one-hot的编码和embedding,有机器学习基础的同学可以跳过这节课。
离散特征处理离散特征在推荐系统中非常常见,性别是离散特征,分为男女两种类别,国籍是离散特征,比如中国、美国、印度,一共有200个左右的国家,英文单词是离散特征,常见的英文单词有几万个,物品ID是离散特征,比如小红书有几亿篇笔记,每篇笔记有一个ID这样的离散特征处理比较困难,因为类别数量实在太大了,用户ID也一样,小红书有几亿个用户,每个用户有一个ID,推荐系统会把一个ID映射成一个向量。离散特征的处理分两步,第一步是建立字典,把类别映射成序号。以国籍特征为例,建立一个国家的字典,比如中国序号是1,美国序号是2,印度序号是3.第二步是做向量化,把序号映射成向量。one-hot编码是一种常 ...
召回03:基于用户的协同过滤(UserCF)
本博文引自王树森老师推荐系统。视频地址:召回03:基于用户的协同过滤(UserCF)_哔哩哔哩_bilibili课件地址: https://github.com/wangshusen/RecommenderSystem
这节课我们继续学习推荐系统链路上的召回环节,这节课的方法叫做基于用户的协同过滤,简称UserCF。它跟前面介绍的ItemCF有很多相似之处。ItemCF是基于物品之间的相似性做推荐。这节课的UserCF是基于用户之间的相似性做推荐。
UserCF的原理首先解释UserCF的原理。作为小红书的用户,我在小红书的点击点赞收藏转发,可以体现出我兴趣爱好。小红书上至少有几百个跟我兴趣爱好非常相似的网友。虽然我不认识这些网友,但是小红书可以从大数据中挖掘出来。小红书知道我们的兴趣爱好非常相似。今天其中某个跟我兴趣非常相似的网友看了篇笔记,他很感兴趣,对笔记点赞转发,于是小红书就知道他喜欢这篇笔记。而我还没有看过这篇笔记。那么,推荐系统就有可能给我推荐这篇笔记。推荐的理由就是跟我兴趣爱好相似的网友喜欢这篇笔记。推荐系统如何找到跟我兴趣非常相似的网友呢?一种办法是判断两个人感兴趣 ...
召回02:Swing模型
本博文引自王树森老师推荐系统。视频地址:召回02:Swing 模型_哔哩哔哩_bilibili课件地址: https://github.com/wangshusen/RecommenderSystem
回顾ItemCF上节课的内容是基于物品的协同过滤,缩写是ItemCF。这节课介绍ItemCF的一个变体叫做Swing,在工业界很常用,Swing跟ItemCF非常像,唯一的区别就是怎么样定义物品的相似度,回顾一下上节课介绍的ItemCF。ItemCF,这样定义两个物品之间的相似度,如果喜欢物品$i_1$和$i_2$的用户有很大的重叠,那么判定物品$i_1$与$i_2$ 相似,ItemCF基于这样的假设,如果用户喜欢物品$i_1$,而且物品$i_1$与$i_2$相似,那么用户很可能也喜欢物品$i_2$。ItemCF就是基于这样的假设做推荐。再复习一下ItemCF计算两个物品相似度的公式,把喜欢物品$i_1$的用户记作集合$w_1$,$w_1$是用户的集合,把喜欢物品$i_2$的用户记作集合$w_2$,把集合$w_1$ $w_2$ 的交集记作$V$。集合$V$中的用户,同时喜欢物品$i_ ...
召回01:基于物品的协同过滤(ItemCF)
本博文引自王树森老师推荐系统。视频地址:召回01:基于物品的协同过滤(ItemCF)_哔哩哔哩_bilibili课件地址: https://github.com/wangshusen/RecommenderSystem
从这节课开始,我们学习推荐系统链路上的召回环节。
ItemCFItemCF的原理这节课内容是基于物品的协同过滤。缩写是ItemCF。item,意思是物品;CF是collaborative filtering的缩写,意思是协同过滤。
首先用个通俗的例子解释ItemCF的原理。比方说我喜欢看笑傲江湖,笑傲江湖与鹿鼎记相似,而且我没有看过鹿鼎记。那么系统会给我推荐鹿鼎记,推荐的理由是两个物品很相似。系统通过历史记录可以知道我喜欢看笑傲江湖,而且我没有看过鹿鼎记。但是推荐系统如何知道笑傲江湖与鹿鼎记相似呢?有很多种办法可以做到,比如用知识图谱。两本书的作者相同,所以两本书相似。还可以基于全体用户的行为判断两个物品的相似性,比如看过笑傲江湖的用户,也看过鹿鼎记。给笑傲江湖写好评的用户,也给鹿鼎记写好评。我们可以从用户的行为中挖掘出物品之间的相似性,再利用物品之间的相似性做推荐 ...
Basic-推荐系统的AB测试
本博文引自王树森老师推荐系统。视频地址:概要03:推荐系统的AB测试_哔哩哔哩_bilibili课件地址: https://github.com/wangshusen/RecommenderSystem
推荐系统算法工程师的日常工作就是改进模型和策略目标是提升推荐系统的业务指标,所有对模型和策略的改进,都需要经过线上的A/B测试,用实验数据验证模型和策略是否有效。召回团队实现了一种GNN召回通道,离线实验结果正向。但离线实验的结果有提升未必意味着线上实验也会有收益。做完离线实验,下一步是做线上的小流量A/B测试,也就是说,要把新的召回通道上线给用户使用观测用户的真实行为数据,比如日活留存点击交互。小流量:意思是把GNN召回通道只给一小部分用户使用,而不是全部的用户。这是因为新的召回通道到效果怎么样还不清楚,有可能会严重损害用户体验,所以先给随机选的10%用户使用,而不是一上来就给所有用户使用。除了判断GNN召回通道能带来多大的业务指标收益,A/B测试还可以帮助我们选择最优的参数。比如,GNN神经网络的深度可以是一层两层三层,不同的参数会有不同的效果,我们可以同时开三组A/B测试,哪 ...
Basic-推荐系统链路
本博文引自王树森老师推荐系统。视频地址:概要02:推荐系统的链路_哔哩哔哩_bilibili课件地址: https://github.com/wangshusen/RecommenderSystem
推荐系统链路第一步是召回,从物品的数据库中快速取回一些物品。比如小红书有几亿篇笔记,用户刷新小红书时,会调用几十条召回通道,每条召回通道选出几十到几百篇笔记,一共取回几千篇笔记。召回之后,要从几千篇笔记中选出用户最感兴趣的笔记。下一步是粗排,用规模较小的机器学习模型给几千篇笔记逐一打分,按照分数做排序和截断,保留分数最高的几百篇笔记。再下一步是精排,这里要用大规模的神经网络给几百篇笔记逐一打分,精排的分数反映出用户对笔记的兴趣,在精排之后可以做截断也可以不做,小红书不做截断,所有几百篇笔记都带着分数进入重排。重排是最后一步,这里会根据精排分数和多样性分数做随机抽样,最后得到几十篇笔记,然后把相似内容打散,并且插入广告和运营内容。
召回这些召回通道会返回几千篇笔记,然后推荐系统会融合这些笔记,做去重和过滤(过滤是指排除掉用户不喜欢的作者,笔记,话题)。
排序召回几千篇笔记后是做排序,排序 ...
Basic-推荐系统的基本概念
本博文引自王树森老师推荐系统。视频地址:概要01:推荐系统的基本概念_哔哩哔哩_bilibili课件地址: https://github.com/wangshusen/RecommenderSystem
小红书推荐系统转化流程绝大多数产品前两部步都是曝光和点击;滑动到底,点赞,收藏和转发说明用户对产品感兴趣,这是推荐系统利用的信号和依据;正面和中性的评论对社区的氛围很有好处,也是可以依据的信号。
短期消费指标
点击率 = 点击次数 / 曝光次数点击率越高说明推荐越精准,给用户推荐了用户感兴趣的内容。但点击率不是唯一的指标,否则骗点击的标题会泛滥,比如“xx震惊了”或者擦边图片骗点击。
点赞率 = 点赞次数 / 点击次数
收藏率 = 收藏次数 / 点击次数
转发率 = 转发次数 / 点击次数
阅读完成率 = 滑动到底次数 / 点击次数 × $f$(笔记长度)$f$是一个归一化的函数。和笔记的长度有关。这是因为笔记越长,完成阅读的比例就越低,如果没有归一化的函数对于长笔记很不公平。
通常来说,推荐的笔记越符合用户兴趣,点击点赞的行为就会越多,但他们不是衡量系统好坏的根本指标,一味追求 ...
属性统计
范数(norm)向量范数表示一个向量的大小(这里的大小(size)不涉及维度,而是份量的大小),是将向量映射为一个标量的函数$f$。通用的$L^P$范数定义如下:
\|x\|_{p}=(\sum_{i = 1}^n|x|^p)^\frac1p$L_1$范数计算的是向量所有元素绝对值的和,$L_2$范数计算的是向量元素所有平方和的平方根,$L_\infty$范数计算的则是向量中最大元素的取值。
向量范数的性质
正定性:$|x|\geq0$,当且仅当$x$=0时,$|x|=0$
齐次性:如果我们按常数因子$\alpha$缩放向量的所有元素,其范数也会按照相同的常数因子的绝对值缩放:
f(\alpha x)=|\alpha|f(x)
三角不等式:
f(x+y)\leq f(x)+f(y)与$L_2$范数相比,$L_1$范数受异常值影响较小。
矩阵范数示例123x = torch.full([8],1,dtype = torch.float) a = x.view(2,4)a,a.norm(1),a.norm(2),a.norm(3)
12345(tensor([[1., 1., 1., 1 ...
数学运算
加减除可以直接使用数学符号使用示例
123456a = torch.rand(3,4)b = torch.rand(4)print(a+b)print(a-b)print(a/b)
输出示例
123456789tensor([[1.5056, 1.3410, 1.7983, 1.5053], [0.9142, 1.5737, 1.6442, 1.3261], [1.1492, 1.7107, 1.3224, 1.4069]])tensor([[ 0.0681, -0.5971, -0.1151, 0.3996], [-0.5234, -0.3644, -0.2692, 0.2204], [-0.2883, -0.2274, -0.5910, 0.3012]])tensor([[1.0947, 0.3838, 0.8797, 1.7228], [0.2719, 0.6239, 0.7186, 1.3987], [0.5988, 0.7653, 0.3823, 1.5448]])
矩阵相乘直接用*是按 ...
拼接与拆分
拼接:Cat,Stack拆分:Split,Chunk
Cattorch.cat(tensors,dim)按维度拼接张量。参数说明:
tensors:要拼接的张量序列,可以是一个列表或元组。
dim:指定拼接的维度,默认为 0。使用示例
123a = torch.rand(4,32,8)b = torch.rand(5,32,8)torch.cat([a,b],dim = 0).shape
输出示例
1torch.Size(9,32,8)
Stacktorch.stack(tensors,dim)也能完成拼接,与cat不同的是,会在指定维度前创建一个新的维度。
使用示例
123a = torch.rand(4,32,8)b = torch.rand(4,32,8)torch.cat([a,b],dim = 0).shape
输出示例
1torch.Size(2,4,32,8)
要拼接的两个维度必须一模一样。
Splittorch.split(tensors,split_size_or_sections,dim)是按照长度len来拆分的。
tensor:要拆分的输入张量。
split ...