00:00
那刚才我们说要对它做降维的时候,是要把它分解成两个,一个大矩阵分解成两个小矩阵相乘,对不对?这到底是怎么回事呢?诶,举一个例子来看一看,大家看啊,我们现在的任务是什么呢?有一个评分矩阵R,然后现在我们可能有M个用户,有N个物品,对不对?哎,那现在我们的任务是干什么,我们是要想要发现K个引类,也就是说什么发现K个隐藏特征。这隐藏特征代表什么呢?就代表用户的隐藏特征和物品的隐藏特征,在这K个维度上,他们共同的隐藏特征对不对?然后我们的任务是什么?就是找到两个矩阵P和Q,使得这两个矩阵的乘积近似的等于原来的这个平分矩阵R。那大就会想到这是不是相当于把一个矩阵R分解成了两个矩阵P和Q的乘积啊,所以R如果是一个M乘,大家想M个用户N个物品是不是一个M乘N的矩阵对吧?M个用户N个物品,大家看这里边这是用户和电影,这是不是三个用户三个电影对不对啊,当然这个这个矩阵不够大啊,大家知道意思就可以了,那我们要把它分解成什么呢?分解成P和Q2个矩阵,那P就是一个M乘K的矩阵。
01:34
啊,当然这里面我们说的P是反过来的啊,P是一个K乘M的矩阵,对不对啊,大家就说这个PT转制之后的这个矩阵是一个M乘K的矩阵,它代表什么呢?M是什么来着,M个用户对不对?所以M个用户M乘K是不是有M行啊,这代表M个用户乘K是不是一行数据里边有K个值啊,大家想这个K是不是就代表我们的隐藏特征啊,所以这个矩阵大家想想象一下,这是不是代表用户的K个隐藏特征这样的一个矩阵啊,那所以大家看我们如果把它翻过来列的话,就是每一列是一个用户的话,那是不是这里面横着就是它的每一条特征啊,大家看到我们这里用F1 f2 f3 F4来表达对不对啊,大家把它放大一点,大家会看到这样一个图,那我们左边的这一个是不是就是原始的平分矩阵R,右边这两个拆开上边这个每一列是不是都是一个用户的特征向量啊,构成的这个矩阵是不是。
02:47
就是用户特征矩阵,哎,这个我们叫P下边对应的每一列是不是都是一个电影的特征向量构成的矩阵,就叫做电影特征矩阵Q,诶这就是这个分解的过程,大家看这个是不是挺玄学的,因为你分解成几个特征,这好像完全没道理,对吧?啊就是这么去分解,好我们接下来来看一下,如果我们把它分解成这两个矩阵的相乘的形式的话,我们做计算的时候怎么算呢?是不是一行乘一列呀,对应是不是就会得到哎第一行第一列这个这个位置的,呃,这个数据对不对?那么大家看一下这个乘起来等于五,它代表什么含义。
03:29
这个用户是这呃,大家看到这个用户的特征是2310,这个电影的特征是不是2010啊,它们对应相乘,乘起来是不是相当于是这两个向量做了一个点积啊乘积啊,这是不是代表这两个向量的一个相关的程度。大家想一下。我们的那个余弦相似度是不是就是点击最后要除以它们的模长啊,那大家想到这个点击是不是也代表这两个向量之间的相关程度啊?那大家会想到这两个向量越相关,是不是代表用户的特征和电影的特征就匹配起来了呀?那是不是得到的分数是不是就代表了用户可能给这个电影评价就会比较高,是不是这样的一个状态?好,那么大家来考察一下啊,这里哪一个评价比较高,这个九分比较高对不对?那这里这个九我们怎么样去算呢?是不是最后一个用户这一行乘以最后一个电影这一列对不对?大家看一眼它为什么评价高,因为这个用户只有两个,这个呃,有三个维度特征是有有数的,对吧?F2这个特征是零,第一个维度特征是负的,代表他他不喜欢这个特征,对不对,那大家看电影的这个特征也是负的。
04:56
哎,你不喜欢的我刚好没有对不对,那你喜欢哪一个?哎,负负就得正了对不对,乘起来之后是不是负负得正了,你喜欢哪个维度呢?他喜欢的特征是F3这个特征对不对?刚好我这个电影是不是F3的得分就特别高啊,是不是电影就有这个F3的特征啊,所以一乘起来是不是这个乘积等于八,这个就特别大对不对,加起来最后得分是不是就非常高,所以大家看是不是就是它的特征,用户的特征和物品的特征匹配在一起了,乘起来的这个结果是不是就可以代表他对电影的一个喜爱程度啊,偏好程度对不对?哎,所以这是不是就可以作为它的一个预测评分啊?哎,所以大家看我们就是把这两个乘回去是不是就得到了,又一个新的平分矩阵,那么大家就要比对这个平分矩阵跟原来的评分矩阵是不是接近了,对吧?我们想要的结果是不?
05:56
就是分解开之后乘回去跟原来的平分矩阵完全一样最好,如果不能完全一样,是不是就是越接近越好啊?哎,这就涉及到后面我们可以定义损失函数了,对吧?好,我们先来做一个进一步理解啊,进一步理解是什么呢?大家就可以想到之所以打这样的分数。
06:16
可能是有内在原因,对不对,那内在的原因是不是就是我们这里所说的隐藏特征啊,哎,所以大家会想到这些隐藏特征可能是我们可以想到的,比方说演员、题材、年代,或者有些就是我们根本想象不到的,对不对,像前面这个是不是根本,我们不知道是代表什么含义啊。但是他可能确实是有内在关联的,我们就当做玄学把它理解就可以了,那找到这样的隐藏特征user和item,如果它的特征正好匹配,正好关联的话,是不是得到的这个预测评分就应该比较高啊,我们就可以根据这个预测评分去判断是否给用户推荐一部电影啊,这就是这个。
07:00
您运营模型的一个理解好,那接下来大家看啊,我们正常的一个数据是不是应该是这样的一个稀疏数据啊,那如果把它做一个分解,大家会想到是不是也可以把它分解成两个矩阵的相乘,P和Q矩阵的相乘对不对?那大家就会想到,P和Q分解完了之后,是不是还可以再乘回去啊,这相当于是我们的原始数据乘回去之后,是不是就变成了一个预测评分预测数据啊,那预测数据是不是有两个矩阵相乘,是不是就应该把它填满了?大家想一想是不是这样,所以你如果之前没有打分控制的地方,我现在是不是就有了一个预测评分啊?啊,这就是我们的这样的一个想法啊,好,那么做一个一般性的分析,大家可以想到R可以表示成P和Q的一个乘积对不对,那我们这里还是习惯性的把P当成是那个用户特征向量构成的那个矩阵数值的那个矩阵对不对?所以我们乘的时候把它做一个转置,然后put,这代表什么呢?
08:14
P是不是本身代表用户U的那一行,在P矩阵里边那一行对不对,那所以大家会想到这个做转制之后,本身这个,呃,我们想到这个特征向量,这是代表用户U的特征向量,对吧?那么本来它应该是一列对不对,我们做转制是不是就变成了一行啊,哎,最后是要做这个,因为P我们定义的这是就是应该是一列对吧,一列一列的用户特征构成的这个矩阵,这个叫P,所以我们把它做一个转置,这是某一个用户的特征矩阵特征向量,然后乘以Qi。QY这个没做转置,是不是就是一列了,它代表什么?是不是某个电影或者某个物品的特征向量啊,那么它俩一乘,乘起来的那个乘积是不是就是对应的那个预测评分啊啊所以大家看前面这个RUI代表用户U对物品I的预测评分,上面加一个had是不是这个这个小标对吧?这是不是代表啊预测对不对,代表对它的一个预测,那把它展开,这个向量展开,我们是不是这个向量有K个维度啊。
09:29
K个特征对不对,展开是不是就是每一个PUK乘以每一个QKI啊。然后乘积做一个加法向量乘积对吧?啊,大家看一下这个表法,这就涉及到数学了,那大家会想到我们把这个乘回去之后,就变成了一个不再稀疏的一个矩阵了,对吧?变成稠密的了,那么原先的位置如果说非常的接近的话,跟这边非常接近的话,我们是不是有理由相近,原先空白的位置填上的这些数据也是比较接近的呀,预测也是准确的对不对?哎,这就是我们做完矩阵分因子分解之后,做预测评分的这样的一个思路啊,这就是一一模型构建出来的一个一个状态啊,那接下来大家就会想到这个模型怎么去求解呢?已经已经讲了这个原理了,对吧?接下来怎么去求解呢?是不是要去定义一个损失函数啊,什么是损失?
10:30
预测的误差偏差就是损失对不对?哎,这个大家很容易想到,那我们用什么样的损失函数呢?那个偏差然后再做什么处理呢?啊,很简单的一个想法,是不是可以用平方损失函数啊,哎,对,所以大家会看到啊,我们这里边最简单的一个方式就是选取平方损失函数,那什么做平方,是不是每一个预测出来的评分都跟原始的那个平分做一个差值啊,然后平方求和,这是不是就是总共的损失函数,总共的损失,那后边我们是不是还应该做防止过拟和要加入正则画像,那大家看这里我们选取的正则画像是什么呢?大家看我们这个问题里边要求解的是不是P和Q啊,那P和Q是未知量,那大家会想到P和Q。
11:29
它如果越复杂是会有一个什么样的状态,呃呃,越复杂就会就会过拟合,对不对,复杂之后就会过你合,那什么时候它就会复杂呢。是不是那个特征K选的越多,它就会越复杂啊,哎,所以大家看我们这里边做了一个惩罚,什么样的惩罚呢?这个项就直接对这个PU,每一个PU是不是我们特征向量啊,P是用户的特征向量对不对?PU是用户的特征向量,我们是不是直接对这个向量求了一个模长,呃,这不是模长没有开根号对吧?这相当于是求了它的一个平方向,对不对平方和。
12:10
那这个大家会想到是不是特征越多,这个值就会越大呀。对吧,特征越多,那个数就越多,这个值肯定越大,对不对?然后同样的我这个Qi是不是特征也要对它做一个惩罚啊,所以我们取了这样的一个平方项,大家会想到前面也是平方,后面也是平方,都是二次项,应该也没什么问题,对不对?哎,所以这个是可以的啊,当然前面有一个拉姆达,这是正则化系数,一般通过交叉验证来获得,对不对啊,有了损失函数之后,那我们的做法是什么呢?大家就会想到两种做法,要不直接找它的这个最小值精确求解对不对,要不是不是梯度下降啊,好,那我们先来想这个精确求解,怎么样去精确求解呢?那大家看这个问题其实跟我们之前讲的线性回归其实很像,对吧?都是一个误差值,然后平方项后边有一个正则化系数,但是这个过程不一样了,为什么呢?因为我们在做线性回归的时候,它里边的未知数是不是都是一组参数,P和Q是两个矩阵,那它相当于里边是不是有两组参数啊,而且最烦的是就是P和Q都要变,对吧,最烦的是他俩还成在一起了。
13:36
这就很烦,因为我们之前的那个线性回归模型里边是不是对,都是只有一个东西变,然后后面sit,一个sit乘以一个X的话,X当于都是确定的,对吧?那这个问题里边就很难办了,它俩相当于耦合在一起了,这个时候我们怎么样去做呢?啊,大家就会想到我们这里就提出了一个算法求解,它的算法叫做als,它的想法是什么呢?简单的一个想法就是说很简单,单先看一下ars,它是什么,什么含义,什么意思啊,它叫交替最小二乘,所以它是不是因为大家看到那个跟本身平方损失函数是不是可以用最小二乘法啊,但是里边P和Q都耦合在一起。
14:25
那我们就用一个交替的最小二乘来求解,它的思想也很简单,怎么样去求解呢?因为这两个耦合在一起,而且都未知,那我们怎么办?先固定一个Q,把它当成常量,然后把P当做变量,直接去求取P,那大家会想到这是不是就变成了一套参数了,尽管是用矩阵形式表达,但是大家可以想象P矩阵的话就是一套参数对不对?这是不是就变成了一个经典的最小二乘问题了?哎,然后我们把当前的这个P求出来,那接下来是不是又反过来可以固定P,再去求Q啊,再去把Q做一个优化对不对?
15:07
然后我们求出来Q之后再去交替,就是再去迭代对不对,一轮一轮去求,所以这个过程就叫做交替最小二程啊,大家想这个这个过程难理解吗?应该不难理解对不对?其实就是因为这两个它耦合在一起,我们就固定一个求另外一个,每一次求解是不是就是一个固定的求解过程啊啊,这就是最小二乘的交替最小二乘的一个思想,大大家看一下它的这个具体过程是什么?这个就很简单了啊,首先是不是为Q指定一个初值啊,然后呃,一般情况啊,这个说零一般不会给零全局平均值,或者说给一个随机值,对吧,随机指定这个数值,然后我们是不是固定Q0求解P0啊,然后再固定P0求解Q1,固定Q1求解PP1,一步一步迭代对不对,直到达到我们的定义的那个迭代上线,或者说。
16:04
得到的那个损失函数收敛的时候是不是就可以结束了,所以大家看到这个其实是什么呢?它好像还是一个迭代法对吧,但是它是每一步里边是一个精确求解的过程,对不对?哎,它是这样的一个思路,好,那接下来我们就来看这个ars里边,每一步里边精确求解,怎么去求解呢?它每一步是不是就是只要固定一个Q就应该能求出P啊。所以我们就应该有一个P的求解公式对不对?好,我们现在以大家看一下这个具体的算法过程啊,我就是大概的过一遍,大家有概念就可以我们固定固定Q来求解P,以这个为例,反过来是不是也是一样的啊啊,它完全对称的吧?好,首先大家想首先有一个基本的想法啊,每一个用户优它的特征是不是都应该是彼此独立的呀,因为它的特征是不是就是基于他给电影评过分的那些数据提取出来的特征啊,跟别的用户评过的分数是不是没关系啊,诶,所以这里如果他相互独立的话,那我们可以认为每一个用户的特征向量PU是不是可以单独求解啊。
17:18
所以我们最后要求一个P,这个矩阵,是不是相当于可以认为求的就是它的每一行,或者说每一个用户的这个特征矩阵,特征向量啊,我们单独求出来,最后拼在一起,是不是就是最后想要的那个P?大家想象一下这个过程啊,啊,有点不好理解是不是好,那我们就继续往后看,大家会看到我们接下来做的其实就是对每一个PU进行一个单独的求解,大家看这里是不是我们的损失函数。对吧,前面是这一个平方项对不对,我们的平方项这里已经把那个预测平分代入进来,是不是就是P乘以Qi啊,两个向量相乘对吧?然后后边的这个损失函数大家看到我就直接把Qi给去掉了,为什么呢?
18:09
因为现在Q是不是固定的啊,那你对Qi去加那个正策画像的时候,最小值是不是它就没有影响啊,是不是只有P的变化会影响到这个最小值的求解,哎,所以我们这里把后面的Qi单独的那个项就去掉了,然后大家看到我们现在是不是要求解整个后边的这个最小值,然后想要。它取最小值的时候,把P要求出来,对吧,它就可以转换成一个什么问题呢?就可以转换成求每一个U,求取最小值的时候,大家看到啊,我就把这个求和是不是把U就提出来了呀,对U求和就提出提到前面来了,里边相当于是不是就相当于是一个固定的用户,固定的U啊。
19:02
大家想象一下是不是这样的,这里边我本身是要对每一个用户,每一个物品是不是都要算一遍,现在我把所有的U如果提前提前提到前面来的话,里边就相当于U也固定了,对吧?就是一行数据,一个用户的数据好,那么一个用户的数据它是相当于做什么计算呢?是不是就是他要对每一个物品I去算一下这个预测评分的误差,然后对这个I要求一个求和啊,然后后边是不是再加上我对应的这个物品U它的这个正则画像这个系数。是不是就转化成这个问题啊,前面我们说了每一个U是不是都可以单独求解,那我们是不是只要求这个就可以了,里边这一部分就可以了,对不对?好,那么我们现在的目标就是求解这个函数的最小值。好,那接下来大家会想到怎么求它的最小值呢?
20:02
它的变量,这里面的变量是什么?是Y吗?这里面没有Y对吧?它的变量是什么,什么改变,它会变RUI,这是已知的平分对不对,这个肯定不会变对不对。那大家想P和Qi Qi是不是已经确定了,整个的Q都确定了,那每一个Qi是不是都是固定的值啊,那是不是就是这个PU不确定啊,对不对,就是这一个用户他的这个特征向量不确定,我们就是要求出它这个特征向量到底是什么,对不对啊,所以我们现在它的自变量就是PU。那大家想到怎么求它最小值呢?是不是可以对PU求求偏导啊,对,所以大家看到接下来我们做的方式就是对PU求偏导。那当然了,这个过程相当于PU本身是个向量对不对,这相当于成了上面这还有矩阵对不对?呃,对向量求求偏导其实也是类似的一些法则,求出来之后大家看转换一下,得到的是这样的一个表达式,那么我们要精确求解的话,大家会想我要函数求最小值,我已经知道它都是二次项,是个凸函数,对吧?
21:22
那是不是导数等于零的地方就是精确的那个最小点啊,所以还是类似的啊,跟线性回归时候算法一样,让它等于零是不是就可以求解了,得到是不是就是里边这一部分都等于零啊,然后我们就做变化了,这里大家注意一下,注意我们的P乘以QY,这是不是一个一行乘一列啊,是不是这就是他们预测平分的时候,它俩那个向量相乘对吧,得到的是不是一个?是不是一个数啊,一个预测的平分数啊,所以这两个相乘是不是跟它反过来求转制之后的结果是一样的。
22:03
一行乘一列,是不是就等于这一列反过来当成行,这一行反过来当成列相乘是不是一样的呀,都是对应元素乘起来相加对吧?啊,所以大家看到我这里做一个小技巧,就用这一部分代替了上面的这个po Qi。然后大家会看到就变成了Qi PU乘以Qi对不对?然后大家会想到这本身还是一个数,这个数是不是可以跟后最后的这个Qi换一个位置啊,最后就得到了,大家看到我是不是可以把这个Qi提到前面去啊?哎,所以大家看到PU都在最后的话,我是不是就可以把这两项都有PU的这个未知数提取出来了,提取出来前边这一项是我们这里的这一项,后边这一项为什么要搭加上laa I呢?I是什么单位矩阵对吧?哎,对,所以我们这里提取出来之后,拉姆达本来是个数,那前面这一个Qi是不是一列啊,一列乘q it变成一行,这两个乘起来就不是一个数了,一列乘一行,乘起来应该是个。
23:13
就是一列乘一行,想一想一列是N乘一,对吧,N行一列一行是一乘NN乘一乘以一乘N,最后得到的是什么?N乘N,这跟一一行乘一列不一样,对不对?一行乘一列是一乘N乘以N乘一,是不是最后是一乘一是一个数啊,你要反过来的话,一列成一行就反反过来成了一个矩阵了,对不对啊,这里大家注意一下,所以我们这里就不能加拉姆达加一个数,是不是要加一个单位矩阵啊,把它转换成一个矩阵形式,那后边是这个把它移过来这一项的形式,那这里又有一个转化,大家注意一下啊,就是我们后边的这一部分,所有的这个R乘以Qi,这个展开的话,是不是就是每一个R对应一个Qi相。
24:13
相乘,然后再加在一起啊,这里求和。那大家想这个过程是不是就有点像两个向量相乘的这种形式啊,所以大家看,我可以把它展开写成这个形式,同样前边的QY和QYT的相乘也可以展成这样的一个,大家看一个向量的相乘形式对不对?只不过这个向量里面的每一个元素是不是又是一个向量啊?啊,展成这个形式,然后再做变换的时候,大家看到所有的这个Q1Q2,这是不是我们的物品特征向量合在一起是不是就是Q啊,对不对,所以这是Q,后边这个是不是就是QT啊,哎,所以我们把它整合起来,就变成了这样一个公式,这个公式就非常简单了,对不对?那大家会想到这个公式怎么求这个PU呢?
25:03
是不是要两边除以这个前面这一个系数啊,把它除过去,除怎么除矩阵怎么除?对是不是乘以它的逆矩阵啊,所以大家看最后得到的结论就是这个公式,这就是ars最后的公式,大家可以看一下啊,它跟什么有关?Q,这是不是当前固定好的那个Q矩阵啊,然后拉达这是正则化系数对不对?然后这里还是Q,最后还有一个RURU是什么?是不是本身这一行,这个用户给所有电影评过分的那一行数据啊,Ru是不是评分数据,Ru是不是指的是U那一行啊,呃,所以大家可以看到最后它相关的就是这些东西,那同样我们就可以解除每一个PU,这是一个向量对吧?合在一起是不是就是整个的用户特征矩阵P啊,哎,这就是我们的P,那当然对应的,如果要是固定P,在求解Q的时候,是不是把它反过来同样的一个计算啊,大家看就是对应的这样的一个公式了。
26:11
啊,大家可以理解一下这个算法到底是什么样的东西啊,呃,比较难对吧,稍微有点难啊,那当然接下来大家会看到我们还可以用梯度下降去算,为什么用梯度下降去算呢?就是大家会想到这个尽管是一个精确的求值啊,精确的求值,但是这里边涉及到一个什么问题,是不是要求一个矩阵的逆啊,我们一看到这个求逆是不是就有点就知道它这个肯定会比较复杂,对不对啊,当然肯定现成的是有一些有一些库可以去调的,但这个大家会想到它的计算会比较复杂,那我们怎么样计算简单呢?哎,又想到了是不是梯度下降做迭代会简单一点啊,那梯度下降怎么下降呢?还是这个损失函数是不是求偏导啊,求偏导之后大家想到怎么算对,是不是就不要让它等于零了,而是直接把它当做我们这里的这个偏导值乘以不长阿尔法?
27:12
然后做迭代是不是就可以了呀,诶,所以其实就是这样的一个公式就可以算了,所以如果前面大家这一部分都理解的话,这一部分其实相对来讲还是还是呃,可以理解的对吧?啊,尽管还是公式比较复杂,那大家就是好好看一看吧,这一部分能理解就可以了。
我来说两句