pytorch在数学计算上下足了功夫,在支持海量数学公式的同时还将速度优化到超过大部分用户DIY的水平。所以,pytorch中的每个常见的数学计算函数都需要我们有一定了解。
今天介绍的是torch.norm,一个pytorch用来求范数的函数。我们先看求范数的数学公式:
∣ ∣ x ∣ ∣ p = ( ∑ i = 1 n ∣ x i ∣ p ) 1 p (1) ||\bold{x}||_p=({\sum_{i=1}^n}|x_i|^p)^{1\over{p}}\tag{1} ∣∣x∣∣p=(i=1∑n∣xi∣p)p1(1)
公式(1)表示的是p-范数。我们可以带入0,1,2,…进去看:
- 1-范数: ∣ ∣ x ∣ ∣ = ∑ i = 1 n ∣ x i ∣ ||\bold{x}||={\sum_{i=1}^n}{|x_i|} ∣∣x∣∣=∑i=1n∣xi∣
- 2-范数: ∣ ∣ x ∣ ∣ 2 = ∑ i = 1 n x i 2 ||\bold{x}||_2=\sqrt{{\sum_{i=1}^n}{x_i^2}} ∣∣x∣∣2=∑i=1nxi2
- ∞ \infin ∞-范数: ∣ ∣ x ∣ ∣ ∞ = max ( ∣ x 1 ∣ , ∣ x 2 ∣ , . . . , ∣ x n ∣ ) ||\bold{x}||_{\infin}=\max({|x_1|,|x_2|,...,|x_n|)} ∣∣x∣∣∞=max(∣x1∣,∣x2∣,...,∣xn∣)
最常见的范数求解是2-范数。物理意义是求向量的长度。而torch.norm也是默认求2-范数。我们看一个例子:
import torcha = torch.FloatTensor([1, 2, 3], [4, 5, 6])
b = torch.norm(a, dim=-1)
print(b)
# tensor([3.7417, 8.7750])
我们求得两个2-范数tensor([3.7417, 8.7750])。这里我们设置的dim=-1,即表示我们对待最小括号为一个向量,求解这个向量的2-范数。这里一共有2个dim可以选,假设我们换一个dim:
import torcha = torch.FloatTensor([1, 2, 3], [4, 5, 6])
b = torch.norm(a, dim=0)
print(b)
# tensor([4.1231, 5.3852, 6.7082])
这里我们将每一数列当作一个向量,求解出三个2-范数。如有疑问,请留言告知~
当然,我们还可以保持维度不下降:
import torcha = torch.FloatTensor([1, 2, 3], [4, 5, 6])
b = torch.norm(a, dim=-1, keepdim=True)
print(b)
# tensor([[3.7417], [8.7750]])
采用keepdim之后,可以进行进一步计算比如a/b之类。一个向量除以向量长度可以得到这一方向上的单位向量。