Pytorch自动微分入门

求导是几乎所有深度学习优化算法的关键步骤,因为在优化损失函数时会用反向传播,即使参数朝着梯度下降的方向调整,那么就可以使损失函数尽量的小,达到局部最优的情况(全局最优很难,不是说对一个Loss函数凸优化难,而是很多Loss函数不能凸优化),而求梯度实际就是求偏导。

虽然求导的计算很简单,但对于复杂的模型,比如一个模型的网络可能有几百层,这个工作量就非常恐怖了,在不出错的情况下进行这么多的微分计算是非常消耗脑力的事情。因此,自动微分是非常Nice的功能。

 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.])

但是Pytorch设计有点问题,会累加梯度值

posted @ 2024-11-02 15:02  老秦鸭  阅读(318)  评论(0)    收藏  举报