我知道深度学习的落后过程遵循梯度下降算法.但是,从来没有最大操作的梯度概念.
诸如tensorflow,pytorch之类的深度学习框架如何处理诸如maxpooling之类的“ max”操作的后退?
解决方法:
您必须考虑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)
这段代码创建了两个随机张量,将它们求和并通过max函数.然后,对结果调用back().
让我们看一下两种可能的结果:
>结果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