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