阅读364 返回首页    go 阿里云 go 技术社区[云栖]


深度学习中的基础线性代数-初学者指南

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud



20b2c59928bc182596307d7c5cb6aa3a42eb23de

上过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 version
x = numpy.array([1,2,3])
y = numpy.array([2,3,4])
x * y

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

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

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

向量

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

向量表示

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

7f04d7f40ffb002089b027ca327ce55cf8872010

几何中的向量

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

7af9aa32d6d695b8157d6342e0d288bd78d4d477

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

 

标量操作

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

7ea100cf09d23b07a775c51d4dd6e9a142fcd1d9

Scalar addition

元素操作

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

83437c20b7c961a5062a9f536197dcbc780dc299

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乘积


点积

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

411c7b4e87946ee1205575ed0cc81e5064df6a8d

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

Hadamard乘积

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

c8de7e55c39e9f1afb1c7d099db3a8b4cb65e1ac

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


向量场

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

8898dca90c9754c2b5633d14be580bae8ffddb61

参考

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


矩阵

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


矩阵维度

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

ecd89b9c84024822ad4162b34a3d2ddfa301d21c


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

矩阵标量运算

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

5c373a72b27fbc53a43d8a147a48b7812d761d32

Matrix scalar addition


矩阵单元操作

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

6f3f2f1514f6e9f6dd81c1819602f817486a6ef8


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 works
a * b
[[ 3, 4],
 [10, 12]]
# Same no. of columns
# Different no. of rows
# but c has one row so this works
b * c
[[ 3, 8],
 [5, 12]]
# Different no. of columns
# Different no. of rows
# but both a and c meet the 
# size 1 requirement rule
a + c
[[2, 3],
 [3, 4]]

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


矩阵Hadamard乘积

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

301a130dce4fcb6413f1c678f060381d86439052

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

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

38be4639ac25dbeed2afcdee166a64fe572967a8


矩阵转置

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

1. 矩阵旋转90°

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

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

29e1dfed5536df8df900364c4bb165705d526e5e

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中列的点积。

1325483e8c7ee2010329d7913ca584347f2137dd

操作a1·b1表示我们取矩阵A第一1,7和矩阵B13,5)的点积

64759c66ce3ec452414b609ab4cfaab91558f18b

这里是另一种方法:

27e4e94c1686ea39faa476b77feb52dd42bbd7db

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

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


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

239630231778cf29b2cf3e6499155619429633d0

矩阵乘法与Numpy

Numpy使用函数np.dotAB)进行向量和矩阵乘法运算。 它有一些其他有趣的功能和问题,所以我希望大家能在使用前阅读一下相关文档。



更多英文教程

Khan Academy Linear Algebra
Deep Learning Book Math Section
Andrew Ng’s Course Notes
Explanation of Linear Algebra
Explanation of Matrices
Intro To Linear Algebra
Immersive Math


本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。

文章原标题《Linear algebra cheat sheet for deep learning》,作者:Brendan Fortuner,译者:friday012,审阅:李烽

文章为简译,更为详细的内容,请查看原文

最后更新:2017-04-01 16:42:10

  上一篇:go 10句话立马激怒程序猿,杀伤力爆棚~
  下一篇:go 数据挖掘——数据挖掘的起源