最近打算开始读《深度学习》(花书),开局就是线性代数,给了我这个高中生当头一棒,但奈何这深度学习还是得学,也只好试试初探一下线性代数,也希望这篇文章可以给想要学习线性代数的高中生一些建议
接下来我将跟随花书的节奏,一步步往下看,作为初探线性代数的第一篇文章,本文讲述的是向量、矩阵和张量
我们对线性代数并不陌生,无论是物理中的力的合成与分解,还是数学中的向量,都是线性代数的一部分
向量、矩阵和张量#
从向量 (vector) 讲起#
基于我们对于向量更加了解,我们先从向量开始学习
在线性代数中,向量的常规表示如下:
x=x_1x_2⋮x_n其中,向量的名字通常为一个粗体小写字母 (如 x ) 表示,每个元素为 x_n
让我们来举一个更为直观的例子:
a=[−12],b=[42]我们定义了两个二维向量 a 和 b ,或许我们可以将其写成我们更为熟悉的形式:
a=(−1,2),b=(4,2)没错,这就是我们数学课上学习到的向量的坐标表示
让我们来看一个实际应用的例子。假设一个物体从原点出发,先向东移动 3 米,再向北移动 4 米,那么这个位移向量可以表示为:
d=[34]这个向量的长度 (模) 就是物体移动的直线距离:∣d∣=32+42=5 米。
你或许会注意到这里使用的是双竖线而非单竖线,这是因为我们使用的是欧几里得范数 (EuclideanNorm),其定义为:∣x∣=x_12+x_22+⋯+x_n2,对于向量,其欧几里得范数 (使用双竖线表示),就是我们学校中学到的使用单竖线表示的模长 (向量的长度)
接下来是矩阵 (matrix)#
矩阵在线性代数中与向量的表示类似,其常规表示如下:
A=[A_1,1&A_1,2A_2,1&A_2,2]矩阵是一个二维数组,与计算机中的二维数组类似,其每一个元素可以用两个索引确定,我们通常会赋予矩阵粗体的大写变量名称,比如此处使用 A ,对于每个元素 A_i,j , i 为行索引, j 为列索引
请注意:当我们需要使用索引定位某一个元素时,我们通常会在表达式后面接下标,如 f(A)_i,j
还有张量 (tensor)#
张量这个词你或许感觉很陌生,但它的英文你一定很熟悉 **:Tensor**,是的,大名鼎鼎的神经网络框架 TensorFlow 的名字就取自张量一词
所谓张量,就是超过两维的数组,一般地,一个数组中的元素分布在若干维坐标的规则网格中,我们称之为张量。
因为张量描述的是超越二维的数组,我们也就无法像矩阵 “列举出来”,对于一个张量 A ,只能写成类似于 A_i,j,k
举个例子,在图像处理中,一张彩色图片就可以用一个三维张量表示:
- 第一维表示图片的高度 (像素行数)
- 第二维表示图片的宽度 (像素列数)
- 第三维表示 RGB 三个颜色通道
所以一张 100×100 像素的彩色图片可以表示为一个 100×100×3 的张量。
矩阵的转置 (transpose) 操作或许一开始不太好理解,坦白地讲我也觉得其 “几何定义”(即镜像) 确实不好理解,不妨直接记住 “代数” 定义,其操作如下:
(A⊤)i,j=Aj,i是的,转置操作所谓的沿对角线镜像在索引表示上的操作其实就是行、列索引的互换,让我们来举个例子:
A=A_1,1&A_1,2A_2,1&A_2,2A_3,1&A_3,2⇒A⊤=[A_1,1&A_2,1&A_3,1A_1,2&A_2,2&A_3,2]这样是不是好理解多了?
矩阵和向量的运算#
矩阵相加#
如果矩阵的形状一样,我们就可以把两个矩阵相加,其法则非常简单 —— 对应位置的元素相加即可
如 C=A+B ,其中就有 C_i,j=A_i,j+B_i,j
标量与矩阵相乘#
当标量和矩阵相乘,或是和矩阵相加时,我们只需将其与矩阵的每个元素相乘或相加
如 D=a⋅B+c ,其中 D_i,j=a⋅B_i,j+c
举例而言:
a=2,B=[1432],C=a⋅B=[2864]矩阵与向量相加#
特别地,在深度学习中,我们会使用一些不那么常规的符号,比如我们允许矩阵与向量相加,产生另一个矩阵:
C=A+b其中:
C_i,j=A_i,j+b_j矩阵乘法#
接下来便是重头戏 —— 矩阵乘法,这是矩阵运算中最重要的操作之一,也是初学时比较难理解的一个操作
矩阵 A 与 B 的矩阵乘积是第三个矩阵 C
其可以写作:
C=AB或C=A⋅B先决条件#
要进行乘法运算,两个矩阵需满足前提: 矩阵 A 的列数必须和矩阵 B 的行数相等。如果矩阵 A 的形状是 m×n ,矩阵 B 的形状是 n×p ,那么其乘积运算的结果矩阵 C 的形状就是 m×p ,举例而言:
A=[A_1,1A_2,1A_1,2A_2,2A_1,3A_2,3] B=B_1,1B_2,1B_3,1B_1,2B_2,2B_3,2此时,矩阵 A 与矩阵 B 可以做乘法运算,其结果矩阵 C 的形状为:
C=[C_1,1C_2,1C_1,2C_2,2]运算法则#
从定义上来看,乘积运算是这样运作的:
Ci,j=k=1∑nA_i,kB_k,j=A_i,1B_1,j+A_i,2B_2,j+⋯+A_i,nB_n,j如果你前面掌握的不错,并且有一定数学功底,那么你大概可以对着表达式,稍加思索后明白这一切是如何发生的,如果不理解也没关系,我们来继续深入 / 简化
让我们来看一个具体的数值计算例子:
[142536]×791181012=============[(1×7+2×9+3×11)(4×7+5×9+6×11)(1×8+2×10+3×12)(4×8+5×10+6×12)]=============[5813964154]
这是一张矩阵乘积运算的示意图,让我们一起来看
假设矩阵 C 为运算结果,则对于 (1,2) 和 (2,3) 这两个位置,是这样运算得来的:
C_1,2=∑_k=12A_1,kB_k,2=A_1,1B_1,2+A_1,2B_2,2 C_3,3=∑_k=12A_3,kB_k,3=A_3,1B_1,3+A_3,2B_2,3应该有些感觉了,当计算 C_1,2 和 C_3,3 这两个值时,分别来自两个矩阵的元素都依箭头方向而两两配对,把每一对中的两个元素相乘,再把这些乘积加总起来,最后得到的值即为箭头相交位置的值。
我不知道该怎么描述这个过程,你可以仔细品读一下,可以在草稿纸上自己试一试,可以把每两个相乘的项连起来,颇有一种连连看的感觉,我相信你可以理解的
现在让我们再来试着写一下通式,还是以先决条件中的两个矩阵相乘为例,此时有:
C=[C_1,1C_2,1C_1,2C_2,2]=============[A_1,1B_1,1+A_1,2B_2,1+A_1,3B_3,1A_2,1B_1,1+A_2,2B_2,1+A_2,3B_3,1A_1,1B_1,2+A_1,2B_2,2+A_1,3B_3,2A_2,1B_1,2+A_2,2B_2,2+A_2,3B_3,2]也为大家安利一下 3Blue1Brown 的《线性代数的本质》系列视频,看完以后你会有更深层次的理解:
让我们来看一个矩阵乘法的实际应用。假设一个商店销售三种商品,价格分别是:
- 商品 A:10 元
- 商品 B:15 元
- 商品 C:20 元
两个顾客的购买情况如下:
- 顾客 1:2 个 A,1 个 B,3 个 C
- 顾客 2:1 个 A,3 个 B,2 个 C
我们可以用矩阵乘法来计算每个顾客需要支付的金额:
[211332]×101520=============[2×10+1×15+3×201×10+3×15+2×20]=============[9585]这个结果表示顾客 1 需要支付 95 元,顾客 2 需要支付 85 元。
(To Be Continued…)