求导是几乎所有深度学习优化算法的关键步骤,因为在优化损失函数时会用反向传播,即使参数朝着梯度下降的方向调整,求梯度即求偏导。虽然求导的计算很简单,但对于复杂的模型,手动进行更新很容易出错。 Pytorch通过自动微分来加快求导。 他会先构建一个计算图(computational graph), 来跟踪计算是哪些数据通过哪些操作组合起来产生输出。 自动微分使系统能够随后反向传播梯度。 反向传播(backpropagate)意味着跟踪整个计算图,填充关于每个参数的偏导数。 下面看一个简单的例子,以及如何使用pytorch自动计算偏微分 $$ y=2x^Tx \\ 实际上y就是个二次型函数\\ y=2(x_1,x_2,x_3,x_4)^T(x_1,x_2,x_3,x_4)=2(x_1^2+x_2^2+x_3^2+x_4^2)=2x_1^2+2x_2^2+2x_3^2+2x_4^2 \\ \newcommand{\y}{(2x_1^2+2x_2^2+2x_3^2+2x_4^2)} 那么x的梯度就是\frac{ \partial y }{ \partial x_i }= \begin{pmatrix} \frac{ \partial y }{ \partial x_1 } \\ \frac{ \partial y }{ \partial x_2 } \\ \frac{ \partial y }{ \partial x_3 } \\ \frac{ \partial y }{ \partial x_4 } \\ \end{pmatrix}= \begin{pmatrix} \frac{ \partial \y }{ \partial x_1 } \\ \frac{ \partial \y }{ \partial x_2 } \\ \frac{ \partial \y }{ \partial x_3 } \\ \frac{ \partial \y }{ \partial x_4 } \\ \end{pmatrix}= \begin{pmatrix} 4x_1\\ 4x_2\\ 4x_3\\ 4x_4 \end{pmatrix} $$
import torch
x = torch.arange(4.0,requires_grad=True)
print(f"x:{x}\nx的梯度:{x.grad}")# 梯度默认值是None
y = 2 * torch.dot(x, x)#dot()用于求内积
y.backward()
x.grad
输出结果为
tensor([0., 1., 2., 3.], requires_grad=True)
x的梯度:None
tensor([ 0., 4., 8., 12.])
实际上这个梯度手动计算也非常容易
标签:partial,pmatrix,梯度,2x,微分,pytorch,自动,frac,grad From: https://www.cnblogs.com/code-laoq/p/18521941