动手学深度学习(李沐)笔记:线性代数(Linear Algebra)+ PyTorch 实现

深度学习里最常见的数据形态就是:标量、向量、矩阵、张量。你只要把线性代数这章吃透,后面梯度、线性回归、softmax、CNN 的维度变化都会顺很多。

本文按李沐的顺序:线性代数概念 → 用 PyTorch 实现 → 按轴求和 → 矩阵计算套路


1. 标量 / 向量 / 矩阵 / 张量:深度学习的数据"四件套"

  • 标量(scalar) :一个数,比如损失 loss=2.3

  • 向量(vector) :一串数,比如一个样本的特征 x∈R^d

  • 矩阵(matrix) :二维表,比如一批样本 X∈R^{n×d}

  • 张量(tensor) :更高维,比如图像 batch N×C×H×W

PyTorch 里都用 torch.Tensor 表示,维度通过 shape 看。

复制代码
import torch

x = torch.tensor(3.14)          # 标量
v = torch.arange(4)             # 向量 shape=(4,)
A = torch.arange(12).reshape(3, 4)  # 矩阵 shape=(3,4)
T = torch.randn(2, 3, 4)        # 张量 shape=(2,3,4)

print(x.shape, v.shape, A.shape, T.shape)

2. 向量的核心运算:加法、数乘、点积(dot)

2.1 逐元素运算(elementwise)

复制代码
v = torch.tensor([1., 2., 3.])
u = torch.tensor([10., 20., 30.])

print(v + u)   # [11,22,33]
print(v * u)   # 逐元素乘
print(2 * v)   # 数乘

2.2 点积(dot product):最常见的"相似度/加权和"

复制代码
v = torch.tensor([1., 2., 3.])
u = torch.tensor([10., 20., 30.])

print(torch.dot(v, u))  # 1*10 + 2*20 + 3*30 = 140

直觉:点积 = "对应维度相乘再求和",后面线性层 y = Xw 本质就是大量点积。


3. 矩阵运算:转置、矩阵乘法、Hadamard 乘法

3.1 转置(transpose)

复制代码
A = torch.arange(12).reshape(3, 4)
print(A.T)  # (4,3)

3.2 两种"乘法"别混了

1)逐元素乘(Hadamard product):形状必须一样

复制代码
A = torch.ones(2, 3)
B = torch.full((2, 3), 2.)
print(A * B)  # 逐元素

2)矩阵乘法(matrix multiplication):线性代数里的乘法

复制代码
A = torch.randn(2, 3)
B = torch.randn(3, 4)
C = A @ B              # 或 torch.matmul(A, B)
print(C.shape)         # (2,4)

记忆法:
* 是逐元素;@ 才是矩阵乘法。


4. 范数(Norm):衡量"向量/矩阵有多大"

深度学习里最常用的两个:

4.1 L2 范数(欧氏长度)

复制代码
v = torch.tensor([3., 4.])
print(torch.norm(v))  # 5

4.2 L1 范数(绝对值和)

复制代码
v = torch.tensor([1., -2., 3.])
print(torch.norm(v, p=1))  # 6

直觉:L2 更像"距离",L1 更像"稀疏惩罚"(后面正则化会出现)。


5. 按特定轴求和:sum(dim=?)

这一节是很多人第一次被 "dim/axis" 搞懵的地方。核心:dim 是"要被消掉的那个维度"

复制代码
A = torch.arange(12).reshape(3, 4)
print(A)
# [[0,1,2,3],
#  [4,5,6,7],
#  [8,9,10,11]]

print(A.sum())         # 全部求和 -> 标量
print(A.sum(dim=0))    # 按列求和 -> shape=(4,)
print(A.sum(dim=1))    # 按行求和 -> shape=(3,)
  • dim=0:把第 0 维(行维)消掉 → "每一列加起来"

  • dim=1:把第 1 维(列维)消掉 → "每一行加起来"

保持维度:keepdim=True(很关键)

复制代码
print(A.sum(dim=1, keepdim=True).shape)  # (3,1)

后面做广播、做归一化、做 softmax 时,keepdim=True 很常用,不然维度对不上。


6. 矩阵计算套路:batch 视角 + 广播 + 维度对齐

深度学习里你经常面对的是:batch 维度 N 叠在最前面。

比如一个 batch 的特征矩阵:X.shape = (N, d)

权重:w.shape = (d, 1)

线性回归输出:y_hat = X @ w(N,1)

复制代码
N, d = 4, 3
X = torch.randn(N, d)
w = torch.randn(d, 1)
b = torch.randn(1)

y_hat = X @ w + b   # b 会自动广播到 (N,1)
print(y_hat.shape)  # (4,1)

广播规则(broadcasting)在这里非常重要

  • 维度从后往前对齐

  • 相等 ✅ 或者其中一个是 1 ✅


7. 本章最常见的坑

  1. * 当成矩阵乘法
  • 逐元素:A * B

  • 矩阵乘:A @ B / torch.matmul

  1. sum(dim=0)sum(dim=1) 搞反
  • dim=0 → 列求和

  • dim=1 → 行求和

  1. 忘记 keepdim=True 导致后面广播失败
  • 做归一化/softmax 时尤其常见
  1. 形状不对但你以为是"数学错了"

    其实是 shape 错了:养成习惯 print(X.shape)


结语:线性代数学到什么程度算够?

对深度学习来说,你至少要能做到:

  • 看懂 X @ w + b 的维度流动

  • 熟练 sum(dim=?) / keepdim

  • 搞清楚 * vs @

  • 知道范数是"大小/正则化"的基础概念

相关推荐
Fxrain1 小时前
[Paper Reading]Diff-Dehazer
人工智能·深度学习·计算机视觉
IT界的老黄牛1 小时前
【IT老齐098 笔记】京东实例讲解如何进行系统架构容量评估
笔记·系统架构
AI成长日志1 小时前
【微调专栏】微调性能优化实战:显存优化、训练加速与成本控制的全链路解决方案
人工智能·深度学习·机器学习·性能优化
sealaugh321 小时前
react native(学习笔记第一课)环境构筑(hello,world)
笔记·学习·react native
LSQ的测试日记1 小时前
深度学习_AlexNet,VGGNet,GoogleNet和ResNet
人工智能·深度学习
菩提小狗1 小时前
第20天:信息打点-红蓝队自动化项目&资产侦察&企查产权&武器库部署&网络空间__笔记|小迪安全2023-2024|web安全|渗透测试|
笔记·安全·自动化
菜菜小狗的学习笔记2 小时前
黑马程序员java web学习笔记--后端进阶(三)Maven高级
java·笔记·学习
kisshuan123962 小时前
【[特殊字符]深度矩阵】Intel DPT-SwinV2单目测距新突破
线性代数·矩阵
家乡的落日2 小时前
软考-系统架构设计师笔记-真题解析-2023年真题
笔记·系统架构