3.4 autograd与逻辑回归

                                                                                       点击此处返回总目录

 

一、自动求导系统

二、逻辑回归实现

 

 

一、autograd -- 自动求导系统

我们知道深度学习模型的训练就是不断地更新权值。而权值的更新需要求解梯度。因此,梯度在模型训练中是至关重要的。

然而求解梯度是十分繁琐的。因此pytorch提供自动求导系统。

 

我们不需要手工计算梯度,只需要搭建好前向传播的计算图,然后根据pytorch中的autograd就可以得到所有张量的梯度。

 

现在我们来学习一下autograd中的方法。

 

1. torch.autograd.backward(tensors, grad_tersors=None, retain_graph=None, create_graph=False)

自动求取梯度。

tensors                         #用于求导的张量,如loss

grad_tersors                 #多梯度权重。当有多个loss要计算梯度的时候,就要通过这个来设置权重。【例3】

retain_graph                 #保存计算图。由于pytorch是动态图。当运行了一次反向传播之后,计算图就会被释放掉。

                                      【例1】【例2】

create_graph=False     #创建导数计算图,用于高阶求导

 

 

在《计算图与动态图机制》里讲过,调用y.backward(),就可以计算得到各个张量的梯度。

 

 

那么y.backward() 与torch.autograd.backward()有什么关系呢?

通过在y.backward()前加断点,调试,进入可以发现:

y.backward()就是调用了torch.autograd.backward()函数。

 

例1:如果执行两次y.backward()则会报错

 

 

 

结果:

 

报错原因就是执行一次反向传播后,计算图被释放了。它也说了只要把backward()的retain_graph属性设置为True,就可以了。

 

 

例2:把backward()的retain_graph属性设置为True,就可以不释放计算图了。这样就可以再次使用计算图了。

 

结果:

 

 

例3:(以后用到再补充)

 

 

 

2. torch.autograd.grad(outputs, inputs, grad_outputs=None, retain_graph=None,create_graph=False )

用于求取梯度,函数返回的是想要的那一个张量的梯度。

 

outputs                         #用于求导的张量,如loss

inputs                           #需要求梯度的张量。

grad_tersors                 #多梯度权重。当有多个loss要计算梯度的时候,就要通过这个来设置权重。

retain_graph                 #保存计算图。由于pytorch是动态图。

create_graph=False     #创建导数计算图,用于高阶求导。【例1】

 

 

例1:

 

结果:

 

 

总结:

pytorch的自动求导系统中有三个需要注意到地方。

 

1. 梯度不会自动清零。再每次反向传播的时候会叠加上去,不会清零【例1】。需要手动的清零【例2】。

2. 依赖于叶子结点的结点,都是要求梯度的。求叶子节点的梯度需要用到这些结点的梯度。【例3】

3. 叶子节点不能执行原位操作。什么是原位操作呢?原位操作就是在原始内存中改变数据。【例4】

    为什么叶子节点不可以执行原位操作呢?比如下图,如果要求y对w的梯度,它是需要y对a的梯度的,而y对a的梯度等于w+1。因此在反向传播的时候是会用到w的,在前向传播的时候,会记录w的地址。反向传播的时候就是根据w的地址去找数。如果在反向传播之前,改变了地址当中的数据,那梯度求解肯定会出错。 

 

 

 

 

 

例1:

 

结果:

 

例2:

 

 

结果:

 

 

例3:

 

结果:

 

 

 

例4:a = a + torch.ones(1),a的地址会发生改变

 

 

可以看到a地址发生了变化。

 

例5:a += torch.ones(1) 是原地操作

 

 

分析:

张量d执行了+=运算之后,地址不变。说明是原位操作。

而b和c是普通的Python变量,参见https://blog.csdn.net/pengchengliu/article/details/106390704

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是 3.4 autograd与逻辑回归 的全部内容, 来源链接: utcz.com/a/53322.html

回到顶部