先掌握pytorch,学好pytorch, 才能学好人工智能
计算图(computation graph)
是机器学习,特别是在深度学习框架(如PyTorch和TensorFlow)中用于表示和跟踪计算过程的一种结构。计算图由节点(nodes)和边(edges)组成,其中节点表示变量或操作(如加法、乘法、激活函数等),边则表示数据或梯度的流动方向。
在计算图中:
- 节点(Nodes):
- 变量节点:存储数据,如输入特征、模型参数(权重和偏置)、中间计算结果等。
- 操作节点:执行数学运算或函数调用,如加法、乘法、ReLU激活函数等。
- 边(Edges):
- 数据流:从输入节点到输出节点的数据流,表示数据在计算图中的传递路径。
- 梯度流:在反向传播过程中,从输出节点到输入节点的梯度传递路径。
梯度求导
梯度求导是计算图中每个变量相对于损失函数的偏导数的过程。这些偏导数用于在反向传播过程中更新模型的参数,以最小化损失函数。
- 链式法则:在计算图中,梯度求导通常使用链式法则。链式法则允许我们通过计算图中每个节点的局部梯度(即该节点相对于其直接依赖的节点的梯度),来推导出全局梯度(即损失函数相对于输入节点的梯度)。
- 叶子节点:在计算图中,用户创建的节点(如输入数据和模型参数)通常被称为叶子节点。这些节点的梯度在反向传播过程中会被计算并存储起来,用于更新模型的参数。
- grad_fn:在PyTorch等深度学习框架中,每个张量都有一个
grad_fn
属性,用于记录创建该张量时所用的方法(函数)。这个属性在梯度求导过程中非常重要,因为它允许框架追踪梯度的来源和流动方向。
计算图与梯度求导的关系
在计算图中,梯度求导是反向传播过程的核心。通过计算图中每个节点的梯度,我们可以更新模型的参数,从而优化模型的性能。
- 前向传播:在前向传播过程中,数据通过计算图从输入节点流向输出节点。同时,每个节点的值都会被计算并存储起来,以便在反向传播过程中使用。
- 反向传播:在反向传播过程中,梯度从输出节点流向输入节点。通过计算图中每个节点的梯度,我们可以得到损失函数相对于每个参数的偏导数。然后,这些偏导数被用于更新模型的参数。
例如:
y=(x+w)(w+1)
a = x+w
b=w+1
y =a * b
x = 2, w =1 时
import torch
w = torch.tensor([1.],requires_grad=True)
x = torch.tensor([2.],requires_grad=True)
a = torch.add(x,w)
b = torch.add(w,1)
y = torch.mul(a,b)
y.backward()
print('output','\n', 'x :', x,x.shape)
print('\n', 'w :', w,w.shape)
print('\n', 'wgrad :', w.grad)
# 查看叶子节点
print('is leaf :', 'x :', x.is_leaf,'w :', w.is_leaf,'a :', a.is_leaf,'b :', b.is_leaf,'y :', y.is_leaf,)
# 查看梯度
print('grad :', 'x :', x.grad,'w :', w.grad,'a :', a.grad,'b :', b.grad,'y :', y.grad,)
output
x : tensor([2.], requires_grad=True) torch.Size([1])
w : tensor([1.], requires_grad=True) torch.Size([1])
wgrad : tensor([5.])
is leaf : x : True w : True a : False b : False y : False
grad : x : tensor([2.]) w : tensor([5.]) a : None b : None y : None
在PyTorch中,计算图是通过动态图(dynamic graph)机制实现的,这意味着计算图是在运行时构建的,而不是在编译时静态地定义的。这种动态图机制使得PyTorch更加灵活,易于调试和修改。
然而,需要注意的是,虽然PyTorch使用动态图,但在每次迭代(或称为每次“forward-backward pass”)之后,计算图都会被丢弃,并且在下一次迭代时重新构建。这与TensorFlow的静态图(static graph)机制不同,后者在编译时构建计算图,并在整个训练过程中重复使用。
在计算图中,还有一个重要的概念是梯度累积(gradient accumulation),它是指在多个小批量(mini-batches)上累积梯度,然后一次性更新模型参数。这种方法可以在使用较大批量训练时节省内存,或者在内存受限的情况下允许使用更大的有效批量大小。
最后,需要注意的是,虽然计算图是理解深度学习模型训练和推理过程的关键概念之一,但在使用高级深度学习框架时,用户通常不需要手动构建或管理计算图。框架会自动处理这些细节,并提供易于使用的API来定义模型、计算损失和进行参数更新。