2090 字
10 分钟
初探线性代数:向量、矩阵和张量

最近打算开始读《深度学习》(花书),开局就是线性代数,给了我这个高中生当头一棒,但奈何这深度学习还是得学,也只好试试初探一下线性代数,也希望这篇文章可以给想要学习线性代数的高中生一些建议

接下来我将跟随花书的节奏,一步步往下看,作为初探线性代数的第一篇文章,本文讲述的是向量、矩阵和张量

我们对线性代数并不陌生,无论是物理中的力的合成与分解,还是数学中的向量,都是线性代数的一部分

向量、矩阵和张量#

从向量( vectorvector )讲起#

基于我们对于向量更加了解,我们先从向量开始学习

在线性代数中,向量的常规表示如下:

x=[x1x2xn]\mathbf{x}=\begin{bmatrix} x_1\\ x_2\\ \vdots\\ x_n \end{bmatrix}

其中,向量的名字通常为一个粗体小写字母(如 x\mathbf{x} )表示,每个元素为 x_nx\_n

让我们来举一个更为直观的例子:

a=[12],b=[42]\mathbf{a}=\begin{bmatrix} -1\\ 2 \end{bmatrix}, \mathbf{b}=\begin{bmatrix} 4\\ 2 \end{bmatrix}

我们定义了两个二维向量 a\mathbf{a}b\mathbf{b} ,或许我们可以将其写成我们更为熟悉的形式:

a=(1,2),b=(4,2)\mathbf{a}=(-1,2),\mathbf{b}=(4,2)

没错,这就是我们数学课上学习到的向量的坐标表示

让我们来看一个实际应用的例子。假设一个物体从原点出发,先向东移动3米,再向北移动4米,那么这个位移向量可以表示为:

d=[34]\mathbf{d}=\begin{bmatrix} 3\\ 4 \end{bmatrix}

这个向量的长度(模)就是物体移动的直线距离:d=32+42=5\|\mathbf{d}\| = \sqrt{3^2 + 4^2} = 5 米。

你或许会注意到这里使用的是双竖线而非单竖线,这是因为我们使用的是欧几里得范数EuclideanNormEuclidean \enspace Norm ),其定义为:x=x12+x22++xn2\|\mathbf{x}\| = \sqrt{x_1^2 + x_2^2 + \cdots + x_n^2},对于向量,其欧几里得范数(使用双竖线表示),就是我们学校中学到的使用单竖线表示的模长(向量的长度)

接下来是矩阵( matrixmatrix#

矩阵在线性代数中与向量的表示类似,其常规表示如下:

A=[A1,1A1,2A2,1A2,2]\mathbf{A}=\begin{bmatrix} A_{1,1}&A_{1,2}\\ A_{2,1}&A_{2,2} \end{bmatrix}

矩阵是一个二维数组,与计算机中的二维数组类似,其每一个元素可以用两个索引确定,我们通常会赋予矩阵粗体的大写变量名称,比如此处使用 A\mathbf{A} ,对于每个元素 Ai,jA_{i,j}ii 为行索引, jj 为列索引

请注意:当我们需要使用索引定位某一个元素时,我们通常会在表达式后面接下标,如 f(A)i,jf(\mathbf{A})_{i,j}

还有张量( tensortensor#

张量这个词你或许感觉很陌生,但它的英文你一定很熟悉:Tensor,是的,大名鼎鼎的神经网络框架TensorFlow的名字就取自张量一词

所谓张量,就是超过两维的数组,一般地,一个数组中的元素分布在若干维坐标的规则网格中,我们称之为张量。

因为张量描述的是超越二维的数组,我们也就无法像矩阵“列举出来”,对于一个张量 A\mathbf{A} ,只能写成类似于 Ai,j,kA_{i,j,k}

举个例子,在图像处理中,一张彩色图片就可以用一个三维张量表示:

  • 第一维表示图片的高度(像素行数)
  • 第二维表示图片的宽度(像素列数)
  • 第三维表示RGB三个颜色通道

所以一张 100×100 像素的彩色图片可以表示为一个 100×100×3 的张量。

转置#

矩阵的转置( transposetranspose​ )操作或许一开始不太好理解,坦白地讲我也觉得其“几何定义”(即镜像)确实不好理解,不妨直接记住“代数”定义,其操作如下:

(A)i,j=Aj,i(A^\top)_{i,j}= A_{j,i}

是的,转置操作所谓的沿对角线镜像在索引表示上的操作其实就是行、列索引的互换,让我们来举个例子:

A=[A1,1A1,2A2,1A2,2A3,1A3,2]A=[A1,1A2,1A3,1A1,2A2,2A3,2]\mathbf{A}=\begin{bmatrix} A_{1,1}&A_{1,2} \\ A_{2,1}&A_{2,2} \\ A_{3,1}&A_{3,2} \end{bmatrix} \Rightarrow \mathbf{A^\top}=\begin{bmatrix} A_{1,1}&A_{2,1}&A_{3,1}\\ A_{1,2}&A_{2,2}&A_{3,2} \end{bmatrix}

这样是不是好理解多了?

矩阵和向量的运算#

矩阵相加#

如果矩阵的形状一样,我们就可以把两个矩阵相加,其法则非常简单——对应位置的元素相加即可

C=A+B\mathbf{C}=\mathbf{A}+\mathbf{B} ,其中就有 Ci,j=Ai,j+Bi,jC_{i,j}=A_{i,j}+B_{i,j}

标量与矩阵相乘#

当标量和矩阵相乘,或是和矩阵相加时,我们只需将其与矩阵的每个元素相乘或相加

D=aB+c\mathbf{D} = a\cdot \mathbf{B} + c ,其中 Di,j=aBi,j+cD_{i,j} = a\cdot B_{i,j} + c

举例而言:

a=2,B=[1342],C=aB=[2684]a=2,\enspace \mathbf{B}=\begin{bmatrix} 1&3\\ 4&2 \end{bmatrix},\quad \mathbf{C}=a \cdot \mathbf{B} = \begin{bmatrix} 2&6\\ 8&4 \end{bmatrix}

矩阵与向量相加#

特别地,在深度学习中,我们会使用一些不那么常规的符号,比如我们允许矩阵与向量相加,产生另一个矩阵:

C=A+b\mathbf{C}=\mathbf{A} + \mathbf{b}

其中:

Ci,j=Ai,j+bjC_{i,j}=A_{i,j} + b_{j}

矩阵乘法#

接下来便是重头戏——矩阵乘法,这是矩阵运算中最重要的操作之一,也是初学时比较难理解的一个操作

矩阵 A\mathbf{A}B\mathbf{B}矩阵乘积是第三个矩阵 C\mathbf{C}

其可以写作:

C=ABC=AB\mathbf{C} = \mathbf{A}\mathbf{B} \enspace 或 \enspace \mathbf{C} = \mathbf{A}\cdot\mathbf{B}

先决条件#

要进行乘法运算,两个矩阵需满足前提: 矩阵 A\mathbf{A} 的列数必须和矩阵 B\mathbf{B} 的行数相等。如果矩阵 A\mathbf{A} 的形状是 m×nm \times n ,矩阵 B\mathbf{B} 的形状是 n×pn \times p ,那么其乘积运算的结果矩阵 C\mathbf{C} 的形状就是 m×pm \times p ,举例而言:

A=[A1,1A1,2A1,3A2,1A2,2A2,3]\mathbf{A}= \begin{bmatrix} A_{1,1} & A_{1,2} & A_{1,3} \\ A_{2,1} & A_{2,2} & A_{2,3} \end{bmatrix} B=[B1,1B1,2B2,1B2,2B3,1B3,2]\mathbf{B}= \begin{bmatrix} B_{1,1} & B_{1,2} \\ B_{2,1} & B_{2,2} \\ B_{3,1} & B_{3,2} \end{bmatrix}

此时,矩阵 A\mathbf{A} 与矩阵 B\mathbf{B} 可以做乘法运算,其结果矩阵 C\mathbf{C} 的形状为:

C=[C1,1C1,2C2,1C2,2]\mathbf{C}= \begin{bmatrix} C_{1,1} & C_{1,2}\\ C_{2,1} & C_{2,2} \end{bmatrix}

运算法则#

从定义上来看,乘积运算是这样运作的:

Ci,j=k=1nAi,kBk,j=Ai,1B1,j+Ai,2B2,j++Ai,nBn,j\mathbf{C} _{i,j} = \sum_{k=1}^n A_{i,k}B_{k,j} = A_{i,1}B_{1,j} + A_{i,2}B_{2,j} + \cdots + A_{i,n}B_{n,j}

如果你前面掌握的不错,并且有一定数学功底,那么你大概可以对着表达式,稍加思索后明白这一切是如何发生的,如果不理解也没关系,我们来继续深入/简化

让我们来看一个具体的数值计算例子:

[123456]×[789101112]=[(1×7+2×9+3×11)(1×8+2×10+3×12)(4×7+5×9+6×11)(4×8+5×10+6×12)]=[5864139154]\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} \times \begin{bmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{bmatrix} = \begin{bmatrix} (1\times7 + 2\times9 + 3\times11) & (1\times8 + 2\times10 + 3\times12) \\ (4\times7 + 5\times9 + 6\times11) & (4\times8 + 5\times10 + 6\times12) \end{bmatrix} = \begin{bmatrix} 58 & 64 \\ 139 & 154 \end{bmatrix}

Matrix_multiplication_diagram

这是一张矩阵乘积运算的示意图,让我们一起来看

假设矩阵 C\mathbf{C} 为运算结果,则对于 (1,2)(1,2)(2,3)(2,3) 这两个位置,是这样运算得来的:

C1,2=k=12A1,kBk,2=A1,1B1,2+A1,2B2,2C_{1,2}=\sum_{k=1}^2 A_{1,k}B_{k,2}=A_{1,1}B_{1,2}+A_{1,2}B_{2,2} C3,3=k=12A3,kBk,3=A3,1B1,3+A3,2B2,3C_{3,3}=\sum_{k=1}^2 A_{3,k}B_{k,3}=A_{3,1}B_{1,3}+A_{3,2}B_{2,3}

应该有些感觉了,当计算 C1,2C_{1,2}C3,3C_{3,3} 这两个值时,分别来自两个矩阵的元素都依箭头方向而两两配对,把每一对中的两个元素相乘,再把这些乘积加总起来,最后得到的值即为箭头相交位置的值。

我不知道该怎么描述这个过程,你可以仔细品读一下,可以在草稿纸上自己试一试,可以把每两个相乘的项连起来,颇有一种连连看的感觉,我相信你可以理解的

现在让我们再来试着写一下通式,还是以先决条件中的两个矩阵相乘为例,此时有:

C=[C1,1C1,2C2,1C2,2]=[A1,1B1,1+A1,2B2,1+A1,3B3,1A1,1B1,2+A1,2B2,2+A1,3B3,2A2,1B1,1+A2,2B2,1+A2,3B3,1A2,1B1,2+A2,2B2,2+A2,3B3,2]\mathbf{C}= \begin{bmatrix} C_{1,1} & C_{1,2}\\ C_{2,1} & C_{2,2} \end{bmatrix} = \begin{bmatrix} A_{1,1}B_{1,1}+A_{1,2}B_{2,1}+A_{1,3}B_{3,1} & A_{1,1}B_{1,2}+A_{1,2}B_{2,2}+A_{1,3}B_{3,2}\\ A_{2,1}B_{1,1}+A_{2,2}B_{2,1}+A_{2,3}B_{3,1} & A_{2,1}B_{1,2}+A_{2,2}B_{2,2}+A_{2,3}B_{3,2} \end{bmatrix}

也为大家安利一下 3Blue1Brown 的《线性代数的本质》系列视频,看完以后你会有更深层次的理解:

让我们来看一个矩阵乘法的实际应用。假设一个商店销售三种商品,价格分别是:

  • 商品A:10元
  • 商品B:15元
  • 商品C:20元

两个顾客的购买情况如下:

  • 顾客1:2个A,1个B,3个C
  • 顾客2:1个A,3个B,2个C

我们可以用矩阵乘法来计算每个顾客需要支付的金额:

[213132]×[101520]=[2×10+1×15+3×201×10+3×15+2×20]=[9585]\begin{bmatrix} 2 & 1 & 3 \\ 1 & 3 & 2 \end{bmatrix} \times \begin{bmatrix} 10 \\ 15 \\ 20 \end{bmatrix} = \begin{bmatrix} 2\times10 + 1\times15 + 3\times20 \\ 1\times10 + 3\times15 + 2\times20 \end{bmatrix} = \begin{bmatrix} 95 \\ 85 \end{bmatrix}

这个结果表示顾客1需要支付95元,顾客2需要支付85元。


(To Be Continued…)

初探线性代数:向量、矩阵和张量
https://vriancao.top/posts/vector-matrix-tensor/vector-matrix-tensor/
作者
VrianCao
发布于
2024-11-15
许可协议
CC BY-NC-SA 4.0