1 PyTorch简介
PyTorch 是一个开源的机器学习库,提供了强大的计算能力和灵活的用于构建和训练神经网络的工具。它的核心特点包括:
动态图计算:与其他机器学习库(如 TensorFlow)不同,PyTorch 允许在运行时动态构建计算图,这使得可以使用 Python 控制流操作(如 if、for、while)来构建模型。
快速 GPU 加速:PyTorch 提供了与 CUDA 相关的 API,可以使用 GPU 加速计算。这使得可以使用 PyTorch 训练大型深度学习模型,而无需太多编码工作。
简单易用:PyTorch 提供了丰富的 API 和数据结构,使得机器学习任务变得简单易用。同时,它还与其他机器学习库(如 NumPy)相集成,使得可以方便地将 PyTorch 与其他库集成在一起。
PyTorch 适用于各种机器学习任务,包括图像分类、自然语言处理、生成对抗网络(GAN)等。它已被广泛应用于学术界和工业界,并被许多公司和组织用于实际应用中。
2 PyTorch张量
正常情况下,我们会直接定义一个变量以及进行变量的加减。
x = 10 y = 2*x*x+3 print(x,y) # 10 103
但如果使用Pytorch定义变量的话,会以张量(tensor)的形式存在。使用张量进行赋值计算的新变量,也会成为张量。
x = torch.tensor(10) print(x) #tensor(10) y = 2*x*x+3 print(y) #tensor(203)
在深度学习里,Tensor实际上就是一个多维数组(multidimensional array)。而Tensor的目的是能够创造更高维度的矩阵、向量。
3 PyTorch的自动求导机制
3.1单变量求导
自动求导机制是PyTorch相比numpy的最重要区别之一。我们在创建张量的时候,需要给Torch一个额外的参数:require_grad=True。这个参数的意思是:梯度反传时对该 Tensor 计算梯度。
x = torch.tensor(10.0, requires_grad=True) print(x) 1
此时的打印结果是tensor(10., requires_grad=True)。可以发现上面的代码输入的还是10,这次我改成了10.0,是因为如果进行求导的话,torch要求的数据格式是float类型而不能是int类型。
y = 2*x*x+3 print(y)
此时的打印结果是tensor(203., grad_fn=),可以看到y也随之发生了变化。接下来我们来计算梯度。
y.backward() print(x.grad)
此时的打印结果是tensor(200.),这里backward函数完成了计算梯度工作,而x.grad则为在x点的梯度值。
3.2多变量求导与链式求导
在实际的神经网络建模中,一定不只一个节点和一个中间层,因此多变量求导与链式求导是常态,Torch对此也是完美支持。
假设此时我们增加一个变量z,z是y的函数,y是x的函数,那么当我们需要求dz/dx时,就需要用来链式求导法则。
import torch x = torch.tensor(10.0, requires_grad=True) y = 2*x*x+3 z = 5*y+6 z.backward() print(x.grad) # tensor(200.)
这个结果与dz/dy * dy/dx 完全相同。
接下来让上面的函数变的更复杂些,加入变量a与b,函数间的关系如下:
这同时也和神经网络更像了,可以把x和a想象成输入层,y和b想象成隐含层,z想象成输出层。如果我们需要求dz/dx,那需要对所有的途径分别求导并相加,也就是:
d z d x = d z d y ∗ d y d x + d z d b ∗ d b d x \frac{dz}{dx}=\frac{dz}{dy}*\frac{dy}{dx}+\frac{dz}{db}*\frac{db}{dx} dx dz = dy dz ∗ dx dy + db dz ∗ dx db
Torch同样可以轻松完成以上操作。
import torch a = torch.tensor(5.0,requires_grad=True) x = torch.tensor(10.0, requires_grad=True) y = 2*x*x+3*a b = 6*x*a z = y*y+1/(b*y) z.backward() print(x.grad) # tensor(17200.)
可以看到,PyTorch会根据我们输入的变量关系,计算出z对x的导数。
以上内容并未覆盖Pytorch的全部内容,但是包含了神经网络建模的大多知识点与相关思想。如果希望进一步了解Pytorch,可以查看下一篇博文,如何使用Pytorch搭建一个简单的三层神经网络模型(撰写中)。