2024-06-11 21:58:00 发布
网友
我知道深度学习的反向过程遵循梯度下降算法。然而,对于max操作从来没有梯度概念。在
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函数。然后对结果调用backward()。在
backward()
让我们看看两种可能的结果:
结果1 t1之和较大:
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之和较大:
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时,将计算t2的最大坡度。在
s1
s2
值得一提的是,另一个不代表最大值的张量仍然是图的一部分。只有梯度设置为零。如果它们不是图的一部分,你将得到None作为梯度,而不是零向量。在
None
如果使用python-max而不是torch.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
运算符的实际作用?即:这正是它在这里所做的-它需要两个或更多的张量,并向前传播最大值。在
看一个简短的例子通常很有帮助:
这段代码创建了两个随机张量,将它们相加并通过一个max函数。然后对结果调用
backward()
。在让我们看看两种可能的结果:
结果1
t1
之和较大:结果2
t2
之和较大:如您所料,
s1
表示将为t1
计算的最大坡度。类似地,当s2
为t2
时,将计算t2
的最大坡度。在值得一提的是,另一个不代表最大值的张量仍然是图的一部分。只有梯度设置为零。如果它们不是图的一部分,你将得到
None
作为梯度,而不是零向量。在如果使用python-
max
而不是torch.max
,可以检查会发生什么情况:输出:
相关问题 更多 >
编程相关推荐