5 Tensorflow - 范数

矩阵进阶 - 范数

作为快餐教程,我们尽可能多上代码,多介绍工具,少讲原理和公式。但是我也深知这样是无法讲清楚的,毕竟问题的复杂度摆在这里呢。与大家一起在Tensorflow探索一圈之后,我一定要写一个数学基础比较扎实的进一步教程。

范数(norm)初识

一般大学本科的《线性代数》教材中是不讲范数、广义逆这些知识的,需要学习《矩阵论》课程。但是很不幸,深度学习中会频繁用到。所以我们还是要有个基础的概念的。

不管是一个向量,还是一个矩阵,我们在机器学习中都经常需要有一个对于它们大小的度量。 
对于向量的度量,我们的第一印象就用向量的长度就是了么。换成更有文化一点的名词就是欧基里得距离。这么高大上的距离,其实就是所有的值的平方的和的平方根。 
我们可以用ord=’euclidean’的参数来调用tf.norm来求欧基里得范数。 
例:

>>> a02 = tf.constant([1,2,3,4],dtype=tf.float32)
>>> sess.run(tf.norm(a02, ord='euclidean'))
5.477226

这没啥神秘的,我们用sqrt也照样算:

>>> np.sqrt(1*1+2*2+3*3+4*4)
5.477225575051661

下面我们将向量的范数推广到矩阵。其实还是换汤不换药,还是求平方和的平方根。

>>> a03 = tf.constant([[1,2],[3,4]],dtype=tf.float32)
>>> a03
<tf.Tensor 'Const_34:0' shape=(2, 2) dtype=float32>
>>> sess.run(a03)
array([[1., 2.],
       [3., 4.]], dtype=float32)

原来一排的向量,现在换成2x2的矩阵,我们继续求范数。现在有个高大上的名字叫做Frobenius范数。

>>> sess.run(tf.norm(a03,ord=2))
5.477226

嗯,一算下来还是跟[1,2,3,4]向量的范数值是一样的。

范数的定义

欧几里得范数和Frobenius范数只是范数的特例。更一般地,范数的定义如下: 
∥x∥p=(∑i|xi|p)1p‖x‖p=(∑i|xi|p)1p 
其中,p∈R,p≥1p∈R,p≥1

范数本质上是将向量映射到非负值的函数。当p=2时,L2L2范数称为欧几里得范数。因为在机器学习中用得太多了,一般就将∥x∥2‖x‖2简写成∥x∥‖x‖。

更严格地说,范数是满足下列性质的任意函数: 
1. f(x)=0⇒x=0f(x)=0⇒x=0 
2. f(x+y)≤f(x)+f(y)f(x+y)≤f(x)+f(y) (这条被称为三角不等式, triangle inequality) 
3. ∀α∈R,f(αx)=|α|f(x)∀α∈R,f(αx)=|α|f(x)

范数的推广

除了L2L2范数之外,在机器学习中还常用L1L1范数,就是所有元素的绝对值的和。

有时候,我们只想计算向量或者矩阵中有多少个元素,这个元素个数也被称为L0L0范数。但是,这种叫法是不科学的,因为不符合上面三条定义中的第三条。一般建议还是使用L1L1范数。

我们来看下L1L1范数的例子:

>>> sess.run(tf.norm(a03,ord=1))
10.0

另外,还有一个范数是L∞L∞范数,也称为最大范数(max norm). 最大范数表示向量中具有最大幅值的元素的绝对值。

我们可以用ord=np.inf的参数来求最大范数。

>>> sess.run(tf.norm(a03,ord=np.inf))
4.0

范数与赋范空间

最后,我们还是看一下数学上对于范数的严格定义。经过上面对于概念和代码实现的了解,现在这个定义已经不难理解了。

定义1 向量范数:设V是数域F上的线性空间,且对于V的任一个向量x,对应一个非负实数∥x∥‖x‖,满足以下条件: 
1. 正定性:∥x∥≥0‖x‖≥0, ∥x∥=0‖x‖=0当且仅当x=0 
2. 齐次性:∥αx∥=|α|∥x∥,a∈F‖αx‖=|α|‖x‖,a∈F 
3. 三角不等式:对任意x,y∈Vx,y∈V,都有∥x+y∥≤∥x∥+∥y∥‖x+y‖≤‖x‖+‖y‖,则称∥x∥‖x‖为向量x的范数,[V;∥⋅∥][V;‖⋅‖]为赋范空间。

定义2 矩阵范数:设A∈Cm×nA∈Cm×n,对每一个A,如果对应着一个实函数N(A),记为∥A∥‖A‖,它满足以下条件: 
1. 非负性:∥A∥≥0‖A‖≥0, 正定性:A=Om×n⇔∥A∥=0A=Om×n⇔‖A‖=0 
2. 齐次性:∥αA∥=|α|∥A∥,α∈C‖αA‖=|α|‖A‖,α∈C 
3. 三角不等式: ∥A+B∥≤∥A∥∥B∥,∀B∈Cm×n‖A+B‖≤‖A‖‖B‖,∀B∈Cm×n,则称N(A)=∥A∥‖A‖为A的广义矩阵范数。进一步,若对Cm×n,Cn×l,Cm×lCm×n,Cn×l,Cm×l上的同类广义矩阵范数∥⋅∥‖⋅‖,有下面的结论: 
4. (矩阵乘法的)相容性:∥AB∥≤∥A∥∥B∥,B∈Cn×l‖AB‖≤‖A‖‖B‖,B∈Cn×l,则称N(A)=∥A∥N(A)=‖A‖为A的矩阵范数。

版权声明:转载 https://blog.csdn.net/lusing/article/details/80082235

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow中的梯度裁剪是一种常用的技术,用于限制学习算法中的梯度值大小,以避免梯度爆炸或消失的问题。 在深度学习中,通过反向传播算法计算梯度,并使用其来更新模型参数。然而,梯度可能会变得非常大,导致参数更新过大,这称为梯度爆炸。另一方面,梯度也可能变得非常小,导致参数更新缓慢,这称为梯度消失。这两个问题都会影响模型的训练和性能。 为了解决这些问题,可以使用梯度裁剪。梯度裁剪通过设置一个阈值来限制梯度的大小,如果梯度的范数超过了这个阈值,就对梯度进行缩放,从而将其限制在合理的范围内。梯度裁剪可以在反向传播之前或之后应用,具体取决于具体的实现方式。 在TensorFlow中,可以使用tf.clip_by_value或tf.clip_by_norm等函数来实现梯度裁剪。tf.clip_by_value函数通过限制梯度的数值范围来进行裁剪。tf.clip_by_norm函数将梯度视为向量,并通过将其缩放到指定的范数来进行裁剪。 例如,可以使用以下代码在TensorFlow中对模型的梯度进行裁剪: ``` optimizer = tf.train.GradientDescentOptimizer(learning_rate) gradients, variables = zip(*optimizer.compute_gradients(loss)) clipped_gradients, _ = tf.clip_by_value(gradients, -threshold, threshold) train_op = optimizer.apply_gradients(zip(clipped_gradients, variables)) ``` 这里,首先使用optimizer.compute_gradients函数计算梯度和变量,然后使用tf.clip_by_value函数对梯度进行裁剪,最后使用optimizer.apply_gradients函数将裁剪后的梯度应用到变量上。 梯度裁剪是一种常用的技术,可以有效地处理梯度爆炸和梯度消失问题,提高模型训练的稳定性和收敛性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值