下文将会从数学定义和TensorFlow范数计算API两个方面进行讲解。
另外,numpy的范数计算API与TensorFlow基本一致,故以下内容也适用之。
1. 数学上的范数
1.1. 向量范数
范数的最原本的概念来自于向量(或者说是一维张量)的长度或者距离度量,于欧式空间,也就有了2-范数的定义,
如果将其中指数位的2一般化为实数,即定义了p-范数,
特殊地:
- ,,即元素绝对值之和
- ,,即绝对值最大的元素取值
- ,,即绝对值最小的元素取值
- ,此时的极限为中零元素的数量,不过,
0-范数并不满足数学上严格的范数定义,只是习惯上这样称呼而已
1.2. 矩阵范数
矩阵范数的定义就比较多了,常见的有以下两种类型。
1.2.1. 矩阵诱导范数
矩阵可以理解为向量变换,通过以下方式诱导所得的矩阵范数,便是矩阵对向量进行变换的极限值,通过以下公式可以诱导出矩阵的范数,
(有些情况下,上式中的分子分母可以取不同范数,得到了更一般的定义,于此暂且不表)
特殊地:
- ,,即列向量绝对值之和中的的最大值
- ,,特征值中最大的绝对值,又称谱范数
- ,,以相对,此为行向量绝对值之和的最大值
1.2.2. 矩阵元范数
相当于将矩阵展开成为维的向量,然后与之对应地定义了p-范数。显然元p-范数和诱导-p范数的内涵和取值都是不同的。
2. TensorFlow中的矩阵范数
TensorFlow的矩阵范数通过tf.norm进行运算获得,函数签名如下,
tf.norm( |
tensor和name无需多言,keepdims和keepdims用来控制输出张量的形状,重点关注的两个参数是ord和axis。
如果用一句话概括,就是axis决定了张量怎么被理解为向量/矩阵,ord决定了取什么范数。
从现在开始,考虑一个形状为的三阶张量。
2.1. axis=None
此时,将会被展开成一个简单的向量,维度为,计算结果为一个标量(不考虑keep_dims效果)。
ord可以取1,2,inf以及任何的正实数,表示计算向量的ord-范数,缺省值euclidean等价于ord=2。
2.2. axis=int
譬如axis=1,此时将会视为沿着第二条轴方向的向量,维度为,而其余的轴将会视为batch,这里的batch_size=,因此,计算结果是形状的张量。
ord的取值与意义同axis=None。
2.3. axis=(int,int)
譬如axis=(1,2),此时将会视为沿着第二三条轴方向的矩阵,形状为,batch_size=,计算结果是维向量。
ord可以取1,2,inf(并不允许其他实数),表示计算矩阵的诱导ord-范数;
ord缺省值euclidean,等价于计算Frobenius-范数,也就是元范数中的情况,与ord=2时并不等价!
2.4. axis=(int,int,int) ?
并不!
数学上没有三阶及以上张量范数的定义。