深度学习中max运算的逆向过程是什么?
What is the backward process of max operation in deep learning?
我知道深度学习的逆向过程遵循梯度下降算法。但是,max
操作从来没有梯度概念。
像tensorflow、pytorch这样的深度学习框架是如何处理像maxpooling
这样的'max'操作的backward的?
你得想一想 max
运算符到底做了什么?即:
- 它 returns 或者更确切地说它传播了最大值。
这正是它在这里所做的 - 它需要两个或更多张量并向前传播 (仅) 最大值。
看一个简短的例子通常很有帮助:
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 函数处理它们。然后根据结果调用 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
我知道深度学习的逆向过程遵循梯度下降算法。但是,max
操作从来没有梯度概念。
像tensorflow、pytorch这样的深度学习框架是如何处理像maxpooling
这样的'max'操作的backward的?
你得想一想 max
运算符到底做了什么?即:
- 它 returns 或者更确切地说它传播了最大值。
这正是它在这里所做的 - 它需要两个或更多张量并向前传播 (仅) 最大值。
看一个简短的例子通常很有帮助:
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 函数处理它们。然后根据结果调用 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