下文将会从数学定义和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) ?
并不!
数学上没有三阶及以上张量范数的定义。