跳至主要内容

深入浅出深度学习中的数学概念

探索数据科学与深度学习中的基础数学概念,如标量与向量、行列式、奇异值分解等。
· 11分钟 阅读

使用 AI 探索

数据科学是一门跨学科领域,运用数学和高级统计方法进行预测。所有数据科学算法都直接或间接地使用数学概念。扎实的数学理解有助于您构建创新的数据科学解决方案,例如推荐系统。如果您的数学功底扎实,转入数据科学会更顺利。作为数据科学家,您需要运用数学的基本概念来解决问题。

除数学之外,您还需要具备领域知识、编程技能、商业能力、分析能力以及好奇心。对于数据科学家而言,数学是绕不开的。您必须自我培养并掌握数学与统计学基础,才能成为数据科学家。

标量与向量

  • 标量(Scalar): 标量是一个单独的数字,通过标量乘法与空间中的向量发生作用。
  • 向量(Vector): 向量 V 是一个有序的元素集合。向量是由数字构成的数组,可以是行或列。向量可以相加,也可以与称为标量的实数相乘。
标量 vs 向量 vs 矩阵

图片来源

# Import numpy module
import numpy as np

# creating a vector
v = np.array([1, 2, 3, 4, 5])
print(v)
[1 2 3 4 5]
# Vector Operations
# Import numpy module
import numpy as np

# Create two vector
a = np.array([1, 2, 3, 4, 5])
b = np.array([1, 2, 3, 4, 5])

# adding two vectors
add = a + b
print("Addition:",add)

# Vector Subtraction
sub = a - b
print("Subtraction:",sub)

# Vector Multiplication
mul = a * b
print("Multiplication:",mul)

# Vector Division
div = a / b
print("division",div)
Addition: [ 2  4  6  8 10]
Subtraction: [0 0 0 0 0]
Multiplication: [ 1  4  9 16 25]
division [1. 1. 1. 1. 1.]

矩阵与张量

  • 矩阵(Matrix): 矩阵是一个 N 维数字数组,表示变换。您可以将矩阵视为一种变换,例如“缩放”“旋转”“剪切”和“翻转”。它会把空间中的单个点映射到空间中的另一个点。
# Import numpy module
import numpy as np

# create 2*2 matrix
a1=np.array([[1, 2], [3, 4]])
a2=np.array([[1, 2], [3, 4]])

# Dot Product
dot_product = np.dot(a1,a2)
print("Dot Product: \n",dot_product)

# Cross Product
cross_product = np.cross(a1,a2)
print("Cross Product: \n", cross_product)
Dot Product:
 [[ 7 10]
 [15 22]]
Cross Product:
 [0 0]

两个向量的点积表示一个向量在另一个向量上的投影;两个向量的叉积使一个向量能够确定两者可能同处的平面。

  • 张量(Tensor): 有时您需要一个超过二维、且各维度大小可能不同的数组,按网格形式排列,即张量。张量的维度称为阶(rank)。标量和向量也是张量的一种:0 阶张量是标量,1 阶张量是向量。
矩阵 vs 向量

图片来源

行列式

行列式是一个标量值,表示矩阵作为伸缩因子对长度(1 维)、面积(2 维)、体积(3 维)的影响。如果行列式为 2,则体积(3 维)变为原来的两倍;若为 1,则对体积(3 维)无影响;若为 0,则矩阵无逆,因为零与任何数相乘都为零。

行列式矩阵

性质:

  • 矩阵乘积的行列式等于各矩阵行列式的乘积:det(M1M2)=det(M1) det(M2)。

  • 矩阵的行列式等于其特征值的乘积。

  • 将矩阵乘以常数 c,则行列式变化为 det(cM)=c^N det(M),其中 N 为矩阵维度。

如果您的矩阵表示一个可拉伸的玩具,那么该矩阵的行列式就显示您把玩具拉伸了多少。

# Import numpy module
import numpy as np

# Create 2*2 matrix
arr=np.array([[1,2],[3,4]])

# Compute Determinant of a matrix
arr_det=np.linalg.det(arr)

# Print the Computed Determinant
print("Determinant:",arr_det)
Determinant: -2.0000000000000004

特征值与特征向量

方阵 A 的一个特征向量是一个非零向量 v,与 A 相乘时仅改变 v 的尺度。

特征值与特征向量

图片来源

特征向量也称为特征矢量。当对其施加线性变换时,它只随标量因子变化,方向不变。

特征向量是线性变换的旋转轴,这些轴方向固定;特征值是矩阵放大或缩小的尺度因子。特征值也称为特征值或特征根。换言之,您可以理解为:特征向量给出限制线性变换行为的固定直线或平面,而线性变换的特征值是失真因子。

行列式给出线性变换下形状被缩放的面积(或体积)。因此,特征值的乘积等于行列式。

# Import numpy module
import numpy as np

# Create 2*2 matrix
arr=np.array([[1,2],[3,4]])

# Find eigenvalues and eigenvectors
eigenvalues, eigenvectors = np.linalg.eig(arr)

# print the eigenvalues and eigenvectors
print("Eigen Values: \n",eigenvalues)
print("Eigen Vectors:\n", eigenvectors)
Eigen Values:
 [-0.37228132  5.37228132]
Eigen Vectors:
 [[-0.82456484 -0.41597356]
 [ 0.56576746 -0.90937671]]

范数(NORM)函数

有时您需要度量向量的“大小”。范数函数帮助您度量向量的大小。除零向量外,它为向量空间中的向量赋予严格正的长度,其中包含 L^p 范数。它将向量映射为非负值。对于向量和矩阵,它等同于欧几里得距离。其值等于最大的奇异值。

NORM 函数公式
# import numpy module
import numpy as np

# Create 3*3 Matrix
a = np.array([[1,2,3],[4,5,6],[7,8,9]])

# Compute norm
a_norm = np.linalg.norm(a)

# print the norm of function
print(a_norm)
16.881943016134134

矩阵分解

矩阵分解(亦称矩阵因式分解)用于将矩阵拆分为其组成部分。矩阵分解类似于对数字进行因式分解,例如将 10 分解为 2 × 5。它用于求解线性方程。

常见的矩阵分解技术包括:

  • LU 分解:用于方阵,将矩阵分解为 L 与 U 两个部分。
  • QR 分解:用于 m×n 矩阵(不限于方阵),将矩阵分解为 Q 与 R 两部分。与 LU 分解不同,它不局限于方阵。
  • Cholesky 分解:用于求解线性回归的线性最小二乘问题,以及仿真与优化方法。
  • 奇异值分解(SVD):见下一节。

奇异值分解

在上一节中,我们看到矩阵的特征分解可将其分解为特征向量和特征值。奇异值分解是一种矩阵分解方法,可将矩阵分解为奇异向量与奇异值。它在信号处理、心理学、社会学、气候与大气科学、统计学和天文学等领域有广泛应用。

奇异值分解公式
  • M 是一个 m×m 矩阵
  • U 是 m×n 的左奇异矩阵
  • Σ 是 n×n 的对角矩阵,元素为非负实数
  • V 是 m×n 的右奇异矩阵
  • V* 是 n×m 的矩阵,即 V 的转置
# Import numpy module
import numpy as np

# Create 3*3 matrix
a = np.array([[1, 3, 4], [5, 6, 9], [1, 2, 3], [7, 6, 8]])

# Decomposition of matrix using SVD
U, s, Vh = np.linalg.svd(a, full_matrices=False)

U,s,Vh
(array([[-0.27067357, -0.61678044,  0.69789573],
        [-0.65939972, -0.2937857 , -0.62152182],
        [-0.20244298, -0.3480035 , -0.06765408],
        [-0.67152413,  0.64200111,  0.34939247]]),
 array([18.0376394 ,  2.34360292,  0.38870323]),
 array([[-0.46961711, -0.51018039, -0.72053851],
        [ 0.87911451, -0.19502274, -0.43488368],
        [-0.08134773,  0.83766467, -0.54009299]]))
# Generate the initial matrix
new_a = np.dot(U, np.dot(np.diag(s), Vh))

# Print original matrix
print(new_a)
[[1. 3. 4.]
 [5. 6. 9.]
 [1. 2. 3.]
 [7. 6. 8.]]

Moore-Penrose 广义逆

矩阵的伪逆是逆矩阵的推广形式,常用于计算最小二乘解。Moore-Penrose 逆是最常见的矩阵伪逆形式。

Moore-Penrose 伪逆矩阵
# Import numpy module
import numpy as np

# Create 3*3 matrix
a = np.array([[1, 3, 4], [5, 6, 9], [1, 2, 3], [7, 6, 8]])

# Compute the (Moore-Penrose) pseudo-inverse of a matrix.
inv=np.linalg.pinv(a)

# Print pseudo-inverse of a matrix.
print(inv)
[[-0.37037037  0.03703704 -0.11111111  0.18518519]
 [ 1.56296296 -1.2962963  -0.11111111  0.71851852]
 [-0.84444444  0.94444444  0.16666667 -0.57777778]]

哈达玛积

哈达玛积(Hadamard product)或 Schur 积是对两个维度相同的原始矩阵进行逐元素相乘的运算,也称为逐元素乘积。它比矩阵乘法更简单。哈达玛积被用于 JPEG 有损压缩算法。哈达玛积具有交换性、结合性和分配性。它便于求逆并简化幂矩阵的计算。

哈达玛积矩阵

哈达玛积应用广泛,例如卫星传输中的纠错编码、信息论、密码学、模式识别、神经网络、极大似然估计、JPEG 有损压缩、多元统计分析以及线性建模等。

# Import numpy module
import numpy as np

# Create 2*2 matrix a1 and a2
a1=np.array([[1, 2], [3, 4]])
a2=np.array([[1, 2], [3, 4]])

# Element wise multiplication
hadamard_product = np.multiply(a1,a2)

# Print hadamard distance
print("Hadamard Product: \n", hadamard_product)
Hadamard Product:
 [[ 1  4]
 [ 9 16]]

熵

“随机变量的熵是一种用于刻画随机变量不可预测性的函数。”(Entropy and Mutual Information)在构建自动决策树时,熵常用于每一步的特征选择。模型选择常基于最大熵原理,即在相互冲突的模型中,熵最大的为优。

“若随机变量 X 取值于集合 χ={x1, x2,..., xn},其概率分布为 P(X),则随机变量的熵可写为”(Entropy and Mutual Information)

熵公式

“若上式中的对数取 2 为底,则熵以比特(bits)表示;若取自然对数,则以纳特(nats)表示。更常见的做法是使用比特。”(Entropy and Mutual Information)

# Import scipy and numpy module
import scipy.stats
import numpy as np

# Create an array
a=np.array([1,1,2,3,1,3,4,2,5,6,3,2,4,3])


# Compute probability distribution
a_pdf=scipy.stats.norm.pdf(a)

# Calculate the entropy of a distribution for given probability values.
entropy = scipy.stats.entropy(a_pdf) # get entropy from probability values
print("Entropy: ",entropy)
Entropy:  1.6688066853941022

Kullback-Leibler 散度

Kullback–Leibler 散度是两个概率分布之间的相对熵。它度量一个分布相对于另一个参考分布的距离(相似或不相似程度)。当 KL 散度为 0 时,两个分布完全相同。其表达式为:

Kullback-Leibler 散度公式

它听起来像是一种距离度量,但实际并非如此,因为它具有不对称性,即该度量不满足交换律。一般而言,D(p, q) ≠ D(q, p)。KL 散度在无监督机器学习技术“变分自编码器(VAE)”中被广泛使用。

# Import scipy.stats and numpy module
import scipy.stats
import numpy as np

# Create numpy arrays
a=np.array([1,1,2,3,1,3,4,2,5,6,3,2,4,3])
b=np.array([1,1,3,4,2,4,5,2,5,6,3,2,4,3])

# Compute probability distribution
a_pdf=scipy.stats.norm.pdf(a)
b_pdf=scipy.stats.norm.pdf(b)

# compute relative entropy or KL Divergence
kl_div=scipy.stats.entropy(a_pdf,b_pdf)

print("KL Divergence: ",kl_div)
KL Divergence:  0.26732496641464365

梯度下降

梯度下降是最知名的优化算法之一,用于优化线性回归、逻辑回归和神经网络中的系数与偏置。它是一种迭代过程,用来寻找给定函数的最小值。

梯度下降示意图

图片来源

梯度下降公式

图片来源

梯度下降有三种类型:全批量(full batch)、随机(stochastic)和小批量(mini-batch)。全批量梯度下降使用整套数据计算梯度;随机梯度下降使用数据集中的一个样本计算梯度;小批量梯度下降结合二者,将训练集划分为若干小批(batch),逐个小批计算损失,并对最终损失求平均。

结语

恭喜您读完本教程!

您已学习了深度学习中的基础数学概念,如标量、向量、矩阵、张量、行列式、特征值与特征向量、范数函数、奇异值分解(SVD)、Moore-Penrose 伪逆、哈达玛积、熵、Kullback–Leibler 散度以及梯度下降。

在学习过程中,您也使用 NumPy 与 SciPy 在 Python 中实践了这些概念。

如果您想进一步学习 Python,推荐以下 DataCamp 课程:

主题