推荐系统实战第01课 推荐系统简介
推荐系统介绍(what why where)
Industrial Recommendation System
1、推荐系统是什么(what)
•分类⽬录(1990s):覆盖少量热门⽹站。Hao123 Yahoo
•搜索引擎(2000s):通过搜索词明确需求。Google Baidu
•推荐系统(2010s):不需要⽤户提供明确的需求,通过分析⽤ 户的历史⾏为给⽤户的兴趣进⾏建模,从⽽主动给⽤户推荐能 够满⾜他们兴趣和需求的信息。
•2020s?
**一种数学定义: **
-
设C为全体用户集合 n
-
设S为全部商品/推荐内容集合
-
设u是评判把 s i s_i si推荐 c i c_i ci的好坏评判函数
-
推荐是对于c∈C,找到s∈S,使得u最大,即
∀ c ∈ C , s c ′ = argmax ( u ( c , s ) ) s ∈ S \forall c \in C, s^{\prime}_{c}=\operatorname{argmax}(u(c, s)) s \in S ∀c∈C,sc′=argmax(u(c,s))s∈S
- 部分场景下是通过TOP N推荐
搜索 vs 推荐的区别
搜索引擎热力图和长尾理论图
2、为什么推荐系统越来越火?(why)
推荐系统存在的前提:
- 信息过载
- ⽤户需求不明确
推荐系统的⽬标:
- ⾼效连接⽤户和物品,发现长尾商品
- 留住⽤户和内容⽣产者,实现商业⽬标
推荐系统意义
1、对用户而言:
找到好玩的东西
帮助决策
发现新鲜事物
2、对商家而言:
-
提供个性化服务,提高信任度和粘性
-
增加营收 …
3、推荐系统需要做怎么做? (How)
根据用户的:
a) 历史行为
b) 社交关系
c) 兴趣点
d) 所处上下文环境
e) …
去判断用户的当前需求/感兴趣的item
4、**寻求解决信息过载的思路 **
- 之前解决相信过载的方式有:
分类导航页 => 雅虎
搜索引擎 => 谷歌,必应,度娘
-
但是,人总是期望计算机尽量多地服务
我们不愿意去想搜索词
希望系统自动挖掘自己的兴趣点
希望系统能给我们惊喜
-
推荐系统就在这种环境下产生的。目前有今日头条,虾米音乐,电商猜你喜欢,豆瓣…等等。
5、推荐系统结构
推荐系统评估
一、评估指标
•准确性 •满意度 •覆盖率 •多样性 •新颖性 •惊喜度
•信任度 •实时性 •鲁棒性 •可扩展性 •商业⽬标 •⽤户留存
用户的偏好的显示反馈和隐式反馈(Explicit vs Implicit)
1、准确性
**①准确性(学术界) **
评分预测:
打分系统 设 r u i r_{u i} rui为用户u对物品i的实际评分, r ^ u i \hat{r}_{u i} r^ui为预测分,则有如下误差判定标准
- 均方根误差
R M S E = ∑ u , i ∈ T ( r u i − r ^ u i ) 2 ∣ T ∣ \mathrm{RMSE}=\sqrt{\frac{\sum_{u, \mathrm{i} \in T}\left(r_{ui}-\hat{r}_{u i}\right)^{2}}{|T|}} RMSE=∣T∣∑u,i∈T(rui−r^ui)2
- 平均绝对误差
M
A
E
=
∑
u
,
i
∈
T
∣
r
u
i
−
r
^
u
i
∣
∣
T
∣
\mathrm{MAE}=\frac{\sum_{u, i \in T}\left|r_{u i}-\hat{r}_{u i}\right|}{|T|}
MAE=∣T∣∑u,i∈T∣rui−r^ui∣
topN推荐
设R(u)为根据训练建立的模型在测试集上的推荐, T(u)为测试集上用户的选择
准确率 vs 召回率
Recall = ∑ u ∈ U ∣ R ( u ) ∩ T ( u ) ∣ ∑ u ∈ U ∣ R ( u ) ∣ \operatorname{Recall}=\frac{\sum_{u \in U}|R(u) \cap T(u)|}{\sum_{u \in U}|R(u)|} Recall=∑u∈U∣R(u)∣∑u∈U∣R(u)∩T(u)∣
Recall = ∑ u ∈ U ∣ R ( u ) ∩ T ( u ) ∣ ∑ u ∈ U ∣ T ( u ) ∣ \operatorname{Recall}=\frac{\sum_{u \in U}|R(u) \cap T(u)|}{\sum_{u \in U}|T(u)|} Recall=∑u∈U∣T(u)∣∑u∈U∣R(u)∩T(u)∣
②准确性(⼯业界)
2、覆盖度
1、覆盖率
C
o
v
e
r
a
g
e
=
∣
⋃
u
∈
U
R
(
u
)
∣
∣
I
∣
Coverage=\frac{\left|\bigcup_{u \in U} R(u)\right|}{|I|}
Coverage=∣I∣∣∣⋃u∈UR(u)∣∣
2、信息熵
衡量一个事件的不确定性的。候选的越多,说明不确定性越强。
H
=
−
∑
i
=
1
n
p
(
i
)
log
p
(
i
)
H=-\sum_{i=1}^{n} p(i) \log p(i)
H=−i=1∑np(i)logp(i)
当信息熵越大,推荐的越是均匀,照顾的长尾越大的。
3、基尼系数
衡量财产分配平稳程度的指标(判断分配平等程度的指标)。
设实际收入分配曲线和收入分配绝对平等曲线之间的面积为A,实际收入分配曲线右下方的面积为B。并以A除以(A+B)的商表示不平等程度。
G = 1 n − 1 ∑ j = 1 n ( 2 j − n − 1 ) p ( i j ) G=\frac{1}{n-1} \sum_{j=1}^{n}(2 j-n-1) p\left(i_{j}\right) G=n−11j=1∑n(2j−n−1)p(ij)
p ( i j ) 表 示 通 过 流 行 度 排 序 第 j 小 的 商 品 出 现 的 次 数 的 概 率 。 p\left(i_{j}\right)表示通过流行度排序第j小的商品出现的次数的概率。 p(ij)表示通过流行度排序第j小的商品出现的次数的概率。
4、分层流量占比
3、多样性
优秀的推荐系统能保证推荐结果列表中物品的丰富性(两 两之间的差异性)。
设s(i,j)表示物品i 和 j之间的相似度,多样性表示如下:
D
i
v
e
r
s
i
t
y
(
R
(
u
)
)
=
1
−
∑
i
,
j
∈
R
(
u
)
,
i
≠
j
s
(
i
,
j
)
1
2
∣
R
(
u
)
∣
(
∣
R
(
u
)
∣
−
1
)
Diversity(R(u))=1-\frac{\sum_{i, j \in R(u), i \neq j} s(i, j)}{\frac{1}{2}|R(u)|(|R(u)|-1)}
Diversity(R(u))=1−21∣R(u)∣(∣R(u)∣−1)∑i,j∈R(u),i̸=js(i,j)
D i v e r s i t y = 1 ∣ U ∣ ∑ u ∈ U Diversity ( R ( u ) ) Diversity=\frac{1}{|U|} \sum_{u \in U} \text {Diversity}(R(u)) Diversity=∣U∣1u∈U∑Diversity(R(u))
多样性&新颖性&惊喜性
-
多样性:推荐列表中两两物品的不相似性。(相似性如何度量?)
-
新颖性:未曾关注的类别、作者;推荐结果的平均流⾏度
-
惊喜性:历史不相似(惊)但很满意(喜)
-
信任度:提供可靠的推荐理由
-
实时性:实时更新程度
往往需要牺牲准确性
- 使⽤历史⾏为预测⽤户对某个物品的喜爱程度
- 系统过度强调实时性
4、Exploitation & Exploration (开发与探索)
什么是Bandit算法(为选择而生)
我们会遇到很多选择的场景。上哪个大学,学什么专业,去哪家公司,中午吃什么等等。这些事情,都让选择困难症的我们头很大。那么,有算法能够很好地对付这些问题吗?
当然有!那就是Bandit算法。
Bandit算法来源于历史悠久的赌博学,它要解决的问题是这样的[1]:
一个赌徒,要去摇老虎机,走进赌场一看,一排老虎机,外表一模一样,但是每个老虎机吐钱的概率可不一样,他不知道每个老虎机吐钱的概率分布是什么,那么每次该选择哪个老虎机可以做到最大化收益呢?这就是多臂赌博机问题(Multi-armed bandit problem, K-armed bandit problem, MAB)。
怎么解决这个问题呢?最好的办法是去试一试,不是盲目地试,而是有策略地快速试一试,这些策略就是Bandit算法。
这个多臂问题,推荐系统里很多问题都与它类似:
- 假设一个用户对不同类别的内容感兴趣程度不同,那么我们的推荐系统初次见到这个用户时,怎么快速地知道他对每类内容的感兴趣程度?这就是推荐系统的冷启动。
- 假设我们有若干广告库存,怎么知道该给每个用户展示哪个广告,从而获得最大的点击收益?是每次都挑效果最好那个么?那么新广告如何才有出头之日?
- 我们的算法工程师又想出了新的模型,有没有比A/B test更快的方法知道它和旧模型相比谁更靠谱?
- 如果只是推荐已知的用户感兴趣的物品,如何才能科学地冒险给他推荐一些新鲜的物品?
•Exploitation:选择现在可能最佳的⽅案
•Exploration:选择现在不确定的⼀些⽅案,但未来可能会有⾼收益 的⽅案。
在做两类决策的过程中,不断更新对所有决策的不确定性的认知,优化 长期的⽬标函数
推荐系统里面有两个经典问题:EE和冷启动。前者涉及到平衡准确和多样,后者涉及到产品算法运营等一系列。
Multi-armed bandit problem
- 推荐系统领域,领域有两个经典问题:EE问题和用户冷启动问题。[2]
EE问题:上面提到过的exploit-explore问题;比如已知某用户对A产品感兴趣,那么在大多数时间要给他推送A的链接才能赚钱,这就是exploit;但是为了赚更多的钱,就需要知道他还对哪些产品感兴趣,那么在有些时候就可以尝试一下给他推送B,C,D,E等选择看用户的反应,这就是explore。
用户冷启动问题:面对新用户时如何用尽量少的次数,猜出用户的大致兴趣。[2]
- 临床测试场景clinical trials
假设有一批用于治疗某种疾病的新药需要进行测试,目标肯定是在尽量少的测试体上进行尝试,找出效果最好的那一种然后应用于其他病患。由于测试需要等待并观察,尽早找出效果最好的药物类型也有利于救助更多的病患;同时,该方法也有助于减少承受不良药物副作用的测试体数量/增加病患存活率。[3]
**Bandit算法-原理 **
-
Epsilon-Greedy:以1-epsilon的概率选取当前收益最⼤大的臂, 以epsilon的概率随机选取⼀一个臂。(缺点是后续观察后就找到规律了,就不必要继续以当前概率探索)
-
Upper Confidence Bound:均值越⼤大,标准差越⼩小,被选中的 概率会越来越⼤大
x ‾ j ( t ) + 2 ln t T j , t \overline{x}_{j}(t)+\sqrt{\frac{2 \ln t}{T_{j, t}}} xj(t)+Tj,t2lnt
(首先探索出了一些一定的价值,大概知道每个老虎机的收益率,Upper的意思是认为我们后面探索的是会更好。右边的上量表示总共试过多少,右边下量表示这个老虎机试过多少次,当前老虎机探索的越多,给的机会就越小。目的是相对均匀的选择老虎机去做探索,不让一个老虎机做过多的探索。)
- Thompson Sampling:每个老虎机臂维护一个beta(wins, lose)分布, 每次⽤用现有的beta分布产⽣生⼀一个随机数,选择随机数最⼤大的臂继续做探索。探索完之后,去更新beta分布。
区别:
Upper Confidence Bound(UCB):对于一个老虎机来讲,每次返回的策略结果一样。从收敛的角度来讲,ucb比较慢。
Thompson Sampling(汤普森采样):有一定的随机策略,他是靠分布产生一个随机数,他不是一个确定的事件。只是满足一个分布。从收敛的角度来讲,汤普森采样实现简单,计算量复杂度小。
Bandit算法代码实现
import numpy as np
import matplotlib.pyplot as plt
import math
number_of_bandits=10
number_of_arms=10
number_of_pulls=10000
epsilon=0.3
min_temp = 0.1
decay_rate=0.999
def pick_arm(q_values,counts,strategy,success,failure):
global epsilon
if strategy=="random":
return np.random.randint(0,len(q_values))
if strategy=="greedy":
best_arms_value = np.max(q_values)
best_arms = np.argwhere(q_values==best_arms_value).flatten()
return best_arms[np.random.randint(0,len(best_arms))]
if strategy=="egreedy" or strategy=="egreedy_decay":
if strategy=="egreedy_decay":
epsilon=max(epsilon*decay_rate,min_temp)
if np.random.random() > epsilon:
best_arms_value = np.max(q_values)
best_arms = np.argwhere(q_values==best_arms_value).flatten()
return best_arms[np.random.randint(0,len(best_arms))]
else:
return np.random.randint(0,len(q_values))
if strategy=="ucb":
total_counts = np.sum(counts)
q_values_ucb = q_values + np.sqrt(np.reciprocal(counts+0.001)*2*math.log(total_counts+1.0))
best_arms_value = np.max(q_values_ucb)
best_arms = np.argwhere(q_values_ucb==best_arms_value).flatten()
return best_arms[np.random.randint(0,len(best_arms))]
if strategy=="thompson":
sample_means = np.zeros(len(counts))
for i in range(len(counts)):
sample_means[i]=np.random.beta(success[i]+1,failure[i]+1)
return np.argmax(sample_means)
fig = plt.figure()
ax = fig.add_subplot(111)
for st in ["greedy","random","egreedy","egreedy_decay","ucb","thompson"]:
best_arm_counts = np.zeros((number_of_bandits,number_of_pulls))
for i in range(number_of_bandits):
arm_means = np.random.rand(number_of_arms)
best_arm = np.argmax(arm_means)
q_values = np.zeros(number_of_arms)
counts = np.zeros(number_of_arms)
success=np.zeros(number_of_arms)
failure=np.zeros(number_of_arms)
for j in range(number_of_pulls):
a = pick_arm(q_values,counts,st,success,failure)
reward = np.random.binomial(1,arm_means[a])
counts[a]+=1.0
q_values[a]+= (reward-q_values[a])/counts[a]
success[a]+=reward
failure[a]+=(1-reward)
best_arm_counts[i][j] = counts[best_arm]*100.0/(j+1)
epsilon=0.3
ys = np.mean(best_arm_counts,axis=0)
xs = range(len(ys))
ax.plot(xs, ys,label = st)
plt.xlabel('Steps')
plt.ylabel('Optimal pulls')
plt.tight_layout()
plt.legend()
plt.ylim((0,110))
plt.show()
Bandit算法-效果
Bandit算法的应用
•兴趣探索
•冷启动探索(新用户来了,不晓得他的兴趣爱好)
•LinUCB:加⼊特征信息。⽤User和Item的特征预估回报及其置信区 间,选择置信区间上界最⼤的Item推荐,观察回报后更新线性关系的参 数,以此达到试验学习的⽬的。
•COFIBA:bandit结合协同过滤
•基于⽤户聚类挑选最佳的Item(相似⽤户集体决策的Bandit);
•基于⽤户的反馈情况调整User和Item的聚类(协同过滤部分)
EE实践
•兴趣扩展:相似话题,搭配推荐
•⼈群算法:userCF、⽤户聚类
•Bandit算法
•graph walking
•平衡个性化推荐和热门推荐⽐例
•随机丢弃⽤户⾏为历史
•随机扰动模型参数
眼前的苟且&远⽅的⽥野
-
探索伤害⽤户体验,可能导致⽤户流失
-
探索带来的长期收益(留存率)评估周期长,KPI压⼒⼤
-
如何平衡实时兴趣和长期兴趣?
-
如何平衡短期产品体验和长期系统⽣态?
-
如何平衡⼤众⼜味和⼩众需求?
-
如何避免劣币趋势良币?
二、评估方法
-
问卷调查:成本⾼
-
离线评估:
只能在⽤户看到过的候选集上做评估,且跟线上真实效果存在偏差
只能评估少数指标
速度快,不损害⽤户体验
- 在线评估:A/B testing
(离线只能评估比较少的指标,比如说准确率,覆盖度,多样性。 但是留存率等只能在在线评估。)
实践:离线评估和在线评估相结合,定期做问卷调查。
AB testing
单层实验:以某种分流的⽅法(随机、uid%100),给每个实验组分配⼀定的流量。每个实验组配置不同的实验参数。
•只能⽀持少量实验,不利于迭代
•实验之间不独⽴,策略之间可能相互影响
•分流⽅式不灵活
多层重叠实验框架
•保留单层实验框架易⽤,快速的优点的同时,增加可扩展性,灵活 性,健壮性。
•核⼼思路:将参数划分到N个⼦集,每个⼦集都关联⼀个实验层, 每个请求会被N个实验处理,同⼀个参数不能出现在多个层中。
分配函数(流量在每层被打散的⽅法)如何设计?如何保 证每层流量分配的均匀性和正交性?
•如何处理实验样本的过滤(eg只选取某个地区的⽤户、只 选取新⽤户)?
•分配多⼤的流量可以使实验置信?
《Overlapping Experiment Infrastructure: More, Better, Faster Experimentation》
推荐系统实践
如何解决冷启动问题
推荐系统的冷启动问题
•⽤户冷启动:如何为新⽤户做个性化推荐
•物品冷启动:如何将新物品推荐给⽤户(协同过滤)
•系统冷启动:⽤户冷启动+物品冷启动 本质是推荐系统依赖历史数据,没有历史数据⽆法预测⽤户偏好
⽤户冷启动
1.收集⽤户特征
•⽤户注册信息:性别、年龄、地域
•设备信息:定位、⼿机型号、app列表
•社交信息、推⼴素材、安装来源
2.制造粗粒度选项,引导⽤户填写兴趣
3.transfer learning:使⽤其它站点的⾏为数据。例如腾讯视频 &QQ⾳乐,今⽇头条&抖⾳
4.新⽼⽤户推荐策略的差异
-
新⽤户在冷启动阶段更倾向于热门排⾏榜,⽼⽤户会更加需要长尾 推荐(参考Performance of recommender algorithms on top-n recommendation tasks,Netflix@RecSys2010)
-
推荐候选的代表性&多样性
-
Explore Exploit⼒度
-
使⽤单独的特征和模型预估
-
保护⽤户体验(物品冷启动探索、⼴告、推送)
物品冷启动
- 物品冷启动时会遇到哪些问题?
- 如何做物品冷启动推荐?和⽤户冷启动策略有哪些异同?
- 如何评估物品冷启动推荐的质量及带来的收益?
- 实验传统的ab testing⽅法是否能够验证冷启动优化效果?
⼯业界推荐系统架构
推荐系统架构
推荐系统架构-Netflix,2013
推荐系统架构-Taobao,2015
推荐系统架构-YouTube,2016
用户历史消息、特征、模型、候选池等
召回仓、预估仓、重排仓等。
推荐系统发展阶段
•1.0:关联规则、热门推荐等统计⽅法
•2.0:矩阵分解、协同过滤等ML⽅法,离线计算推荐列表
•3.0:召回 + learning to rank重排序
•4.0:召回&排序实时化
•5.0:end2end深度学习,⼀切皆embedding
•6.0:智能化推荐系统
推荐系统的发展趋势
学术界&⼯业界区别
推荐系统学习规划
推荐系统学习资料
-
《Item-Based Collaborative Filtering Recommendation Algorithms 》
-
《 Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model 》
-
《Matrix factorization techniques for recommender systems》
⼯业实践学习资料
•Facebook实践:recommending items to more than a billion people
•Quora是如何做推荐的? •《Real-time Personalization using Embeddings for Search Ranking at Airbnb》 •《Deep Neural Networks for YouTube Recommendations》
•《Wide & Deep Learning for Recommender Systems》
•《Ad Click Prediction: a View from the Trenches