线性代数
🏷sec_linear-algebra
在你已经可以存储和操作数据后,让我们简要地回顾一下部分基本线性代数内容。
这些内容能够帮助你了解和实现本书中介绍的大多数模型。
本节我们将介绍线性代数中的基本数学对象、算术和运算,并用数学符号和相应的代码实现来表示它们。
标量 0阶张量
如果你曾经在餐厅支付餐费,那么你已经知道一些基本的线性代数,比如在数字间相加或相乘。
例如,北京的温度为 5 2 ∘ F 52^{\circ}F 52∘F(除了摄氏度外,另一种温度计量单位)。
严格来说,我们称仅包含一个数值的叫标量(scalar)。
如果要将此华氏度值转换为更常用的摄氏度,
则可以计算表达式 c = 5 9 ( f − 32 ) c=\frac{5}{9}(f-32) c=95(f−32),并将 f f f赋为 52 52 52。
在此等式中,每一项( 5 5 5、 9 9 9和 32 32 32)都是标量值。
符号 c c c和 f f f称为变量(variable),它们表示未知的标量值。
在本书中,我们采用了数学表示法,其中标量变量由普通小写字母表示(例如, x x x、 y y y和 z z z)。
我们用 R \mathbb{R} R表示所有(连续)实数标量的空间。
我们之后将严格定义空间(space)是什么,
但现在你只要记住表达式 x ∈ R x\in\mathbb{R} x∈R是表示 x x x是一个实值标量的正式形式。
符号 ∈ \in ∈称为“属于”,它表示“是集合中的成员”。
我们可以用 x , y ∈ { 0 , 1 } x, y \in \{0,1\} x,y∈{
0,1}来表明 x x x和 y y y是值只能为 0 0 0或 1 1 1的数字。
(标量由只有一个元素的张量表示)。
在下面的代码中,我们实例化两个标量,并执行一些熟悉的算术运算,即加法、乘法、除法和指数。
import torch
x = torch.tensor(3.0)
y = torch.tensor(2.0)
x + y, x * y, x / y, x**y
(tensor(5.), tensor(6.), tensor(1.5000), tensor(9.))
向量 1阶张量
[你可以将向量视为标量值组成的列表]。
我们将这些标量值称为向量的元素(element)或分量(component)。
当向量表示数据集中的样本时,它们的值具有一定的现实意义。
例如,如果我们正在训练一个模型来预测贷款违约风险,我们可能会将每个申请人与一个向量相关联,
其分量与其收入、工作年限、过往违约次数和其他因素相对应。
如果我们正在研究医院患者可能面临的心脏病发作风险,我们可能会用一个向量来表示每个患者,
其分量为最近的生命体征、胆固醇水平、每天运动时间等。
在数学表示法中,我们通常将向量记为粗体、小写的符号
(例如, x \mathbf{x} x、 y \mathbf{y} y和 z ) \mathbf{z}) z))。
我们通过一维张量处理向量。一般来说,张量可以具有任意长度,取决于机器的内存限制。
x = torch.arange(4)
x
tensor([0, 1, 2, 3])
我们可以使用下标来引用向量的任一元素。
例如,我们可以通过 x i x_i xi来引用第 i i i个元素。
注意,元素 x i x_i xi是一个标量,所以我们在引用它时不会加粗。
大量文献认为列向量是向量的默认方向,在本书中也是如此。
在数学中,向量 x \mathbf{x} x可以写为:
x = [ x 1 x 2 ⋮ x n ] , \mathbf{x} =\begin{bmatrix}x_{1} \\x_{2} \\ \vdots \\x_{n}\end{bmatrix}, x=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤,
:eqlabel:eq_vec_def
其中 x 1 , … , x n x_1,\ldots,x_n x1,…,xn是向量的元素。在代码中,我们(通过张量的索引来访问任一元素)。
x[3]
tensor(3)
长度、维度和形状
向量只是一个数字数组,就像每个数组都有一个长度一样,每个向量也是如此。
在数学表示法中,如果我们想说一个向量 x \mathbf{x} x由 n n n个实值标量组成,
我们可以将其表示为 x ∈ R n \mathbf{x}\in\mathbb{R}^n x∈Rn。
向量的长度通常称为向量的维度(dimension)。
与普通的Python数组一样,我们可以通过调用Python的内置len()
函数来[访问张量的长度]。
len(x)
4
当用张量表示一个向量(只有一个轴)时,我们也可以通过.shape
属性访问向量的长度。
形状(shape)是一个元素组,列出了张量沿每个轴的长度(维数)。
对于(只有一个轴的张量,形状只有一个元素。)
x.shape
torch.Size([4])
请注意,维度(dimension)这个词在不同上下文时往往会有不同的含义,这经常会使人感到困惑。
为了清楚起见,我们在此明确一下:
向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量。
然而,张量的维度用来表示张量具有的轴数。
在这个意义上,张量的某个轴的维数就是这个轴的长度。
矩阵
正如向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。
矩阵,我们通常用粗体、大写字母来表示
(例如, X \mathbf{X} X、 Y \mathbf{Y} Y和 Z \mathbf{Z} Z),
在代码中表示为具有两个轴的张量。
在数学表示法中,我们使用 A ∈ R m × n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rm×n
来表示矩阵 A \mathbf{A} A,其由 m m m行和 n n n列的实值标量组成。
我们可以将任意矩阵 A ∈ R m × n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rm×n视为一个表格,
其中每个元素 a i j a_{ij} aij属于第 i i i行第 j j j列:
A = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ] . \mathbf{A}=\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \\ \end{bmatrix}. A=⎣⎢⎢⎢⎡a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn⎦⎥⎥⎥⎤.
:eqlabel:eq_matrix_def
对于任意 A ∈ R m × n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rm×n,
A \mathbf{A} A的形状是( m m m, n n n)或 m × n m \times n m×n。
当矩阵具有相同数量的行和列时,其形状将变为正方形;
因此,它被称为方阵(square matrix)。
当调用函数来实例化张量时,
我们可以[通过指定两个分量 m m m和 n n n来创建一个形状为 m × n m \times n m×n的矩阵]。
A = torch.arange(20).reshape(5, 4)
A
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
我们可以通过行索引( i i i)和列索引( j j j)来访问矩阵中的标量元素 a i j a_{ij} aij,
例如 [ A ] i j [\mathbf{A}]_{ij} [A]ij。
如果没有给出矩阵 A \mathbf{A} A的标量元素,如在 :eqref:eq_matrix_def
那样,
我们可以简单地使用矩阵 A \mathbf{A} A的小写字母索引下标 a i j a_{ij} aij
来引用 [ A ] i j [\mathbf{A}]_{ij} [A]ij。
为了表示起来简单,只有在必要时才会将逗号插入到单独的索引中,
例如 a 2 , 3 j a_{2,3j} a2,3j和 [ A ] 2 i − 1 , 3 [\mathbf{A}]_{2i-1,3} [A]2i−1,3。
当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose)。
我们用 a ⊤ \mathbf{a}^\top a⊤来表示矩阵的转置,如果 B = A ⊤ \mathbf{B}=\mathbf{A}^\top B=A⊤,
则对于任意 i i i和 j j j,都有 b i j = a j i b_{ij}=a_{ji} bij=aji