深度学习中最大运算的落后过程是什么?

ink*_*kzk 4 python deep-learning caffe tensorflow pytorch

我知道深度学习的落后过程遵循梯度下降算法。但是,从来没有一个用于max操作的梯度概念。

像tensorflow和pytorch这样的深度学习框架如何处理像'max'操作的后退maxpooling呢?

blu*_*nox 5

您必须考虑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)
Run Code Online (Sandbox Code Playgroud)

这段代码创建了两个随机张量,将它们求和并通过max函数。然后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.])
    
    Run Code Online (Sandbox Code Playgroud)
  • 结果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.])
    
    Run Code Online (Sandbox Code Playgroud)

如您期望的那样,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)
Run Code Online (Sandbox Code Playgroud)

输出:

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 
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,特别是对于“不代表最大值的其他张量仍然是图形的一部分”。 (2认同)