特征编码
二进制向量编码
现实生活中有很多的多类别问题,比如说星座、血型、科目等等。机器学习中要处理这些多类别问题就会用到像决策树和随机森林这样的模型。但是这样多类别问题的模型实在太稀缺如果我们想要让其它数值模型也能够解决这些问题的话就需要将这些多元的类别编码将类别特征转换成数值特征。比如将血型编码如下图所示:
用线性网络萃取特征
现在有一个电影的推荐系统,我们现在有的数据就是每一个用户对每一部电影的评分。我们任然可以对这些用户和电影进行编码。比如在5个用户中表示第二个用户可以有[0,1,0,0,0]这样的一个向量。每一个用户都有自己关于电影评分的一个向量比如说[5.2, 9.1, 4.3, 2.5, 6.0]。
将这些特征向量化在加上一种特征萃取的方法我们也许能够萃取出某个用户的特征。类似于前面学过的基于神经网络的自动编码机,这里的特征萃取用到的是线性编码器。
上图中我们输入用户的向量,单个用户时向量只有一个地方为1其余的为0。在输出的一方为这个用户对每一部电影的评价。如果输入一个用户然后输出的分数与我们拿到的标签大致相同,那么中间的一些组合与转换就大概萃取到了这个用户的特征了。
这个网络的输入N(N个用户,中间层d(d个特征),输出层M(M部电影))。中间的转换在这里显得不是那么必要,就算是中间不做转换我们任然可以得到一组权重去描述我们的特征。改版后的模型如下(将tanh改为线性模型):
除此之外我们为了方便推导我们将上面的矩阵重新命名并且从形式上简化计算:
我们希望能够通过模型的训练得到更好的V与W矩阵来描述用户的特征。
矩阵分解学习
线性网络:每部电影的线性模型
在上述的线性网络中第一层所做的是转换用来萃取用户的特征,第二层是一个线性模型用来找到每部电影所对应的最佳权重。如果我们想要求出某一部电影的特征我们会使用所有用户对于这部电影的评价(也就是用户的行为)进行线性组合得出预测值。
对于某个用户对某部电影的评分我们会让这个用户所对应特征的这个向量(vn)与对应的权重(wm)做内积最后得到这部电影的预测值。我们要最小化的就是预测值与我们标签之间的差值。在此我们使用的错误衡量是平方误差如下图所示:
进行矩阵分解
我们将每一个用户对于每一部电影的评价放到一个R矩阵中如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/7eb4a992e538241d1e5916f294085899.png)
对于这个矩阵我们希望将它分解成两个小矩阵,其中V矩阵的每行这个向量代表了每个用户的特征,W矩阵中每列代表每个用户对于这部电影评价的权重。也就是说通过R矩阵我们既能够通过单个用户对多部电影的评价学到用户的特征也能通过多个有特点的用户对一部电影的评价学到电影的特征(当然我们只是利用已经在手上的数据)。我们有回到了轮流优化的场景。
矩阵分解学习
我们将最小化的错误衡量写下来
我们想最小化的式子是一个嵌套的连加,内层是计算多个用户对一部电影的评价与标签的差值平方和,外层是将内层的结果推广到所有的电影上求和。我们不擅长同时将同时优化两个变数所以我们进行交互式的优化:
①将v固定然后w只负责线性组合,所以我们可以通过做线性回归来优化w。
②将w固定,由于w与v的对称关系,所以我们可以对v做线性回归来求出最优解。
在初始化的时候我们通常会使用随机的W和V。最后由于我们的损失函数最小为0,所以我们的错误衡量一定会收敛。
与自动编码器的对比
有很强的关联性,我们把矩阵分解看成是一种更一般的方式在资料中萃取出有用的特征。
用随机梯度下降法(SGD)去优化模型
为什么是SGD
①如果资料量过大的时候使用SGD能够大大简化计算量(由于在计算梯度时常常以一个点的梯度去近似代替整个数据集的梯度)。
②如果我们使用的不是基于平方的错误那么就不能用上述的交互更新发,但是SGD通常可以。
每笔资料的错误衡量
我们使用的错误衡量仍然是平方错误。对于单笔资料来说它的错误衡量的函数只与它所对应的向量有关与其他的资料无关。如下图所示:
所以每笔资料的梯度就简写成-(余数)(另一个特征向量)。
随机梯度下降法的步骤:
①首先随机初始化各个向量。
②随机选取一个点。
③计算这个点的梯度。
④使用这个点的梯度更新w与v向量。
⑤重复②到④步骤直到一定的时间或者步数或者错误率。