深度学习中的基础线代知识-初学者指南

时间:2022-05-06
本文章向大家介绍深度学习中的基础线代知识-初学者指南,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

导语:在经过一天之后,我们的活动人数已经达到40人了,感谢大家对小编的支持,同时在本文末附上前一天的众筹榜单。希望能跟小伙伴们度过愉快的6天!

上过 Jeremy Howard 的深度学习课程后,我意识到我在线性代数方面的不足,而这大大影响我对类似反向传播这样的概念的理解。因此我决定在这个方面花点时间,以 补全这方面的知识 。本文是 对线性代数的 基本介绍,用于深度学习中会使用到的一些常见的线性代数操作。

什么是线性代数?

在深度学习的背景下,线性代数是一个数学工具,它提供了有助于同时操作数组的技术。 它提供了像向量和矩阵(电子表格)这样的数据结构用来保存数字和规则,以便进行加,减,乘,除的运算。

线性代数为什么有用?

线性代数可以将复杂的问题简单化,让我们能够对问题进行高效的数学运算。 以下是线性代数如何达到这些目标的一个例子。

# Multiply two arrays x = [1,2,3]
y = [2,3,4]
product = []
for i in range(len(x)):
    product.append(x[i]*y[i])# Linear algebra versionx = numpy.array([1,2,3])
y = numpy.array([2,3,4])
x * y

初始化这两个数组后,用线性代数的方法会快3倍。

如何在深度学习中使用线性代数?

神经网络将权重存储在矩阵中。 线性代数使矩阵运算变得更加快捷简便,尤其是在 GPU 上进行训练的时候。 实际上, GPU 是以向量和矩阵运算为基础的。 比如,图像可以表示为像素数组。视频游戏使用庞大且不断发展的矩阵来产生令人炫目的游戏体验。 GPU 并不是处理单个像素,而是并行地处理整个像素矩阵。

向量

向量是 1 维数组。 在几何中,向量将大小和方向的潜在变化存储到一个点。 例如,向量 [3, -2] 表示向右移 3 个单位距离和向下移 2 个单位距离。而具有多个维度的向量称为矩阵。

向量表示

我们可以以不同的方式来表示向量。 这里有几个常见的表示方式。

几何中的向量

向量通常表示从一个点出发的运动。 它们将 大小方向 的潜在变化存储到一个点。 向量[-2,5] 表示左移 2 个单位,向上 5 个单位。 参考资料

向量可以应用于任何空间点。 向量的方向就是向上 5 个单位和向左 2 个单位的斜线 , 它的大小等于斜线的长度。

标量操作

标量运算涉及向量和某个数字。 我们可以通过对向量中的所有项进行加,减,乘,除操作来对其进行修改。

Scalar addition

元素操作

在诸如加法,减法和除法的元素操作中,相应位置的值被重新组合以产生新的向量。 向量 A 中的第一个值与向量 B 中的第一个值配对。第二个值与第二个值配对,依此类推。也就是说,这两个向量必须有着相同的尺寸,才能完成元素操作*。

Vector addition

y = np.array([1,2,3])x = np.array([2,3,4])y + x = [3, 5, 7]y - x = [-1, -1, -1]y / x = [.5, .67, .75]

* 请参阅下面关于 numpy 中的 broadcasting 方法详细信息。

向量乘法

向量乘法有两种类型:点积和 Hadamard乘积 。

点积

两个向量的点积是一个标量。 向量和矩阵的点积(矩阵乘法)是深度学习中最重要的操作之一。

y = np.array([1,2,3])
x = np.array([2,3,4])
np.dot(y,x) = 20

Hadamard乘积

Hadamard乘积 是元乘法,它的输出是一个向量。

y = np.array([1,2,3])
x = np.array([2,3,4])
y * x = [2, 6, 12]

向量场

如果我们对一个点 ( x , y ) 应用一个加法或乘法的向量函数,向量场则表示了该点 可能会移动多远。 给定空间中某一个点,向量场显示了图中各个不同点可能的变化 力度方向

参考

向量场是非常有趣的,因为它根据不同的起点可以向不同的方向移动。 这是因为向量场背后的向量存储着 2x或 x² 这样的函数关系,而不是像-2和5这样的标量值。对于图上的每个点,我们将x值代入2x或x²,并从起始点绘制箭头指向新的位置。向量场对于类似梯度下降(Gradient Descent)这类的机器学习技术的可视化是非常有用的。

矩阵

矩阵是数字或字符的矩形网格(如 Excel 表格),并具有加,减,乘等运算规则。

矩阵维度

我们用列和行来描述矩阵的维度。

a = np.array([
 [1,2,3], 
 [4,5,6]
])
a.shape == (2,3)
b = np.array([
 [1,2,3]
])
b.shape == (1,3)

矩阵标量运算

矩阵的标量运算与向量一样。 简单地将标量应用于矩阵中的每个元素进行 加,减,乘,除等操作。

Matrix scalar addition

矩阵单元操作

为了对两个矩阵进行加,减或除法,它们必须具有相等的维度。 * 我们以元素组合的方式产生对应的值,得到新的矩阵。

a = np.array([
 [1,2],
 [3,4]
])
b = np.array([
 [1,2],
 [3,4]
])
a + b[[2, 4],
 [6, 8]]a — b[[0, 0],
 [0, 0]]

Numpy 的broadcasting方法 *

这是个不得不提的话题,因为它在实践中非常重要。 在 numpy 中,元素操作的维度要求通过称为 broadcasting 的机制来扩展。 如果每个矩阵(行 与行,列与列)中的相应维度满足以下要求,则这两个矩阵是兼容的:

1. Â Â Â Â 两个矩阵维度相等,或

2. Â Â 一个矩阵的维度为 1

a = np.array([
 [1],
 [2]
])
b = np.array([
 [3,4],
 [5,6]
])
c = np.array([
 [1,2]
])# Same no. of rows# Different no. of columns# but a has one column so this worksa * b
[[ 3, 4],
 [10, 12]]# Same no. of columns# Different no. of rows# but c has one row so this worksb * c
[[ 3, 8],
 [5, 12]]# Different no. of columns# Different no. of rows# but both a and c meet the # size 1 requirement rulea + c
[[2, 3],
 [3, 4]]

但在更高的维度上(3维或4维),事情会变得有点奇怪,但是现在我们不用担心。 了解二维上的操作是个很好的开始。

矩阵Hadamard乘积

矩阵的 Hadamard 乘积是一个元素运算,就像向量一样。 相应位置的值通过乘法运算来产生一个新的矩阵。

a = np.array(
[[2,3],
 [2,3]])
b = np.array(
[[3,4],
 [5,6]])# Uses python's multiply operatora * b
[[ 6, 12],
 [10, 18]]

只要矩阵维度符合 broadcasting 要求,就可以用Numpy对矩阵和向量进行 Hadamard 乘积运算。

矩阵转置

神经网络经常处理维度不符合要求的矩阵。 而 矩阵 转置提供了一种方法来 “ 旋转 ” 其中一个矩阵,以使其操作符合乘法要求。 转置矩阵有两个步骤:

1. 矩阵 旋转 90 °

2. 反转每行元素的顺序(例如 [a b c] 变为 [c b a] )

例如,将矩阵M转置为T:

a = np.array([
   [1, 2], 
   [3, 4]])
a.T[[1, 3],
 [2, 4]]

矩阵乘法

矩阵乘法规定了一组对矩阵进行乘法运算,以产生新矩阵的规则。

规则

并不是所有的矩阵都能进行乘法运算的。 并且,对输出矩阵的维度也存在要求。 参考资料

1. Â Â Â Â 第一矩阵的列数必须等于第二个矩阵 的行数

2. Â Â M × N 矩阵和 N × K 矩阵的乘积是 M × K 矩阵。 新矩阵取第一个矩阵的行和第二个矩阵的列。

步骤

矩阵乘法依赖于点积与行列元素的各种组合。 以下图为例(取自 Khan 学院的线性代数课程),矩阵 C 中的每个元素都是矩阵 A 中行与矩阵 B 中列的点积。

操作 a1 · b1 表示我们取矩阵 A 中 第一 行 ( 1,7 ) 和矩阵 B 中 第 1 列 ( 3,5 )的点积 。

这里是另一种方法:

为什么矩阵乘法以这种方式工作?

矩阵的乘法运算非常有用。但背后并没有太深奥的数学 规律。 之所以 数学家 发明了这种运算,完全是因为它简化了以前乏味的计算。 这是一个人为的产物,但却非常有效。

用一下几个例子自我测试一下