为何PyTorch中多次运行Block3时x.grad累加,Block4始终输出10?
问题原因解析
- PyTorch的梯度默认采用累加机制:调用
backward()时,计算出的梯度会直接加到张量已有的.grad属性上,而非覆盖原有值。 - 分开运行Block2和Block3的场景:
- Block2仅执行一次,创建了同一个带
requires_grad=True的张量x,其.grad初始为None。 - 每次运行Block3,都会基于这个固定的
x计算梯度(结果为10),并将该值累加到x.grad中。第一次运行后x.grad=10,第二次累加后变为20,以此类推。
- Block2仅执行一次,创建了同一个带
- 合并运行Block4的场景:
- 每次运行Block4,都会重新创建一个全新的张量
x,新张量的.grad初始状态为None。 - 每次计算梯度后,
x.grad被赋值为10,由于没有之前的梯度积累,所以每次打印结果始终是10。
- 每次运行Block4,都会重新创建一个全新的张量
内容的提问来源于stack exchange,提问作者MENG
相关产品推荐
相关产品推荐

