神经网络

UV 安装GPU PyTorch

1
2
3
torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

uv pip install xxx --torch-backend=auto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
dependencies = [
"ipykernel>=7.1.0",
"matplotlib>=3.10.8",
"torch",
"torchvision",
]

[tool.uv.sources]
torch = [
{ index = "pytorch-cu124", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
]
torchvision = [
{ index = "pytorch-cu124", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
]

[[tool.uv.index]]
name = "pytorch-cu124"
url = "https://download.pytorch.org/whl/cu124"
explicit = true

简单使用

1
2
3
4
5
6
uv pip install numpy torch torchvision matplotlib --torch-backend=auto

import torch
print(f"CUDA available: {torch.cuda.is_available()}") # 应返回 True
print(f"PyTorch CUDA version: {torch.version.cuda}") # 应显示 11.8 或 12.1
print(f"GPU name: {torch.cuda.get_device_name(0)}") # 显示您的 GPU 型号

激活函数

没有激活函数,那么不管堆多少层,本质都是“线性模型”
就是经过这一个函数f(x)=wx+b,w是斜率也是权重,b就是偏置
权重的数量个数值都是PyTorch自动设置的
当一个特征比较重要,它的权重就会比较高

[!note]-
假设我们要设计一个简单的神经元,判断“今天是否去跑步”。
• 输入 :天气好不好(1 好,0 差)
• 输入 :是否有空(1 有,0 无)
你的设计(参数设定):
• 设定权重 ,(说明天气对你的决定影响更大)。
• 设定偏置 (这代表你天生有点懒,需要足够的正面刺激才会出门)。
场景 1:天气好(1),但没空(0)

  1. $z = (5 \times 1) + (2 \times 0) + (-3) = 2$
  2. 结论:有 88% 的概率会去跑步。
    场景 2:天气差(0),有空(1)
  3. $z = (5 \times 0) + (2 \times 1) + (-3) = -1$
  4. 结论:只有 27% 的概率会去跑步。

权重:是多少个输入参数,有PyTorch框架决定,具体的数值是多少也是由框架自动计算。
例如一个识别手写数字

1
784 - 128 -10

第一层隐藏层,如果是32欠拟合,256过拟合
然后可不止一层,可以多加几层
没有正确答案,只有“是否合适”

总结

其实就是设计好架构以及给出数据集,然后让初始函数训练成一个多层复合函数(成品超小模型)
当使用训练出来的这个多层复合函数的时候,就是把要被识别Content经过多层复合函数,最终得出特征的比值权重
例如识别手写数字,如果最终的结果5的权重比较高,识别出来的结果就是5

细分

nn.Linear(in_features, out_features, bias=True)

输入向量维度,输出向量维度,是否使用偏置项

1
self.custom_name = nn.Linear(784,128)

前向传播

训练和推理

1
2
3
4
5
6
7
训练时
forward -> loss -> backward -> update
算预测 - 算错多少 - 算梯度 - 改参数

推理时
forward -> output
没有loss,没有backward,参数不变
项目 向前传播 反向传播
方向 输入->输出 输出->输入
做什么 计算结果 计算梯度
改参数 不改 本身不改
依赖 当前参数 loss
“按照菜谱做一遍,看看味道如何”-“分析哪里太咸,盐该少放多少”

损失函数

计算预算的结果与正确结果之间的差距有多大,错的有多离谱
计算出梯度

1
2
Loss(y_true, y_pred)
答案,预测值

梯度

就是一个导函数,当导函数是正,说明向上,那也就是说明正儿损失函数增大
image.png
新权重=旧权重−学习率×梯度

GPT

image.png