深度学习框架通过自动计算 $\color{#66ccff}{导数}$ 自动微分
根据设计好的模型,系统会构建一个$\large\color{#66ccff}{计算图}$
也就是把算的过程都存下来,这种自动微分使系统能够随后$\color{#66ccff}{反向传播梯度$。
2.5.1 实战:
$y=2\mathbf{x}^{\top}\mathbf{x}$ 关于$\mathbf{x}$求导. 先初始化为0-3
import torch
x = torch.arange(4.0)
x
tensor([0., 1., 2., 3.])
需要先整一个地方来存储梯度。注意内存中原地更新避免每次新分配地址炸内存
x.requires_grad_(True) # 等价于x=torch.arange(4.0,requires_grad=True)
x.grad # 默认值是None
y = 2 * torch.dot(x, x)
y
tensor(28., grad_fn=<MulBackward0>) ## (0,1,2,3)点乘自己就是14,随便定义y=2xx=2*14=28
然后反向传播来计算每个元素(分量)的梯度
y.backward() ##也就dy/x1,x2,x3,x4 都算出来
x.grad ##打印下
tensor([ 0., 4., 8., 12.]) ## d2xx/dx_i=2*2x=4x . dy/dx1=0,dy/dx2=4 ... so on and so forth
x.grad == 4 * x
返回4个True,求导定义就是每个分量分别求
现在再求个别的函数。pytorch默认累计梯度,所以手动初始化清空下.
x.grad.zero_()
y = x.sum() ## 定义个累加的函数
y.backward()
x.grad
tensor([1., 1., 1., 1.])
$$
\frac{\partial y}{\partial x_i} = \frac{\partial}{\partial x_i} \left( \sum_{j=1}^{n} x_j \right) = 1
$$
$$
x.grad = \text{tensor}([1, 1, \ldots, 1]) \quad \text{(with n ones)}
$$