首页 > 解决方案 > 使用pytorch进行反向传播的两个操作有什么区别?

问题描述

我有一个张量 x 和x.shape=(batch_size,10)

我想向所有元素添加一个,并进行两种不同的操作

  1. x=x+1
  2. for i in range(0,batch_size): x[i]=x[i]+1

这两个操作我得到了相同的张量,但是当我调用 时loss.backward(),(2)在反向传播中比(1)花费更多的时间。

他们有什么区别???

标签: pythonpytorch

解决方案


这是可以预料的。首先,转发也慢很多:通过for循环,Pythonbatch_size将以下请求分派给 PyTorch:

  1. 获取i第一个元素x
  2. 加 1
  3. 用增加的值更新i的元素x

Python 很慢。在第二版中,Python 向 PyTorch 发送一条消息“到处添加 1”。PyTorch 比 Python 快得多(更不用说它的 GPU 加速能力了)。这要归功于称为矢量化的技术,它并不特定于 PyTorch,而是基本上所有 Python(和许多其他)数学包。

其次,对于您的后向,PyTorch 需要跟踪发生在它们身上的所有操作x并通过它们进行反向传播。在第一种情况下,有batch_size它们,在第二种情况下,只有一个。再次,矢量化获胜。


推荐阅读