《动手学深度学习》笔记1.2——线性代数--总结与思考

目录

1. 数学概念

1.1 长度

1.2 点乘

1.3 矩阵乘法

1.4 范数

1.5 特殊矩阵

1.6 特征值和特征向量

1.7 资源推荐

2. PyTorch中“张量”的“轴”

3. 分配新内存(隔离)

4. 按特定轴求和(降维)

4.1 轴,维度,层

4.2 看到“axis=”说明要降维

4.3 降维求平均 mean()

5. 非降维求和(广播机制)

5.1 广播机制

5.2 keepdims=True(非降维)

5.3 累加求和(非降维)

6. 点积(Dot Product)

7. 矩阵-向量积

8. 矩阵乘法

补充:行向量vs列向量

9. 范数

10. 总结


1. 数学概念

李沐老师在视频里说线代不必学得很深,但是他在PPT里放的概念有一定理解门槛(大一考过的线代都忘完了)

1.1 长度

课程原视频:

05 线性代数【动手学深度学习v2】_哔哩哔哩_bilibili

图6:这里的长度用到了l2-范数
图7:智谱AI可以读图识别公式进行解释,效果非常赞,令人惊叹

1.2 点乘

图8:点乘

1.3 矩阵乘法

图9:矩阵乘法
图10:矩阵乘法,类似于线性变换(映射),扭曲(多维是扭曲,在2维就是旋转)空间

  • 前者有几行,后者有几列,乘出来就是几行几列

图11:依次按列做乘法

李沐老师:这个操作在后面会很常用,需要了解!

1.4 范数

图12:矩阵范数算起来比较麻烦,一般用F范数
  • 计算简单:F范数的计算仅涉及矩阵元素的平方和,这可以通过简单的循环或矩阵运算快速完成。
  • 易于分析:F范数在数学分析中经常出现,因为它与矩阵的迹(trace)和行列式等概念有直接的联系。

1.5 特殊矩阵

图13:正定矩阵在deep learning里用得少
图14

1.6 特征值和特征向量

图15:矩阵乘法、线性变换(扭曲)后,有些向量不会改变方向,就是特征向量

1.7 资源推荐

 我搜集了很多B站和知乎资源,进过筛选,最推荐的教学资源如下,预计阅读时长15min

资源好不好,贴几张图便知,这位博主的文章质量很高

1. 矩阵乘法:

 2. 特征向量和特征值:

2. PyTorch中“张量”的“轴”

在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量,也就是维度;

在pytorch中也一样。

就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构,也就是这里的张量(tensor)。

图16:这里的“2”(块)是最后一维,也称最外的维度,第一个维度,可用axis=0表示

当我们开始处理图像时,张量将变得更加重要,图像以𝑛维数组形式出现, 其中3个轴对应于高度、宽度,以及一个通道(channel)轴, 用于表示颜色通道(红色、绿色和蓝色)。 现在先将高阶张量暂放一边,而是专注学习其基础知识。

3. 分配新内存(隔离)

图17:如果不克隆,直接“==”,或者“reshape”原本的张量,改动原本的张量,A和B会跟着一起变

还可参考这里(来自数据操作章节的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=”说明要降维

对哪个轴求和就是消去(折叠)哪个维度

假想一个立方体,(沿着长宽高的某个方向)把它压扁,便是沿着某条轴降维求和

把外层压缩到内层,最内层是“列”

关于轴和降维,很多同学们反馈没听懂,李沐老师还做了补充:

按特定轴求和_哔哩哔哩_bilibili

(看完这个视频,很多同学直呼 “清晰!”,“通透!”

代码如下↓(这里的A是李沐老师现场加到的三维,讲义原先是二维reshape(5,4),0-19)

图18:李沐老师额外演示了最外层(axis=0),次外层(axis=1)的压缩,最后还展示了双层求和(axis=[0,1]),这些都是只有视频里面有,讲义和课本里面没有

李沐老师这里是两个维度求和(一次压缩两个维度),超过了文档讲义,详情可参考:

【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. 通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
  2. 对生成的数组执行按元素操作。

在大多数情况下,我们将沿着数组中长度为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.]]])
"""

这里相当于是两个“块”相加,加到了后面的“块”上,但是前面的“块”的以保留

直接看老师提供的讲义会更好理解:

原来的A
cumsum(累加求和)后的A

6. 点积(Dot Product)

7. 矩阵-向量积

8. 矩阵乘法

矩阵-矩阵乘法可以简单地称为矩阵乘法,不应与 "Hadamard积" (不求和的点乘,结果仍是矩阵) 混淆。

补充:行向量vs列向量

行向量:tensor([1,2,3]);

列向量:tensor([[1],[2],[3]])

9. 范数

10. 总结

最后就是,常看李沐老师的文档,重点是要看懂每行代码的逻辑,常看常新

课程官网在这里(文档、课程视频、电子书,一站式上课):课程安排 - 动手学深度学习课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值