Pytorch 学习 - 5.pytorch 张量数学-计算图

先掌握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 时

\frac{\partial y}{\partial w} = \frac{\partial y}{\partial a} \frac{\partial a}{\partial w} +\frac{\partial y}{\partial b} \frac{\partial b}{\partial w} = b*1+a*1 = b + a = (w + 1) +(x + w) = 1 + 1 + 2 + 1 = 5 

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来定义模型、计算损失和进行参数更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值