在PyTorch中data.norm()<1000做什么?

voo*_*doo 16 python linear-algebra deep-learning pytorch tensor

我在这里关注PyTorch教程.它说

x = torch.randn(3, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
    y = y * 2

print(y)

Out:    
tensor([-590.4467,   97.6760,  921.0221])
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下data.norm()在这里做什么吗?当我改变.randn.ones它的输出 tensor([ 1024., 1024., 1024.]).

kma*_*o23 11

它只是张量的L2范数(又称欧几里得范数)。下面是可复制的插图:

In [15]: x = torch.randn(3, requires_grad=True)

In [16]: y = x * 2

In [17]: y.data
Out[17]: tensor([-1.2510, -0.6302,  1.2898])

In [18]: y.data.norm()
Out[18]: tensor(1.9041)

# computing the norm using elementary operations
In [19]: torch.sqrt(torch.sum(torch.pow(y, 2)))
Out[19]: tensor(1.9041)
Run Code Online (Sandbox Code Playgroud)

首先,它对张量中的每个元素求平方y,然后求和,最后取平方根。这些运算计算所谓的L2或欧几里得范数

  • 本质上,它试图获得一个幅度 &lt; 1000 的向量(L2 范数是可以计算向量的欧几里得距离) (2认同)

Jon*_*han 6

根据@kmario23 所说,代码将向量的元素乘以 2,直到向量的欧几里得幅度(距原点的距离)/L2 范数至少为 1000。

以带有 (1,1,1) 的向量为例:它增加到 (512, 512, 512),其中 l2 范数约为 886。这小于 1000,因此它再次乘以 2 并变为 ( 1024、1024、1024)。它的震级大于 1000,所以它停止了。