机器学习中的线性代数:关于常用操作的新手指南

什么是线性代数?

在深度学习中,线性代数是一个非常有用的数学工具,提供同时操作多组数值的方法。它提供多种可以放置数据的结构,如向量(vectors)和矩阵(matrices, 即spreadsheets)两种结构,并定义了一系列的加减乘除规则来操作这些结构。

为什么有用?

线性代数可以将各种复杂问题转化为简单、直观、高效的计算问题。下面这个Python例子展现了线性代数的高速与简洁。

# 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

通过将数组初始化「numpy.array()」, 线性代数方法较数组相乘快了三倍。

它是怎样用于深度学习的?

神经网络(Neural networks)将权值(weights)存放于矩阵(matrices)中。线性代数使得矩阵操作快速而简单,特别是通过 GPU 进行运算。事实上,GPU 的设计便是受启发自向量和矩阵的运算。类似于用像素的多维数组(arrays of pixels)来表示图形图像,视频游戏通过大规模且持续的矩阵计算,带来了极具吸引力的游戏体验。GPU 是并行操作整个矩阵中的各个像素,而不是一个接一个地去处理单个像素。

向量

向量是关于数字或数据项的一维数组的表示。从几何学上看,向量将潜在变化的大小和方向存储到一个点。向量 [3, -2] 表示的是左移3个单位下移2个单位。我们将 具有多个维度的向量称为矩阵。

向量记法

应用中有多种表达向量的方式,下式是阅读中常见的几种表示。

几何学中的向量

向量通常用于代表从一个点出发的移动。它们用一个点存储了大小(magnitude)和方向(direction)的潜在变化。如向量 [-2,5] 表示左移2个单位并上移5个单位。 参考: http://mathinsight.org/vector_introduction.

v = [-2, 5]

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

标量操作

标量操作涉及到一个向量和一个数。你可以通过对向量中的所有项进行加、减、乘操作,实现对一个向量的原地修改(in-place modification) 。

Scalar addition (标量相加)

元素操作Elementwise operations

在向量的元素操作中,如加减除,相应位置的值被组合生成了新的向量。向量 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  方法。

向量乘法

向量乘法有两种:点积(Dot product) 和 Hadamard乘积(Hadamard product)。

点积

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

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) 应用了一个加法或乘法的向量函数,向量场表示了该点理论上可以移动多远。在空间中给定一个点,向量场显示了图中各个点的可能的变化力度(power)和方向(direction)。

向量场参考

上图这个向量场非常有趣,因为它随起点差异而向不同方向移动。原因是,该向量场背后的向量存储着如2x 或x² 这样的元素,而不是 -2 和 5这样的标量值。对于图中的每个点,我们将 x 轴的值带入 2x 或 x² 中,并绘制一个从开始点指向新位置的箭头。向量场对于机器学习技术的可视化非常有用,如绘制梯度下降(Gradient Descent)的方向。

矩阵

一个矩阵是数字或元素的矩形网格(如Excel表格),有着特别加、减、乘的运算规则。

矩阵维度

我们用m行n列( rows by columns)来描述矩阵的维度.

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 operations

矩阵的标量运算与向量相同。只需将标量与矩阵中的每个元素进行加、减、乘、除等操作。

Matrix scalar addition (矩阵的标量相加)

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

矩阵的元素操作Matrix elementwise operations

为了实现两个矩阵的加、减、除操作,他们必须有着相同的维度。 * 我们对两个矩阵的对应元素值操作,组合生成新的矩阵。

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的机制实现。我们称两个矩阵相容(compatible),如果它们相互对应的维度(行对行,列对列)满足以下条件: 

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 仅有一列,所以可行。
a * b
[[ 3, 4],
 [10, 12]]

# Same no. of columns
# Different no. of rows
# but c has one row so this works

# 相同列数,不同行数,但 c 仅有一行,所以可行。
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 都满足大小为1的规则。
a + c
[[2, 3],
 [3, 4]]

在更高的维度上(3维,4维),情况会变得有点诡异,但现在我们不必担心。理解2维上的操作是一个好的开始。

矩阵的 Hadamard 乘积 Matrix Hadamard product

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

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

# Uses python's multiply operator

# 使用 python 的乘法运算
a * b
[[ 6, 12],
 [10, 18]]

在 numpy 中,只要矩阵和向量的维度满足 broadcasting的要求,你便可以对他们使用 Hadamard 乘积运算.

矩阵转置 Matrix transpose

神经网络经常需要处理不同大小的输入矩阵和权值矩阵,它们的维度常常不满足矩阵相乘的规则。矩阵转置提供了一种方法来“旋转”其中的一个矩阵,使其满足乘法操作的要求。转置一个矩阵分两个步骤:

1. 将矩阵顺时针旋转 90°

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

以将矩阵 M 转置成 T为例:

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

a.T
[[1, 3],
 [2, 4]]

矩阵的乘法 Matrix multiplication

矩阵的乘法定义了一系列关于矩阵相乘生成新矩阵的规则。

规则

不是所有的矩阵都可以进行乘法运算。并且,对于输出的结果矩阵也有维度要求。 参考.

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

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

步骤

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

参考

操作 a1 · b1 意味着我们对矩阵A的第一行(1, 7)  和矩阵B 的第一列 (3, 5) 做点积运算.

也可以换一种角度来看:

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

矩阵的乘法很有用,但它的背后并没有什么特别的数学的定律。数学家们把它发明出来是因为它的规范简化了之前乏味的运算。这是一个人为的设计,但却非常有效。

用这些例子自我测试下

使用 numpy 做矩阵乘法

Numpy 使用函数 np.dot(A,B) 做向量和矩阵的乘法运算。它有一些其他有趣的特性和问题,所以我建议你在使用之前先阅读该说明文档 (https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html)。

a = np.array([
 [1, 2]
 ])
a.shape == (1,2)

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

# Multiply
mm = np.dot(a,b)
mm == [13, 16]
mm.shape == (1,2)

原文发布时间为:2017-04-20

时间: 2024-08-02 09:30:38

机器学习中的线性代数:关于常用操作的新手指南的相关文章

php中的mongodb select常用操作代码示例_php实例

前面说到了mongodb安装,配置,集群,以及php的插入与更新等,请参考:mongodb. 下面说一下,mongodb select的常用操作 测试数据: 复制代码 代码如下: { "_id" : 1, "title" : "红楼梦", "auther" : "曹雪芹", "typeColumn" : "test", "money" : 80,

C#中对DatagridView的部分常用操作

C#中对DatagridView部分常用操作 只列出技巧部分,后面会有补充 0(最基本的技巧). 获取某列中的某行(某单元格)中的内容 this.currentposition = this.dataGridView1.BindingContext [this.dataGridView1.DataSource, this.dataGridView1.DataMember].Position; bookContent = this.database.dataSet.Tables[0].Rows [

python中list常用操作实例详解

  本文实例讲述了python中list常用操作.分享给大家供大家参考.具体分析如下: 1.定义list ? 1 2 3 4 5 6 7 >>> li = ["a", "b", "mpilgrim", "z", "example"] >>> li ['a', 'b', 'mpilgrim', 'z', 'example'] >>> li[0] 'a' &

MongoDB在PHP中的常用操作小结

  本篇文章主要是对MongoDB在PHP中的常用操作进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 $mongodb = new Mongo(); //$connection = new Mongo( "$dburl:$port" ); // connect to a remote host (default port) $mydb = $mongodb->mydb; //隐性创建数据库mydb $mydb = $mongodb->selectDB(&

javascript中对Date类型的常用操作小结_基础知识

javascript中对Date类型的常用操作小结 /** 3. * 日期时间脚本库方法列表: 4. * (1)Date.isValiDate:日期合法性验证 5. * (2)Date.isValiTime:时间合法性验证 6. * (3)Date.isValiDateTime:日期和时间合法性验证 7. * (4)Date.prototype.isLeapYear:判断是否闰年 8. * (5)Date.prototype.format:日期格式化 9. * (6)Date.stringToD

Java中对List集合的常用操作详解_java

目录: 1.list中添加,获取,删除元素: 2.list中是否包含某个元素: 3.list中根据索引将元素数值改变(替换): 4.list中查看(判断)元素的索引: 5.根据元素索引位置进行的判断: 6.利用list中索引位置重新生成一个新的list(截取集合): 7.对比两个list中的所有元素: 8.判断list是否为空: 9.返回Iterator集合对象: 10.将集合转换为字符串: 11.将集合转换为数组: 12.集合类型转换: 备注:内容中代码具有关联性. 1.list中添加,获取,

周志华撰文介绍机器学习两大派别;机器学习中常用激活函数的总结与比较 | AI开发者日报

周志华:机器学习有这两大派别,新人入门别跟错队 机器学习作为近年来非常火的一个概念,关注者追随者甚众,然而它的渊源及由来却鲜有人知晓.南京大学的周志华教授在近期的 AIDL2<机器学习前沿>会议上分享介绍了机器学习的两大派别,以及入门需要注意的一些要点.雷锋网整理如下: 详情:http://www.leiphone.com/news/201702/z1aKZcHhkdKtQFoa.html CitizenNet博客:商业系统中的随机森林算法,集合和性能指标 本文由CitizenNet的首席科学

整理JavaScript对DOM中各种类型的元素的常用操作_基础知识

节点类型nodeType以下是一些重要的nodeType的取值: 1: 元素element 2: 属性attr 3: 文本text 8: 注释comments 9: 文档document nodeName,nodeValue 节点关系childNodes: 每个节点都有一个childNodes属性,其中保存着一个NodeList对象 firstChild: 等同于childNodes[0] lastChild: 等同于childNodes.length-1 同时通过使用列表中每个节点的previ

结合美团下单率预测详解机器学习中的数据清洗与特征处理

目前在美团的团购系统中大量地应用到了机器学习和数据挖掘技术,例如个性化推荐.筛选排序.搜索排序.用户建模等等.本文主要介绍在美团的推荐与个性化团队实践中的数据清洗与特征挖掘方法. 综述 机器学习框架 如上图所示是一个经典的机器学习问题框架图.数据清洗和特征挖掘的工作是在灰色框中框出的部分,即"数据清洗=>特征,标注数据生成=>模型学习=>模型应用"中的前两个步骤. 灰色框中蓝色箭头对应的是离线处理部分.主要工作是 从原始数据,如文本.图像或者应用数据中清洗出特征数据和