深度学习在线教育平台实践---协同过滤推荐系统

对于商品内容进行分析,进而根据商品内容进行推荐,是一种常用的推荐系统实现技术。但是如果商品种类很多,而且商品的属性很复杂,这样靠人工来标注商品的内容属性,就变得不太现实了。协同过滤技术正是为了解决这一问题而提出的,通过这种技术,我们不需要了解商品本身,只需要通过研究用户与商品这间的交互,就可以精准的向用户推荐他们可能感举趣的商品了。
具体到我们的个性题库系统,如果我们的客户有数以万计的题目,让人工来观看每个题目,然后给出这个题目有多少成份是知识点1,有多少成份是知识点2,是一件工作量非常巨大的事情。而且在实际应用中,我们对每个题目的描述,也不仅仅是知识点1、知识点2两个特征,所以实际应用中工作量非常巨大,这就是基于内容的推荐技术应用较少的原因。
如果我们换个角度来看待这个问题,我们还是用知识点1、知识点2两个特征来描述每个题目,但是我们并不知道每个题目到底是知识点1还是知识点2。为了解决这个问题,我们会评做每个学生,给该学生对知识点1、知识点2的需要程度进行打分,那么我们的研究问题就变成了已经参数集 { θ ( 1 ) , θ ( 2 ) , . . . , θ ( n u ) } ,来求出每部影片样本集 { x ( 1 ) , x ( 2 ) , . . . , x ( n m ) } ,如下所示:

* 题目 张一 李二 王三 赵四 知识点1 知识点2
x ( 1 ) 题目1 5 5 0 0 ? ?
x ( 2 ) 题目2 5 0 ? ?
x ( 3 ) 题目3 4 0 ? ?
x ( 4 ) 题目4 0 0 5 4 ? ?
x ( 5 ) 题目5 0 0 5 ? ?

{ θ ( 1 ) , θ ( 2 ) , . . . , θ ( n u ) } = { [ 0.0 5.0 0.0 ] , [ 0.0 5.0 0.0 ] [ 0.0 0.0 5.0 ] [ 0.0 0.0 5.0 ] }

我们的任务就是根据上面的已知条件,推测出每个题目的特征向量 x ( i ) 。例如,我们要预测题目 x ( 1 ) 我们知道张一和李二都需要知识点1,而对知识点2掌握程度较好,而王三和赵四都非常需要知识点2,对知识点1掌握程度较好。通过上表可以看到,张一和李二对题目1的需要程度都是5分,而王三和赵四的需要程度则为0分,综合上面的信息,我们不难推测出题目1是知识点1的题目,而不是知识点2的题目,所以 x ( 1 ) 的值为:
x ( 1 ) = [ x 0 ( 1 ) x 1 ( 1 ) x 2 ( 1 ) ] = [ 1.0 1.0 0.0 ]

注意,在上面的表示中 x 0 ( 1 ) 始终为1, θ ( 0 ) 取0,代表偏移量。
那么我们的推测是否正确呢?因为我们已经知道了参数集 { θ ( 1 ) , θ ( 2 ) , . . . , θ ( n u ) } ,同时知道了当前样本的特征向量 x ( 1 ) ,我们可以很方便地求出每个学生对题目1的需要程度,通过与学生对这个题目的实际需要程度,我们就可以得出我们对x(1)的推测是否正确,学生j对题目i的打分可以通过如下公式计算:
y ^ ( i , j ) = θ ( j ) 2 x ( i )

具体计算过程如下所示:
y ^ ( 1 , 1 ) = θ ( 1 ) 2 x ( 1 ) = [ 0.0 5.0 0.0 ] T [ 1.0 1.0 0.0 ] = 5.0

y ^ ( 1 , 2 ) = θ ( 2 ) 2 x ( 1 ) = [ 0.0 5.0 0.0 ] T [ 1.0 1.0 0.0 ] = 5.0

y ^ ( 1 , 3 ) = θ ( 3 ) 2 x ( 1 ) = [ 0.0 0.0 5.0 ] T [ 1.0 1.0 0.0 ] = 0.0

y ^ ( 1 , 4 ) = θ ( 4 ) 2 x ( 1 ) = [ 0.0 5.0 0.0 ] T [ 1.0 1.0 0.0 ] = 5.0

从上面可以看出,我们的计算结果与学生的实际需求程度结果是一致的,这证明我们对 x ( 1 ) 的预测是准确的。
这就引出了我们的协同过滤算法,对于题目i,我们首先需要选取适当的 x ( i ) ,使得我们预测出的学生对题目i的需要程度与用户实际对题目i的需要程度误差得到最小值,我们假设 m ( i ) 为影片i的所有评分数量:
min x ( i ) 1 2 m ( i ) i : r ( i , j ) = 1 ( θ ( j ) T x ( i ) y ( i , j ) ) 2

为了提高模型的范化能力,我们在上式上加入 L 2 调整项,表明我们希望参数 x ( i ) 的2范式平方最小,即参数值越小越好,如下所示:
min x ( i ) ( 1 2 m ( i ) i : r ( i , j ) = 1 ( θ ( j ) T x ( i ) y ( i , j ) ) 2 + λ 2 m ( i ) k = 1 n x k ( i ) 2 )

与上一节类似,我们也去掉不影响取得极小值的 m ( i ) ,得到最终的代价函数为:
min x ( i ) ( 1 2 i : r ( i , j ) = 1 ( θ ( j ) T x ( i ) y ( i , j ) ) 2 + λ 2 k = 1 n x k ( i ) 2 )

我们不仅需要学习题目i的参数向量 x ( i ) ,我们需要学习所有题目参数向量 { x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . , x ( n m ) } ,所以代价函数就变为如下式所示:
min x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . , x ( n m ) ( 1 2 i = 1 n m i : r ( i , j ) = 1 ( θ ( j ) T x ( i ) y ( i , j ) ) 2 + λ 2 i = 1 n m k = 1 n x k ( i ) 2 )

通过上面的讨论,我们可以得到代价函数为:
J ( x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . , x ( n m ) ) = min x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . , x ( n m ) ( 1 2 i = 1 n m i : r ( i , j ) = 1 ( θ ( j ) T x ( i ) y ( i , j ) ) 2 + λ 2 i = 1 n m k = 1 n x k ( i ) 2 )

我们采用梯度下降算法,可以得到如下公式:
k = 1 , , n 时:
x k ( i ) = x k ( i ) α ( i : r ( i , j ) = 1 ( θ ( j ) T x ( i ) y ( i , j ) ) θ k ( j ) + λ x k ( i ) )

式中 α 为超参数学习率,需要人工设定。
在有了上两节介绍的算法之后,我们就可以根据我们的实际情况,应用其中的一种算法,来进行推荐了。在实践中,我们其实可以将两种方法结合起来,取得更好的推荐效果。我们首先确定题目的特征向量,例如在本例中知识点1、知识点2特征,然后我们估计每个学生对这些特征的需要程度,即估计参数集 { θ ( 1 ) , θ ( 2 ) , . . . , θ ( n u ) } ,然后我们运行协同过滤算法,学习出每个题目的特征向量。接着我们以新学习出来的特征向量为基础,通过内容推荐算法,重新学习出新的参数集 { θ ( 1 ) , θ ( 2 ) , . . . , θ ( n u ) } ,此时的参数集会比我们开始时的估计值要好很多。我们可以再以新的参数集为输入,利用协同过滤算法求出每道题目的特征向量,这个过程可以一直进行下去,直到得到令人满意的结果。
但是这种方法有一个缺点,就是要运行两个独立的线性回归模型,效率比较低下。在下一节中,我们将介绍将两个算法结合起来,一次可以同时学习参数集和特征向量。

猜你喜欢

转载自blog.csdn.net/Yt7589/article/details/81542727
今日推荐