一.推荐系统介绍和应用
(1)推荐系统通俗解读
推荐系统就是来了就别想走了。例如在大数据时代中京东越买越想买,抖音越刷越是自己喜欢的东西,微博越刷越过瘾。
(2).推荐系统发展简介
1)推荐系统无处不在,它是根据用户的行为决定推荐的内容。用户每天在互联网中都会留下足迹,这样就会越来越多的用户画像。
2)为什么要推荐系统
卖的好的商品就那几种,其它就不管了吗?答案是否定的。80%的销售来自20%的热门商品,要想提高销售效率,需把不好卖的商品推荐出去。
3)推荐系统发展
<1>亚马逊1998年用简单的协同过滤做了推荐系统,能提高30%的销售额。<2>2015年深度学习崛起(有数据喂过来,机器自动来提特征等操作了,不用人为主观来判断了),推荐也随着改变。<3>今天是百花齐放,各大论文层出不穷。
(3).应用领域与多方位评测指标
1)广告都是钱,如地图导航,地图导航上的附近吃,玩,住的广告,单击进去,要收费。
2)不仅只是推荐产品,还可帮助完成决策,例如图模型做的事情太多了,真是万物互联。例如可能认识的好友推荐
3)知识图谱也是做好产品的必备技能,这样图模型才能做得好。
(4)任务流程与挑战概述
1)推荐系统里的常用词
item:商品;embedding:隐向量,用数值能让计算机识别的向量,例如对用户商品评分矩阵的分解;召回:粗略计算要返回的结果;打分:要排名得有一个统一的标准;重排:最终结果排序。
2)推荐系统经典流程
<1>模式是离线+近线+在线(召回+粗排+精排)。
<2>离线通常跑较大模型与算法,先得到当前数据的大致结果。
<3>粗排通常跟用户走,用户做了什么推荐结果也更新
<4>精排需根据业务规则返回结果,例百度中前几名的结果交的广告钱肯定交得更多。
3)推荐系统的难点与挑战
<1>人的标签与画像不再是难点,但人的兴趣等会变,你的推荐结果也要更新吧,这时特征工程也肯定要变才行,所以构建特征工程现在是难点。
<2>冷启动怎么办?例用户与商品冷启动,例用户新进来抖音,抖音不知道它的特征标签,画像等,那抖音推什么给他呢?抖音肯定不会放过每个用户。
(5)常用技术点分析
1)embedding方向:如何更好地表示数据,让计算机更好地读懂数据,肯定不用one-shot(例如一个商品在100个城市中,其中只用一个1表示某个城市,其它99个都是用0表示来编码,这样做就会出现稀疏庞大的矩阵,因为99个0没太多实际意义)。隐向量embedding的方法在推荐中几乎无处不用,例如常见的点击率估计的FM与DEEPFM算法中。
2)向量就是把内容转成计算机能识别的数字,例如一句话当中把每个字都转成不同维度的能让计算机识别的向量来,那一句话就能让计算机理解读懂了。向量是数值,能参与计算与建模,也是我们做特征提取过程中最需要解决的问题。
3)nlp方向:如何基于文本数据来推荐?感觉有点难。文本处理方法较多,例 如LDA,词向量,矩阵分解等。
4)知识图谱方向:2021年以来最火的技术点,肯定要用到推荐系统中。数据越多越能体现知识图谱的强大,万物互联。
5)cv方向:卷积,图卷积,图像与视频数据也是用户行为的体现。卷积不仅应用图像与视频数据中,矩阵数据都可以尝试卷积。
(6)与深度学习的结合
1)深度学习就是end2end的结构,先设计出一个网络,然后输入数据到网络中,最后等输出结果。把深度学习认为把复杂问题简单化的过程。
2)为什么需要深度学习?
宏观:人工特征工程难度大,深度学习可把特征做得更好。
二.推荐系统中常用的协同过滤与矩阵分解
(1)协同过滤与矩阵分解简介
物以类聚,人以群分
1)协同过滤
<1>基于用户的协同过滤算法
<2>基于商品的协同过滤算法
2)矩阵分解
<1>矩阵分解(如何得到用户对所有商品的评价)
<2>矩阵分解中隐式与显式分解情况
(2)基于用户与商品的协同过滤
1)基于用户的协同过滤(实际运用比较少)
用户的协同过滤关键是相似度计算设计好
<1>首先找到相似用户(相似度计算)
<2>属性特征,行为特征等都可以当作计算输入。
<3>例如user1中意1,2,3,4;而user2中意2,3。如果这二个用户计算后相似度较高,那就可把1与4推荐给user2
2)用户的协同过滤的不足
<1>因为用户的数据量是庞大的,构建的矩阵将很稀疏并且计算复杂度也很高。例如商品多,但用户买的商品却极少。又例如用户与商品都比较大时,计算矩阵相似度就很难了。
<2>人是善变的,用户特征也要随时要变
<3>用户冷启动问题
3)商品的协同过滤(实际运用中这个比较常用)
<1>还是要先得到用户与商品的交互数据
<2>若发现物品1,3经常一起出现,我们认为他两相关性较高,那这时user2买了物品2与3,所以可以把物品1也可推荐给user2了。
(3)相似度计算与推荐实例
用户与电影实例:
例如excel中的横向表示用户,纵向表示电影,现在估计出用户5对电影1的打分。首先算出商品1的协同过滤(即电影1与2,3,等等的相似度值);然后取相似度值为前2的商品出来当作加权系数,分别是0.64与0.52;而用户5对相似度值前2的商品做了打分,分别是2与3分;这时就可加权平均估算出用户5对电影1的打分:(0.64*2+0.52*3)/(0.64+0.52)
(4)矩阵分解的目的与效果
例如1亿用户与1000万商品构成的矩阵计算时间是很久的,那现在就需想一个中介来作为桥梁,把这矩阵分解后计算。
矩阵分解是推荐系统中使用最多的方法了。
例如现有数据横向表示歌曲,列向表示用户,当用户听过某首歌曲就对应行列中打上1,否则空白,这时要预测这空白处的值(将听过就1,否则打上0),这个矩阵看上去就是一个很稀疏的矩阵来的。
矩阵分解原理就是:原矩阵假设为m*n的,就如上面的m表示用户,n表示歌曲,那对它预测时可用上面说的协同过滤方法。当然现在是用矩阵分解来做,原理是 m*n的矩阵=m*k的矩阵一乘以k*n的矩阵二,例如矩阵一中k表示用三维的向量表示每个用户的特征,同理矩阵二中k表示用三维的向量表示每个歌曲的特征,这样两边矩阵的规模是一样的(shape值一致)。即前一矩阵的列等以后一矩阵的行就可用矩阵乘法。
(5)矩阵分解中的隐向量
通过上面的矩阵分解原理可知隐向量其实就是特征的高维表达,只不过很难去理解。而最终目的是预测大矩阵中的空白值,我们做法就是给定目标函数,这时可想到用机器学习中的回归等算法,然后对这二个分解后的小矩阵进行优化,最终把大矩阵(m*n)中空白的值补充完整,相当于更新了剩下的向量值。最后还原回大矩阵。
(5)目标函数简介
1)原始目标函数与回归方程很像,最终目的就是优化后的2个小矩阵还原回去后越接近大矩阵越好。小矩阵优化还是用梯度下降,并加上正则惩罚项,防止某些值异常大。
2)对原始目标函数进行改进,因为用户可能对商品打分很低或商品本身就很好的固有属性,所以在原始目标函数中对每一个用户与商品分别加入一个偏置项作为向量的一部分参与计算。
3)公式为:设用户矩阵为X,商品矩阵为Y,R为评分的大矩阵,a为惩罚项系数。则有
min(sum(R-X转置*Y)的平方)+a*(sum(X的平方+sum(Y的平方)),其中sum表示求累加和。可把前一部分的min(sum(R-X转置*Y)的平方)当作回归,后半部分a*(sum(X的平方)+sum(Y的平方))当作正则化,而正则化一般通用格式就是a*(矩阵的平方)。这里的平方是指向量相乘,不是某个貝体值。
(6)隐式情况分析
1)上面说的用户直接对歌曲打分并构建出向量特征的情形是属于显式情况;而通常收集的数据是用户的行为,没那么直接的,例如观看的时间,点击次数等指标,像这种就是属于隐式情况。
2)这种隐式数据怎么求解呢?
<1>首先定义个置信度,例置信度公式为C=1+k*X,其中X是单击次数,k是置信度系数,1是默认常数表示置信度默认值(即没点击商品,C都是为1)。这公式告式告式我们单击次数越多,置信度越大。置信度值Y越大越要向用户推荐商品。
<2>重新定义评分,规则是有点击(不管点击次数是多少)的就设为1,否则为0,设评分值为P。这里点击次数越多为什么评分越高呢?因为它公式中还有一个置信值来控制。虽然没有评分,但这里自定义出一个评分出来。最后得到隐式情况的最新优化目标的公式为:
G(X,Y)=(sum(C)*((P-X转置*Y)的平方))+a*(sum(X的平方+sum(Y的平方)),其中C表示置信度值,其它与显式中说明的一样。
<3>从上面隐式这个公式可知置信度值C越大,则预测准备点,否则它的损失值就越大了。
<4>隐式公式求解:也是交替使用最小二乘法来求解,固定Y优化X,再固定X优化Y。
六.点击率估计FM与DeepFM算法
(1)CTR(点击通过率:即用户点这个广告的概率)估计与其经典方法概述
人家认为深度学习的逻辑回归或线性神经网络或树模型都可做这种二分类问题,因为输入就是一个广告矩阵数据,但实际上没那么简单,用户是否点击广告与多个因素和环境有关的,所以将用FM与DeepFM算法来搞,FM与DeepFM算法是要解决特征工程中的特征间的组合。
(2)二项式特征的作用与挑战
1)特征情况:特征维度高,主要还涉及很多离散型的特征,通常都是通过one-shot来处理,所以稀疏性高。如果还考虑特征间的组合,这样计算起来是相当吓人的。
2)如何解决高维并且非常稀疏的特征?
<1>我们知道最终是解决特征间组合带来的问题,这是直接用二阶多项式来解决。二阶多项式的公式:Y(X)=W0+sum(Wi*Xi)+sumsum(Wij*Xi*Xj)
其中Wi,Wij都表示权重值,sum是指累加和。其中前部分W0+sum(Wi*Xi)是线性模型(其中W0当作是偏置项),即W0+sum(Wi*Xi)表示的是一阶特征,而后面的sumsum(Wij*Xi*Xj)是二阶部分。我们最终目的是算出权重参数值来,对于这个公式求解,你也许认为和一阶类似直接用梯度下降(偏导)来算,但是这真的会没问题吗?像Xi*Xj这二个稀疏矩阵(好多为0)相乘后大概率会为0,那这样用梯度下梯来算就没意义了。所以用以前这种直接用梯度下降来算是有问题的。而且sumsum是相乘的(累加后再相乘),如果维度很大时,计算也会很恐怖的。
(3)二阶公式推导与化简
(4)FM算法解析
1)上面公式二阶部分的Wij可用两个隐向量内积表示,向量是可由多少个维度表示的。设Wij=<Vi,Vj>,其中Vi与Vj是二个隐向量,它的计算主要是对二阶部分做内积展开,合并同类项与合并成平方项等操作,其实FM是借用隐向量来求解权重值。
2)原公式中的二项式计算的时间复杂度是O(n的平方),现在只需求kn(其中n是指隐向量个数,k是维度,维度值通常不大,例k=4),就好像大矩阵mn=(小矩阵mk)*(小矩阵kn)。那这些隐向量V又怎么表示出来,感觉还要进行预训练,很麻烦一样噢,解决方法就直接用升级版本DeepFM。
3)特征间组合较多时,自然会想到好兄弟:神经网络。因为可把神经网络想像成特征提取器,当特征庞大到无法人为处理时就用神经网络给我们来做吧。
(5)DeepFM整体架构解读
1)FM融合到神经网络中
<1>不管用啥算法,但凡用深度学习做,都更简单了。
<2>整体架构:FM+DNN(即隐藏层,全连接),最后在(FM输出结果+DNN输出结果)上加多一个sigmoid输出概率结果
<3>embedding是FM的重点,它不但是输入进行embedding,权重值也是进行embedding
<4>还是需要进行特征组合的
(6)输入层所需数据样例
输入的一条样本假设有7个特征(用field表示),每个特征由向量组成,向量又可以是大于等于1维的向量。例如由男生/女生;哈尔滨/沈阳/长春;打篮球/不打篮球这7个特征组成,当取男生,哈尔滨,打篮球时对应的索引值是0,2,5。这三个索引对应的数据值假设均为1,其余四个为0,这里是指取这些特征就用1表示。在做embedding时,传入的通常为索引值,而不是实际数据。
(7)embedding层的作用与总结
1)其实是设计多组权重参数
2)其中包括了一阶与二阶的
3)权重参数就是embedding
七.DeepFM算法实战