深度学习中max操作的反向过程是什么?

10

我知道深度学习的反向过程遵循梯度下降算法。但是,max操作永远没有梯度概念。

像tensorflow、pytorch这样的深度学习框架如何处理类似于maxpooling的'max'操作的反向传播?

1个回答

20

你需要思考一下max运算符实际上是做什么的?也就是说:

  • 它返回或者更确切地说,传播最大值。

而这正是它在这里所做的-它取两个或多个张量并向前传播(仅)最大值。

看一个简短的例子通常是有帮助的:

t1 = torch.rand(10, requires_grad=True)
t2 = torch.rand(10, requires_grad=True)


s1 = torch.sum(t1)
s2 = torch.sum(t2)
print('sum t1:', s1, 'sum t2:', s2)
m = torch.max(s1, s2)
print('max:', m, 'requires_grad:', m.requires_grad)
m.backward()
print('t1 gradients:', t1.grad)
print('t2 gradients:', t2.grad)

这段代码创建了两个随机张量,将它们加起来并通过一个最大函数。然后,对结果调用backward()

让我们来看看可能的两种结果:

  • 结果1 - t1的总和较大:

sum t1: tensor(5.6345) sum t2: tensor(4.3965)
max: tensor(5.6345) requires_grad: True
t1 gradients: tensor([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
t2 gradients: tensor([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
  • 结果2 - t2的总和更大:

    sum t1: tensor(3.3263) sum t2: tensor(4.0517)
    max: tensor(4.0517) requires_grad: True
    t1 gradients: tensor([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
    t2 gradients: tensor([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
    
  • s1 表示最大值时,将计算 t1 的最大梯度。同样地,当 s2 是最大值时,将计算 t2 的最大梯度。

    • 与向前传递步骤类似,反向传播会通过最大值向后传播。

    需要提到的一件事是,其他张量仍然是图形的一部分,但不代表最大值。只是将梯度设置为零。如果它们不是图形的一部分,您将得到 None 梯度而不是零向量。

    您可以检查如果使用 python-max 而不是 torch.max 会发生什么:

    t1 = torch.rand(10, requires_grad=True)
    t2 = torch.rand(10, requires_grad=True)
    
    
    s1 = torch.sum(t1)
    s2 = torch.sum(t2)
    print('sum t1:', s1, 'sum t2:', s2)
    m = max(s1, s2)
    print('max:', m, 'requires_grad:', m.requires_grad)
    m.backward()
    print('t1 gradients:', t1.grad)
    print('t2 gradients:', t2.grad)
    

    输出:

    sum t1: tensor(4.7661) sum t2: tensor(4.4166)
    max: tensor(4.7661) requires_grad: True
    t1 gradients: tensor([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
    t2 gradients: None 
    

    3
    非常好的回答,特别是对于“其他未表示最大值的张量仍然是图的一部分”的解释。 - Ink

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接