内积运算应该是机器学习中使用最多的,因此本文着重介绍了内积!其次是外积。至于叉积,目前还没在机器学习相关论文上看到过。
内积(Inner product)
首先从内积空间引入到内积运算。然后介绍常见的几个内积空间中具体的内积定义。(Wikipedia上关于内积的介绍也是在内积空间的条目中的,甚至没有单独给内积一个页面,可见,要了解内积还是得从内积空间开始)
内积空间是具有内积运算的向量空间,这使得在该空间中可以定义向量的长度(范数)和向量之间的夹角。该空间是对实数向量空间$\mathbb{R}^n$的推广。常见的内积空间有实数向量空间$\mathbb R^n$、复数向量空间 $\mathbb C^n$、函数空间 $\mathcal{C}^\infty(\mathbb{R})$、矩阵空间 $\mathbb{F}^{m \times n}$等。
那什么是内积运算呢?内积运算就是把向量空间$\mathbb V$中的两个向量映射到标量场 $\mathbb F$中的一个标量,是 $\mathbb V \times \mathbb V \rightarrow \mathbb F$ 的函数,通常表示为 $\langle \mathbf x,\mathbf y\rangle$ 或者 $(\mathbf x,\mathbf y)$。
内积运算需满足如下性质:
- 对称性 $\langle \mathbf x, \mathbf y\rangle = \langle \mathbf y, \mathbf x\rangle$
- 线性 $\langle a \mathbf x, \mathbf y\rangle = a \langle \mathbf x, \mathbf y\rangle$
- 双线性 $\langle \mathbf x+\mathbf y, \mathbf z\rangle = \langle \mathbf x, \mathbf z\rangle + \langle \mathbf y, \mathbf z\rangle$
- 正定性 $\langle \mathbf x, \mathbf y\rangle > 0, \text{if}; \mathbf x\neq 0$
满足了这些性质才确保了内积空间中向量的长度(范数)和向量之间的角度的概念是有意义的。
“长度”和”夹角”并不是一个向量空间天然具有的特性,需要额外引入内积的定义,即让两个向量点乘之后得到一个标量,才借此产生出了模长和夹角,进而可以定义什么是标准化(模长为1),什么是正交化(夹角垂直)。引入了内积的线性空间称为内积空间。
具体而言,内积空间中向量的范数$| \cdot |$定义为向量与自身的内积的平方根,即:
$$ | \mathbf{x} | = \sqrt{\langle \mathbf{x}, \mathbf{x} \rangle} $$
另外,内积空间中,两个非零向量 $\mathbf{x}$ 和 $\mathbf{x}$ 的夹角 $\theta$ 可以通过它们的内积及范数根据余弦公式计算:
$$ \cos \theta = \frac{\langle \mathbf{x}, \mathbf{y} \rangle}{|\mathbf{x}| |\mathbf{y}|} $$
接下来介绍工科应用中最常见的几个内积空间及对应的内积运算。
实数向量空间R^n 点乘
在 $\mathbb R^n$ 向量空间中,内积又称为点积(因此点积是内积的一个特例,这也是为什么工科中,经常把点积和内积这两个专业词混着用的缘由)。点积定义如下:对任意两个 $n$ 维向量$\mathbf x=\begin{pmatrix} x_1 \ \vdots \ x_n \end{pmatrix} \in \mathbb R^n$ 和 $\mathbf y=\begin{pmatrix} y_1 \ \vdots \ y_n \end{pmatrix} \in \mathbb R^n$,其内积(点积) $\langle \mathbf x, \mathbf y\rangle = x_1 * y_1 + x_2 * y_2 + \cdots + x_n * y_n$
复数向量空间C^n 复点乘
在 $\mathbb C^n$ 向量空间中,内积定义如下:对任意两个 $n$ 维向量$\mathbf x=\begin{pmatrix} x_1 \ \vdots \ x_n \end{pmatrix} \in \mathbb C^n$ 和 $\mathbf y=\begin{pmatrix} y_1 \ \vdots \ y_n \end{pmatrix} \in \mathbb C^n$,其内积 $\langle \mathbf x, \mathbf y\rangle = x_1 * \overline{y_1} + x_2 * \overline{y_2} + \cdots + x_n * \overline{y_n}$
其中,$\overline{y_i}$ 为 $y_i$ 的共轭复数。
矩阵空间
矩阵的内积定义为两个矩阵对应位置元素乘积之和,也因此,矩阵内积仅在尺寸相同时有定义。给定$m*n$矩阵$A$和$B$,则矩阵$A$和$B$的内积为:
$$ \langle A, B \rangle = \text {trace}(A^TB) = \sum_{i=1}^{m} \sum_{j=1}^{n} A_{ij} B_{ij} $$
矩阵内积又称为Frobenius inner product,利用该内积,可以计算矩阵A的Frobenius norm为
$$ |A|F = \sqrt {\langle A, A \rangle} = \sum{i=1}^m \sum_{j=1}^n |A_{ij}|^2 $$
如果将矩阵展平成一个长向量(将矩阵的每一行依次排列成一个长向量),那么这个长向量的 $2$ 范数就与原矩阵的 Frobenius 范数相同。
外积(Outer product)
在线性代数中,两个向量$\mathbf u$和$\mathbf v$的外积(Outer product)是一个矩阵。如果这两个向量的维数分别为$n$和$m$,那么它们的外积是一个$n×m$矩阵,且该矩阵秩为$1$,其中行向量为向量 $\mathbf u$ 的缩放版本,列向量是向量 $\mathbf v$ 的缩放版本。
给定两个向量$\mathbf u$和$\mathbf v$,它们的外积定义为一个矩阵,记作 $\mathbf{u} \otimes \mathbf{v}$:
$$ \mathbf{u} \otimes \mathbf{v} = \mathbf{u} \mathbf{v}^T
$$
改矩阵中每个元素的值为:
$$ (\mathbf{u} \otimes \mathbf{v})_{ij}=u_i v_j $$
更一般的,给定两个张量(多维数组),它们的外积是张量。张量的外积也被称为它们的张量积,可以用来定义张量代数。
外积运算在线性代数中有许多应用,例如在矩阵分解、协方差矩阵的构造等方面(别的实在想不出来了…)。
注:外积不像内积这样有数学上深刻的含义,更多的仅仅是定义了一种向量的计算方式。
叉积(Cross product,叉乘)
在数学中,叉积(Cross product)或向量积(Vector product)是在三维欧几里得向量空间中对两个向量的二元运算,用符号$\times$表示。给定两个线性无关的向量$\mathbf{u}$ 和$\mathbf{v}$,叉积$\mathbf{u} \times \mathbf{v}$是一个垂直于$\mathbf{u}$和 $\mathbf{v}$的向量,因此垂直于包含它们的平面。
在三维空间中,两个向量$\mathbf u=\begin{pmatrix} u_1 \ u_2 \ x_3 \end{pmatrix}$和$\mathbf v=\begin{pmatrix} v_1 \ v_2 \ v_3 \end{pmatrix}$的叉积$\mathbf{u} \times \mathbf{v}$可以表示为一个行列式:
$$ \mathbf{u} \times \mathbf{v} = \begin{vmatrix} \mathbf{i} & \mathbf{j} & \mathbf{k} \ u_1 & u_2 & u_3 \ v_1 & v_2 & v_3 \end{vmatrix}
$$
其中,$i,j,k$ 是单位向量分别沿 $x,y,z$ 方向。这个行列式计算的结果是一个新的向量,如下,即为叉积的结果向量:
$$ \mathbf{u} \times \mathbf{v} =\begin{pmatrix} u_2 v_3 - u_3 v_2 \ u_3 v_1 - u_1 v_3 \ u_1 v_2 - u_2 v_1 \end{pmatrix}
$$
叉积在物理、工程和计算机编程中有许多应用。如在物理学中,叉积常用于描述力和位移的乘积,计算扭矩(torque)。在计算机科学中,许多凸包算法(如 Graham 扫描算法)利用叉积来确定三个点的方向,从而判断哪些点位于凸包的边界上。
注:叉积在机器学习中很少用到,至少我没在论文中看到过,但是很多blog会把叉乘和外积弄混。甚至GPT-3.5也会把它弄混,严重怀疑是中文圈搞混的文章太多了,以至于污染了训练数据。
参考