作者 | Vihar Kurama

编译 | 专知

整理 | Mandy

线性代数对于理解机器学习和深度学习内部原理至关重要,线性代数是有关连续值的数学。许多计算机科学家在此方面经验不足,传统上计算机科学更偏重离散数学。这篇博文主要介绍了线性代数的基本概念,包括标量、向量、矩阵、张量,以及常见的矩阵运算,并且也有相应的Python代码实现。

Linear Algebra for Deep Learning

深度学习(Deep Learning)是机器学习的一个子领域,涉及的算法模仿大脑的功能和结构,称为人工神经网络。

线性代数(linear algebra)是有关连续值的数学。许多计算机科学家在此方面经验不足(传统上计算机科学更偏重离散数学)。想要理解和使用许多机器学习算法,特别是深度学习算法,对线性代数的良好理解是不可或缺的。

为什么要学习数学?



线性代数、概率论和微积分是用来表达机器学习的“语言”。学习这些内容将有助于深入理解底层的算法机制,也有助于开发新的算法。

当被限制在足够小的尺度上,深度学习背后的一切都是数学。所以在开始深度学习之前,了解基本的线性代数是非常重要的。

深度学习背后的核心数据结构是标量(Scalar)、向量(Vector)、矩阵(Matrix)、张量(Tensor)。在编程中,让我们使用这些数据结构求解基本的线性代数问题。

标量(Scalars)



标量是一个数字,或者说,是一个0阶张量。符号表示是一个属于实数集的标量。

深度学习中有着不同的数字集合。表示正整数集。表示整数集,包括正整数,负整数和零。表示有理数集,可以表达两个整数之比的数。

在Python中有几个内置的标量类型:int、float、complex、bytes、Unicode。Numpy又增加了二十多种新的标量类型。有关数据类型的更多信息,请参阅文档。

在Python中定义标量和一些运算: 下面的代码片段展示了对标量的几个运算操作。

# In-Built Scalars
a = 5
b = 7.5
print(type(a))
print(type(b))
print(a + b)
print(a - b)
print(a * b)
print(a / b)

输出结果:

<class 'int'>
<class 'float'>
12.5
-2.5
37.5
0.6666666666666666

下面的代码片段用来检查给定的变量是否是标量。

import numpy as np# Is Scalar Function
def isscalar(num):if isinstance(num, generic):return Trueelse:return Falseprint(np.isscalar(3.1))
print(np.isscalar([3.1]))
print(np.isscalar(False))

输出结果:

True
False
True

向量(Vectors)



向量是由单个数字组成的有序数组,或者说,1阶张量。向量是向量空间这一对象的组成部分。一个向量空间可以看作是一个特定长度(或维度)的所有可能向量的集合。三维实数向量空间()常用于表示现实世界中的三维空间。  为了明确地识别向量的分量(component),向量的第个标量元素被记为

在深度学习中,向量通常表示特征向量,其原始分量定义了特定特征的相关性。这些元素可以是二维图像中一组像素的强度的相关性或者是金融工具截面的历史价格值。

在Python中定义向量和一些运算:

import numpy as np# 声明向量x = [1, 2, 3]
y = [4, 5, 6]print(type(x))# +并不表示向量的加法,而是列表的连接:
print(x + y)# 需要使用Numpy进行向量加法:
z = np.add(x, y)
print(z)
print(type(z))# 向量的叉积(cross product):两个向量的叉积向量,
大小等于以这两个向量为邻边的平行四边形面积,方向与这两个向量所在平面垂直
mul = np.cross(x, y)
print(mul)

输出结果:

<class 'list'>
[1, 2, 3, 4, 5, 6]
[5 7 9]
<class 'numpy.ndarray'>
[-3  6 -3]

矩阵(Matrices)



矩阵是由数字组成的矩形数组,或者说,2阶张量。如果和为正整数,即 ,那么一个的矩阵包含个数字,行列。 一个的矩阵可表示成:

有时可简写为:

在Python中,我们使用numpy库创建n维数组,也就是矩阵。我们将列表传入matrix方法,以定义矩阵。

>>> import numpy as np
>>> x = np.matrix([[1,2],[2,3]])
>>> x
matrix([[1, 2],[2, 3]])>>> a = x.mean(0)
>>> a
matrix([[1.5, 2.5]])
>>> # Finding the mean with 1 with the matrix x.
>>> z = x.mean(1)
>>> z
matrix([[ 1.5],[ 2.5]])
>>> z.shape
(2, 1)
>>> y = x - z
matrix([[-0.5,  0.5],[-0.5,  0.5]])
>>> print(type(z))
<class 'numpy.matrixlib.defmatrix.matrix'>

在Python中定义矩阵和一些运算:

矩阵加法

矩阵可以与标量、向量和其他矩阵相加。每个操作都有一个精确的定义。这些技术在机器学习和深度学习中经常被使用,所以你需要熟悉它们。

# Matrix Additionimport numpy as npx = np.matrix([[1, 2], [4, 3]])sum = x.sum()
print(sum)
# Output: 10

矩阵-矩阵相加

C = A + B(矩阵A和矩阵B应该具有相等的行数和列数)

两个矩阵的相对应的元素分别相加,如果矩阵的形状不相同,则会抛出一个错误,说明不能相加。

# Matrix-Matrix Additionimport numpy as npx = np.matrix([[1, 2], [4, 3]])
y = np.matrix([[3, 4], [3, 10]])print(x.shape)
# (2, 2)
print(y.shape)
# (2, 2)m_sum = np.add(x, y)
print(m_sum)
print(m_sum.shape)
"""
Output :
[[ 4  6][ 7 13]](2, 2)
"""

矩阵-标量相加

将给定的标量与给定矩阵中的所有元素相加。

# Matrix-Scalar Additionimport numpy as npx = np.matrix([[1, 2], [4, 3]])
s_sum = x + 1
print(s_sum)
"""
Output:
[[2 3][5 4]]
"""

矩阵-标量相乘

将给定的标量与给定矩阵中的所有元素相乘。

# Matrix Scalar Multiplicationimport numpy as npx = np.matrix([[1, 2], [4, 3]])
s_mul = x * 3
print(s_mul)
"""
[[ 3  6][12  9]]
"""

矩阵-矩阵相乘

矩阵A(m行n列)与矩阵B(n行p列)得到矩阵C(m行p列),如下图所示:

# Matrix Multiplicationimport numpy as npa = [[1, 0], [0, 1]]
b = [1, 2]
np.matmul(a, b)
# Output: array([1, 2])complex_mul = np.matmul([2j, 3j], [2j, 3j])
print(complex_mul)
# Output: (-13+0j)

矩阵转置

矩阵转置交换原矩阵的行和列(行变为列,列变为行)。通过转置,可以将行向量转换为列向量,反之亦然:

# Matrix Transposeimport numpy as npa = np.array([[1, 2], [3, 4]])
print(a)
"""
[[1 2][3 4]]
"""
a.transpose()
print(a)
"""
array([[1, 3],[2, 4]])
"""

张量(Tensors)



比标量、向量、矩阵更通用的概念是张量。在物理科学和机器学习中,有时需要使用超过二阶的张量(如前文中所说,标量、向量、矩阵分别可以视为0、1、2阶张量。)

一般来说,我们使用像tensorflow或PyTorch这样的Python库来声明张量。

在PyTorch中定义一个简单的张量:

import torcha = torch.Tensor([26])print(type(a))
# <class 'torch.FloatTensor'>print(a.shape)
# torch.Size([1])# Creates a Random Torch Variable of size 5x3.
t = torch.Tensor(5, 3)
print(t)
"""0.0000e+00  0.0000e+00  0.0000e+000.0000e+00  7.0065e-45  1.1614e-410.0000e+00  2.2369e+08  0.0000e+000.0000e+00  0.0000e+00  0.0000e+00nan         nan -1.4469e+35[torch.FloatTensor of size 5x3]
"""
print(t.shape)
# torch.Size([5, 3])

Python中对张量的一些算术运算:

import torch# Creating Tensorsp = torch.Tensor(4,4)
q = torch.Tensor(4,4)
ones = torch.ones(4,4)print(p, q, ones)
"""
Output:0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+001.6009e-19  4.4721e+21  6.2625e+22  4.7428e+303.1921e-09  8.0221e+17  5.1019e-08  8.1121e+178.1631e-07  8.2022e+17  1.1703e-19  1.5637e-01
[torch.FloatTensor of size 4x4]0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+001.8217e-44  1.1614e-41  0.0000e+00  2.2369e+080.0000e+00  0.0000e+00  2.0376e-40  2.0376e-40nan         nan -5.3105e+37         nan
[torch.FloatTensor of size 4x4]1  1  1  11  1  1  11  1  1  11  1  1  1
[torch.FloatTensor of size 4x4]
"""
print("Addition:{}".format(p + q))
print("Subtraction:{}".format(p - ones))
print("Multiplication:{}".format(p * ones))
print("Division:{}".format(q / ones))"""
Addition:0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+001.6009e-19  4.4721e+21  6.2625e+22  4.7428e+303.1921e-09  8.0221e+17  5.1019e-08  8.1121e+17nan         nan -5.3105e+37         nan
[torch.FloatTensor of size 4x4]Subtraction:
-1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00
-1.0000e+00  4.4721e+21  6.2625e+22  4.7428e+30
-1.0000e+00  8.0221e+17 -1.0000e+00  8.1121e+17
-1.0000e+00  8.2022e+17 -1.0000e+00 -8.4363e-01
[torch.FloatTensor of size 4x4]Multiplication:0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+001.6009e-19  4.4721e+21  6.2625e+22  4.7428e+303.1921e-09  8.0221e+17  5.1019e-08  8.1121e+178.1631e-07  8.2022e+17  1.1703e-19  1.5637e-01
[torch.FloatTensor of size 4x4]Division:0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+001.8217e-44  1.1614e-41  0.0000e+00  2.2369e+080.0000e+00  0.0000e+00  2.0376e-40  2.0376e-40nan         nan -5.3105e+37         nan
[torch.FloatTensor of size 4x4]
"""

有关张量和PyTorch的更多文档,请查阅文档。

原文链接:

https://towardsdatascience.com/linear-algebra-for-deep-learning-506c19c0d6fa

推荐阅读:

如何在知乎上做到“有效学习”?

【学术福利】Pytorch的tensorboard食谱帮你可视化误差结果

通俗易懂讲解感知机(三)--收敛性证明与对偶形式以及python代码讲解  




扫码加好友,加入海归Python编程和人工智能群

【干货】深度学习中的线性代数---简明教程相关推荐

  1. 正则化的通俗解释_干货|深度学习中的正则化技术概述(附Python+keras实现代码)...

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 介绍 数据科学研究者们最常遇见的问题之一就是怎样避免过拟合.你也许在训练模型的时候也遇 ...

  2. 深度学习中的线性代数知识详解

    1. 基础概念 标量(scalar) 一个标量就是一个单独的数,一般用小写的的变量名称表示. 向量(vector) 一个向量就是一列数,这些数是有序排列的: ⎡⎣⎢⎢⎢⎢x1x2...x5⎤⎦⎥⎥⎥⎥ ...

  3. 深度学习数学基础之线性代数

    深度学习中的基本数据结构,基本上都是用向量或矩阵表示的,因此: 深度学习的基础学科之一:就是线性代数. 深度学习中的线性代数知识主要包括以下部分: 1.标量.向量.矩阵和张量: 这4个变量很好理解: ...

  4. 干货|卷积有多少种?一文读懂深度学习中的各种卷积

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 我们都知道卷积的重要性,但你知道深度学习领域的卷积究竟是什么,又有 ...

  5. 干货|一文全解深度学习中的卷积

    来源:1024深度学习 概要:卷积现在可能是深度学习中最重要的概念.正是靠着卷积和卷积神经网络,深度学习才超越了几乎其他所有的机器学习手段. 译自Tim Dettmers的Understanding ...

  6. 深度学习中所需的线性代数知识

    原址 每个深度学习项目背后的数学知识. 深度学习是机器学习的一个子领域,涉及一些模仿人脑结构和功能的人工神经网络算法. 线性代数是一种连续的而非离散的数学形式,许多计算机科学家对它几乎没有经验.对于理 ...

  7. matlab中没有linearmodel,MATLAB线性代数简明教程(Linear Algebra Using MATLAB)

    MATLAB线性代数简明教程(Linear Algebra Using MATLAB) 编辑 锁定 讨论 上传视频 <MATLAB线性代数简明教程(Linear Algebra Using MA ...

  8. 深度学习中的数学-线性代数

    深度学习中的数学-线性代数 1 矩阵和向量相乘 1.1 标准乘积 1.2 元素对应乘积 2 线性相关和生成子空间 3 特征分解 4 奇异值分解 推荐书目 参考 1 矩阵和向量相乘 1.1 标准乘积 如 ...

  9. 干货丨 简述迁移学习在深度学习中的应用

    文章来源:机器之心 迁移学习是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中. 深度学习中在计算机视觉任务和自然语言处理任务中将预训练的模型作为新模型 ...

最新文章

  1. MySQL 加锁处理分析 ---非常牛逼
  2. Matlab处理JSON数据
  3. [云炬创业基础笔记]第七张创业团队测试1
  4. python读取字典元素笔记_python学习笔记:字典的使用示例详解
  5. java天气app_MVP+RxJava2+Retrofit2 实况天气app
  6. Python键鼠自动化函数
  7. 9张图总结一下阿里云的2019
  8. Tomcat启动过程源码分析四
  9. CSS 布局经典问题初步整理
  10. 基础编程题目集 7-4 BCD解密 (10 分)
  11. Scala开发教程(16): 没有“break”和“continue”的日子
  12. 如何使用自动化与分析工具库创建 Excel 直方图
  13. 需要多少次找出较轻的小球
  14. GitHub排名第一!免费最”强“12306抢票神器,程序员再不用跪求加速包!
  15. 2021京东618活动脚本App和电脑版最新版(建议使用app版)
  16. 大表哥有个项目,100W预算,让我顺手做了算了......
  17. 看看月光blog2014年都搞些啥
  18. 牛客每日一题系列(持续更新)
  19. 教你利用VMM虚拟机安装LEDE旁路由实现软路由超强功能的方法教程
  20. Tomcatnbsp;Servletnbsp;JSPamp;nbs…

热门文章

  1. 【LeetCode】【HOT】239. 滑动窗口最大值(双向队列)
  2. Java面试之锁-可重入锁和递归锁
  3. LeetBook《程序员的算法趣题》Q18---水果酥饼日
  4. 解决 IDEA 中src下xml等资源文件无法读取的问题
  5. 001.常见监控简介
  6. 编译wxWidgets
  7. [转] WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单
  8. java应用挂死故障排查
  9. 2019年京东Java研发岗社招面经(面试经历+真题总结+经验分享)!
  10. (转)基于Metronic的Bootstrap开发框架经验总结(6)--对话框及提示框的处理和优化...