机器学习数学基础:线性代数与微积分

机器学习数学基础:线性代数与微积分

【免费下载链接】handson-ml3 A series of Jupyter notebooks that walk you through the fundamentals of Machine Learning and Deep Learning in Python using Scikit-Learn, Keras and TensorFlow 2. 【免费下载链接】handson-ml3 项目地址: https://gitcode.com/gh_mirrors/ha/handson-ml3

本文系统介绍了机器学习所需的数学基础,重点涵盖线性代数和微积分两大核心领域。在线性代数部分,详细讲解了向量、矩阵、线性变换、行列式、特征值与特征向量等核心概念及其在机器学习中的应用。微积分部分则深入探讨了微分计算的原理、导数定义、基本规则以及优化算法的数学基础,包括梯度下降及其变体、学习率调度策略和高级优化算法。文章通过Python代码示例和数学公式相结合的方式,帮助读者建立直观理解并掌握实际应用技能。

线性代数核心概念

线性代数是机器学习领域最重要的数学基础之一,它研究向量空间和线性变换,为理解数据表示、模型训练和特征提取提供了数学框架。在机器学习中,线性代数不仅用于数据处理,更是深度学习、降维算法和优化方法的核心数学工具。

向量:数据的基本表示

向量是线性代数中最基本的概念,它表示具有大小和方向的量。在机器学习中,向量通常用于表示数据样本和特征。

向量的数学定义: 一个N维向量可以表示为: $$\mathbf{v} = \begin{pmatrix} v_1 \ v_2 \ \vdots \ v_N \end{pmatrix}$$

Python中的向量表示

import numpy as np

# 使用列表创建向量
vector_list = [10.5, 5.2, 3.25, 7.0]

# 使用NumPy数组创建向量(推荐)
video_features = np.array([10.5, 5.2, 3.25, 7.0])
print("向量:", video_features)
print("向量大小:", video_features.size)
print("第三个元素:", video_features[2])  # 索引从0开始

向量的几何意义: 向量可以在多维空间中表示为点或箭头,这种几何视角有助于理解向量运算的物理意义。

mermaid

矩阵:线性变换与数据操作

矩阵是二维数组,可以表示线性变换、数据集或权重参数。在机器学习中,矩阵用于批量处理数据和实现复杂的数学运算。

矩阵的基本操作

# 创建矩阵
matrix = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 矩阵属性
print("矩阵形状:", matrix.shape)
print("矩阵秩:", matrix.ndim)
print("矩阵元素总数:", matrix.size)

# 特殊矩阵
identity_matrix = np.eye(3)  # 单位矩阵
zeros_matrix = np.zeros((2, 3))  # 零矩阵
ones_matrix = np.ones((2, 2))  # 全1矩阵

矩阵运算的重要性: 矩阵运算允许我们同时对多个向量进行操作,这在批量数据处理和并行计算中至关重要。

线性变换与矩阵乘法

矩阵乘法表示线性变换,这是理解神经网络层运算、坐标变换和数据投影的基础。

矩阵乘法的几何意义

# 定义变换矩阵
transformation_matrix = np.array([[2, 0],
                                 [0, 1.5]])

# 定义向量
vector = np.array([1, 1])

# 应用变换
transformed_vector = transformation_matrix.dot(vector)
print("变换后的向量:", transformed_vector)

常见的线性变换类型

变换类型矩阵表示几何效果
缩放$\begin{pmatrix} s_x & 0 \ 0 & s_y \end{pmatrix}$沿坐标轴缩放
旋转$\begin{pmatrix} \cos\theta & -\sin\theta \ \sin\theta & \cos\theta \end{pmatrix}$绕原点旋转
剪切$\begin{pmatrix} 1 & k \ 0 & 1 \end{pmatrix}$保持一个坐标不变

行列式:衡量变换的缩放因子

行列式是一个标量值,用于衡量线性变换对空间的缩放程度。行列式的绝对值表示面积(2D)或体积(3D)的缩放因子。

行列式的计算与意义

import numpy.linalg as LA

# 计算行列式
matrix = np.array([[2, 1],
                   [1, 2]])
determinant = LA.det(matrix)
print("行列式值:", determinant)

# 行列式的几何解释
if abs(determinant) < 1e-10:
    print("矩阵是奇异的(不可逆)")
elif determinant < 0:
    print("变换包含反射")
else:
    print("变换保持方向")

行列式的性质

  • 行列式为0:变换将空间压缩到更低维度
  • 行列式为负:变换包含方向反转
  • 行列式为正:变换保持方向

特征值与特征向量:理解变换的本质

特征值和特征向量揭示了线性变换的核心性质,它们在主成分分析(PCA)、谱聚类和动力系统分析中至关重要。

特征问题的数学定义: 对于矩阵A,如果存在非零向量v和标量λ满足: $$A\mathbf{v} = \lambda\mathbf{v}$$ 则λ称为特征值,v称为对应的特征向量。

Python中的特征值计算

# 计算特征值和特征向量
matrix = np.array([[4, 1],
                   [2, 3]])
eigenvalues, eigenvectors = LA.eig(matrix)

print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)

# 验证特征方程
for i in range(len(eigenvalues)):
    left_side = matrix.dot(eigenvectors[:, i])
    right_side = eigenvalues[i] * eigenvectors[:, i]
    print(f"特征方程验证 {i}: {np.allclose(left_side, right_side)}")

特征值与特征向量的应用

mermaid

实际应用案例

案例:视频分类的特征表示

# 视频特征向量表示
video_features = np.array([
    10.5,    # 视频时长(分钟)
    5.2,     # 观看超过1分钟的观众比例(%)
    3.25,    # 日均观看次数
    7.0      # 被标记为垃圾邮件的次数
])

# 分类概率向量(模型输出)
class_probabilities = np.array([0.80, 0.18, 0.02])  # 垃圾邮件/点击诱饵/优质视频

print("视频特征:", video_features)
print("分类概率:", class_probabilities)

案例:矩阵在数据变换中的应用

# 数据集矩阵(每行是一个样本,每列是一个特征)
data_matrix = np.array([
    [1.2, 3.4, 5.6],
    [2.3, 4.5, 6.7],
    [3.4, 5.6, 7.8],
    [4.5, 6.7, 8.9]
])

# 权重矩阵(用于线性变换)
weight_matrix = np.array([
    [0.1, 0.2],
    [0.3, 0.4],
    [0.5, 0.6]
])

# 应用线性变换
transformed_data = data_matrix.dot(weight_matrix)
print("原始数据形状:", data_matrix.shape)
print("变换后数据形状:", transformed_data.shape)

线性代数的这些核心概念为机器学习提供了强大的数学工具,从基本的数据表示到复杂的模型运算,都离不开向量、矩阵、线性变换以及特征分析这些基础概念。掌握这些核心概念不仅有助于理解机器学习算法的数学原理,更能为算法优化和创新提供坚实的理论基础。

矩阵运算与应用

在机器学习领域,矩阵运算是线性代数的核心内容,它们为数据处理、特征变换和模型训练提供了强大的数学工具。矩阵不仅仅是数字的排列,更是线性变换的数学表示,能够高效地处理多维数据。

矩阵的基本概念与表示

矩阵是一个矩形数组,由标量(整数、实数或复数)按行和列排列组成。例如一个2×3矩阵:

$$ A = \begin{bmatrix} 10 & 20 & 30 \ 40 & 50 & 60 \end{bmatrix} $$

在Python中,我们可以使用NumPy库来高效地表示和操作矩阵:

import numpy as np

# 创建矩阵
A = np.array([[10, 20, 30], 
              [40, 50, 60]])
print("矩阵A:")
print(A)
print("矩阵形状:", A.shape)

矩阵乘法运算

矩阵乘法是线性代数中最重要的运算之一,它遵循特定的规则:矩阵$Q$($m×n$)可以乘以矩阵$R$($n×q$),结果是$m×q$矩阵$P$,其中每个元素计算为:

$$ P_{i,j} = \sum_{k=1}^n{Q_{i,k} × R_{k,j}} $$

mermaid

在NumPy中执行矩阵乘法:

# 创建两个矩阵
A = np.array([[10, 20, 30], 
              [40, 50, 60]])  # 2×3矩阵

D = np.array([[2, 3, 5, 7], 
              [11, 13, 17, 19], 
              [23, 29, 31, 37]])  # 3×4矩阵

# 矩阵乘法
E = np.matmul(A, D)
print("矩阵乘法结果 E = A × D:")
print(E)

矩阵转置操作

矩阵转置是将矩阵的行列互换的操作,记作$A^T$。转置后的矩阵满足$(A^T){i,j} = A{j,i}$。

$$ A^T = \begin{bmatrix} 10 & 20 & 30 \ 40 & 50 & 60 \end{bmatrix}^T = \begin{bmatrix} 10 & 40 \ 20 & 50 \ 30 & 60 \end{bmatrix} $$

# 矩阵转置
A_T = A.T
print("矩阵A的转置:")
print(A_T)

矩阵逆运算

矩阵的逆是线性代数中的重要概念,对于可逆矩阵$F$,存在逆矩阵$F^{-1}$,使得$F × F^{-1} = I$(单位矩阵)。

mermaid

在NumPy中计算矩阵逆:

from numpy.linalg import inv

# 创建剪切变换矩阵
F_shear = np.array([[1, 1.5], 
                    [0, 1]])

# 计算逆矩阵
F_inv_shear = inv(F_shear)
print("剪切矩阵的逆:")
print(F_inv_shear)

矩阵运算的几何应用

矩阵运算在计算机图形学和机器学习中有着广泛的几何应用:

投影变换

通过矩阵乘法可以将点投影到坐标轴上,这在降维和特征提取中非常重要。

旋转变换

旋转矩阵可以将点集绕原点旋转特定角度:

def rotation_matrix(angle_degrees):
    """创建2D旋转变换矩阵"""
    angle_rad = np.radians(angle_degrees)
    return np.array([[np.cos(angle_rad), -np.sin(angle_rad)],
                     [np.sin(angle_rad), np.cos(angle_rad)]])
缩放和剪切变换

缩放矩阵可以改变对象的尺寸,剪切矩阵可以实现斜切变换效果。

矩阵运算在机器学习中的应用

矩阵运算为机器学习算法提供了数学基础:

应用领域矩阵运算作用描述
线性回归矩阵求逆求解最优参数
主成分分析特征分解降维和特征提取
神经网络矩阵乘法前向传播计算
图像处理卷积运算特征检测和滤波
# 线性回归中的矩阵运算示例
def linear_regression(X, y):
    """使用矩阵运算实现线性回归"""
    # 添加偏置项
    X_b = np.c_[np.ones((X.shape[0], 1)), X]
    
    # 使用正规方程求解:θ = (X^T X)^(-1) X^T y
    theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
    return theta

特殊矩阵类型

在机器学习中,几种特殊矩阵具有重要应用:

对称矩阵

对称矩阵满足$M^T = M$,其转置等于自身。对称矩阵的特征值都是实数,特征向量正交。

单位矩阵

单位矩阵是对角线为1,其余为0的方阵,是矩阵乘法中的乘法单位元。

正交矩阵

正交矩阵的列向量彼此正交且长度为1,满足$Q^T Q = I$。

矩阵分解技术

矩阵分解是将复杂矩阵分解为简单矩阵乘积的技术:

mermaid

这些分解技术在推荐系统、自然语言处理和计算机视觉中有着广泛应用。

矩阵运算通过其强大的数学表达能力和计算效率,为现代机器学习算法提供了坚实的基础。从简单的线性变换到复杂的深度学习模型,矩阵运算无处不在,是每个机器学习工程师必须掌握的核心技能。

微分计算原理

微分计算是微积分的核心分支,它研究函数在某一点处的瞬时变化率。在机器学习中,微分计算是理解梯度下降、反向传播等优化算法的数学基础。本文将深入探讨微分计算的核心原理、定义方法以及实际应用。

导数的极限定义

导数的核心思想源于极限概念。对于函数 $f(x)$ 在点 $x = x_\mathrm{A}$ 处的导数,数学上定义为:

$$f'(x_\mathrm{A}) = \underset{x_\mathrm{B} \to x_\mathrm{A}}\lim\dfrac{f(x_\mathrm{B}) - f(x_\mathrm{A})}{x_\mathrm{B} - x_\mathrm{A}}$$

这个定义可以直观地理解为:当点 B 无限接近点 A 时,连接两点的割线斜率趋近于曲线在点 A 处的切线斜率。

另一种等价的定义使用增量 $\epsilon$ 表示:

$$f'(x) = \underset{\epsilon \to 0}\lim\dfrac{f(x + \epsilon) - f(x)}{\epsilon}$$

这种形式在计算中更为方便,特别是在推导各种微分规则时。

导数计算示例:$f(x) = x^2$

让我们通过具体例子来理解导数的计算过程。对于函数 $f(x) = x^2$,其导数计算如下:

$$ \begin{align*} f'(x) &= \underset{\epsilon \to 0}\lim\dfrac{(x + \epsilon)^2 - x^2}{\epsilon} \ &= \underset{\epsilon \to 0}\lim\dfrac{x^2 + 2x\epsilon + \epsilon^2 - x^2}{\epsilon} \ &= \underset{\epsilon \to 0}\lim\dfrac{2x\epsilon + \epsilon^2}{\epsilon} \ &= \underset{\epsilon \to 0}\lim (2x + \epsilon) \ &= 2x \end{align*} $$

这个结果表明,函数 $y = x^2$ 在任何点 $x$ 处的斜率都是 $2x$。当 $x > 0$ 时斜率为正,函数递增;当 $x < 0$ 时斜率为负,函数递减;在 $x = 0$ 处斜率为 0。

极限运算的基本性质

在微分计算中,我们需要掌握以下几个重要的极限性质:

极限性质数学表达式说明
常数极限$\underset{x \to k}\lim c = c$常数函数的极限等于常数本身
变量极限$\underset{x \to k}\lim x = k$变量趋近于某值的极限等于该值
和极限$\underset{x \to k}\lim [f(x) + g(x)] = \lim f(x) + \lim g(x)$和的极限等于极限的和
积极限$\underset{x \to k}\lim [f(x) \times g(x)] = \lim f(x) \times \lim g(x)$积的极限等于极限的积

这些性质是推导各种微分规则的基础。

微分计算的基本规则

微分计算遵循一系列基本规则,这些规则使得复杂函数的求导变得系统化:

1. 常数规则

对于常数函数 $f(x) = c$,其导数为: $$f'(x) = 0$$

2. 幂函数规则

对于幂函数 $f(x) = x^r$(其中 $r \neq 0$),其导数为: $$f'(x) = r x^{r-1}$$

3. 和差规则

对于函数和 $f(x) = g(x) + h(x)$,其导数为: $$f'(x) = g'(x) + h'(x)$$

4. 乘积规则

对于函数积 $f(x) = g(x) \cdot h(x)$,其导数为: $$f'(x) = g'(x)h(x) + g(x)h'(x)$$

5. 商规则

对于函数商 $f(x) = \dfrac{g(x)}{h(x)}$,其导数为: $$f'(x) = \dfrac{g'(x)h(x) - g(x)h'(x)}{h^2(x)}$$

6. 链式法则

对于复合函数 $f(x) = g(h(x))$,其导数为: $$\dfrac{df}{dx} = \dfrac{dg}{dh} \cdot \dfrac{dh}{dx}$$

微分计算的应用实例

让我们通过几个实例来展示微分规则的应用:

例1:多项式函数求导 $$f(x) = x^3 + \cos(x)$$ 应用和差规则: $$f'(x) = \dfrac{d}{dx}[x^3] + \dfrac{d}{dx}[\cos(x)] = 3x^2 - \sin(x)$$

例2:复合函数求导 $$f(x) = \sin(2x^2) + 1$$ 令 $u(x) = \sin(x) + 1$,$v(x) = 2x^2$,则 $f(x) = u(v(x))$ 应用链式法则: $$f'(x) = u'(v(x)) \cdot v'(x) = \cos(2x^2) \cdot 4x$$

微分计算的可视化理解

为了更好地理解导数的几何意义,我们可以通过图形来展示:

mermaid

这个过程展示了从平均变化率到瞬时变化率的过渡,正是微分计算的核心思想。

导数在优化中的应用

在机器学习中,导数最重要的应用是函数优化。当函数在某个点达到极值(最小值或最大值)时,如果函数在该点可导,那么导数必然为 0。这个性质为优化问题提供了重要的数学工具。

考虑函数 $f(x) = \dfrac{1}{4}x^4 - x^2 + \dfrac{1}{2}$,其导数为: $$f'(x) = x^3 - 2x$$

令 $f'(x) = 0$,解得: $$x(x^2 - 2) = 0 \Rightarrow x = 0, x = \sqrt{2}, x = -\sqrt{2}$$

这些点对应函数的极值点,通过二阶导数测试可以确定它们是极大值还是极小值。

多元函数的偏导数

对于多元函数 $f(x, y)$,我们需要引入偏导数的概念。偏导数 $\dfrac{\partial f}{\partial x}$ 表示在保持其他变量不变的情况下,函数沿 $x$ 方向的变化率:

$$\dfrac{\partial f}{\partial x} = \underset{\epsilon \to 0}\lim\dfrac{f(x+\epsilon, y) - f(x,y)}{\epsilon}$$

类似地,可以定义 $\dfrac{\partial f}{\partial y}$。所有偏导数组成的向量称为梯度:

$$\nabla f(\mathbf{x}) = \begin{pmatrix} \dfrac{\partial f}{\partial x_1} \ \dfrac{\partial f}{\partial x_2} \ \vdots \ \dfrac{\partial f}{\partial x_n} \end{pmatrix}$$

梯度在机器学习中至关重要,它指示了函数增长最快的方向,是梯度下降算法的基础。

高阶导数

我们还可以对导数函数再次求导,得到高阶导数。二阶导数 $f''(x)$ 表示函数变化率的变化率,可以理解为函数的"加速度":

$$f''(x) = \dfrac{d}{dx}\left[\dfrac{df}{dx}\right] = \dfrac{d^2f}{dx^2}$$

在优化中,二阶导数提供了关于极值点性质的额外信息:如果 $f'(x) = 0$ 且 $f''(x) > 0$,则该点为局部极小值;如果 $f''(x) < 0$,则为局部极大值。

微分计算的实际意义

微分计算不仅是理论数学的重要组成部分,更是现代机器学习的基石。通过理解微分原理,我们能够:

  1. 优化模型参数:使用梯度下降法最小化损失函数
  2. 理解模型行为:分析函数的变化趋势和极值特性
  3. 设计高效算法:基于导数信息设计收敛更快的优化方法
  4. 处理复杂函数:通过链式法则处理深度神经网络中的复合函数

虽然现代深度学习框架提供了自动微分功能,但深入理解微分计算的原理仍然至关重要。只有掌握了这些基本原理,才能在遇到数值稳定性问题、梯度消失或爆炸等问题时,做出正确的诊断和修复。

微分计算的美妙之处在于它将直观的几何概念(切线斜率)与精确的代数方法相结合,为我们提供了分析和优化复杂系统的强大工具。从简单的二次函数到深度神经网络,微分计算始终是理解函数行为的关键所在。

优化算法数学基础

在机器学习和深度学习中,优化算法是模型训练的核心引擎。它们通过数学方法寻找损失函数的最小值,从而确定模型的最佳参数。理解优化算法的数学基础对于构建高效、稳定的机器学习系统至关重要。

梯度下降的基本原理

梯度下降是最基础的优化算法,其核心思想是利用函数的梯度信息来指导参数的更新方向。对于一个可微的损失函数 $J(\theta)$,梯度下降的更新规则为:

$$\theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta_t)$$

其中:

  • $\theta_t$ 是第 $t$ 次迭代时的参数向量
  • $\eta$ 是学习率,控制每次更新的步长
  • $\nabla_\theta J(\theta_t)$ 是损失函数在 $\theta_t$ 处的梯度
import numpy as np

def gradient_descent(X, y, learning_rate=0.01, n_iterations=1000):
    """批量梯度下降算法实现"""
    m = len(y)
    theta = np.random.randn(X.shape[1], 1)  # 随机初始化参数
    theta_history = [theta]
    
    for iteration in range(n_iterations):
        gradients = 2/m * X.T.dot(X.dot(theta) - y)
        theta = theta - learning_rate * gradients
        theta_history.append(theta)
    
    return theta, theta_history

梯度下降的变体

在实际应用中,根据数据规模和计算需求的不同,梯度下降有三种主要变体:

1. 批量梯度下降 (Batch Gradient Descent)

使用全部训练数据计算梯度,每次更新都基于完整的数据集。

数学表达式: $$\theta_{t+1} = \theta_t - \eta \cdot \frac{1}{m} \sum_{i=1}^m \nabla_\theta J(\theta_t; x^{(i)}, y^{(i)})$$

特点:

  • 收敛稳定,方向准确
  • 计算成本高,不适合大数据集
  • 可能陷入局部最小值
2. 随机梯度下降 (Stochastic Gradient Descent)

每次只使用一个训练样本计算梯度并更新参数。

数学表达式: $$\theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta_t; x^{(i)}, y^{(i)})$$

特点:

  • 计算速度快,适合在线学习
  • 收敛过程波动较大
  • 可能跳出局部最小值
3. 小批量梯度下降 (Mini-batch Gradient Descent)

折中方案,每次使用一个小批量的数据计算梯度。

数学表达式: $$\theta_{t+1} = \theta_t - \eta \cdot \frac{1}{k} \sum_{i=1}^k \nabla_\theta J(\theta_t; x^{(i)}, y^{(i)})$$

其中 $k$ 是小批量的大小。

学习率调度策略

学习率的选择对优化效果至关重要。常见的学习率调度策略包括:

固定学习率

最简单的策略,但在训练后期可能导致震荡。

时间衰减

$$\eta_t = \frac{\eta_0}{1 + \text{decay} \cdot t}$$

指数衰减

$$\eta_t = \eta_0 \cdot e^{-\text{decay} \cdot t}$$

阶梯衰减

在特定epoch数后降低学习率

def learning_rate_schedule(t, t0=5, t1=50):
    """学习率调度函数示例"""
    return t0 / (t + t1)

# 在随机梯度下降中的应用
def stochastic_gradient_descent(X, y, n_epochs=50):
    m = len(y)
    theta = np.random.randn(X.shape[1], 1)
    
    for epoch in range(n_epochs):
        for i in range(m):
            # 随机选择一个样本
            random_index = np.random.randint(m)
            xi = X[random_index:random_index+1]
            yi = y[random_index:random_index+1]
            
            # 计算梯度
            gradients = 2 * xi.T.dot(xi.dot(theta) - yi)
            
            # 动态学习率
            eta = learning_rate_schedule(epoch * m + i)
            
            # 更新参数
            theta = theta - eta * gradients
    
    return theta

高级优化算法

除了基本的梯度下降变体,还有多种高级优化算法:

Momentum(动量法)

引入动量项来加速收敛并减少震荡:

$$v_t = \gamma v_{t-1} + \eta \nabla_\theta J(\theta_t)$$ $$\theta_{t+1} = \theta_t - v_t$$

其中 $\gamma$ 是动量系数(通常设为0.9)。

RMSprop

自适应学习率算法,根据梯度平方的移动平均调整每个参数的学习率:

$$E[g^2]t = \beta E[g^2]{t-1} + (1-\beta) g_t^2$$ $$\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} g_t$$

Adam(自适应矩估计)

结合了Momentum和RMSprop的优点:

$$m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t$$ $$v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2$$ $$\hat{m}_t = \frac{m_t}{1-\beta_1^t}$$ $$\hat{v}t = \frac{v_t}{1-\beta_2^t}$$ $$\theta{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t$$

优化算法性能比较

下表总结了不同优化算法的特点和适用场景:

算法收敛速度内存需求超参数敏感性适用场景
BGD慢但稳定小数据集
SGD快但震荡大数据集
MBGD中等中等中等通用场景
Momentum中等非凸优化
Adam很快深度学习

数学收敛性分析

梯度下降算法的收敛性可以通过以下数学条件保证:

  1. Lipschitz连续梯度:存在常数 $L$ 使得 $\|\nabla f(x) - \nabla f(y)\| \leq L \|x-y\|$
  2. 强凸性:存在常数 $\mu$ 使得 $f(y) \geq f(x) + \nabla f(x)^T(y-x) + \frac{\mu}{2}\|y-x\|^2$

在这些条件下,梯度下降以线性速率收敛:

$$f(x_k) - f^* \leq (1 - \frac{\mu}{L})^k (f(x_0) - f^*)$$

实践建议

  1. 学习率选择:从小学习率开始,逐步调整
  2. 批量大小:通常设为2的幂次方(32, 64, 128等)
  3. 算法选择:对于深度学习,Adam通常是好的起点
  4. 监控训练:使用验证集监控过拟合,及时调整超参数
# 综合优化示例
def train_model(X_train, y_train, X_val, y_val, optimizer='adam', 
               learning_rate=0.001, batch_size=32, epochs=100):
    """
    综合训练函数,支持多种优化器
    """
    model = create_model()  # 假设的模型创建函数
    
    if optimizer == 'sgd':
        opt = tf.keras.optimizers.SGD(learning_rate=learning_rate)
    elif optimizer == 'momentum':
        opt = tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=0.9)
    elif optimizer == 'adam':
        opt = tf.keras.optimizers.Adam(learning_rate=learning_rate)
    elif optimizer == 'rmsprop':
        opt = tf.keras.optimizers.RMSprop(learning_rate=learning_rate)
    
    model.compile(optimizer=opt, loss='mse', metrics=['accuracy'])
    
    history = model.fit(X_train, y_train, 
                       batch_size=batch_size,
                       epochs=epochs,
                       validation_data=(X_val, y_val),
                       verbose=0)
    
    return model, history

优化算法的选择和实践需要结合具体问题和数据特征,通过实验找到最适合的配置。理解其数学基础有助于做出更明智的决策,提高模型训练的效率和质量。

总结

机器学习数学基础的核心在于线性代数和微积分两大支柱。线性代数提供了数据表示和变换的数学框架,从基本的向量和矩阵运算到复杂的特征分析,为理解机器学习算法提供了必要的工具。微积分则通过微分计算和优化算法,为模型训练和参数优化奠定了数学基础。掌握这些核心概念不仅有助于理解现有算法的原理,更能为算法创新和优化提供坚实的理论基础。文章通过理论讲解与代码实践相结合的方式,帮助读者建立完整的知识体系,为后续的机器学习学习和应用打下扎实的数学基础。

【免费下载链接】handson-ml3 A series of Jupyter notebooks that walk you through the fundamentals of Machine Learning and Deep Learning in Python using Scikit-Learn, Keras and TensorFlow 2. 【免费下载链接】handson-ml3 项目地址: https://gitcode.com/gh_mirrors/ha/handson-ml3

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值