线性代数作为数学的一个分支,广泛用于科学和工程中。然而,因为线性代数主要是面向连续数学,而非离散数学,所以很多计算机科学家很少接触它。握好线性代数对于理解和从事机器学习算法相关工作是很有必要的,尤其对于深度学习算法而言。因此,我们集中探讨一些必备的线性代数知识。并使用numpy或者tf2的代码去展现这些运用。
np_scalar = np.array(1)
tf_scalar = tf.constant(1)
print(np_scalar, tf_scalar)
out: 1 tf.Tensor(1, shape=(), dtype=int32)
np_vector = np.array([1,2,3])
tf_vector = tf.constant([1,2,3])
print(np_vector, tf_vector)
out: [1 2 3] tf.Tensor([1 2 3], shape=(3,), dtype=int32)
np_matrix = np.array([[1, 1, 1],
[2, 2, 2]])
tf_matrix = tf.constant([[1, 2, 3],
[2, 2, 2]])
print(np_matrix, tf_matrix)
out:
[[1 1 1]
[2 2 2]] tf.Tensor(
[[1 2 3]
[2 2 2]], shape=(2, 3), dtype=int32)
矩阵乘法是矩阵运算中最重要的操作之一。两个矩阵A 和B 的矩阵乘积
(matrix product)是第三个矩阵C。为了使乘法定义良好,矩阵A 的列数必须和矩阵B 的行数相等。如果矩阵A 的形状是mn,矩阵B 的形状是np,那么矩阵C 的形状是mp。我们可以通过将两个或多个矩阵并列放置以书写矩阵乘法
C = AB:
具体地,该乘法操作定义为:
A = tf.constant([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])
B = tf.constant([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])
C = A @ B
print(C)
需要注意的是,两个矩阵的标准乘积不是指两个矩阵中对应元素的乘积。不过,那样的矩阵操作确实是存在的,被称为元素对应乘积(element-wise product)或者Hadamard 乘积(Hadamard product),记为A ⊙ B。
两个相同维数的向量x 和y 的点积(dot product)可看作是矩阵乘积x⊤y。我们可以把矩阵乘积C = AB 中计算Ci;j 的步骤看作是A 的第i 行和B 的第j 列之间的点积。
在深度学习中,我们也使用一些不那么常规的符号。我们允许矩阵和向量相加,产生另一个矩阵:C = A + b,其中Ci;j = Ai;j + bj。换言之,向量b 和矩阵A 的每一行相加。这个简写方法使我们无需在加法操作前定义一个将向量b 复制到每一行而生成的矩阵。这种隐式地复制向量b 到很多位置的方式,被称为广播(Broadcasting)
A = tf.constant([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])
b = tf.constant([1])
C = A + b
print(C)
接下来就不写太多冗余的定义了,说人话时间
想要了解线性相关和生成子空间让我们先来了解几个概念
生成子空间: 原始向量线性组合后所能抵达的点的集合。
线性相关:
假设A有m列,n行
不等式n >=m 仅是方程对每一点都有解的必要条件条件。这不是一个充分条件,因为有些列向量可能是冗余的。假设有一个R22 中的矩阵,它的两个列向量是相同的。那么它的列空间和它的一个列向量作为矩阵的列空间是一样的。换言之,虽然该矩阵有2 列,但是它的列空间仍然只是一条线,不能涵盖整个R2 空间。说人话就算在运算的过程中有的列可以被消去,变成全为0
正式地说,这种冗余被称为线性相关(linear dependence)。
(怎么感觉还是不在说人话…)
有时我们需要衡量一个向量的大小。注意划重点,范数是用来衡量一个向量的大小,在机器学习中,我们经常使用被称为范数(norm)的函数衡量向量大小。形式上,Lp 范数定义如下
范数(包括Lp 范数)是将向量映射到非负值的函数。直观上来说,向量x 的范数衡量从原点到点x 的距离。更严格地说,范数是满足下列性质的任意函数:
范数是一种函数不是数
当p = 2 时,L2 范数被称为欧几里得范数(Euclidean norm)。它表示从原点出发到向量x 确定的点的欧几里得距离。L2 范数在机器学习中出现地十分频繁,经常简化表示为∥x∥,略去了下标2。平方L2 范数也经常用来衡量向量的大小,可以简单地通过点积x⊤x 计算。
平方L2 范数在数学和计算上都比L2 范数本身更方便。例如,平方L2 范数对x 中每个元素的导数只取决于对应的元素,而L2 范数对每个元素的导数却和整个向量相关。但是在很多情况下,平方L2 范数也可能不受欢迎,因为它在原点附近增长得十分缓慢。在某些机器学习应用中,区分恰好是零的元素和非零但值很小的元素是很重要的。在这些情况下,我们转而使用在各个位置斜率相同,同时保持简单的数学形式的函数:L1 范数。L1 范数可以简化如下:
当机器学习问题中零和非零元素之间的差异非常重要时,通常会使用L1 范数。每当x 中某个元素从0 增加ϵ,对应的L1 范数也会增加ϵ。
有时候我们会统计向量中非零元素的个数来衡量向量的大小。有些作者将这种函数称为“L0 范数’’,但是这个术语在数学意义上是不对的。向量的非零元素的数目不是范数,因为对向量缩放 a 倍不会改变该向量非零元素的数目。因此,L1 范数经常作为表示非零元素数目的替代函数。
范数还有很多种类:
有兴趣的可以去了解了解,这里就不多做说明了