浅谈张量分解(一):如何简单地进行张量分解?

在介绍张量分解(tensor decomposition)之前,我们可能需要先简单地了解一下张量是什么,然后再考虑张量分解有什么用途,并如何像稀疏矩阵分解(matrix decomposition/factorization)一样来对稀疏张量进行分解。

从初中到大学,我们接触最多的可能只是标量(scalar)、向量(vector)和矩阵(matrix),而张量则不那么常见,但实际上,标量是第0阶张量,向量是第1阶张量,矩阵是第2阶张量,第3阶或阶数更高的张量被称为高阶张量(higher-order tensor),一般提到的张量都是特指高阶张量,这在接下来的叙述中也不例外。

我们也知道,在一个矩阵中,某一元素的位置可以说成“第i行第j列”的形式,要表达某一元素的位置需要两个索引构成的组合\left( i,j \right) ,类似地,在一个第3阶张量里面,表达某一元素的位置需要三个索引构成的组合\left( i,j,k \right) 。在处理稀疏矩阵和稀疏张量时,用索引来标记元素的位置会带来很多便利。

另外,阶数d\geq 3的张量可以理解为矩阵的d维泛化,在这里,阶数d其实就是空间维度(spatial dimension),张量可以被视为多维数组。

张量分解从本质上来说是矩阵分解的高阶泛化。对矩阵分解有所了解的读者可能知道,矩阵分解有三个很明显的用途,即降维处理、缺失数据填补(或者说成“稀疏数据填补”)和隐性关系挖掘,其实张量分解也能够很好地满足这些用途。因此,在介绍张量分解之前,我们先来看看相对简单的矩阵分解,并掌握稀疏矩阵的分解过程。

1 推荐系统中常用的矩阵分解

在我们常见的推荐系统(如商品推荐系统、电影推荐系统等)中,给定一个大小为m\times n的评分矩阵R,元素r_{ij}表示用户(user)i对项(item,如电影、商品等)j的评分值,如1~5分不等。

k=rank\left( R \right) \ll \min {\left(m,n \right)},并且能够写成如下形式

R=UV^{T}

其中,U是大小为m\times k的矩阵(用户因子矩阵,user-factor matrix),V是大小为n\times k的矩阵(项因子矩阵,item-factor matrix)。这一过程就是矩阵分解。

k<rank\left( R \right) ,我们可以将矩阵分解的过程看作是一个低秩逼近问题(low-rank approximation problem),原来的分解过程则变成

R\approx UV^{T}

和前面相同,U是大小为m\times k的矩阵(用户因子矩阵,user-factor matrix),V是大小为n\times k的矩阵(项因子矩阵,item-factor matrix)。在这个低秩逼近问题中,可以很明显得看出整体误差为残差矩阵R-UV^{T}中所有元素的平方和,即|| R-UV^{T} || ^{2}(这种写法含义是矩阵F-范数的平方,等价于矩阵中所有元素的平方和)。

如果简单地使总的误差最小,那么,可以将矩阵分解的逼近问题转化为一个无约束的优化问题,即

\min J=\frac{1}{2} || R-UV^{T} || ^{2}

在实际应用中,这里的评分矩阵R往往是一个稀疏矩阵,即很多位置上的元素是空缺的,或者说根本不存在。试想一下,如果有10000个用户,同时存在10000部电影,如果我们需要构造一个评分矩阵,难道每个用户都要把每部电影都看一遍才知道用户的偏好吗?其实不是,我们只需要知道每个用户仅有的一些评分就可以利用矩阵分解来估计用户的偏好,并最终推荐用户可能喜欢的电影。

在这里,我们将矩阵R中存在评分的位置记为\left( i,j \right) ,所有观测到的位置索引记作集合S,其中,用户的索引为i\in \left\{ 1,2,...,m \right\} ,项的索引为j\in \left\{ 1,2,...,n \right\} ,需要注意的是,推荐系统中的矩阵分解对原矩阵R有一定的要求,即矩阵的每行和每列至少有一个元素。此时,任意位置\left( i,j \right) 所对应的评分估计值为\hat{r} _{ij}=\left(UV^{T}\right)_{ij}=\sum_{q=1}^{k}{u_{iq}\cdot v_{jq}}

则原来的优化问题等价于

\min J=\frac{1}{2} \sum_{\left(i,j\right)\in S}{e_{ij}^{2}}=\frac{1}{2} \sum_{\left( i,j \right)\in S }{\left( r_{ij}-\sum_{q=1}^{k}{u_{iq}\cdot v_{jq}} \right) ^2}

对目标函数J中的u_{iq}v_{jq}求偏导数,得

\frac{\partial J}{\partial u_{iq}} =\sum_{j:\left( i,j \right)\in S } {\left(r_{ij}-\sum_{q=1}^{k}{u_{iq}v_{jq}}\right)\left( -v_{jq} \right) }

\frac{\partial J}{\partial v_{jq}} =\sum_{i:\left( i,j \right)\in S } {\left(r_{ij}-\sum_{q=1}^{k}{u_{iq}v_{jq}}\right)\left( -u_{iq} \right) }.

这里,可以将两个偏导数分别简写为\frac{\partial J}{\partial u_{iq}} =-\sum_{j:\left( i,j \right)\in S } {e_{ij}v_{jq}}\frac{\partial J}{\partial v_{jq}} =-\sum_{i:(i,j)\in S}{e_{ij}u_{iq}},其中,i\in \left\{ 1,2,...,m \right\} j\in \left\{ 1,2,...,n \right\} q\in \left\{ 1,2,...,k \right\}

根据梯度下降(gradient descent)方法,u_{iq}v_{jq}在每次迭代过程中的更新公式为

u_{iq}\Leftarrow u_{iq}+\alpha \sum_{j:\left( i,j \right)\in S } {e_{ij}v_{jq}}v_{jq}\Leftarrow v_{jq}+\alpha \sum_{i:(i,j)\in S}{e_{ij}u_{iq}}.

这里的\alpha>0表示梯度下降的步长,又称为学习率(learning rate),另外,更新公式中的求和项下标j:\left( i,j \right)\in S i:\left( i,j \right)\in S 分别表示向量R\left( i,: \right) R\left( :,j \right) 上所有非零元素的位置索引构成的集合。

2 隐性因子模型

上面已经简单地介绍了矩阵分解的原理,对推荐系统有了解的读者可能对上面这一过程并不陌生,上面的矩阵分解在推荐系统中常常被称为隐性因子模型(latent factor model, LFM),其实张量分解

编辑于 2022-11-01 06:40