林轩田机器学习技法关于特征学习系列,其中涉及到Neural Network,Backpropagation Algorithm,Deep Learning,Autoencoder,
PCA,Radial Basis Function Network,K-Means,Matrix Factorization 等。
- 机器学习笔记-Neural Network
- 机器学习笔记-Deep Learning
- 机器学习笔记-Radial Basis Function Network
- 机器学习笔记-Matrix Factorization
Linear Network Hypothesis
上一篇介绍了RBF Network,简单来说这个模型可以看成是由到很多不同的中心点的相似性的线性组合,其中使用聚类算法k-Means来计算中心点。
机器学习算法的目的是希望能从资料data中学习到某种能力skill。例如一个经典的场景是,从用户对电影的历史评分中学习如何预测或者推荐给用户可能喜欢的电影。对于这样的场景我们得到的资料可能是这样的 {(ui,mj,rij)n},n=1,2,⋯,N,其中每一条资料的含义是第 i 个用户 ui 对第 j 部电影 mj 的评分为 rij 。
需要注意的是, 这样的资料和我们之前喂给机器学习的资料有很大的不同, 对于每一个用户来说, 我们只有一个编号代表该用户,而没有关于该用户的任何具体的信息,例如该用户性别,年龄等等,所以这样的特征我们称之为抽象的特征。
本篇要介绍的内容就是如何从这些用户的编号和评分的历史中学习用户的偏好。进而对用户进行电影的推荐,具体使用的方法为矩阵分解matrix factorization。
我们将取值没有数值上的大小关系的特征称为categorical feature。例如用户的ID:1126,6211等,血型:A,B,AB,O,程序设计语言的种类:C,python,Java等。但是我们之前介绍的学习算法大多数来说都是针对数值型numerical features资料而言的,例如线性模型:线性回归,逻辑斯蒂回归等这些涉及到计算分数score=wTx的;或者是线性模型的延伸,例如神经网络,不管是其中的前向传播还是反向传播都需要依赖于数值的计算。也有一些方法可以用来直接处理非数值型的特征, 例如decision tree,以及基于decision tree的算法random forest或者是gradient boosted decision tree。
所以为了能够很好的处理类别型categorical feature数据,首先需要做的是对特征进行编码,转换为数值型的特征。例如采用一种非常简单的数值编码方式binary vector encoding对血型进行编码的结果是:
A=[1 0 0 0]T,B=[0 1 0 0]T,AB=[0 0 1 0]T,O=[0 0 0 1]T
对电影评分数据中的用户编码采用如上的方式进行编码,并且整理可以得到形式如下的数据:
{(xn=(0 0 ⋯ n ⋯0)N, yn=[rn1 ? ? rn4 ⋯ rnM]T}
这样的一条数据就完全描述了第
n 个用户的信息,其中
xn这样的表示方式也可以被称为是
one hot representation,其长度为所有用户的个数
N,且只有一个维度上的取值为
1, 其余都为
0。
yn表示该用户
xn对所有电影的评分,该向量的长度为所有电影的个数
M,其中
? 表示还没有看过该部电影。
接下来我们就是想要从这样的资料当中去学习或者说萃取每一个用户的偏好,将这些偏好作为描述用户的特征,然后对用户做推荐。我们之前介绍过的对数据进行特征抽取的一个典型的方法是神经网络,所以在这里利用如下所示的模型从用户的one hot representation中进行特征的抽取,与neural network不同的是, 隐层的神经元中的激活函数使用线性函数替代tanh, 所以这样的模型也被称为是Linear Network。
将第一层中所有的权重用矩阵VT表示,例如针对上面的图有:
VT=⎡⎣⎢⎢⎢⎢⎢⎢w(1)11w(1)12w(1)21w(1)22w(1)31w(1)32w(1)41w(1)42⎤⎦⎥⎥⎥⎥⎥⎥N×d~=[w(1)1w(1)2]
第二层中所有的权重用矩阵W表示,例如:
W=⎡⎣w(2)11w(2)12w(2)13w(2)21w(2)22w(2)23⎤⎦d~×M=[w(2)1w(2)2w(2)3]
这样定义之后该模型可以描述为:
h(x)=WTVx(1)
其维度为
(M×d~)×(d~×N)×(N×1)=(M×1)。根据线性代数的知识,只有第
n个元素为
1,其余都是
0的向量
x左乘一个矩阵相当于取该矩阵的第
n列
vn。所以
1式可以变为
h(xn)=WTvn(2)
其中vn可以理解为经过抽取或者特征转换得到的用户的偏好。(2)式这样的模型通常用在推荐系统recommender system中,接下来我们的任务就是从数据中利用学习算法学习到好的V:可以抽取到用户潜在的特征;学习到好的W:结合经过抽取之后的用户的偏好拟合用户喜欢的电影。
Basic Matrix Factorization
上一小节中(2)式得到了一个用户xn对所有的电影的评分向量,进一步可以得到某一个用户 n 对某一部电影 m 的评分,其计算公式如下:
h(xn)=wTmvn
我们想要
rnm≈wTmvn,可以利用我们熟悉的
squared error来做到:
Ein({vm},{vn})=∑user n rated movie m(rnm−wTmvn)2
如果我们能够最小化Ein那么我们就同时学到了两件事情:
- 如何对原始的用户向量做特征转换,或者说是提取用户的特征
- 如何组合用户的特征进行得分的预测
将所有用户对电影的评分构成一个R矩阵,想要做到rnm≈wTmvn 可以理解为想要将矩阵 R 分解为 VT 和 W 的乘积。其中vTn是经过转换之后用户的特征,wm可以理解为是电影的特征,或者电影对用户特征的组合权重。
矩阵分解这样的方式经常用来将抽象的特征,例如用户的ID, 电影的ID,转化为有意义可以进一步做处理的特征。
Matrix Factorization Learning
下面来解决如何进行学习的问题:
minW,VEin({vm},{vn})=∑user n rated movie m(rnm−wTmvn)2=∑m=1M(∑(xn,rnm)∈Dm(rnm−wTmvn)2)
可以看到有两组需要最优化的变量,可以使用在上一篇中求解k-Means的方法alternating minimization来解决, 其基本的思路是:
- 当所有的vn已经固定的时候:求解所有的wm就变成了求解M个互不相关的线性回归问题,其中在求解每一个wm的时候,其输入的资料为{(vn,rnm)},n=1,⋯,N。
- 当所有的wm已经固定的时候:从上面的讨论可以看到,其实V和W是对称的关系。当wm固定的时候,可以理解为已经学习到了电影特征,求解所有的vn就变成了求解N个互不相关的线性回归问题,其中在求解每一个vn的时候,其输入的资料为{(wm,rnm)},m=1,⋯,M。
该算法被称为是alternating least squests algorithm。直观上讲就是对w和v交互的做linear regression。
Alternating least squests algorithm
- initialize d~ dimension vector {wm},{vn}
- alternating optimization of Ein: repeatedly
- optimize w1,⋯,wM:
- update wm by linear regression on {(vn,rnm)}
- optimize v1,⋯,vN:
- update vn by linear regression on {(wm,rnm)}
- until converge
即, 首先随机的初始化长度为d~的向量v1,⋯,vN,w1,⋯,wM。首先利用所有评价过第一部电影的用户的数据{(v1,r11),⋯,(vs,rs1),⋯,}优化w1,然后优化w2,⋯,wM;再利用已经优化好的W来优化V, 直到收敛。
Linear autoencoder versus matrix factorization
之前介绍的Linear autoencoder希望通过神经网络将原始的X矩阵经过编码和解码的过程得到和X相似的矩阵,即X≈W(WTX),这也可以看成是一个矩阵分解的过程。下面对Linear autoencoder和matrix factorization做一个简单的比较。
Linear autoencoder使用一个d-d~-d的线性神经网络架构,matrix factorization也是使用一个N-d~-M的线性神经网络架构;两者都是使用squared error来作为损失函数,不同的是,前者在所有的xni上进行计算,后者只能在已知的rnm上做计算;前者可以通过计算XTX的最大的特征值得到全局最优解,但后者只能通过alternating least squares算法来得到局部最佳解。前者主要用来做数据的降维,后者用来萃取潜藏在user和item中的特征。
Stochastic Gradient Descent
上一小节介绍了使用alternating least squests algorithm这样的算法来解决matrix factorization。这一小节尝试使用stochastic gradient descent来求解matrix factorization。
简单介绍下stochastic gradient descent的思路, 如果在Ein中包含一个求和的操作(如下所示),即,要在所有的样本误差和上求取梯度来确定变量的更新方向,这时可以通过只计算一个随机抽取的样本的误差的梯度来代替。
Ein({wm},{vn})=∑user n rated movie m(rnm−wTmvn)2err(user n,movie m,rating rnm)
因为 err(user n,movie m,rating rnm)=(rnm−wTmvn)2
所以:
▽vnerr(user n,movie m,rating rnm)=−2(rnm−wTmvn)wm▽wmerr(user n,movie m,rating rnm)=−2(rnm−wTmvn)vn
SGD for Matrix Factorization
SGD for Matrix Factorization
initialize d~ dimension vectors {wm},{vn} randomly
for t=0,1,⋯,T
- randomly pick (n,m) within all known rnm
- calculate residual r¯nm=(rnm−wTmvv)
- SGD update:
- vnewn⟵voldn+η⋅r¯nmwoldm
- wnewm⟵woldm+η⋅r¯nmvoldn
如果是一个大型的矩阵分解问题,通常会使用SGD算法。
这四篇的主题是Extraction Model,概述的来讲,在这样的模型当中,通常最后一层还是要做一个简单的线性模型,但是在此之前我们希望把特征转换或者是特征抽取也纳入学习的过程,也就是要从资料中学习怎么表达资料有利于算法的预测结果。
对于neural network及其延伸deep learning,其输出层的权重可以理解为是一个(输出层只有一个神经元)或者很多个(输出层有多个神经元)线性模型的权重,其余层权重用来对数据进行转换或者说特征抽取。在RBF Network和matrix factorization中,同样可以理解为这样的架构。只不过在matrix factorization中,我们既可以说是抽取了用户的特征,在第二层中对用户的特征进行线性组合, 也可以说是抽取了电影的特征,在第二层中对电影的特征进行线性组合。
其实对于aggregation model,那些g可以看成是特征的转换,最后对所有g进行通过系数α进行组合。
甚至kNN也可以看成是这样的模型,其特征转换的方式就是找邻域内的其它点,最后组合这些点的label做出决策。
这个过程中也涉及到了很多从数据中进行特征抽取的技巧,例如在Adaptive/Gradient Boosting中通过functional gradient descent推导出g;在Neural Network/DeepLearning中通过BP算法有效的计算权重的更新的方向,并且介绍了利用autoencoder的机制来得到一个比较好的初始权重;在RBFNetwork中同样是使用一个无监督学习算法k Means来得到一种对资料进行转换的方式。通过deep learning中做pre training的autoencoder和RBFNetwork中确定中心点的k Means我们可以看到无监督学习在提取资料的特征这方面可能是非常有用的。在Matrix Factorization中可以使用SGD和alternating least SQR来进行特征的抽取。
Pros and Cons of Extraction Models
最后来总结下这些特征抽取的模型有什么好处, 以及有什么缺陷。首要的好处是这样的模型可以帮助我们自动完成特征的抽取,而不必要人为的去思考设计抽取有用的特征。同时这样的模型是非常powerful的,只要包含有足够多的hidden variables。其缺点主要有,难于进行最优化,因为这些模型所对应的最优化问题大多是非凸的,另一问题是这样的模型由于非常的强大,所以有很大的可能性会发生过拟合,所以在这样的模型当中,regularization和validation就显得非常的重要。
总结
本篇主要的内容是matrix factorization。首先使用linear network从用户原始的one hot representation中抽取用户的特征。之后讲解了求解matrix factorization的两种方法。