李沐深度学习预备知识——线性代数

李沐深度学习预备知识——线性代数


1、标量(不加粗表示)

用只有一个元素的张量表示

import torch
x = torch.tensor(3.0)
y = torch.tensor(2.0)
x + y, x * y, x / y, x**y

2、向量(小写粗体表示x)

机器学习大量文献定义向量默认方向为方向。但每个数据样本,一般是矩阵中的一行表示

x=torch.arange(4) # 注意有个a
print(x) #tensor([0, 1, 2, 3])
print(x[3])#tensor(3)
len(x)# 4
x.shape# 可调用shape属性访问长度 torch.Size([4])

维度(dimension)在不同语境下含义不同,对于向量(轴)来说指代长度。对于其他张量表示该张量拥有的轴数。

3、矩阵(大写粗体表示X)

实例化张量时,可指定形状

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

转置

A.T

4、张量(特殊大写字母,加粗视情况而定)

有n个轴的代数对象称为n阶张量,向量是一阶张量,矩阵是二阶张量。

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

5、张量算法的基本性质

对于张量运算,任何按元素二元运算的结果都将是相同形状的张量,包括+、-、*、/

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone() # 通过分配新内存,将A的一个副本分配给B,深拷贝,避免影响
A, A + B

上述代码若改为B=A,则若对B原址修改(例如B[:,:]=A+B)则,AB值同时变了,是浅拷贝。

矩阵的三种乘法方式:普通乘积(一般直接用AB表示,哈达玛积 ⊙ \odot 和克罗内克积 ⨂ \bigotimes 的介绍见下方链接内容,本文只介绍python实现。
矩阵三种乘积

A*B #hadamard product
2*A #乘以(加)标量等于矩阵A内每个元素乘以(加)这个标量
2+A

7、向量、矩阵的几种乘积

(1)点积(Dot Product)⟨x, y⟩

y = torch.ones(4, dtype = torch.float32)
x=torch.tensor([0,1,2,3],dtype=torch.float32)
print(torch.dot(x, y))
print(torch.sum(x * y))# 与上一行等价

点积应用广泛,在赋予权重时,可以用数据乘以权重向量得到值,当权重非负和为1时相当于求均值。当两个向量规范化得到单位长度时,乘积等于其夹角余弦值
在向量代数中,行向量和列向量是同构的,可以通过转置操作相互转换。在PyTorch中,一维张量并不强调其行向量或列向量属性,而是作为扁平化的数值序列对待。因此,无论是以行向量形式还是列向量形式理解这两个一维张量,torch.dot()和torch.sum(x * y)都会正确地计算它们之间的点积,无需特别关心向量的“方向”。故这里也体现了keepdims=True的语句,在降维时的作用,不降维一维张量。

(2)矩阵-向量积

矩阵A ∈ Rm×n和向量x ∈ Rn,进行矩阵-向量积实现从n到m的向量转换

A.shape, x.shape, torch.mv(A, x)

(3)矩阵乘法

torch.mm(A, B)

(4)范数

范数是线性代数中最有用的一类运算符,向量范数是将向量映射到标量的函数f。给定任意向量x,向量范数要满足一些属性

  • 1、如果我们按常数因子α缩放向量的所有元素,其范数也会按相同常数因子的绝对值缩放。 f ( α X ) = a b s ( α ) f ( X ) f(\alpha X)=abs(\alpha)f(X) f(αX)=abs(α)f(X)
  • 2、范数满足三角不等式 f ( X + Y ) < = f ( X ) + f ( Y ) f(X+Y)<=f(X)+f(Y) f(X+Y)<=f(X)+f(Y)
  • 3、范数是非负的 f ( X ) > = 0 f(X)>=0 fX>=0
    范数具体讲解见书本

计算L2范数(欧几里得距离)

u=torch.tensor([3.0,-4.0])
print(torch.norm(u))

计算L1范数(绝对值和)

print(torch.abs(u).sum())

更一般的Lp范数
∥ x ∥ p = ( ∑ i = 1 n ∣ x i p ∣ ) 1 / p \lVert \boldsymbol{x} \rVert _p=\left( \sum_{i=1}^n{\left| x_i ^p\right|} \right) ^{1/p} xp=(i=1nxip)1/p
对于矩阵的Frobenius 范数(Frobenius norm)是矩阵元素平方和的平方根
∥ X ∥ F = ( ∑ i = 1 m ∑ j = 1 n x i j 2 ) 1 / 2 \lVert \boldsymbol{X} \rVert _F=\left( \sum_{i=1}^m{\sum_{j=1}^n{x_{ij}^{2}}} \right) ^{1/2} XF=(i=1mj=1nxij2)1/2

torch.norm(torch.ones((4, 9)))# 计算frobenius范数

6、降维

# 降维求和
A=torch.arange(24).reshape(4,6)
print(A)
print(A.sum()) #求和降成0维
A.sum(axis=[0, 1]) #与上一行等价
A_sum_axis0=A.sum(axis=0)# 按行方向降维(注意指的是求每列和,最后是得到行向量)
print(A_sum_axis0)
# 降维求均值
A=A.type(float)
# 求均值
A.mean()
A.sum()/A.numel()
# 沿指定轴求平均降维
A.mean(axis=0), A.sum(axis=0) / A.shape[0]

求均值前,本小节的A内元素为long类型, mean() 函数要求输入张量的数据类型必须是浮点型(floating point)或复数型(complex)。这两种数据类型支持进行数学运算(如加法、除法等)并保持足够的精度。而 Long 类型通常代表整数类型,不适合直接用于计算平均值,因为它不支持除法得到精确的小数结果。为了解决这个问题,需要将张量 A 的数据类型转换为浮点型(如 float 或 double),然后再调用 mean() 函数。可以在调用 mean() 之前添加一行代码,使用 torch.Tensor.to() 方法或 torch.tensor.type() 方法进行类型转换。

# 非降维求和
sum_A = A.sum(axis=1, keepdims=True)# 保持轴数不变
A.cumsum(axis=0)# 累积和

keepdims:
带 keepdims=True:求和后,结果矩阵仍保持与原矩阵相同的维度数,只是在指定轴(这里是axis=0,即行)上的尺寸变为1。例如,如果原矩阵A.shape为(m, n),则sum_A.shape将是(1, n)。
不带 keepdims 或 keepdims=False(默认值):求和后,指定轴会被压缩(因为对该轴的操作已完成),结果矩阵的维度数会减一。同样以原矩阵A.shape为(m, n)为例,此时sum_A.shape将是(n,),即变为一维数组。
这个操作对后续操作的兼容性有影响:
带 keepdims=True:由于结果保持了与原矩阵相同的维度结构,对于后续需要同样维度的数学运算、索引操作或者与其他同维度数据拼接等场景(如广播),无需额外调整,可以直接使用,代码逻辑更清晰,也减少了因形状不匹配导致的错误。
不带 keepdims:结果是一维数组,若后续操作需要与原矩阵具有相同维度的数据结构交互,可能需要手动重塑(如使用reshape或expand_dims)以恢复丢失的维度,否则可能导致形状不匹配错误或需要调整代码逻辑来适应新的形状

  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值