Categories
未分类

PyTorch自动求导(Autograd)原理解析

我们知道,深度学习最核心的其中一个步骤,就是求导:根据函数(linear + activation function)求weights相对于loss的导数(还是loss相对于weights的导数?)。然后根据得出的导数,相应的修改weights,让loss最小化。 各大深度学习框架Tensorflow,Keras,PyTorch都自带有自动求导功能,不需要我们手动算。 在初步学习PyTorch的时候,看到PyTorch的自动求导过程时,感觉非常的别扭和不直观。我下面举个例子,大家自己感受一下。 >>> import torch >>> >>> a = torch.tensor(2.0, requires_grad=True) >>> b = torch.tensor(3.0, requires_grad=True) >>> c = a + b >>> d = torch.tensor(4.0, requires_grad=True) >>> e = c * d >>> >>> e.backward() # 执行求导 >>> a.grad # a.grad 即导数 d(e)/d(a) 的值 tensor(4.) 这里让人感觉别扭的是,调用 e.backward()执行求导,为什么会更新 a 对象的状态grad?对于习惯了OOP的人来说,这是非常不直观的。因为,在OOP里面,你要改变一个对象的状态,一般的做法是,引用这个对象本身,给它的property显示的赋值(比如 user.age […]