TensorFlow中的范数

下文将会从数学定义和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,
ord='euclidean',
axis=None,
keepdims=None,
name=None,
keep_dims=None
)

tensorname无需多言,keepdimskeepdims用来控制输出张量的形状,重点关注的两个参数是ordaxis

如果用一句话概括,就是axis决定了张量怎么被理解为向量/矩阵,ord决定了取什么范数。

从现在开始,考虑一个形状为的三阶张量

2.1. axis=None

此时,将会被展开成一个简单的向量,维度为,计算结果为一个标量(不考虑keep_dims效果)。

ord可以取12inf以及任何的正实数,表示计算向量的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可以取12inf(并不允许其他实数),表示计算矩阵的诱导ord-范数

ord缺省值euclidean,等价于计算Frobenius-范数,也就是元范数的情况,与ord=2时并不等价!

2.4. axis=(int,int,int) ?

并不!

数学上没有三阶及以上张量范数的定义。