今天说一个深度学习里面经常出现,但是未必人人都能 get 到直观感受的概念:范数,英文名叫 norm。
1. 直观理解
本质上来讲,范数是用来衡量一个向量(vector)的规模的。
什么叫规模,举个例子:
x:
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
y:
tensor([0., 0.])
他们的 size 分别是:
x: torch.Size([3, 3])
y: torch.Size([2])
x 的规模是 3 维的,而且每个维度有 3 个取值,值的绝对值都为1;y 的规模是 1 维的, 每个维度只有 2 个取值,值为0;
无论是维度还是数值大小,x 都毫无疑问比 y 大。如果现在问你,这两个向量的规模哪个大一些,相信你能很直观且不违背直觉地得出结论:x 的规模更大,size 更大。相应地,x 的范式也更大。
当然,还有一种比较亲民的理解方法,你可以把一个向量的范式衡量了这个向量指向的终点距离原点的距离。 这样一来,维度很高且各维度上取值都很大的向量指向的点,肯定就比维度低且取值小的点,距离原点更远些。所以前者的范数更大。
那么在数学上具体是怎么定义范式的呢?
2. 数学定义
严格来说,范式是一个可以由一个向量映射到一个数值的函数。这个函数遵从下面几条规则:
- 范式是非负的,当你把它理解为长度的时候,就不难理解这个限制,因为长度是非负的。
- 当且仅当向量为零向量时,这个向量的范数才为零。
- 范数遵循三角定律。两个向量相加以后求范式 <= 两个向量求范式以后再相加。
- 向量乘以标量以后求范式 = 向量求范式以后再乘以标量。
也就说,只要满足上面四条规律的函数,不限形式,都可以作为范式函数。用这个函数可以求得一个向量的范式值,去描述一个向量的规模。
实际应用中,机器学习和深度学习常常用到下面这种范式函数,LP 范式:
向量 的 LP 范式定义为:
其中,,且 >= 1。
特别地,当 为 1 时,称为向量的 L1 范式; 取 2 时,为 L2 范式。
特别要说明的是,严格来说,并不存在 L0 范式! 这是一个缪语。只不过,在实际操作中,通常会把一个向量的非零元素的个数称为 L0 范式。但是读者需要明白地是,如果计算一个向量的非零元素的个数能够作为范式的话,那这个映射规则明显是不符合上述第 4 条规则的:把一个具有 n 个 0 值的向量乘以一个标量 k 以后,它的非零元素的个数还是 n,而不是 k*n。
3. L1 范式和 L2 范式的比较
当 p 取 1 时,L1 范式为:
很简单,就是向量所有元素值的绝对值求和。
当 p 取 2 时,L2 范式为:
别名也叫 Euclidean norm,欧几里得范式。这么亲切的名字,喻示着,L2 范式相当于求欧式距离。举个例子:如果一个向量 u 为:
那么,它的 L2 范式就是这么求的:
很简单吧!向量 u 的 L2 范式值就是 5。
numpy 里面用 linalg.norm 函数就可以求 L2 范式:
np.linalg.norm([3, 4])
5.0
因为 L2 范式是最常用的范式,所以有时候,会把 简写为 ,L1 范式记为 。
实践过程中,常常会用到 L2 范式的平方(squared L2 norm,以下简称 L2 范式的平方为 “平方 L2“。):,即:
平方 L2 摆脱了根号以后变得十分可爱了,因为它就是向量所有元素的平方和而已。在损失函数的优化过程中,关于单个变量的求导变得容易很多。 具体来说,如果向量 为:
那么,它的 L2 范式关于各项元素的求导为:
如果是 L2 范式平方求导呢:
L2 求导,每个元素的偏导与整个向量所有的元素有关,而平方 L2 求导,每个元素的偏导只与这个元素自己的取值有关。 这样一来,求导过程瞬间简单很多。
说完平方 L2 的优点,再来说一下它的不足。
由于函数增长特性,平方 L2 在元素值接近于零的时候,其增长速度非常缓慢。看下图:
对比 L2:
可以看到,平方 L2 在接近于 0(底座)较之于 L2,增长非常平缓。所以在某些需要明确区分零值与非零值的应用中,用平方 L2 则显得不够明智。这种情况下,可以选择 L1 范式:
在 L1 范式中,一个向量的某个元素值从零增加 ,则 L1 范式值也增加 ,而不是像平方 L2 一样几近无增长。所以机器学习里面,在对接近零值区域比较敏感的情况下,L1 范式是用的最多的。
4. 其他范式
除了上述的 LP 范式,机器学习中还很常见的一个范式是 范式,也叫 max norm,顾名思义,即一个向量的 范式为这个向量所有元素值的最大绝对值。
此外,深度学习中有时需要衡量一个矩阵的 size 的时候,会需要用到 Frobenius 范式(Frobenius norm),公式为:
其相当于,对矩阵进行平滑操作(flatten)后的一维向量求 L2 范式。
此外,两个向量的点乘也可以利用 L2 范式来求:
以两个向量为例:
那么,等式左边:
等式右边:
关于范式的初步说明今天先到此为止,后续有时间会补充说明为什么需要搞出这个所谓的范数,以及怎样选择范数。
Reference:https://zh.wikipedia.org/zh-hans/范数