深度学习最大化操作的落后过程是什么?

2024-06-11 21:58:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道深度学习的反向过程遵循梯度下降算法。然而,对于max操作从来没有梯度概念。在

像《火把》的深度学习框架如何处理?在


Tags: 算法框架概念过程火把max梯度
1条回答
网友
1楼 · 发布于 2024-06-11 21:58:00

您必须考虑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()。在

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

  • 结果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计算的最大坡度。类似地,当s2t2时,将计算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 

相关问题 更多 >