前言:
算是给自己搞点新的事情去处理吧,输出有助于自己整理思路
越到后面越晕,二刷的时候再整理一下笔记吧,现在估计很乱,和我现在脑子里的思路一样。
1. 入门概念
1.1 推荐系统的目的:
找到user和item之间的联系
1.2 推荐适用场景:
什么时候不适合于做推荐:
- 工具类产品
- 物品过少,联系不会造成太多影响
- 用户留存回访低,这个情况下,推荐也是很难去处理的。
- 当增加的连接数主要靠增加的活跃用户和增加物品数做贡献,那么就不适合增加推荐系统,而当连接可以自发生长,那么就比较适合推荐系统加速这个过程。(我理解就是,如果客户留存不强,或者对陈旧物品完全没想法,那么整体下来,推荐就是比较难做的,推荐能做的,就是增加用户看到的物品的可能性)
这里我就衍生出2个问题:
- 广告类的推荐是不是都会存在留存过低的问题?
- 内容推荐/电商类的推荐才是真的可以累积经验的?
1.3 推荐系统预测问题模式:
- 评分预测:
- 预测目标:预测分数与实际分数差距越来越小(量化标准之一:均方根误差)
- 难点:数据质量,评分分布
- 行为预测
- 优势:数据量比用户明确的评分反馈大
- 预测行为方式:预测行为发生概率(点击率)or 预测物品相对排序(rank算法)。
感觉是,行为预测解决数据不均衡问题,解决大头部分,然后,评分预测解决最终的点击率提升
1.4 几个常见问题
- 冷启动问题:新用户/不活跃用户/新物品/展示次数较少的物品,解决方案都是加数据,从已有数据中学习
- 探索利用问题:已有兴趣点与新兴趣点需要做到平衡。大部分推荐感兴趣,小部分试探新的兴趣。
- 安全问题
1.5 推荐系统的几个关键元素
- ui 和ue
- 数据
- 领域知识
- 算法
2. 内容推荐
1. 用户画像
- 整体用户画像的适用阶段:匹配评分与召回。
- 构建方向:可以自己从业务逻辑构建,也可以直接适用机器学习方法(潜语意模型,矩阵分解得到的隐因子,embedding向量)
- 评价指标:排序好坏/召回策略
2. 文本建立到用户画像
(感觉就是word2vec方法?)
2.1 结构化文本/构建特征方式
- 关键词提取:TF-IDF和TextRank
- 实体识别:基于词典的方法结合CRF模型
- 内容分类:将文本按照分类体系分类
- 文本:从文本直接划分多个类簇
- 主题模型:从文本中提取主题向量,在预测各个主题的概率分布。
- 嵌入:embedding方法。
TF-IDF方法
- 在一篇文字中反复出现的词更重要
- 在所有文本中都频繁出现的词更不重要
TextRank方法
出现共现关系的会互相支持对方成为关键词。
内容分类方法
短文本分类方法:SVM
现有开源方法:facebook的FastText
实体识别:
序列标注问题(隐马尔可夫模型或者条件随机场)
词典法:先分毫词典,然后使用 trie-tree数据结构存储,然后匹配。
工业级别工具:spaCy,NLTK
聚类
算法:LDA主题模型算法(达到软聚类效果,一个文本属于多个类簇),需要计算k个主题之间两两相似程度,筛选较低的k值。
开源工具:Gensim,PLDA
词嵌入
词向量的用途:(word2vec)
- 词之间相似度描述,扩充结构化标签
- 累加得到文本稠密向量
- 用于聚类,可以得到更好的语意聚类效果
2.2 标签选择
前面的方法为特征构建,然后这一步是建立标准做特征筛选。
常用方法:
卡方检验(词和类别的关系,如果有关系,则为关键词)
信息增益(和决策树里面的信息增益感觉差不多,就是看增加一个特征之后,信息增加多少,从而判断最重要的特征)
卡方针对每一个行为单独筛选一套标签,然后信息增益是针对全局做统一筛选。
2.3 内容推荐框架
主要步骤与核心点:
- 数据源头扩充
- 数据清洗与信息提取:内容挖掘与用户分析(抓住主题,直接到嵌入分析),产出为结构化内容库,内容分析模型(分类器模型,主题模型,实体识别模型,嵌入模型)
- 内容推荐算法:Lucene中的BM25F算法
- 算法
3. 近邻推荐
3.1 协同过滤
3.1.1 基于用户的协同过滤
核心:用户物品关系矩阵
计算方式:通过用户物品向量计算用户相似度。
输出:
问题:
- 矩阵稀疏处理方式:大部分元素由于是0,所以可以用CSR或者COO存储。
- 相似度计算:随机抽出10维计算。现有技巧:DIMSUM 算法,或者把循环使用向量来计算。
- 用户量大:原始矩阵map成用户对,值为两个用户对同一个物品的评分积。
- 遍历用户喜欢物品列表
- 获取相似用户列表
- 拼接为:(相似用户id,物品id,1),value(相似度)
(相似用户id,物品id,0),value(喜爱程度*相似度) - 结果: (相似用户id,物品id,0)/(相似用户id,物品id,1)
- 优化:
- 对热门物品增加惩罚。
- 增加喜欢程度的时间衰减。
3.1.2 基于物品的协同过滤
- 物品之间相似度优化:
- 物品中心化:感觉就是归一化,去掉边缘值。value-avg(value)
- 用户中心化:用户维度,计算均值,然后把他打过的分都减去均值 value-avg(value)
- 计算推荐结果:
topk问题:
目标:计算用户u对物品i的分数
- 遍历u打过分的m个物品,计算这些物品与i的相似度
- 相似度*用户评分,处以相似度的和,就得到加权平均
直接推荐相似物品 - 直接推荐和物品i相似度较高的物品
slope one 算法
遗留问题:
slope one怎么做到在线更新
3.1.3 相似度:
数据分类:
- 欧式距离(计算绝对差异)
- 余弦相似度(计算方向差异)
- 皮尔逊相似度:实际上也是余弦相似度,不过弦对向量做了中心化。向量各自减去均值,再计算相似度。
-
jaccard 相似度(只适合bool类型):交集元素个数在并集中所占比例。适用于隐式反馈。
遗留问题:
社交网络会适合那一类方法:
4. 矩阵分解
4.1 netflix prize中推荐算法
近邻模型问题:
- 物品之间相关性。
- 矩阵稀疏导致计算结果不稳定。
矩阵分解:技术的svd算法(奇异值分解)
机器学习框架核心(损失函数/优化算法)
增加偏置信息:(比svd要多学习2个参数)
增加历史行为:
在学习参数上增加:x(隐式反馈的物品向量),y(用户属性向量)
时间因素:
- 评分按照时间加权
- 对评分时间划分区间,不同时间区间分别学习出隐因子向量
- 对特殊的期间,如节日,周末等训练对应的隐因子
4.2 矩阵分解优化方法
评价标准:
- 偏差:偏差大,欠拟合
- 方差:方差大,过拟合
交替最小二乘法
优点:
隐式反馈
one-class:从解决评分预测问题专向解决预测行为
算法改进成:加权交替最小二乘:
(行为的次数是对行为的置信度反应)
问题:真谛没有反馈的缺失值怎么处理
- 隐式反馈只有正类别确定,负类别是假设的。所以很可能导致正负类样本很不均衡。
解决方案:根据物品的热门程度做负采样。
算法汇总:
- topk:facebook有开源的faiss 和NMSLIB
- 先推荐产品簇,然后再增加排序统计算法作为最终推荐结果。
4.3 排序算法:贝叶斯个性化排序(BPR模型)
目标:能够较好的为用户排列出更好的物品相对顺序
计算相对顺序。
评价标准:auc
目标函数:目标函数的构造和auc是搭配的。
训练方法:结果重复抽样的梯度下降
5. 模型融合:
- 挖掘
- 召回
- 排序
经典融合模型:gbdt+lr
梯度下降优化算法:google13年发布的FTRL
特征组合:
因子分解机:用于模型融合,对召回结果重新排序。
FFM:(需要对样本做归一化)
wide and deep模型:
6.mab:
bandit算法:
把推荐具体物品,上升到选择策略。
bandit算法:计算选择会带来多少遗憾,遗憾越少越好。bandit累积遗憾增长慢,就是好算法
常用算法:
汤普森采样算法:每一类基于不同的贝塔分布,取随机数,取最大。
ucb算法:同样的以平均收益为基准,对于选择次数不足的给予照顾,选择倾向是哪些确定收益较好的算法:
贪婪算法:感觉就是,给一个随机数e(0-1),以1-e的概率选择平均收益最大类。
同bandit算法解决冷启动问题:
结合上下文的bandit算法:
LinUCB算法
随着m增加,置信上边界减少
高级版ucb:
有部分特征对应的参数是在左右候选之间共享的,就是无论哪个被选中,都会去更新这部分参数。
bandit算法与协同过滤结合
COFIBA算法:
内容相关。
针对第i个用户,每次推荐时做如下操作:
更新类簇的办法:
ee问题:
- 真的在探索的时候不能推荐质量过低的问题
- 需要有精心的产品设计
7. 深度学习在推荐系统中的应用:
深度学习中可以帮助推荐系统的部分:
- embedding:矩阵分解的隐因子,word2vec(目的是得到词的嵌入向量)
- predicting
各种2vector-》 AntoEncoder:学习不同的嵌入向量
youtube 视频推荐
rnn构建个性化音乐
结合上时间属性之后的优化
其他应用算法:
rank算法:
- 热门排行榜
- 针对老用户也推荐热门产品
- 整理兜底方案
时间因素
好评率预估公式:威尔逊区间
加权采样算法:
有限数据集
- 等概率采样
-
利用指数分布
流采样
-
蓄水池采样:
推荐候选的去重策略:
去重:
- 内容源去重
- 不重复的给用户推荐
simhash算法
最开始主要是搜索引擎公司使用。
不太重要的词,设置权重为1或者-1
(每个词hash成一个整数,有jenkins算法)
BloomFilter 算法 布隆过滤器
防止重复内容。(针对内容id的去重复)
工程部分:
只想说,前面的理论是入门的个鬼,完全跪了。
看工程部分能不能不那么令人头秃
常见架构:
1. 典型信息流架构:
Activity Stream的feed架构
2. netflix个性化推荐架构:
在线任务:防止重复的过滤,简单算法逻辑,模型预测阶段,商业目标相关的过滤与调权,场景有关的逻辑,互动性强的算法。
离线任务:模型训练与推荐结果计算。
近线任务:数据来源是实时的,进入在线数据库,等到有发生请求再提供服务。(流计算,storm,spark streaning,flink,manhattan)
3. 总览推荐框架和搜索,广告的关系:
搜索:解决为精准快速的展示结果,主要目标为降低延迟与提高相关性
推荐:时间杀手,给用户展示多样性,
广告:给信息找人,带有纯粹的商业目标。
架构抽象
- 过滤候选:推荐系统中的召回则为过滤候选。
- 排序候选:排序上的差异主要是目标不一样。(排序模型:BM25,Learn to rank模型)
- 个性化输出:
推荐系统与搜索引擎是存在互助的。搜索累积客户兴趣,推荐满足长期兴趣。
常见模块:
1. 数据采集
数据采集:
- 报表统计
- 数据分析:找原因,数据质量,为什么好或者坏。知道商业推广,开发方式。
- 机器学习:
日志的数据模型:
- 数据属性
- 物品数据
- 事件
- 关系数据
收集哪些数据:
- 埋点
- 业务数据库(用户,事件,事件发生时间,从什么事件而来,事件发生时用户属性,事件发生时物品属性)
用什么工具:
质量检测:
- 完整性
- 一致性
- 正确
- 及时
2.实时推荐:
需要满足:数据实时进来,实时计算,实时更新
实时流数据:kafka,storm,flink
效率提升:
- 剪枝:利用hoeffding不等式确认确认不用更新物品对相似度。(发现一个物品对更新次数达到最少更新次数,或者是相似度小于设定阈值,就直接判定不相似)
- 加窗:滑动窗口(近k次会话,近k次行为记录)
- 采样:短时间大量的数据
- 缓存:使用redis或者memcached
3. 数据驱动与实验平台:
重叠实验平台:(划分流量的方法,基于流量来做切分)
bandit算法同时可以做测试,选择不同的参数组合,策略,动态实时的跟进用户表现给出选择策略。
3. 推荐系统服务化:
效果保证:
1. 指标:
现在有多好:
- 评分准确度:rmse
- 排序
- 分类准确率
- 社交关系数量/用户停留时长
- 新颖性
推荐系统是否健康,能好多久
- 个性化:取一天的日志,计算用户推荐列表的平均相似度。
- 基尼系数:推荐次数越不平均,基尼系数就趋近于1
- 多样性。
2. 攻击方式:
防护方式:
3. 开源工具与框架:
内容分析(主题模型/词嵌入/文本分类)
协同过滤与矩阵分解
模型融合
产品部分:
扫一下就好
答题还是跪了: