https://www.bilibili.com/video/BV164411b7dx?p=96
在接下来的视频中,我想讲一下推荐系统。我想讲推荐系统有两个原因:
第一、仅仅因为它是机器学习中的一个重要的应用。在过去几年,硅谷不同的技术公司,吴恩达老师常和工作在这儿致力于机器学习应用的人们聊天,问他们觉得最重要的机器学习的应用是什么,或者他们最想改进的机器学习应用有哪些。我最常听到的答案是推荐系统。现在,在硅谷有很多团体试图建立很好的推荐系统。因此,如果你考虑网站像亚马逊,或网飞公司或易趣,或iTunes Genius,有很多的网站或系统试图推荐新产品给用户。如亚马逊推荐新书给你,网飞公司试图推荐新电影给你,等等。这些推荐系统,根据浏览你过去买过什么书,或过去评价过什么电影来判断。这些系统会带来很大一部分收入,比如为亚马逊和像网飞这样的公司。因此,对推荐系统性能的改善,将对这些企业的有实质性和直接的影响。
推荐系统是个有趣的问题,在学术机器学习中因此,我们可以去参加一个学术机器学习会议,推荐系统问题实际上受到很少的关注,或者,至少在学术界它占了很小的份额。但是,如果你看正在发生的事情,许多有能力构建这些系统的科技企业,他们似乎在很多企业中占据很高的优先级。这是我为什么在这节课讨论它的原因之一。
我想讨论推荐系统地第二个原因是:这个班视频的最后几集我想讨论和分享机器学习中的一些大思想。这节课我们也看到了,对机器学习来说,特征是很重要的,你所选择的特征,将对你学习算法的性能有很大的影响。因此,在机器学习中有一种大思想,对于一些问题,算法可以为你自动学习一套好的特征。因此,不要试图手动设计,而手写代码这是目前为止我们常干的。有一些环境,能让你开发某个算法用来学习使用哪个特征,推荐系统就是这个环境的一个例子。还有很多其它的,但是通过推荐系统,我们将领略一小部分特征学习的思想,但至少,你将能够了解到这方面的一个例子,我认为,机器学习中的大思想也是这样。
接下来,我们举一个预测电影评分的例子,假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分。
前三部电影是爱情片,后两部则是动作片,我们可以看出Alice和Bob似乎更倾向与爱情片, 而 Carol 和 Dave 似乎更倾向与动作片。并且没有一个用户给所有的电影都打过分。我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据。
下面引入一些标记:
https://www.bilibili.com/video/BV164411b7dx?p=97
上节课举了个例子:通过一些用户对一些电影的评价,借助算法预测他们对其他电影的评价。这节课我们将会介绍一种算法:基于内容的推荐算法。
在我们的例子中,我们可以假设每部电影都有两个特征,如代表电影的浪漫程度, 代表电影的动作程度。
则每部电影都有一个特征向量,如是第一部电影的特征向量为[0.9 0]。
下面我们要基于这些特征来构建一个推荐系统算法。 假设我们采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如是第一个用户的模型的参数。 于是,我们有:
θ ( j ) \theta^{(j)} θ(j)用户 j j j 的参数向量
x ( i ) x^{(i)} x(i)电影 i i i 的特征向量
对于用户 j j j 和电影 i i i ,我们预测评分为: ( θ ( j ) ) T x ( i ) (\theta^{(j)})^Tx^{(i)} (θ(j))Tx(i)
代价函数
针对用户(对电影评分了的) ,该线性回归模型的代价为预测误差的平方和,加上正则化项:
其中 i : r ( i , j ) i:r(i,j) i:r(i,j) 表示我们只计算那些用户 j j j 评过分的电影。在一般的线性回归模型中,误差项和正则项应该都是乘以1/2 m m m,在这里我们将去掉 m m m。并且我们不对方差项 θ 0 \theta_0 θ0进行正则化处理。
上面的代价函数只是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:
如果我们要用梯度下降法来求解最优解,我们计算代价函数的偏导数后得到梯度下降的更新公式为:
https://www.bilibili.com/video/BV164411b7dx?p=98
这节课我们要讲一种方法来构建推荐系统,叫协同过滤。这种算法有一个特性,叫做特征学习,这种算法可以自行的学习他所要使用的特征。
在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征(通过用户的评价,得到每个电影的爱情和动作占比),但实际生活中,很难也很不现实的得到每个电影的这两个特征,何况每个电影也不只有两个特征,所以我们要如何通过其他方法获取这两个特征。
我们暂时把这个问题放一放。换一个问题,假设我们已经有每个用户对爱情片和动作片的评价,但却没有电影对于这两个特征的参数(用问号表示),如图
理论上,我们可以用上节课的内容,预测评分的公式: ( θ ( j ) ) T x ( i ) (\theta^{(j)})^Tx^{(i)} (θ(j))Tx(i),得到两个参数的值
然后我们可以继续举例,找出电影还有什么合适的特征(自动寻找特征)
让我们将这个例子,标准化到任意特征。
假设我们用户告诉了我们一系列爱好 θ ( 1 ) , . . . , θ ( n u ) \theta^{(1)},...,\theta^{(n_u)} θ(1),...,θ(nu),我们想学习电影 i i i的特征 x ( i ) x_(i) x(i)
所以我们需要把所用用户 j j j对电影 i i i的评价求和,来求出电影i的特征,也就是向量 x ( i ) x^{(i)} x(i),其中还是老生常谈,要使的我们选择的特征能够使预测的评价和实际的评价误差最小,后面就是正则化。
总结:
尝试找出特征 x ( i ) x^{(i)} x(i),这个参数能够是的所有用户 j j j对电影 i i i的预测评价与实际评价的误差最小。
而上述只是从一个电影学习到特征的方法,我们要学习所有电影所有的特征,所以加上求和。
总结一下:
在上节课,我们讲的的是,如果你有所有电影的评分合集,即 σ ( i , j ) \sigma^{(i,j)} σ(i,j)和 y ( i , j ) y^{(i,j)} y(i,j),根据不同的特征 x ( 1 ) , . . . . , x ( n m ) x^{(1)},....,x^{(n_m)} x(1),....,x(nm)我们可以学习到参数 θ ( 1 ) , . . . , θ ( n u ) \theta^{(1)},...,\theta^{(n_u)} θ(1),...,θ(nu),即从电影的特征推出用户的评价
而这节课讲的就是,我们拥有用户的评价,可以推出各种电影的特征值。
但是如果我们既没有用户的参数,也没有电影的特征,这两种方法都不可行了。协同过滤算法可以同时学习这两者。
通过以上两种方式,我们可以用 θ \theta θ推出 x x x,再由 x x x推出 θ \theta θ,依次迭代下去,知道我们可以拥有一组合理电影的特征值,以及一组对不同用户的参数的估计,这就是基本的协同过滤算法。
但我们不止局限于基本的协同过滤算法,我们还要对齐进行改进。
https://www.bilibili.com/video/BV164411b7dx?p=99
上节课我们讲到,如果给了你电影的特征值,可以学习用户的参数,如果给饿了你用户的参数,也可以用它们来学习电影的特征
。本节视频中,我们会把这些概念结合起来,得到协同过滤算法
协同过滤优化目标:
将上节课的两个方式结合在一起。求出 x x x和 θ \theta θ,同时最小化,不需要来回折腾。
最后一件事:我们一般设定 x 0 = 1 x_0=1 x0=1,再协同过滤算法中,我们不再需要 x 0 x_0 x0
注:在协同过滤从算法中,我们通常不使用方差项,如果需要的话,算法会自动学得。 协同过滤算法使用步骤如下:
通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不总是人能读懂的,但是我们可以用这些数据作为给用户推荐电影的依据。
https://www.bilibili.com/video/BV164411b7dx?p=100
在上几节视频中,我们谈到了协同过滤算法,本节视频中我将会讲到有关该算法的向量化实现,以及说说有关该算法你可以做的其他事情。
举例子:
当给出一件产品时,你能否找到与之相关的其它产品。
一位用户最近看上一件产品,有没有其它相关的产品,你可以推荐给他。
我将要做的是:找到一种方法,写出协同过滤算法的预测情况。
我们有关于五部电影的数据集,我将要做的是,将这些用户的电影评分,分组并存到一个矩阵中。
我们有五部电影,以及四位用户,那么 这个矩阵 Y Y Y 就是一个5行4列的矩阵,它将这些电影的用户评分数据都存在矩阵里:
推出评分:
针对这个预测评分矩阵,我们有一个比较简单的或者向量化的方法来写出它们,比如说我定义矩阵X,如果我们再找到一个矩阵,用大写的Θ表示,每行都是一个用户的参数向量。即如图:
所以原预测评分矩阵,就可以由这两个矩阵表示 X Θ T X\Theta^T XΘT,这就是一种向量化的表示,这种协同算法有另一个名字:低秩矩阵分解,这是一个线性代数里面的一个定义:矩阵X × Θ T \Theta^T ΘT为低秩矩阵
找到相关影片:
现在既然你已经对特征参数向量进行了学习,那么我们就会有一个很方便的方法来度量两部电影之间的相似性。例如说:电影 i i i 有一个特征向量 x ( i ) x^{(i)} x(i) ,你是否能找到一部不同的电影 j j j,保证两部电影的特征向量之间的距离 x ( i ) x^{(i)} x(i)和 x ( j ) x^{(j)} x(j)很小,那就能很有力地表明电影 i i i 和电影 j j j 在某种程度上有相似,至少在某种意义上,某些人喜欢电影 i i i ,或许更有可能也对电影 j j j 感兴趣。总结一下,当用户在看某部电影 i i i 的时候,如果你想找5部与电影非常相似的电影,为了能给用户推荐5部新电影,你需要做的是找出电影 j j j,在这些不同的电影中与我们要找的电影 i i i 的距离最小,这样你就能给你的用户推荐几部不同的电影了。
例如,如果一位用户正在观看电影 x ( i ) x^{(i)} x(i) ,我们可以寻找另一部电影 x ( j ) x^{(j)} x(j) ,依据两部电影的特征向量之间的距离 ∣ ∣ x ( i ) − x ( j ) ∣ ∣ ||x^{(i)} - x^{(j)}|| ∣∣x(i)−x(j)∣∣的大小。
通过这个方法,希望你能知道,如何进行一个向量化的计算来对所有的用户和所有的电影进行评分计算。同时希望你也能掌握,通过学习特征参数,来找到相关电影和产品的方法。
https://www.bilibili.com/video/BV164411b7dx?p=101
让我们来看下面的用户评分数据:
如果我们新增一个用户 Eve,并且 Eve 没有为任何电影评分,那么我们以什么为依据为Eve推荐电影呢?
由上节课的内容,我们可以看出Eve没有对任何电影评价,那么公式前半部分就没有满足 r ( i , j ) = 1 r(i,j)=1 r(i,j)=1,所以就不包括前半部分,那么后半部分实际上我们要看到就是 θ k ( j ) θ_k^{(j)} θk(j),这部分的最小值,也就是令 θ = 0 θ=0 θ=0,那么评分公式 θ T x = 0 θ^Tx = 0 θTx=0那么也就表明Eve对所有电影都打0分,这显然是不合理的。所以我们要借助均值归一化。
我们首先需要对结果 Y Y Y 矩阵进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值:
然后我们利用这个新的 Y Y Y 矩阵来训练算法。 如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测 ( θ ( j ) ) T x ( i ) + μ i (\theta^{(j)})^Tx^{(i)} + μ_i (θ(j))Tx(i)+μi,对于Eve,我们的新模型会认为她给每部电影的评分都是该电影的平均分。
所以在这个例子中,即使 θ T x = 0 θ^Tx = 0 θTx=0,但由于使用了均值归一化处理,那么我们就需要将平均值重新加回去。