首页 文章

使用pytorch进行反向传播的两个操作之间有什么区别?

提问于
浏览
1

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

我想在所有元素中添加一个,并采取两种不同的操作

  • x=x+1

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

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

它们之间的区别是什么?

1 回答

  • 0

    这是可以预料的 . 首先,前进也慢得多:使用 for 循环,Python向PyTorch发送以下请求 batch_size 次:

    • 获取 xi 元素

    • 加1

    • 使用递增的值更新 xi 元素

    Python很慢 . 在第二版中,Python将单个消息"add 1 everywhere"调度到PyTorch . PyTorch比Python快得多(更不用说它能够加速GPU加速) . 这要归功于名为vectorization的技术,并不是特定于PyTorch,而是基本上所有Python(以及许多其他)数学包 .

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

相关问题