花书《深度学习》数学基础实战3个核心公式的NumPy实现与几何直观深度学习作为人工智能领域最具革命性的技术之一其理论基础建立在坚实的数学框架之上。Ian Goodfellow等学者所著的《深度学习》俗称花书系统性地梳理了这一领域的数学基础但对于许多初学者而言理论公式与实际代码实现之间仍存在理解鸿沟。本文将聚焦线性代数、概率论和优化计算三个核心数学领域通过NumPy代码实现和几何可视化帮助读者建立直观的数学直觉。1. 线性代数核心奇异值分解的几何意义与实现奇异值分解SVD是线性代数中极具威力的工具在深度学习中被广泛应用于主成分分析、推荐系统和自然语言处理等领域。理解SVD不仅需要掌握其数学形式更需要直观感受其几何变换本质。1.1 SVD的数学表述与几何解释任何实数矩阵A∈ℝ^(m×n)都可以分解为 A UΣV^T 其中U和V是正交矩阵Σ是对角矩阵。从几何角度看SVD揭示了一个线性变换可以分解为三个基本操作的组合旋转/反射V^T缩放Σ旋转/反射Uimport numpy as np import matplotlib.pyplot as plt # 生成一个2x2矩阵示例 A np.array([[2, 1], [1, 2]]) # 计算SVD U, S, Vt np.linalg.svd(A) print(U矩阵:\n, U) print(奇异值:\n, S) print(V转置矩阵:\n, Vt)1.2 SVD的几何可视化让我们通过单位圆的变形过程直观理解SVD# 创建单位圆上的点 theta np.linspace(0, 2*np.pi, 100) circle np.vstack((np.cos(theta), np.sin(theta))) # 应用SVD各阶段变换 Vt_transform Vt circle sigma_transform np.diag(S) Vt_transform final_transform U sigma_transform # 绘制变换过程 plt.figure(figsize(12, 4)) plt.subplot(141) plt.plot(circle[0], circle[1]) plt.title(单位圆) plt.subplot(142) plt.plot(Vt_transform[0], Vt_transform[1]) plt.title(V^T变换) plt.subplot(143) plt.plot(sigma_transform[0], sigma_transform[1]) plt.title(Σ缩放) plt.subplot(144) plt.plot(final_transform[0], final_transform[1]) plt.title(U变换) plt.tight_layout() plt.show()执行上述代码我们将看到单位圆如何先被V^T旋转然后被Σ在不同方向上缩放最后被U旋转形成最终的椭圆形状。这种可视化直观展示了矩阵如何通过SVD分解为基本的几何操作。1.3 SVD在降维中的应用SVD的一个重要应用是数据降维。通过保留前k个最大的奇异值我们可以实现数据压缩和噪声过滤# 使用SVD进行图像压缩示例 from skimage import data image data.camera().astype(float) U, S, Vt np.linalg.svd(image) # 选择前50个奇异值进行重建 k 50 reconstructed U[:, :k] np.diag(S[:k]) Vt[:k, :] plt.figure(figsize(10, 5)) plt.subplot(121) plt.imshow(image, cmapgray) plt.title(原始图像) plt.subplot(122) plt.imshow(reconstructed, cmapgray) plt.title(f使用前{k}个奇异值重建) plt.show()提示在实际应用中SVD的计算复杂度较高对于大型矩阵通常会使用随机化SVD等优化算法。2. 概率论核心多元高斯分布与协方差矩阵概率论为深度学习提供了描述不确定性和进行统计推断的语言。多元高斯分布是其中最重要的概率分布之一其性质由均值向量和协方差矩阵完全决定。2.1 多元高斯分布的数学形式d维多元高斯分布的概率密度函数为 p(x) (1/((2π)^(d/2)|Σ|^(1/2))) * exp(-1/2 (x-μ)^T Σ^(-1) (x-μ))其中μ是均值向量Σ是协方差矩阵。def multivariate_gaussian(x, mu, cov): 计算多元高斯分布的概率密度 d len(mu) x_centered x - mu inv_cov np.linalg.inv(cov) exponent -0.5 * x_centered.T inv_cov x_centered normalization 1 / ((2*np.pi)**(d/2) * np.sqrt(np.linalg.det(cov))) return normalization * np.exp(exponent)2.2 协方差矩阵的几何解释协方差矩阵决定了高斯分布的形状对角线元素各维度的方差非对角线元素维度间的协方差# 定义不同协方差矩阵 cov1 np.array([[1, 0], [0, 1]]) # 球形 cov2 np.array([[2, 0], [0, 0.5]]) # 轴向拉伸 cov3 np.array([[1, 0.8], [0.8, 1]]) # 相关 # 生成网格点 x, y np.mgrid[-3:3:.1, -3:3:.1] pos np.dstack((x, y)) # 计算各点概率密度 mu np.array([0, 0]) z1 np.apply_along_axis(lambda v: multivariate_gaussian(v, mu, cov1), 2, pos) z2 np.apply_along_axis(lambda v: multivariate_gaussian(v, mu, cov2), 2, pos) z3 np.apply_along_axis(lambda v: multivariate_gaussian(v, mu, cov3), 2, pos) # 绘制等高线图 plt.figure(figsize(15, 5)) plt.subplot(131) plt.contourf(x, y, z1) plt.title(球形协方差) plt.subplot(132) plt.contourf(x, y, z2) plt.title(轴向拉伸) plt.subplot(133) plt.contourf(x, y, z3) plt.title(相关变量) plt.show()2.3 协方差矩阵的性质与操作协方差矩阵必须是对称的正定的所有特征值大于零在深度学习中我们经常需要对协方差矩阵进行各种操作# 协方差矩阵的正定性检查 def is_positive_definite(matrix): return np.all(np.linalg.eigvals(matrix) 0) # 从数据估计协方差矩阵 data np.random.multivariate_normal([0, 0], cov3, 1000) estimated_cov np.cov(data.T) print(估计的协方差矩阵:\n, estimated_cov) print(是否正定:, is_positive_definite(estimated_cov))注意在实际应用中当特征维度很高时协方差矩阵可能变得奇异非正定此时需要考虑正则化技术或使用对角协方差矩阵。3. 优化计算核心梯度下降的几何直观与实现优化算法是训练深度神经网络的核心而梯度下降是最基础也最重要的优化方法。理解梯度下降的几何行为对于调试和设计神经网络至关重要。3.1 梯度下降的数学表述参数更新规则 θ ← θ - η∇θJ(θ)其中η是学习率∇θJ(θ)是目标函数J关于参数θ的梯度。def gradient_descent(f, grad_f, initial_theta, learning_rate0.1, n_iter100): 基本梯度下降实现 theta initial_theta.copy() history [theta] for _ in range(n_iter): gradient grad_f(theta) theta theta - learning_rate * gradient history.append(theta.copy()) return np.array(history)3.2 梯度下降的几何可视化让我们在一个二维函数上观察梯度下降的轨迹# 定义目标函数 (Rosenbrock函数) def rosenbrock(x, y, a1, b100): return (a - x)**2 b*(y - x**2)**2 def rosenbrock_grad(v): x, y v dx -2*(1 - x) - 400*x*(y - x**2) dy 200*(y - x**2) return np.array([dx, dy]) # 生成网格数据 x np.linspace(-2, 2, 100) y np.linspace(-1, 3, 100) X, Y np.meshgrid(x, y) Z rosenbrock(X, Y) # 运行梯度下降 initial_theta np.array([-1.5, 2.5]) history gradient_descent(rosenbrock, rosenbrock_grad, initial_theta, 0.0005, 1000) # 绘制等高线和优化路径 plt.figure(figsize(10, 8)) plt.contour(X, Y, Z, levelsnp.logspace(-1, 3, 20), cmapviridis) plt.plot(history[:, 0], history[:, 1], r.-, markersize10) plt.scatter([1], [1], cgold, s100, marker*) # 全局最小值 plt.title(梯度下降在Rosenbrock函数上的优化路径) plt.colorbar() plt.show()3.3 梯度下降变体的实现基本梯度下降有几个重要变体它们在深度学习中被广泛使用动量法引入动量项减少振荡AdaGrad自适应调整学习率Adam结合动量和自适应学习率def adam_optimizer(f, grad_f, initial_theta, learning_rate0.001, beta10.9, beta20.999, epsilon1e-8, n_iter1000): Adam优化器实现 theta initial_theta.copy() m np.zeros_like(theta) # 一阶矩估计 v np.zeros_like(theta) # 二阶矩估计 history [theta] for t in range(1, n_iter1): grad grad_f(theta) m beta1 * m (1 - beta1) * grad v beta2 * v (1 - beta2) * grad**2 # 偏差校正 m_hat m / (1 - beta1**t) v_hat v / (1 - beta2**t) theta theta - learning_rate * m_hat / (np.sqrt(v_hat) epsilon) history.append(theta.copy()) return np.array(history) # 比较不同优化器 gd_history gradient_descent(rosenbrock, rosenbrock_grad, initial_theta, 0.0005, 1000) adam_history adam_optimizer(rosenbrock, rosenbrock_grad, initial_theta, 0.1, n_iter1000) plt.figure(figsize(10, 8)) plt.contour(X, Y, Z, levelsnp.logspace(-1, 3, 20), cmapviridis) plt.plot(gd_history[:, 0], gd_history[:, 1], r.-, label梯度下降) plt.plot(adam_history[:, 0], adam_history[:, 1], b.-, labelAdam) plt.scatter([1], [1], cgold, s100, marker*) plt.legend() plt.title(不同优化算法比较) plt.show()从可视化结果可以明显看出Adam优化器比基本梯度下降更快地收敛到全局最小值且路径更加平滑。4. 数学基础的综合应用从理论到实践将线性代数、概率论和优化计算结合起来我们可以构建一个完整的机器学习流程。下面以线性回归为例展示如何综合运用这些数学工具。4.1 线性回归的数学推导给定数据集{(x_i, y_i)}线性回归模型假设 y Xw ε 其中ε ∼ N(0, σ²I)最大似然估计等价于最小化均方误差 J(w) (1/2n)||Xw - y||²解析解正规方程 w (X^T X)^(-1) X^T y4.2 NumPy实现与比较# 生成合成数据 np.random.seed(42) n_samples 100 X 2 * np.random.rand(n_samples, 1) y 4 3 * X np.random.randn(n_samples, 1) # 解析解 X_b np.c_[np.ones((n_samples, 1)), X] # 添加偏置项 w_analytic np.linalg.inv(X_b.T X_b) X_b.T y # 梯度下降解 def mse_loss(w, X, y): return np.mean((X w - y)**2) def mse_grad(w, X, y): return (2/X.shape[0]) * X.T (X w - y) initial_w np.random.randn(2, 1) w_history gradient_descent(lambda w: mse_loss(w, X_b, y), lambda w: mse_grad(w, X_b, y), initial_w, learning_rate0.1, n_iter100) # 绘制结果 plt.figure(figsize(12, 5)) plt.subplot(121) plt.scatter(X, y) plt.plot(X, X_b w_analytic, r-, label解析解) plt.plot(X, X_b w_history[-1], g--, label梯度下降解) plt.legend() plt.title(线性回归拟合) plt.subplot(122) losses [mse_loss(w, X_b, y) for w in w_history] plt.plot(losses) plt.xlabel(迭代次数) plt.ylabel(损失值) plt.title(训练过程) plt.show() print(解析解参数:, w_analytic.ravel()) print(梯度下降解参数:, w_history[-1].ravel())4.3 概率视角的解释从概率角度看线性回归的参数w也是一个随机变量。利用贝叶斯方法我们可以计算参数的后验分布# 贝叶斯线性回归 sigma 1 # 假设已知噪声标准差 Lambda np.eye(2) # 先验协方差 # 后验均值与协方差 posterior_cov np.linalg.inv(X_b.T X_b / sigma**2 np.linalg.inv(Lambda)) posterior_mean posterior_cov (X_b.T y / sigma**2) # 从后验分布采样 np.random.seed(42) w_samples np.random.multivariate_normal(posterior_mean.ravel(), posterior_cov, 100) # 绘制采样得到的直线 plt.figure(figsize(10, 6)) plt.scatter(X, y) for w in w_samples: plt.plot(X, X_b w[:, np.newaxis], r-, alpha0.1) plt.plot(X, X_b posterior_mean, b-, linewidth2) plt.title(贝叶斯线性回归后验采样) plt.show()这种概率视角让我们不仅能得到点估计还能量化参数的不确定性为决策提供更多信息。
花书《深度学习》数学基础实战:3个核心公式的NumPy实现与几何直观
发布时间:2026/7/9 6:45:12
花书《深度学习》数学基础实战3个核心公式的NumPy实现与几何直观深度学习作为人工智能领域最具革命性的技术之一其理论基础建立在坚实的数学框架之上。Ian Goodfellow等学者所著的《深度学习》俗称花书系统性地梳理了这一领域的数学基础但对于许多初学者而言理论公式与实际代码实现之间仍存在理解鸿沟。本文将聚焦线性代数、概率论和优化计算三个核心数学领域通过NumPy代码实现和几何可视化帮助读者建立直观的数学直觉。1. 线性代数核心奇异值分解的几何意义与实现奇异值分解SVD是线性代数中极具威力的工具在深度学习中被广泛应用于主成分分析、推荐系统和自然语言处理等领域。理解SVD不仅需要掌握其数学形式更需要直观感受其几何变换本质。1.1 SVD的数学表述与几何解释任何实数矩阵A∈ℝ^(m×n)都可以分解为 A UΣV^T 其中U和V是正交矩阵Σ是对角矩阵。从几何角度看SVD揭示了一个线性变换可以分解为三个基本操作的组合旋转/反射V^T缩放Σ旋转/反射Uimport numpy as np import matplotlib.pyplot as plt # 生成一个2x2矩阵示例 A np.array([[2, 1], [1, 2]]) # 计算SVD U, S, Vt np.linalg.svd(A) print(U矩阵:\n, U) print(奇异值:\n, S) print(V转置矩阵:\n, Vt)1.2 SVD的几何可视化让我们通过单位圆的变形过程直观理解SVD# 创建单位圆上的点 theta np.linspace(0, 2*np.pi, 100) circle np.vstack((np.cos(theta), np.sin(theta))) # 应用SVD各阶段变换 Vt_transform Vt circle sigma_transform np.diag(S) Vt_transform final_transform U sigma_transform # 绘制变换过程 plt.figure(figsize(12, 4)) plt.subplot(141) plt.plot(circle[0], circle[1]) plt.title(单位圆) plt.subplot(142) plt.plot(Vt_transform[0], Vt_transform[1]) plt.title(V^T变换) plt.subplot(143) plt.plot(sigma_transform[0], sigma_transform[1]) plt.title(Σ缩放) plt.subplot(144) plt.plot(final_transform[0], final_transform[1]) plt.title(U变换) plt.tight_layout() plt.show()执行上述代码我们将看到单位圆如何先被V^T旋转然后被Σ在不同方向上缩放最后被U旋转形成最终的椭圆形状。这种可视化直观展示了矩阵如何通过SVD分解为基本的几何操作。1.3 SVD在降维中的应用SVD的一个重要应用是数据降维。通过保留前k个最大的奇异值我们可以实现数据压缩和噪声过滤# 使用SVD进行图像压缩示例 from skimage import data image data.camera().astype(float) U, S, Vt np.linalg.svd(image) # 选择前50个奇异值进行重建 k 50 reconstructed U[:, :k] np.diag(S[:k]) Vt[:k, :] plt.figure(figsize(10, 5)) plt.subplot(121) plt.imshow(image, cmapgray) plt.title(原始图像) plt.subplot(122) plt.imshow(reconstructed, cmapgray) plt.title(f使用前{k}个奇异值重建) plt.show()提示在实际应用中SVD的计算复杂度较高对于大型矩阵通常会使用随机化SVD等优化算法。2. 概率论核心多元高斯分布与协方差矩阵概率论为深度学习提供了描述不确定性和进行统计推断的语言。多元高斯分布是其中最重要的概率分布之一其性质由均值向量和协方差矩阵完全决定。2.1 多元高斯分布的数学形式d维多元高斯分布的概率密度函数为 p(x) (1/((2π)^(d/2)|Σ|^(1/2))) * exp(-1/2 (x-μ)^T Σ^(-1) (x-μ))其中μ是均值向量Σ是协方差矩阵。def multivariate_gaussian(x, mu, cov): 计算多元高斯分布的概率密度 d len(mu) x_centered x - mu inv_cov np.linalg.inv(cov) exponent -0.5 * x_centered.T inv_cov x_centered normalization 1 / ((2*np.pi)**(d/2) * np.sqrt(np.linalg.det(cov))) return normalization * np.exp(exponent)2.2 协方差矩阵的几何解释协方差矩阵决定了高斯分布的形状对角线元素各维度的方差非对角线元素维度间的协方差# 定义不同协方差矩阵 cov1 np.array([[1, 0], [0, 1]]) # 球形 cov2 np.array([[2, 0], [0, 0.5]]) # 轴向拉伸 cov3 np.array([[1, 0.8], [0.8, 1]]) # 相关 # 生成网格点 x, y np.mgrid[-3:3:.1, -3:3:.1] pos np.dstack((x, y)) # 计算各点概率密度 mu np.array([0, 0]) z1 np.apply_along_axis(lambda v: multivariate_gaussian(v, mu, cov1), 2, pos) z2 np.apply_along_axis(lambda v: multivariate_gaussian(v, mu, cov2), 2, pos) z3 np.apply_along_axis(lambda v: multivariate_gaussian(v, mu, cov3), 2, pos) # 绘制等高线图 plt.figure(figsize(15, 5)) plt.subplot(131) plt.contourf(x, y, z1) plt.title(球形协方差) plt.subplot(132) plt.contourf(x, y, z2) plt.title(轴向拉伸) plt.subplot(133) plt.contourf(x, y, z3) plt.title(相关变量) plt.show()2.3 协方差矩阵的性质与操作协方差矩阵必须是对称的正定的所有特征值大于零在深度学习中我们经常需要对协方差矩阵进行各种操作# 协方差矩阵的正定性检查 def is_positive_definite(matrix): return np.all(np.linalg.eigvals(matrix) 0) # 从数据估计协方差矩阵 data np.random.multivariate_normal([0, 0], cov3, 1000) estimated_cov np.cov(data.T) print(估计的协方差矩阵:\n, estimated_cov) print(是否正定:, is_positive_definite(estimated_cov))注意在实际应用中当特征维度很高时协方差矩阵可能变得奇异非正定此时需要考虑正则化技术或使用对角协方差矩阵。3. 优化计算核心梯度下降的几何直观与实现优化算法是训练深度神经网络的核心而梯度下降是最基础也最重要的优化方法。理解梯度下降的几何行为对于调试和设计神经网络至关重要。3.1 梯度下降的数学表述参数更新规则 θ ← θ - η∇θJ(θ)其中η是学习率∇θJ(θ)是目标函数J关于参数θ的梯度。def gradient_descent(f, grad_f, initial_theta, learning_rate0.1, n_iter100): 基本梯度下降实现 theta initial_theta.copy() history [theta] for _ in range(n_iter): gradient grad_f(theta) theta theta - learning_rate * gradient history.append(theta.copy()) return np.array(history)3.2 梯度下降的几何可视化让我们在一个二维函数上观察梯度下降的轨迹# 定义目标函数 (Rosenbrock函数) def rosenbrock(x, y, a1, b100): return (a - x)**2 b*(y - x**2)**2 def rosenbrock_grad(v): x, y v dx -2*(1 - x) - 400*x*(y - x**2) dy 200*(y - x**2) return np.array([dx, dy]) # 生成网格数据 x np.linspace(-2, 2, 100) y np.linspace(-1, 3, 100) X, Y np.meshgrid(x, y) Z rosenbrock(X, Y) # 运行梯度下降 initial_theta np.array([-1.5, 2.5]) history gradient_descent(rosenbrock, rosenbrock_grad, initial_theta, 0.0005, 1000) # 绘制等高线和优化路径 plt.figure(figsize(10, 8)) plt.contour(X, Y, Z, levelsnp.logspace(-1, 3, 20), cmapviridis) plt.plot(history[:, 0], history[:, 1], r.-, markersize10) plt.scatter([1], [1], cgold, s100, marker*) # 全局最小值 plt.title(梯度下降在Rosenbrock函数上的优化路径) plt.colorbar() plt.show()3.3 梯度下降变体的实现基本梯度下降有几个重要变体它们在深度学习中被广泛使用动量法引入动量项减少振荡AdaGrad自适应调整学习率Adam结合动量和自适应学习率def adam_optimizer(f, grad_f, initial_theta, learning_rate0.001, beta10.9, beta20.999, epsilon1e-8, n_iter1000): Adam优化器实现 theta initial_theta.copy() m np.zeros_like(theta) # 一阶矩估计 v np.zeros_like(theta) # 二阶矩估计 history [theta] for t in range(1, n_iter1): grad grad_f(theta) m beta1 * m (1 - beta1) * grad v beta2 * v (1 - beta2) * grad**2 # 偏差校正 m_hat m / (1 - beta1**t) v_hat v / (1 - beta2**t) theta theta - learning_rate * m_hat / (np.sqrt(v_hat) epsilon) history.append(theta.copy()) return np.array(history) # 比较不同优化器 gd_history gradient_descent(rosenbrock, rosenbrock_grad, initial_theta, 0.0005, 1000) adam_history adam_optimizer(rosenbrock, rosenbrock_grad, initial_theta, 0.1, n_iter1000) plt.figure(figsize(10, 8)) plt.contour(X, Y, Z, levelsnp.logspace(-1, 3, 20), cmapviridis) plt.plot(gd_history[:, 0], gd_history[:, 1], r.-, label梯度下降) plt.plot(adam_history[:, 0], adam_history[:, 1], b.-, labelAdam) plt.scatter([1], [1], cgold, s100, marker*) plt.legend() plt.title(不同优化算法比较) plt.show()从可视化结果可以明显看出Adam优化器比基本梯度下降更快地收敛到全局最小值且路径更加平滑。4. 数学基础的综合应用从理论到实践将线性代数、概率论和优化计算结合起来我们可以构建一个完整的机器学习流程。下面以线性回归为例展示如何综合运用这些数学工具。4.1 线性回归的数学推导给定数据集{(x_i, y_i)}线性回归模型假设 y Xw ε 其中ε ∼ N(0, σ²I)最大似然估计等价于最小化均方误差 J(w) (1/2n)||Xw - y||²解析解正规方程 w (X^T X)^(-1) X^T y4.2 NumPy实现与比较# 生成合成数据 np.random.seed(42) n_samples 100 X 2 * np.random.rand(n_samples, 1) y 4 3 * X np.random.randn(n_samples, 1) # 解析解 X_b np.c_[np.ones((n_samples, 1)), X] # 添加偏置项 w_analytic np.linalg.inv(X_b.T X_b) X_b.T y # 梯度下降解 def mse_loss(w, X, y): return np.mean((X w - y)**2) def mse_grad(w, X, y): return (2/X.shape[0]) * X.T (X w - y) initial_w np.random.randn(2, 1) w_history gradient_descent(lambda w: mse_loss(w, X_b, y), lambda w: mse_grad(w, X_b, y), initial_w, learning_rate0.1, n_iter100) # 绘制结果 plt.figure(figsize(12, 5)) plt.subplot(121) plt.scatter(X, y) plt.plot(X, X_b w_analytic, r-, label解析解) plt.plot(X, X_b w_history[-1], g--, label梯度下降解) plt.legend() plt.title(线性回归拟合) plt.subplot(122) losses [mse_loss(w, X_b, y) for w in w_history] plt.plot(losses) plt.xlabel(迭代次数) plt.ylabel(损失值) plt.title(训练过程) plt.show() print(解析解参数:, w_analytic.ravel()) print(梯度下降解参数:, w_history[-1].ravel())4.3 概率视角的解释从概率角度看线性回归的参数w也是一个随机变量。利用贝叶斯方法我们可以计算参数的后验分布# 贝叶斯线性回归 sigma 1 # 假设已知噪声标准差 Lambda np.eye(2) # 先验协方差 # 后验均值与协方差 posterior_cov np.linalg.inv(X_b.T X_b / sigma**2 np.linalg.inv(Lambda)) posterior_mean posterior_cov (X_b.T y / sigma**2) # 从后验分布采样 np.random.seed(42) w_samples np.random.multivariate_normal(posterior_mean.ravel(), posterior_cov, 100) # 绘制采样得到的直线 plt.figure(figsize(10, 6)) plt.scatter(X, y) for w in w_samples: plt.plot(X, X_b w[:, np.newaxis], r-, alpha0.1) plt.plot(X, X_b posterior_mean, b-, linewidth2) plt.title(贝叶斯线性回归后验采样) plt.show()这种概率视角让我们不仅能得到点估计还能量化参数的不确定性为决策提供更多信息。