目录
1. 数学概念
李沐老师在视频里说线代不必学得很深,但是他在PPT里放的概念有一定理解门槛(大一考过的线代都忘完了)
1.1 长度
课程原视频:
1.2 点乘
1.3 矩阵乘法
- 前者有几行,后者有几列,乘出来就是几行几列
李沐老师:这个操作在后面会很常用,需要了解!
1.4 范数
- 计算简单:F范数的计算仅涉及矩阵元素的平方和,这可以通过简单的循环或矩阵运算快速完成。
- 易于分析:F范数在数学分析中经常出现,因为它与矩阵的迹(trace)和行列式等概念有直接的联系。
1.5 特殊矩阵
1.6 特征值和特征向量
1.7 资源推荐
我搜集了很多B站和知乎资源,进过筛选,最推荐的教学资源如下,预计阅读时长15min
资源好不好,贴几张图便知,这位博主的文章质量很高
1. 矩阵乘法:
2. 特征向量和特征值:
2. PyTorch中“张量”的“轴”
在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量,也就是维度;
在pytorch中也一样。
就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构,也就是这里的张量(tensor)。
当我们开始处理图像时,张量将变得更加重要,图像以𝑛维数组形式出现, 其中3个轴对应于高度、宽度,以及一个通道(channel)轴, 用于表示颜色通道(红色、绿色和蓝色)。 现在先将高阶张量暂放一边,而是专注学习其基础知识。
3. 分配新内存(隔离)
还可参考这里(来自数据操作章节的jupyter)
X = x.reshape(3, 4)
print(X)
Y = X.numel() # 检查size,元素个数
print(Y)
# x改了,X也会改,因为pytorch和numpy改n维数组的值,该变量的地址却没改,因此尽量别改值
x[1] = 3
print(X)
# view和reshape基本一样,但reshape更形象、常用
Z = x.view(3, 4)
print(Z)
"""
输出为:
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
12
tensor([[ 0, 3, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([[ 0, 3, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
"""
4. 按特定轴求和(降维)
4.1 轴,维度,层
4.2 看到“axis=”说明要降维
对哪个轴求和就是消去(折叠)哪个维度
假想一个立方体,(沿着长宽高的某个方向)把它压扁,便是沿着某条轴降维求和
把外层压缩到内层,最内层是“列”
关于轴和降维,很多同学们反馈没听懂,李沐老师还做了补充:
(看完这个视频,很多同学直呼 “清晰!”,“通透!” )
代码如下↓(这里的A是李沐老师现场加到的三维,讲义原先是二维reshape(5,4),0-19)
李沐老师这里是两个维度求和(一次压缩两个维度),超过了文档讲义,详情可参考:
【05 线性代数【动手学深度学习v2】】【精准空降到 05:43】
https://www.bilibili.com/video/BV1eK4y1U7Qy/?p=2&share_source=copy_web&vd_source=625c1cc8099ce85e6541c402c78c1760&t=34
4.3 降维求平均 mean()
5. 非降维求和(广播机制)
这得先从广播机制说起:
5.1 广播机制
相同形状的两个张量上可以执行按元素(加减乘除)操作。 在某些情况下,[即使形状不同,我们仍然可以通过调用 广播机制(broadcasting mechanism)来执行按元素操作]。 这种机制的工作方式如下:
- 通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
- 对生成的数组执行按元素操作。
在大多数情况下,我们将沿着数组中长度为1的轴进行广播,如下例子:
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
"""
运行结果:
(tensor([[0],
[1],
[2]]),
tensor([[0, 1]]))
"""
由于a和b分别是3×1和1×2矩阵,如果让它们相加,它们的形状不匹配。我们将两个矩阵广播为一个更大的3×2矩阵,如下所示:矩阵a将复制列,矩阵b将复制行,然后再按元素相加。
a + b
"""
运行结果:
tensor([[0, 1],
[1, 2],
[2, 3]])
"""
5.2 keepdims=True(非降维)
即Keep Dimensions,保持维度
有时在调用函数来[计算总和或均值时保持轴数不变]会很有用。
比如:
sum_A = A.sum(axis=1, keepdims=True)
sum_A
"""
输出:
tensor([[[ 40., 45., 50., 55.]],
[[140., 145., 150., 155.]]])
"""
由于sum_A
在对每行进行求和后仍保持两个轴,我们可以(通过广播将A
除以sum_A
)。如果上面没有“keepdims=True”,下面就除(四则运算)不了,四则运算得同维度才能广播。
A / sum_A
"""
输出:
tensor([[[0.0000, 0.0222, 0.0400, 0.0545],
[0.1000, 0.1111, 0.1200, 0.1273],
[0.2000, 0.2000, 0.2000, 0.2000],
[0.3000, 0.2889, 0.2800, 0.2727],
[0.4000, 0.3778, 0.3600, 0.3455]],
[[0.1429, 0.1448, 0.1467, 0.1484],
[0.1714, 0.1724, 0.1733, 0.1742],
[0.2000, 0.2000, 0.2000, 0.2000],
[0.2286, 0.2276, 0.2267, 0.2258],
[0.2571, 0.2552, 0.2533, 0.2516]]])
"""
5.3 累加求和(非降维)
如果我们想沿[某个轴计算A
元素的累积总和], 比如axis=0
(按行计算),可以调用cumsum
函数。 此函数不会沿任何轴降低输入张量的维度。
A.cumsum(axis=0)
"""
输出:
tensor([[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]],
[[20., 22., 24., 26.],
[28., 30., 32., 34.],
[36., 38., 40., 42.],
[44., 46., 48., 50.],
[52., 54., 56., 58.]]])
"""
这里相当于是两个“块”相加,加到了后面的“块”上,但是前面的“块”的以保留
直接看老师提供的讲义会更好理解:
6. 点积(Dot Product)
7. 矩阵-向量积
8. 矩阵乘法
矩阵-矩阵乘法可以简单地称为矩阵乘法,不应与 "Hadamard积" (不求和的点乘,结果仍是矩阵) 混淆。
补充:行向量vs列向量
行向量:tensor([1,2,3]);
列向量:tensor([[1],[2],[3]])
9. 范数
10. 总结
最后就是,常看李沐老师的文档,重点是要看懂每行代码的逻辑,常看常新
课程官网在这里(文档、课程视频、电子书,一站式上课):课程安排 - 动手学深度学习课程