浅谈张量分解(四):外积、Kronecker积和张量积

在维基百科上,外积(Outer product - Wikipedia)被解释为:

In linear algebra, an outer product is the tensor product of two coordinate vectors, a special case of the Kronecker product of matrices.

虽然这个解释很简明,但当我们看完这段话后,可能会产生以下两点疑问:

  • 为什么外积能被认为是Kronecker积的特例呢?
  • 外积与张量积(tensor product)有什么关系?

围绕这两点疑问,我们来讨论一下容易混淆的外积、Kronecker积和张量积。

1 Kronecker积

在之前的浅谈张量分解(二):张量分解的数学基础一文中,我们已经知道了Kronecker积的运算规则,给定一个大小为m_1\times m_2的矩阵A和一个大小为n_1\times n_2的矩阵B,则矩阵A和矩阵B的Kronecker积为

A\otimes B = \left[ \begin{array}{cccc} a_{11}B & a_{12}B & \cdots & a_{1m_2}B \\ a_{21}B & a_{22}B & \cdots & a_{2m_2}B \\ \vdots & \vdots & \ddots & \vdots \\ a_{m_11}B & a_{m_12}B & \cdots & a_{m_1m_2}B \\ \end{array} \right]

很明显,矩阵A\otimes B的大小为\left( m_1n_1 \right) \times \left( m_2n_2 \right),即行数为m_1n_1,列数为m_2n_2,符号“\otimes”表示Kronecker积。当给定两个向量,如\vec u=\left[ \begin{array}{c} 1 \\ 2 \\ \end{array} \right]\vec v=\left[ \begin{array}{c} 3 \\ 4 \\ \end{array} \right]时,我们可以很轻松地计算出Kronecker积为\vec u \otimes \vec v=\left[ \begin{array}{c} 3 \\ 4 \\ 6 \\ 8 \\ \end{array} \right]

import numpy as np
a = np.array([[1], [2]])
b = np.array([[3], [4]])
np.kron(a, b)
np.outer(a, b)
np.kron(a, b.T)

然而,向量\vec u, \vec v的外积却为\vec u \circ \vec v = \vec u \vec v^T=\left[ \begin{array}{cc} 3 & 4 \\ 6 & 8 \\ \end{array} \right],是一个大小为2 \times 2的矩阵。我们发现Kronecker积与外积并不相同。Kronecker product and outer product confusion认为这种不一致是由符号的“滥用”造成的。

不妨将Kronecker积的符号记作\otimes _K,外积的符号记作\otimes _O(注:一般用符号 \circ 表示),则有

\vec u \otimes_O \vec v=\vec u \otimes_K \vec v^T.

虽然严格意义上的Kronecker积的计算结果和外积的不同,但这种不同仅仅体现在每个元素的摆放位置不同,而且\vec u \otimes_K \vec v^T等价于\vec u \vec v^T,确实可以用来计算外积。若给定向量 \vec u = \left[ \begin{array}{c} u_1 \\ u_2 \\ \end{array} \right] , \vec v = \left[ \begin{array}{c} v_1 \\ v_2 \\ v_3 \\ \end{array} \right] 和 \vec w = \left[ \begin{array}{c} w_1 \\ w_2 \\ \end{array} \right] ,则它们外积为

\mathcal{X} = \left[ \begin{array}{c} u_1 \\ u_2 \\ \end{array} \right] \circ \left[ \begin{array}{c} v_1 \\ v_2 \\ v_3 \\ \end{array} \right] \circ \left[ \begin{array}{c} w_1 \\ w_2 \\ \end{array} \right]

\Leftrightarrow \left[ \begin{array}{c} x_{111} \\ x_{211} \\ x_{121} \\ x_{221} \\ x_{131} \\ x_{231} \\ x_{112} \\ x_{212} \\ x_{122} \\ x_{222} \\ x_{132} \\ x_{232} \\ \end{array} \right] = \left[ \begin{array}{c} u_1v_1w_1 \\ u_2v_1w_1 \\ u_1v_2w_1 \\ u_2v_2w_1 \\ u_1v_3w_1 \\ u_2v_3w_1 \\ u_1v_1w_2 \\ u_2v_1w_2 \\ u_1v_2w_2 \\ u_2v_2w_2 \\ u_1v_3w_2 \\ u_2v_3w_2 \\ \end{array} \right] =\vec w \otimes \vec v \otimes \vec u .

因此,我们依然可以认为外积是Kronecker积的特例。

2 张量积

简单来说,张量积的定义为:给定两个有限维的向量空间(finite dimensional vector space)VW,其中,\vec v_1,...,\vec v_m为向量空间V的基(basis),\vec w_1,...,\vec w_n为向量空间W的基,则我们可以将V\otimes W定义为mn\vec v_i \otimes \vec w_j的线性组合,即

V\otimes W=\sum_{i,j}{c_{ij}\left(\vec v_i \otimes \vec w_j\right)}.

同时,双线性映射(bilinear map,如果仅仅关注张量积的计算,则不必深究这个概念)被定义为

B:V \times W \rightarrow V \otimes W

其中,B \left(\sum_i {a_i \vec v_i}, \sum_j {b_j \vec w_j}\right) = \sum_{i,j}{a_i b_j\left(\vec v_i \otimes \vec w_j\right)},对于任意取自向量空间VW下的向量,我们都可以用相应的基进行线性组合来表示出来,若a_i,i=1,...,m为向量\vec v_i线性组合的系数,b_j,j=1,...,n为向量\vec w_j线性组合的系数,则满足a_i b_j=c_{ij}。另外,V \times W表示两个向量空间的Cartesian积(维基链接:Cartesian product)。

为了便于理解,这里举一个简单的例子(来源:Calculate the tensor product of two vectors)。

已知\mathbb{R}^2下的一组标准基为\vec e_1=\left(1, 0\right) ^T\vec e_2=\left(0, 1\right) ^T\mathbb{R}^3下的一组标准基为\vec f_1=\left(1,0,0 \right)^T\vec f_2=\left(0,1,0 \right)^T\vec f_3=\left(0,0, 1 \right)^T。给定向量\vec x=\left[ \begin{array}{c} 1 \\ 1 \\ \end{array} \right]=\vec e_1+\vec e_2,向量\vec y=\left[ \begin{array}{c} 1 \\ -2 \\ 1 \\ \end{array} \right]=\vec f_1-2 \vec f_2 +\vec f_3,则向量\vec x,\vec y的张量积为

\vec x \otimes \vec y=\sum_{i=1}^{2} \sum_{j=1}^{3}x_iy_j \left(\vec e_i \otimes \vec f_j\right)

=\vec e_1 \otimes \vec f_1-2\vec e_1 \otimes \vec f_2+\vec e_1 \otimes \vec f_3+\vec e_2 \otimes \vec f_1-2\vec e_2 \otimes \vec f_2+\vec e_2 \otimes \vec f_3=\left[ \begin{array}{ccc} 1 & -2 & 1 \\ 1 & -2 & 1 \\ \end{array} \right]=\vec x\vec y^T

其中,\vec e_i \otimes \vec f_j\mathbb{R}^2 \otimes \mathbb{R}^3的基,张量积与外积的计算结果完全相同。

import numpy as np
x = np.array([[1], [1]])
y = np.array([[1], [-2], [1]])
np.kron(x, y.T)
np.outer(x, y)

对于任意向量\vec x\vec{y},它们的张量积\vec x\otimes \vec y有时被称为外积,如果\vec e_i\otimes \vec f_j\mathbb {R}^m \otimes \mathbb {R}^n的基,且\vec e_i, \vec f_j 是标准基,则外积可以写成如下形式:

\vec x\otimes \vec y=\sum_{i=1}^m \sum_{j=1}^n {c_{ij}\left(\vec e_i \otimes \vec f_j\right)}

其中,c_{ij}是矩阵\vec x\vec y^Ti行、第j列的元素。

对于向量而言,张量积和外积是等价的。

3 推荐阅读:秩一(rank one)矩阵和外积的联系

在矩阵分解和张量分解中,我们总不免见到rank one这个词,另外,我们也知道“秩一”与向量的外积密切相关,因此,对秩一矩阵和外积的联系感兴趣的读者可阅读Rank of a Decomposable TensorIs there meaning for uv^T?上的回答。

附录——张量积的性质:

(1) (\vec a+\vec b) \otimes \vec c=\vec a \otimes \vec c+\vec b \otimes \vec c\vec a \otimes (\vec b+\vec c)=\vec a\otimes \vec b+\vec a\otimes \vec c;

(2) (\lambda \vec a)\otimes \vec b=\vec a\otimes (\lambda \vec b)=\lambda (\vec a\otimes \vec b),\lambda \in \mathbb {R}.

展开阅读全文

没有更多推荐了,返回首页