了解mode-n fibers能帮助你更好的理解tensor的mode-n展开,这里用一个三维tensor
X
∈
R
I
×
J
×
K
X \in R^{I\times J \times K}
X∈RI×J×K作为例子,由于这个tensor有三个维度,所以可以从三个不同的方向将其分割成一个个列向量,如下图所示:
从上到下的方向称为mode-1方向,从左到右的方向称为mode-2方向,从前往后的方向称为mode-3方向。沿mode-n方向将tensor分割得到的一个个列向量称为该tensor的mode-n fibers。
要得到 X X X的mode-n fibers,可以固定除第n维以外的其他维度的坐标,此时取出第n维度的所有的元素,即为 X X X的一个mode-n fibers。举例来说, X X X的mode-1 fibers可表示为 X [ : , j , k ] j ∈ [ 0 , J ) k ∈ [ 0 , K ) X[:,j,k]\ \ \ j\in[0,J)\ \ \ k\in[0,K) X[:,j,k] j∈[0,J) k∈[0,K), X X X的mode-3 fibers则可以表示为 X [ i , j , : ] i ∈ [ 0 , I ) j ∈ [ 0 , J ) X[i,j,:]\ \ \ i\in[0,I)\ \ \ j\in[0,J) X[i,j,:] i∈[0,I) j∈[0,J)。
同理,如果这个tensor是四维的,则它的mode-4 fibers可表示为 X [ i , j , k , : ] i ∈ [ 0 , I ) j ∈ [ 0 , J ) k ∈ [ 0 , K ) X[i,j,k,:]\ \ \ i\in[0,I)\ \ \ j\in[0,J)\ \ \ k\in[0,K) X[i,j,k,:] i∈[0,I) j∈[0,J) k∈[0,K),其中i,j,k均取整数。
在得到tensor的mode-n fibers之后,将所有fibers排列在一起即可得到该tensor的mode-n展开矩阵(每个fibers都可以看成是一个列向量)。
那么应该按怎样的顺序来排列mode-n fibers呢?
对于展开矩阵中的第
j
j
j列mode-n fibers,j的位置可通过如下公式得到:
这个式子很枯燥,说实话,我并没有搞懂j的计算方式,不过我搞清楚了三维tensor展开为矩阵的mode-n排列方式,通过代码能更清晰的展示它的排列顺序,下面是python的代码实现:
import numpy as np
# 矩阵X,具体见代码之后的例子,这是一个简单的3x4x2的tensor
X = [[[a0+d*3, a0+d*3+12] for d in range(0,4)] for a0 in range(1,4)]
X = np.array(X)
#-------------------------unfolding(tensor的矩阵化)-------------------------#
fibers_mode1 = [X[:,j,k] for k in range(0,2) for j in range(0,4)]
fibers_mode2 = [X[i,:,k] for k in range(0,2) for i in range(0,3)]
fibers_mode3 = [X[i,j,:] for j in range(0,4) for i in range(0,3)]
unfold_mode1 = np.array(fibers_mode1).T # mode-1展开结果
unfold_mode2 = np.array(fibers_mode2).T # mode-2展开结果
unfold_mode3 = np.array(fibers_mode3).T # mode-3展开结果
举例来说,
mode-1展开是先增加fibers
X
[
:
,
j
,
k
]
X[:,j,k]
X[:,j,k]的第二维坐标,再增加第三维坐标,将按顺序遍历的fibers依次加入到展开矩阵中;
mode-2展开是先增加fibers
X
[
i
,
:
,
k
]
X[i,:,k]
X[i,:,k]的第一维坐标,再增加第三维坐标,将按顺序遍历的fibers依次加入到展开矩阵中;
mode-3展开是先增加fibers
X
[
i
,
j
,
:
]
X[i,j,:]
X[i,j,:]的第一维坐标,再增加第二维坐标,将按顺序遍历的fibers依次加入到展开矩阵中。
按照归纳法进行推测,对N个维tensor进行mode-n展开,应当依次增加fibers X [ i , j , . . . , n − 1 , : , n + 1 , . . . , N ] X[i,j,...,n-1,:,n+1,...,N] X[i,j,...,n−1,:,n+1,...,N]中第 1 , 2 , . . . n − 1 , n + 1 , . . . N 1,2,...n-1,n+1,...N 1,2,...n−1,n+1,...N维的坐标,将其依次组加入到展开矩阵中。
在上面的代码中,
X
X
X是3x4x2的tensor,它由矩阵
𝑋
1
𝑋_1
X1和
𝑋
2
𝑋_2
X2组成,其中
X
[
:
,
:
,
0
]
=
𝑋
1
;
X
[
:
,
:
,
1
]
=
𝑋
2
,
𝑋
1
和
𝑋
2
X[:,:,0]=𝑋_1; X[:,:,1]=𝑋_2,𝑋_1 和𝑋_2
X[:,:,0]=X1;X[:,:,1]=X2,X1和X2的取值如下:
它的三种mode-n 展开
X
(
1
)
,
X
(
2
)
,
X
(
3
)
X_{(1)}, X_{(2)}, X_{(3)}
X(1),X(2),X(3)分别为:
先了解tensor的mode-n slice(切片)能帮助你更好的理解tensor的mode-n乘法,对于一个三维tensor,可以从三个不同的方向对其进行切片,示意图如下:
现在可以聊一聊mode-n乘法的方式了。tensor X ∈ R I × J × K X\in R^{I\times J \times K} X∈RI×J×K和矩阵 U U U的mode-n乘法,其过程为U的第i个行向量和 X X X的所有mode-n fibers做内积,得到结果的第i个mode-n slice,将得到的所有mode-n slice组合起来即为mode-n的乘积结果。
举例来说,假设
X
X
X为1.2节所提到的
X
X
X,
U
=
[
[
1
,
3
,
5
]
,
[
2
,
4
,
6
]
]
U = [[1,3,5],[2,4,6]]
U=[[1,3,5],[2,4,6]],两者的mode-1乘积记为
Y
=
X
×
1
U
Y=X_{\times 1}U
Y=X×1U,则
Y
Y
Y的mode-1 slice为
U
U
U的第一个行向量
[
1
,
3
,
5
]
[1,3,5]
[1,3,5]和
X
X
X的所有mode-1 fibers的乘积,结果为:
将两个mode-1 slice按照mode-1的方向(从上到下的方向)组织起来,得到mode-1 乘积的结果。
其代码实现如下:
# mode-1 乘积 U 2x3
U = np.array([[1,3,5],[2,4,6]]);
# @是numpy中定义的矩阵乘积,这里是一个行向量乘以一个列向量
product = [[[U[m,:]@X[:,j,k] for k in range(0,2)] for j in range(0,4)] for m in range(0,2)]
product_mode1 = np.array(product) # 2x4x2
对于mode-2、mode-3 乘积,这里分别给出一个例子:
# mode-2乘积 V 1x4
V = np.array([1,2,3,4]).reshape(1,4)
product = [[[V[m,:]@X[i,:,k] for k in range(0,2)] for m in range(0,1)] for i in range(0,3)]
product_mode2 = np.array(product) # 3x1x2
# mode-3乘积 W 4x2
W = np.arange(0,10).reshape(5,2)
product = [[[W[m,:]@X[i,j,:] for m in range(0,)] for j in range(0,4)] for i in range(0,3)]
product_mode3 = np.array(product) # 3x4x5
那么这个mode-n乘积可以怎么使用呢?
我想到的一个场景是RGB图像转为灰度图,通过加权方式将每个RGB像素(三元组)转为一个灰度值,(x,y)位置上的RGB像素转化为灰度值的计算公式为: 0.3 ∗ R [ x , y ] + 0.59 ∗ G [ x , y ] + 0.11 ∗ B [ x , y ] 0.3*R[x,y] + 0.59*G[x,y]+0.11*B[x,y] 0.3∗R[x,y]+0.59∗G[x,y]+0.11∗B[x,y],其中R、G、B表示三个通道对应的矩阵。
将加权系数组织为矩阵,得 W = [ 0.3 , 0.59 , 0.11 ] ∈ R 1 × 3 W=[0.3,0.59,0.11]\in R^{1\times 3} W=[0.3,0.59,0.11]∈R1×3,对于任意大小的RGB图像 X ∈ R h × w × 3 X\in R^{h \times w \times 3} X∈Rh×w×3,将它和 W W W进行mode-3乘积,便可以得到对应的灰度图 X ^ ∈ R h × w × 1 \hat X \in R^{h \times w \times 1} X^∈Rh×w×1。
参考资料:Tensor Decomposition and Applications