从零开始学机器学习:SmolML 库详解

在机器学习领域,有许多强大的库,如 Scikit-learn、PyTorch 和 TensorFlow 等,它们极大地简化了机器学习任务的实现。但你有没有想过这些库内部是如何工作的?神经网络是如何学习的?梯度下降又是如何实现的?这些问题的答案对于深入理解机器学习至关重要。今天,我要给大家介绍一个专门为教育目的而设计的纯 Python 机器学习库 ——SmolML。

一、SmolML 是什么?

SmolML 是一个从底层完全用纯 Python 编写的机器学习库,只使用了 Python 基本的 collections、random 和 math 模块。它的目标不是与生产级别的库在速度或功能上竞争,而是提供一个透明、可理解且具有教育意义的机器学习核心概念实现。

对于刚开始学习机器学习的学生、对日常使用的机器学习库内部原理感到好奇的开发者以及寻找简单透明代码库来展示机器学习原理的教育者来说,SmolML 是一个非常有价值的工具。

二、SmolML 的核心组件

(一)自动微分与多维数组

  1. 自动微分(Value) :这是训练神经网络的核心。它简单且能自动跟踪操作和计算梯度。例如,在神经网络的反向传播过程中,自动微分能够帮助计算每个参数对损失函数的梯度,从而指导参数的更新方向和幅度。
  2. 多维数组(MLArray) :这个组件受 NumPy 启发,支持机器学习所需的常见数学运算。虽然它在 Python 中实现,效率远不及 NumPy 等优化过的库,但对于理解多维数组在机器学习中的作用非常理想。比如,在处理图像数据或多特征数据集时,多维数组能够方便地存储和操作数据。

(二)预处理工具

  1. 标准化缩放器(StandardScaler) :它能够将数据标准化,使数据的均值为 0,标准差为 1。这有助于许多机器学习算法更好地收敛,因为这些算法对数据的尺度敏感。例如,在进行线性回归或神经网络训练时,标准化后的数据通常能加快训练速度并提高模型性能。
  2. 最小 – 最大缩放器(MinMaxScaler) :将数据缩放到一个指定的范围,通常是 [0,1]。对于一些对数据范围有限制的算法或需要将数据限制在特定范围内的场景,这个工具非常有用。比如,在使用某些基于距离的算法(如 K – 近邻算法)时,数据的范围会影响距离的计算,进而影响模型的结果。

三、构建自己的神经网络

(一)激活函数

SmolML 提供了多种激活函数,包括 relu、sigmoid、softmax 和 tanh。这些激活函数为神经网络引入了非线性,使得网络能够学习复杂的模式。

  1. relu 函数 :在正区间输出输入本身,在负区间输出 0。它的计算简单且能有效缓解梯度消失问题,在许多深度神经网络中被广泛应用。
  2. sigmoid 函数 :将输入映射到 (0,1) 区间,常用于二分类问题的输出层,表示属于某一类的概率。
  3. softmax 函数 :通常用于多分类问题的输出层,将输入转换为概率分布,使得所有输出的和为 1。
  4. tanh 函数 :将输入映射到 (- 1,1) 区间,与 sigmoid 函数类似,但输出范围不同,在某些场景下可能会有更好的表现。

(二)权重初始化器

  1. Xavier 初始化 :这种初始化方法根据神经网络层的输入和输出神经元数量来设置权重的初始值,旨在保持信号在神经网络中的传播,避免梯度消失或爆炸问题。例如,在一个具有多个隐藏层的神经网络中,使用 Xavier 初始化可以提高训练的稳定性。
  2. He 初始化 :它考虑了激活函数的特性,特别是在使用 relu 激活函数时表现出色。He 初始化通过合理设置权重初始值,使信号能够更好地传播,加速网络的训练过程。

(三)损失函数

  1. 均方误差损失(mse_loss) :用于回归问题,计算预测值与真实值之间的平方差的平均值。它衡量了模型预测的准确性,值越小表示模型的预测结果越接近真实值。
  2. 二元交叉熵损失(binary_cross_entropy) :适用于二分类问题,衡量模型预测的概率分布与真实分布之间的差异。在二分类任务中,如垃圾邮件检测,这个损失函数能够有效地指导模型学习区分两类样本。
  3. 分类交叉熵损失(categorical_cross_entropy) :用于多分类问题,与 softmax 激活函数配合使用,评估模型对多个类别的预测性能。

(四)优化器

  1. 随机梯度下降(SGD) :这是最基本的优化算法,通过计算每个样本的梯度来更新模型参数。虽然它的收敛速度可能较慢,但对于简单的模型和较小的数据集仍然有效。
  2. Adam 优化器 :结合了动量和自适应学习率的方法,能够根据参数的历史梯度信息动态调整学习率。在许多情况下,Adam 优化器能够快速收敛并找到较好的模型参数,因此在实际应用中非常受欢迎。
  3. AdaGrad 优化器 :通过累积过去的梯度信息来调整学习率,对于稀疏数据或具有不同尺度的特征的优化表现出色。在处理自然语言处理任务或其他具有高维稀疏特征的问题时,AdaGrad 可能会取得较好的效果。

四、经典机器学习模型

(一)回归模型

  1. 线性回归 :用于预测连续值,假设特征与目标变量之间存在线性关系。通过最小化预测值与真实值之间的误差(如均方误差)来拟合模型参数。例如,在房价预测问题中,线性回归可以利用房屋的面积、位置等特征来预测房价。
  2. 多项式回归 :它是线性回归的扩展,能够捕捉特征与目标变量之间的非线性关系。通过引入多项式特征(如 x²、x³ 等),模型可以更好地拟合复杂的数据分布。在一些具有非线性趋势的数据中,多项式回归可能比线性回归提供更准确的预测结果。

(二)基于树的模型

  1. 决策树 :通过一系列的特征判断(即节点的分裂)来对样本进行分类或回归。决策树具有直观易懂的特点,能够清晰地展示决策过程。例如,在客户 churn 预测中,决策树可以基于客户的消费行为、合同类型等特征来判断客户是否可能会流失。
  2. 随机森林 :它是多个决策树的集成,通过随机抽样特征和样本构建多个决策树,并综合它们的预测结果。随机森林能够提高模型的准确性和稳定性,减少过拟合的风险。在处理复杂的分类和回归任务时,随机森林通常能取得较好的性能。

(三)K – 均值聚类

K – 均值算法用于将数据点分组到 K 个簇中,使得同一簇内的数据点相似度较高,不同簇之间的相似度较低。它通过迭代优化簇中心和数据点的分配来实现聚类。例如,在客户细分中,可以根据客户的购买行为、消费偏好等特征将客户分为不同的群体,以便企业制定针对性的营销策略。

五、SmolML 的适用人群与局限性

(一)适用人群

  1. 学生 :对于初次学习机器学习概念的学生来说,SmolML 提供了一个清晰的、易于理解的代码库,可以帮助他们深入理解机器学习算法的内部原理,而不仅仅是调用现成的库函数。
  2. 开发者 :那些对日常使用的机器学习库内部原理感到好奇的开发者,可以通过研究 SmolML 的代码来满足自己的求知欲,进一步提升对机器学习技术的掌握程度。
  3. 教育者 :教育者可以利用 SmolML 简单透明的代码库来向学生展示机器学习的核心概念和算法实现,使教学过程更加生动和深入。

(二)局限性

  1. 性能问题 :由于 SmolML 是纯 Python 实现,没有使用优化过的 C/C++/Fortran 后端,因此在处理大规模数据集或复杂模型时,其速度远远不及生产级别的库如 NumPy 等。它更适合用于小型数据集和玩具问题,在这些场景下理解机器学习的原理比计算时间更为重要。
  2. 生产环境不适合 :SmolML 并不是为生产应用而设计的。对于实际的生产任务,应该选择经过充分测试和优化的库,如 Scikit – learn、PyTorch、TensorFlow、JAX 等,以确保模型的性能和稳定性。

六、如何开始使用 SmolML

你可以通过以下步骤开始使用 SmolML:

git clone https://github.com/rodmarkun/SmolML
cd SmolML

在克隆了仓库后,你可以探索 smolml 目录下的代码,了解各个模块的实现细节。此外,你还可以运行 tests 文件夹中的测试用例来验证 SmolML 的功能,并将其与其他标准库(如 TensorFlow、sklearn 等)进行比较。为了运行测试,你需要先安装 requirements.txt 中的依赖项:

cd tests
pip install -r requirements

七、贡献与支持

SmolML 欢迎大家的贡献。如果你对 SmolML 的改进或扩展感兴趣,可以按照以下步骤进行:

  1. 叉取 SmolML 仓库。
  2. 创建一个新的分支来编写你的代码。
  3. 完成修改后,提交一个 pull request,将你的更改合并到主分支中。

此外,如果你喜欢 SmolML 并希望支持它,可以通过以下方式表达你的支持:

  1. 在 GitHub 上给项目点赞(Star)。
  2. 通过 Ko-fi 页面进行捐赠。
  3. 将 SmolML 项目分享给你的朋友和同事,让更多人了解这个有价值的学习工具。

通过学习和使用 SmolML,你可以更深入地理解机器学习的核心原理,为在机器学习领域的进一步发展打下坚实的基础。