最近打算开始读《深度学习》(花书),开局就是线性代数,给了我这个高中生当头一棒,但奈何这深度学习还是得学,也只好试试初探一下线性代数,也希望这篇文章可以给想要学习线性代数的高中生一些建议
接下来我将跟随花书的节奏,一步步往下看,作为初探线性代数的第一篇文章,本文讲述的是向量、矩阵和张量
我们对线性代数并不陌生,无论是物理中的力的合成与分解,还是数学中的向量,都是线性代数的一部分
向量、矩阵和张量#
从向量( vector )讲起#
基于我们对于向量更加了解,我们先从向量开始学习
在线性代数中,向量的常规表示如下:
x=x1x2⋮xn其中,向量的名字通常为一个粗体小写字母(如 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∥=x12+x22+⋯+xn2,对于向量,其欧几里得范数(使用双竖线表示),就是我们学校中学到的使用单竖线表示的模长(向量的长度)
接下来是矩阵( matrix )#
矩阵在线性代数中与向量的表示类似,其常规表示如下:
A=[A1,1A2,1A1,2A2,2]矩阵是一个二维数组,与计算机中的二维数组类似,其每一个元素可以用两个索引确定,我们通常会赋予矩阵粗体的大写变量名称,比如此处使用 A ,对于每个元素 Ai,j , i 为行索引, j 为列索引
请注意:当我们需要使用索引定位某一个元素时,我们通常会在表达式后面接下标,如 f(A)i,j
还有张量( tensor )#
张量这个词你或许感觉很陌生,但它的英文你一定很熟悉:Tensor,是的,大名鼎鼎的神经网络框架TensorFlow的名字就取自张量一词
所谓张量,就是超过两维的数组,一般地,一个数组中的元素分布在若干维坐标的规则网格中,我们称之为张量。
因为张量描述的是超越二维的数组,我们也就无法像矩阵“列举出来”,对于一个张量 A ,只能写成类似于 Ai,j,k
举个例子,在图像处理中,一张彩色图片就可以用一个三维张量表示:
- 第一维表示图片的高度(像素行数)
- 第二维表示图片的宽度(像素列数)
- 第三维表示RGB三个颜色通道
所以一张 100×100 像素的彩色图片可以表示为一个 100×100×3 的张量。
矩阵的转置( transpose )操作或许一开始不太好理解,坦白地讲我也觉得其“几何定义”(即镜像)确实不好理解,不妨直接记住“代数”定义,其操作如下:
(A⊤)i,j=Aj,i是的,转置操作所谓的沿对角线镜像在索引表示上的操作其实就是行、列索引的互换,让我们来举个例子:
A=A1,1A2,1A3,1A1,2A2,2A3,2⇒A⊤=[A1,1A1,2A2,1A2,2A3,1A3,2]这样是不是好理解多了?
矩阵和向量的运算#
矩阵相加#
如果矩阵的形状一样,我们就可以把两个矩阵相加,其法则非常简单——对应位置的元素相加即可
如 C=A+B ,其中就有 Ci,j=Ai,j+Bi,j
标量与矩阵相乘#
当标量和矩阵相乘,或是和矩阵相加时,我们只需将其与矩阵的每个元素相乘或相加
如 D=a⋅B+c ,其中 Di,j=a⋅Bi,j+c
举例而言:
a=2,B=[1432],C=a⋅B=[2864]矩阵与向量相加#
特别地,在深度学习中,我们会使用一些不那么常规的符号,比如我们允许矩阵与向量相加,产生另一个矩阵:
C=A+b其中:
Ci,j=Ai,j+bj矩阵乘法#
接下来便是重头戏——矩阵乘法,这是矩阵运算中最重要的操作之一,也是初学时比较难理解的一个操作
矩阵 A 与 B 的矩阵乘积是第三个矩阵 C
其可以写作:
C=AB或C=A⋅B先决条件#
要进行乘法运算,两个矩阵需满足前提: 矩阵 A 的列数必须和矩阵 B 的行数相等。如果矩阵 A 的形状是 m×n ,矩阵 B 的形状是 n×p ,那么其乘积运算的结果矩阵 C 的形状就是 m×p ,举例而言:
A=[A1,1A2,1A1,2A2,2A1,3A2,3] B=B1,1B2,1B3,1B1,2B2,2B3,2此时,矩阵 A 与矩阵 B 可以做乘法运算,其结果矩阵 C 的形状为:
C=[C1,1C2,1C1,2C2,2]运算法则#
从定义上来看,乘积运算是这样运作的:
Ci,j=k=1∑nAi,kBk,j=Ai,1B1,j+Ai,2B2,j+⋯+Ai,nBn,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) 这两个位置,是这样运算得来的:
C1,2=k=1∑2A1,kBk,2=A1,1B1,2+A1,2B2,2 C3,3=k=1∑2A3,kBk,3=A3,1B1,3+A3,2B2,3应该有些感觉了,当计算 C1,2 和 C3,3 这两个值时,分别来自两个矩阵的元素都依箭头方向而两两配对,把每一对中的两个元素相乘,再把这些乘积加总起来,最后得到的值即为箭头相交位置的值。
我不知道该怎么描述这个过程,你可以仔细品读一下,可以在草稿纸上自己试一试,可以把每两个相乘的项连起来,颇有一种连连看的感觉,我相信你可以理解的
现在让我们再来试着写一下通式,还是以先决条件中的两个矩阵相乘为例,此时有:
C=[C1,1C2,1C1,2C2,2]=[A1,1B1,1+A1,2B2,1+A1,3B3,1A2,1B1,1+A2,2B2,1+A2,3B3,1A1,1B1,2+A1,2B2,2+A1,3B3,2A2,1B1,2+A2,2B2,2+A2,3B3,2]也为大家安利一下 3Blue1Brown 的《线性代数的本质》系列视频,看完以后你会有更深层次的理解:
让我们来看一个矩阵乘法的实际应用。假设一个商店销售三种商品,价格分别是:
两个顾客的购买情况如下:
- 顾客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…)