F范数的定义:A为
m
∗
m
m*m
m∗m的矩阵
∣
∣
A
∣
∣
F
=
∑
i
n
∑
j
n
a
i
j
2
\begin{aligned} ||A||_F=\sqrt{\sum_{i}^n{\sum_j^n}a_{ij}^2} \end{aligned}
∣∣A∣∣F=i∑nj∑naij2
即计算矩阵的每个元素的平方之后的加和然后开方。
在矩阵分解问题中,为了优化所近似求解的矩阵,往往都会用到F范数作为损失函数的正则项。在matlab中求解范数的函数为norm(X, ‘fro’),在python中为numpy.linalg.norm(x,ord=None),其中x是求解的数值,ord是求解范数的类型,默认的是F范数其实也是二范数。
在Pytorch中计算F范数的方法为torch.norm(X, ‘norm’),在深度学习中有时需要自定义损失函数就用到了F范数,如果自己不想重写函数的话完全可以用torch.nn.MSELoss定义。因为这两个函数的计算方法大体一致,主要区别就在于MSELoss(nn.MSELoss详解)的设置中是否除以样本数,以及F范数是否开方的问题。
下面看个例子:
import numpy as np
import torch
import torch.nn as nn
X = np.array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])
Y = X*2
print(X)
[[1 1 1]
[2 2 2]
[3 3 3]]
print(Y)
[[2 2 2]
[4 4 4]
[6 6 6]]
a = np.linalg.norm(X-Y)
print(a*a)
42.0
X1 = torch.from_numpy(X)
Y1 = torch.from_numpy(Y)
loss_fn2 = torch.nn.MSELoss(reduction='sum')
loss2 = loss_fn2(X1.float(), Y1.float())
print(loss2)
tensor(42.)