线性代数基础

本文目录

  • 1. 线性代数的意义
  • 2. 基本概念
  • 3. Pytorch中的运算
    • 3.1 标量
    • 3.2 向量
    • 3.3 长度、维度和形状
    • 3.4 矩阵
    • 3.5 张量
    • 3.6 降维
    • 3.7 点积
    • 3.8 矩阵-矩阵乘法
    • 3.9 范数

1. 线性代数的意义

  • 线性代数提供了⼀种看待世界的抽象视角:万事万物都可以被抽象成某些特征的组合,并在由预置规则定义的框架之下以静态和动态的方式加以观察。
  • 是现代数学和以现代数学作为主要分析方法的众多学科的基础。从量子力学到图像处理都离不开向量和矩阵的使用。
  • 线性代数是用虚拟数字世界表示真实物理世界的工具。
  • 线性代数的本质在于将具体事物抽象为数学对象,并描述其静态和动态的特性;

2. 基本概念

集合:元素常常有共性

标量(scalar):一个标量 a 可以是整数、实数或复数。零维数组(即只有单纯的一个数)。

向量(vector):多个标量a1,a2,⋯,an按一定顺序组成一个序列。一维数组,向量的实质是 n 维线性空间中的静止点;shape=(1,n)

矩阵(matrix):将向量的所有标量都替换成相同规格的向量。二维数组;shape=(m,n)

张量(tensor):矩阵中的每个标量元素再替换为向量。高阶的矩阵。三维或者n维等高维数组。;shape=(a1,a2…,an)

范数(norm):对单个向量大小的度量,描述的是向量自身的性质,其作用是将向量映射为一个非负的数值。对⼀个给定向量, L 1 {L_1} L1 范数计算的是向量所有元素绝对值的和, L 2 {L_2} L2 范数计算的是通常意义上的向量长度, L ∞ {L_∞} L 范数计算的则是向量中最大元素的取值。通用的 L p {L ^ p} Lp 范数定义如下:

线性代数基础_第1张图片

内积(inner product):计算两个向量之间的关系,对应元素乘积的求和。两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为:a·b=a1b1+a2b2+……+anbn。内积能够表示两个向量之间的相对位置,即向量之间的夹角。一种特殊的情况是内积为 0,即(x,y)=0.在二维空间上,这意味着两个向量的夹角为 90 度,即相互垂直。而在高维空间上,这种关系被称为正交(orthogonality)。如果两个向量正交,说明他们线性无关,相互独立,互不影响。

线性空间(linear space):一个集合的元素具有相同维数的向量(可以是有限个或无限个), 并且定义了加法和数乘等结构化的运算.
在线性空间中,任意一个向量代表的都是 n 维空间中的一个点;反过来, 空间中的任意点也都可以唯一地用一个向量表示。

内积空间(inner product space):定义了内积运算的线性空间。

正交基(orthogonal basis):在内积空间中,一组两两正交的向量构成这个空间的正交基。 正交基的作用就是给内积空间定义出经纬度。⼀旦描述内积空间的正交基确定了,向量和点之间的对应关系也就随之确定。描述内积空间的正交基并不唯一。对二维空间来说,平面直角坐标系和极坐标系就对应了两组不同的正交基,也代表了两种实用的描述方式。

标准正交基(orthonormal basis):正交基中基向量的 L 2 {L_2} L2范数都是单位长度 1。

线性变换(linear transformation):线性变换描述了向量或者作为参考系的坐标系的变化,可以用矩阵表示。线性空间的一个重要特征是能够承载变化。当作为参考系的标准正交基确定后,空间中的点就可以用向量表示。当这个点从一个位置移动到另一个位置时,描述它的向量也会发生改变。在线性空间中,变化的实现有两种方式:一是点本身的变化,二是参考系的变化。在第一种方式中,使某个点发生变化的方法是用代表变化的矩阵乘以代表对象的向量。可是反过来,如果保持点不变,而是换一种观察的角度,得到的也将是不同的结果。

矩阵的作用就是对正交基进行变换。因此,对于矩阵和向量的相乘,就存在不同的解读方式:Ax = y。向量 x 经过矩阵 A 所描述的变换,变成了向量 y;也可以理解为一个对象在坐标系 A 的度量下得到的结果为向量 x,在标准坐标系(单位矩阵:主对角线元素为 1,其余元素为 0)的度量下得到的结果为向量 y。这表示矩阵不仅能够描述变化,也可以描述参考系本身。表达式 Ax 就相当于对向量 x 做了一个环境声明,用于度量它的参考系是 A。如果想用其他的参考系做度量的话,就要重新声明。而对坐标系施加变换的方法,就是让表示原始坐标系的矩阵与表示变换的矩阵相乘。

特征值(eigenvalue):表示了变化的速度

特征向量(eigenvector):表示变化的方向

对于Ax = λx。其效果通常是对原始向量同时施加方向变化和尺度变化。有些特殊的向量,矩阵的作用只有尺度变化而没有方向变化,也就是只有伸缩的效果而没有旋转的效果。对于给定的矩阵来说,这类特殊的向量就是矩阵的特征向量,特征向量的尺度变化系数就是特征值。

特征值分解:求解给定矩阵的特征值和特征向量的过程。但能够进行特征值分解的矩阵必须是 n 维方阵。

奇异值分解:将特征值分解算法推广到所有矩阵之上。

3. Pytorch中的运算

3.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.5]), tensor([9])

3.2 向量

向量是标量值组成的列表,我们将这些标量值称为向量的元素或分量。在数学表示法中,我们通常将向量记为粗体、小写的符号(例如, x 、 y 和 z {x、 y和 z } xyz一维数组

x = torch.arange(4)

输出:
tensor([0, 1, 2, 3])

大量文献认为列向量是向量的默认方向。在数学中,向量 $x $可以写为:

线性代数基础_第2张图片

我们可以通过张量的索引来访问任一元素:

x[3]

OutPut:
tensor(3)

3.3 长度、维度和形状

向量的长度通常称为向量的维度。与普通的Python数组一样,我们可以通过调用Python的内置len()函数来访问张量的长度。

len(x)

输出:
4

当用张量表示一个向量(只有一个轴)时,我们也可以通过.shape属性访问向量的长度。形状(shape)是一个元组,列出了张量沿每个轴的长度(维数)。对于只有一个轴的张量,形状只有一个元素。

x.shape

输出:
torch.Size([4])

注意,维度(dimension)这个词在不同上下文时往往会有不同的含义向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量。然而,张量的维度用来表示张量具有的轴数。在这个意义上,张量的某个轴的维数就是这个轴的长度。

3.4 矩阵

向量将标量从零阶推广到了一阶,矩阵将向量从一阶推广到了二阶。矩阵,通常用大写字母来表示(例如,X、Y和Z),在代码中表示为具有两个轴的张量。在数学表示法中,我们使用 A ∈ R m × n {A∈R^{m\times n}} ARm×n来表示矩阵A,其由m行和n列的实值标量组成。直观地,我们可以将任意矩阵 A ∈ R m × n {A∈R^{m\times n}} ARm×n视为一个表格。二维数组

线性代数基础_第3张图片

当矩阵具有相同数量的行和列时,其形状将变为正方形;因此,它被称为方矩阵。

当调用函数来实例化张量时,我们可以通过指定两个分量m和n来创建一个形状为 m×n的矩阵。

A = torch.arange(20).reshape(5, 4)

输出:
tensor([[0, 1, 2, 3],
        [4, 5, 6, 7],
        [8, 9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])

当我们交换矩阵的行和列时,结果称为矩阵的转置。我们用 A T {A^T} AT来表示矩阵 A {A} A的转置。现在我们在代码中访问矩阵的转置。

A.T

输出:
tensor([[0, 4, 8, 12, 16],
        [1, 5, 9, 13, 17],
        [2, 6, 10, 14, 18],
        [3, 7, 11, 15, 19]])

矩阵是有用的数据结构:它们允许我们组织具有不同变化模式的数据。例如,我们矩阵中的行可能对应于不同的房屋(数据样本),而列可能对应于不同的属性。因此,尽管单个向量的默认方向是列向量,但在表示表格数据集的矩阵中,将每个数据样本作为矩阵中的行向量更为常见。

3.5 张量

张量为我们提供了描述具有任意数量轴的 n 维数组的通用方法。高阶的矩阵

当我们开始处理图像时,张量将变得更加重要,图像以 3 维数组形式出现,其中3个轴对应于高度、宽度以及一个通道(channel)轴,用于堆叠颜色通道(红色、绿色和蓝色)。现在,我们将跳过高阶张量,集中在基础知识上。

X = torch.arange(24).reshape(2, 3, 4)

输出:
tensor([[[0, 1, 2, 3],
         [4, 5, 6, 7],
         [8, 9, 10, 11]],
        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])

任何按元素的一元运算都不会改变其操作数的形状。同样,给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量。例如,将两个相同形状的矩阵相加会在这两个矩阵上执行元素的加法。

A = torch.arange(20, dtype=torch.float32).reshape(5,4)
B = A.clone
A, A + B

输出:
tensor([[0, 1, 2, 3],
        [4, 5, 6, 7],
        [8, 9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]]),
tensor([[0, 2, 4, 6],
        [8, 10, 12, 14],
        [16, 18, 20, 22],
        [24, 26, 28, 30],
        [32, 34, 36, 38]])

两个矩阵按元素乘法称为哈达玛积。

A * B

输出:
tensor([[0, 1, 4, 9],
        [16, 25, 36, 49],
        [64, 81, 100, 121],
        [144, 169, 196, 225],
        [256, 289, 324, 361]])

将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。

3.6 降维

我们可以对任意张量进行一个有用的操作是计算其元素的和。在代码中,我们可以调用计算求和的函数:

x = torch.arange(4, dtype = torch.float32)
x.sum()

输出:
tensor(6)

默认的情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。我们还可以指定张量沿哪一个轴来通过求和降低维度。以矩阵为例,为了通过求和所有行的元素来降维(轴0),我们可以在调用函数时指定axis = 0。由于输入矩阵沿着0轴降维以生成输出张量,因此输入的轴0的维数在输出形状中丢失。

A.shape
torch.Size([5, 4])
A_sum_axis0 =A.sum(axis =0)
A_sum_axis0, A_sum_axis0.shape

输出:
tensor([40, 45, 50, 55]), torch.Size([4])

指定axis = 1将通过汇总所有列的元素降维(轴1)。因此,输入的轴1的维数在输出形状中消失。

A_sum_axis1 = A.sum(axis = 1)
A_sum_axis1, A_sum_axis1.shape

输出:
tensor([6, 22, 38, 54, 70]), torch.Size([5])

沿着行和列对矩阵求和,等价于对矩阵的所有元素进行求和。

A.sum(axis=[0, 1])

输出:
tensor(190)

一个与求和相关的量是平均值。在代码中,我们可以调用函数来计算任意形状张量的平均值。

A.mean()

同样,计算平均值的函数也可以沿指定轴降低张量的维度。

A.mean(axis = 0)

3.7 点积

最基本的操作是点积。给定两个向量,点积是它们相同位置的按元素乘积的和。

y = torch.ones(4, dtype = torch.float32)
x, y, torch.dot(x, y)

输出:
tensor([0, 1, 2, 3]), tensor([1, 1, 1, 1]), tensor(6)

3.8 矩阵-矩阵乘法

在下面的代码中,我们在A和B上执行矩阵乘法。这里的A是一个5行4列的矩阵,B是一个4行3列的矩阵。相乘后,我们得到一个5行3列的矩阵。A、B矩阵做乘法的要求为:A的列数等于B的行数。做乘法以后新的矩阵的形状为(A的行数,B的列数)

B = torch.ones(4, 3)
torch.mm(A, B)

3.9 范数

线性代数中最有用的一些运算符是范数。非正式地说,一个向量的范数告诉我们一个向量有多大。这里考虑的大小(size)概念不涉及维度,而是分量的大小。

在线性代数中,向量范数是将向量映射到标量的函数 f 。向量范数要满足一些属性。给定任意向量 x ,

第一个性质来说,如果我们按常数因子 α 缩放向量的所有元素,其范数也会按相同常数因子的绝对值缩放:
f ( α x ) = ∣ α ∣ f ( x ) f ( \alpha x ) = |\alpha| f ( { \bf x } ) f(αx)=αf(x)
第二个性质是我们熟悉的三角不等式:
f ( x + y ) < = f ( x ) + f ( y ) f ( { \bf x + y }) <= f ( { \bf x } ) + f ( { \bf y } ) f(x+y)<=f(x)+f(y)
第三个性质简单地说范数必须是非负的:
f ( X ) > = 0 f ( { X } ) >= 0 f(X)>=0
最后一个性质要求范数最小为0,当且仅当向量全由0组成:
∀ i , [ x ] i = 0   < = >   f ( x ) =   0 \forall i , [ x ] _ { i } = 0 \, <=>\, f ( { \bf x } ) = \, 0 i,[x]i=0<=>f(x)=0
可能在这里会注意到,范数听起来很像距离的度量。事实上,欧几里得距离是一个范数:具体而言,它是L2范数。在代码中,我们可以按如下方式计算向量L2的范数。

u = torch.tensor([3, 4])
torch.norm(u)

在深度学习中,我们更经常地使用L2范数的平方。我们还会经常遇到L1范数,它表示为向量元素的绝对值之和:
x ∣ 1 = ∑ i = 1 n ∣ x i ∣ { \bf x } | _ { 1 } = \sum _ { i = 1 } ^ { n } { } |{ x } { } _ { i }| x1=i=1nxi
与L2范数相比,L1范数受异常值的影响较小。为了计算L1范数,我们将绝对值函数和按元素求和组合起来。

u = torch.tensor([3, 4])
torch.abs(u).sum()

L2范数和L1范数都是更一般的LP范数的特例:

线性代数基础_第4张图片

范数和目标:

地使用L2范数的平方。我们还会经常遇到L1范数,它表示为向量元素的绝对值之和:
x ∣ 1 = ∑ i = 1 n ∣ x i ∣ { \bf x } | _ { 1 } = \sum _ { i = 1 } ^ { n } { } |{ x } { } _ { i }| x1=i=1nxi
与L2范数相比,L1范数受异常值的影响较小。为了计算L1范数,我们将绝对值函数和按元素求和组合起来。

u = torch.tensor([3, 4])
torch.abs(u).sum()

L2范数和L1范数都是更一般的LP范数的特例:

[外链图片转存中…(img-rVpkaMAL-1651218583741)]

范数和目标:

在深度学习中,我们经常试图解决优化问题:最大化分配给观测数据的概率;最小化预测和真实观测之间的距离。用向量表示物品(如单词、产品或新闻文章),以便最小化相似项目之间的距离,最大化不同项目之间的距离。通常,目标,或许是深度学习算法最终要的组成部分(除了数据),被表达为范数。

你可能感兴趣的:(NLP,算法,线性代数,人工智能,机器学习,深度学习)