神经网络(NN)是在某些输入数据上执行的嵌套函数的集合。 这些函数由参数(由权重和偏差组成)定义,这些参数在 PyTorch 中存储在张量中。
训练 NN 分为两个步骤:
正向传播:在正向传播中,NN 对正确的输出进行最佳猜测。 它通过其每个函数运行输入数据以进行猜测。
反向传播:在反向传播中,NN 根据其猜测中的误差调整其参数。 它通过从输出向后遍历,收集有关函数参数(梯度)的误差导数并使用梯度下降来优化参数来实现。 有关反向传播的更详细的演练,请查看 3Blue1Brown 的视频。
1 | import torch,torchvision |
1 | #* 一个随机张量具有3个通道的64X64的图片 |
1.通过模型的每一层运行输入数据,进行正向传播
1 | prediction=model(data) #forward pass |
2.计算损失并通过反向传播估计每个模型参数的梯度
1 | loss=(prediction-labels).sum() |
#3.使用SGD优化器根据模型参数的梯度来调整每个模型参数
1.学习率为0.01,
2.动量为0.9
1 | optim=torch.optim.SGD(model.parameters(),lr=1e-2,momentum=0.9) |
Autograd 的微分
让我们来看看autograd如何收集梯度。 我们用requires_grad=True创建两个张量a和b。 这向autograd发出信号,应跟踪对它们的所有操作。
1 | from IPython.display import Latex |
$$\begin{equation}
Q=3*a^3-b^2
\end{equation}$$
1 | #!分别相对于模型参数进行求偏导 |
$$\begin{equation}
\frac{\partial Q}{\partial a}=9*a^2
\end{equation}$$
$$\begin{equation} \frac{\partial Q}{\partial b}=-2*b
\end{equation}$$
当对误差Q进行backward
时,可以将Q聚合为一个标量,之后隐式向后调用
Q.sum().backward()
当进行反向传播是,各个参数的梯度分别沉积在a.grad
和b.grad
中
1 | external_grad = torch.tensor([1., 1.]) |
tensor([True, True])
tensor([True, True])