在本节中,我们将讨论如何在对学生一无所知的情况下,例如入学的新生,转学过来的学生,利用我们上一节中讲到的基于深度学习的推荐系统,给学生推荐适合的题目。
所有推荐系统,比较难解决的问题就是冷启动问题,就是在系统运行初期,没有学生做练习题目的数据,而我们要推荐的话,这些数据是必须的。通常解决方法是找一批种子用户,让他们来做这些题目,然后我们根据学习做题正确情况,所用时间等信息,给出学生对题目的需要程度,然后运行前面章节介绍的算法,得到每个题目对应的特征向量和学生对应的参数集。
但是新学生来了之后要怎么办呢?因为新学生没有与我们的系统交互过,我们对新学生的知识点掌握情况一无所知,我们应该怎样处理呢?
假设我们有4个种子用户,我们邀请他们来做我们的题目,我们评估他们对每个题目的需要程度,当再新进来一个学生时,我们的数据集如下所示:

* 题目 张一 李二 王三 赵四 钱五
x(1)x(1)<script type="math/tex" id="MathJax-Element-4260">x^{(1)}</script> 题目1 5 5 0 0
x(2)x(2)<script type="math/tex" id="MathJax-Element-4261">x^{(2)}</script> 题目2 5 0
x(3)x(3)<script type="math/tex" id="MathJax-Element-4262">x^{(3)}</script> 题目3 4 0
x(4)x(4)<script type="math/tex" id="MathJax-Element-4263">x^{(4)}</script> 题目4 0 0 5 4
x(5)x(5)<script type="math/tex" id="MathJax-Element-4264">x^{(5)}</script> 题目5 0 0 5

由此我们得到的结果矩阵Y为:

Y=5.05.0?0.00.05.0?4.00.00.00.0?0.05.05.00.00.0?4.0??????Y=[5.05.00.00.0?5.0??0.0??4.00.0??0.00.05.04.0?0.00.05.0??]
<script type="math/tex; mode=display" id="MathJax-Element-4265"> Y=\begin{bmatrix} 5.0&5.0&0.0&0.0&?\\ 5.0&?&?&0.0&?\\ ?&4.0&0.0&?&?\\ 0.0&0.0&5.0&4.0&?\\ 0.0&0.0&5.0&?&? \end{bmatrix} </script>
我们需要优化的代价函数为:
minx(1),x(2),...,x(nm)θ(1),θ(2),...,θ(nu)=(i:r(i,j)=1(θ(j)2x(i)y(i,j))2+λ2i=1nmk=1nx(i)k2+λ2j=1nuk=1nθ(j)k2)minx(1),x(2),...,x(nm)θ(1),θ(2),...,θ(nu)=(∑i:r(i,j)=1(θ(j)2x(i)−y(i,j))2+λ2∑i=1nm∑k=1nxk(i)2+λ2∑j=1nu∑k=1nθk(j)2)
<script type="math/tex; mode=display" id="MathJax-Element-4266"> \min_{ \boldsymbol{x}^{(1)}, \boldsymbol{x}^{(2)}, ..., \boldsymbol{x}^{(n_m)} \\ \boldsymbol{\theta}^{(1)}, \boldsymbol{\theta}^{(2)}, ..., \boldsymbol{\theta}^{(n_u)} } =\Bigg( \sum_{i:r(i,j)=1} \bigg( {\boldsymbol{\theta}^{(j)}}^2 \boldsymbol{x}^{(i)} - y^{(i, j)} \bigg)^2 + \\ \frac{\lambda}{2} \sum_{i=1}^{n_m} \sum_{k=1}^{n} {\boldsymbol{x}_k^{(i)}}^2 + \frac{\lambda}{2} \sum_{j=1}^{n_u} \sum_{k=1}^{n} {\boldsymbol{\theta}_k^{(j)}}^2 \Bigg) </script>
根据上式,新学生没有做过任何题目,无法估计对题目的需要程度,所以第一个叠加项始终为0,在随机梯度下降学习算法中,对上式进行求导,以参数θ为例,得到的导数为λθ(j)kλθk(j)<script type="math/tex" id="MathJax-Element-4267">\lambda \theta_k^{(j)}</script>,当优化目标是取最小值时,最终θ(j)k=0θk(j)=0<script type="math/tex" id="MathJax-Element-4268">\theta_k^{(j)}=0</script>,这时我们得到新用户对应的θ(j)θ(j)<script type="math/tex" id="MathJax-Element-4269">\boldsymbol{\theta}^{(j)}</script>就是一个全零向量,此时如果我们利用公式来计算新用户对每部影片的打分θ(j)Tx(i)θ(j)Tx(i)<script type="math/tex" id="MathJax-Element-4270">{\boldsymbol{\theta}^{(j)}}^T\boldsymbol{x}^{(i)}</script>,得到的打分结果会都是0,这显然是不太合理的。因为根据我们的数据集,第一个题目有两个学生的需要程度为5分,新用户是有可能也需要练习这个题目的,我们怎么来处理这种情况呢?我们需要引入均值归一化方法。
我们先来看用户的打分结果,我们从中可以求出每个题目的均值,并组成均值向量,如下所示:
Y=5.05.0?0.00.05.0?4.00.00.00.0?0.05.05.00.00.0?4.00.0?????,μ=(5+5+0+0)/4(5+0)/2(4+0)/2(0+0+5+4)/4(0+0+5+0)/4=2.52.522.251.25Y=[5.05.00.00.0?5.0??0.0??4.00.0??0.00.05.04.0?0.00.05.00.0?],μ=[(5+5+0+0)/4(5+0)/2(4+0)/2(0+0+5+4)/4(0+0+5+0)/4]=[2.52.522.251.25]
<script type="math/tex; mode=display" id="MathJax-Element-4271"> Y=\begin{bmatrix} 5.0&5.0&0.0&0.0&?\\ 5.0&?&?&0.0&?\\ ?&4.0&0.0&?&?\\ 0.0&0.0&5.0&4.0&?\\ 0.0&0.0&5.0&0.0&? \end{bmatrix}, \boldsymbol{\mu}=\begin{bmatrix} (5+5+0+0)/4\\ (5+0)/2\\ (4+0)/2\\ (0+0+5+4)/4\\ (0+0+5+0)/4 \end{bmatrix}=\begin{bmatrix} 2.5\\ 2.5\\ 2\\ 2.25\\ 1.25 \end{bmatrix} </script>
接着我们将打分结果矩阵进行归一化,如下所示:
Y=5.05.0?0.00.05.0?4.00.00.00.0?0.05.05.00.00.0?4.00.0?????2.52.522.251.25=2.52.5?2.251.252.5?2.02.251.252.5?2.02.753.752.52.5?1.751.25?????Y=[5.05.00.00.0?5.0??0.0??4.00.0??0.00.05.04.0?0.00.05.00.0?]−[2.52.522.251.25]=[2.52.5−2.5−2.5?2.5??−2.5??2.0−2.0??−2.25−2.252.751.75?−1.25−1.253.75−1.25?]
<script type="math/tex; mode=display" id="MathJax-Element-4272"> Y=\begin{bmatrix} 5.0&5.0&0.0&0.0&?\\ 5.0&?&?&0.0&?\\ ?&4.0&0.0&?&?\\ 0.0&0.0&5.0&4.0&?\\ 0.0&0.0&5.0&0.0&? \end{bmatrix}-\begin{bmatrix} 2.5\\ 2.5\\ 2\\ 2.25\\ 1.25 \end{bmatrix}=\begin{bmatrix} 2.5&2.5&-2.5&-2.5&?\\ 2.5&?&?&-2.5&?\\ ?&2.0&-2.0&?&?\\ -2.25&-2.25&2.75&1.75&?\\ -1.25&-1.25&3.75&-1.25&? \end{bmatrix} </script>
我们用这个打分结果矩阵进行学习,可以得到对应每个学生的参数集{θ(1),θ(2),...,θ(nu)}{θ(1),θ(2),...,θ(nu)}<script type="math/tex" id="MathJax-Element-4273">\{ \boldsymbol{\theta}^{(1)}, \boldsymbol{\theta}^{(2)}, ..., \boldsymbol{\theta}^{(n_u)} \}</script>和每个题目的特征向量{x(1),x(2),...,x(nm)}{x(1),x(2),...,x(nm)}<script type="math/tex" id="MathJax-Element-4274">\{ \boldsymbol{x}^{(1)}, \boldsymbol{x}^{(2)}, ..., \boldsymbol{x}^{(n_m)} \}</script>,这时如果我们要计算学生j对题目i的需要程度时,公式如下所示:
y^(i,j)=θ(j)Tx(i)+μiy^(i,j)=θ(j)Tx(i)+μi
<script type="math/tex; mode=display" id="MathJax-Element-4275"> \hat{y}^{(i,j)}={\boldsymbol{\theta}^{(j)}}^T \boldsymbol{x}^{(i)} + \mu_i </script>
而对于新学生,由于没做过任何题目,没有对题目需要程度的信息,所以θ(j)θ(j)<script type="math/tex" id="MathJax-Element-4276">\boldsymbol{\theta}^{(j)}</script>为0向量,所以第一项始终为0,而第二项则代表是当前学生对题目i的平均需要程度。因为我们对新学生一无所知,我们认为新学生对题目i的需要程度更可能的值是所有学生对该题目需要程度的平均分,换句话说,我们认为新学生是一个对知识点掌握程度处于平均水平平的普通学生。我们可以看到,采用均值归一化之后,我们对新学生,就可以有一个相对合理的处理方式了,可以较好的解决冷启动的问题。
到此为止,我们已经将基于深度学习的推荐算法在教育平台上个性化学习应用中的数学原理全部讲解完了。读者可以根据这些知识,完全写出一个具有实用价值的个性化题库系统。但是为了让大家更快的掌握推荐系统的实现原现,在下一节中,将向大家详细讲解,基于Python 3.x实现深度学习推荐系统的技术细节。

更多推荐