探索微小机器学习的世界

1. 机器学习基础

1.1 什么是机器学习

机器学习是一个让计算机在无需明确编程的情况下进行学习的研究领域,这与传统的计算机编程方法形成鲜明对比。在传统编程中,我们需要为计算机提供具体的指令,计算机再执行这些指令。

在软件开发中,很多时候很难给出精确的指令来实现特定目标。例如,编写一个垃圾邮件检测程序,如果手动编写,可能需要查找与垃圾邮件相关的常见词汇,如“free”“amazing”“you are the winner”等,还要为垃圾邮件分数制定公式。这个任务既耗时,又难以保证令人满意的准确性。

而机器学习在信息分类或从现有数据中提取新知识不明确时是一种有效的方法。它系统地分析数据,识别那些人类肉眼可能无法立即察觉的模式。模型经过训练后,就可以根据输入数据进行推断(预测结果)。

机器学习有数百种从数据中检测和提取模式的方法,并且它可以在无需人工干预的情况下定期运行,确保其决策能力始终保持最新状态,这是其巨大的优势。不过,随着时间的推移,机器学习算法的能力不断增强,模型的规模和复杂性也在增加,这导致对资源(如 RAM 和 CPU/GPU)的需求不断增加,在嵌入式或基于微控制器的系统中使用时会面临挑战,但这并不意味着不能在小型硬件上运行机器学习。

1.2 什么是微小机器学习

如果你阅读相关内容而不是传统机器学习的内容,说明你正在涉足嵌入式领域。这里的嵌入式硬件专注于单一任务,通过传感器和执行器与周围环境进行交互。由于尺寸、效率、功率和成本的限制,嵌入式硬件的资源(CPU、程序空间和 RAM)有限,在本文中主要指微控制器硬件(MCU)。

微小机器学习(TinyML,EDGE AI FOUNDATION 的商标)是机器学习的一个专门领域,专注于优化模型以在嵌入式设备上运行。这种优化主要有两种形式:
- 创建尽可能小的自定义模型。
- 通过压缩现有模型以适应硬件限制。

并非所有模型都能压缩到在如此有限的资源上运行,但仍有很多可行的选择。微小机器学习的一个关键因素是机器学习过程中的不对称性:执行模型(输入数据并获取输出,即推断)所需的资源通常比训练模型(输入数据并发现模式)所需的资源少几个数量级。我们可以利用这种不对称性,在资源丰富的硬件(如台式 PC)上训练模型,然后将其转换为适合嵌入式硬件约束的轻量级格式。

虽然在特定约束下可以在资源有限的设备上进行训练(如设备端学习和联邦学习),但本文主要关注不对称工作流程,因为它在模型选择上提供了更多自由,允许更大的训练数据规模,并通过利用经过充分测试的软件和工具简化了整体开发。通常,先在功能强大的 PC 上进行实验和迭代,直到结果满足质量要求,然后再生成在微控制器上运行的 C++ 代码,且该代码仅执行推断。

1.3 什么可以被认为是“微小”

微小机器学习的定义多年来发生了显著变化。最初关于微小机器学习的探索是在 TensorFlow 网站上的一篇博客文章,展示了在 Arduino Nano BLE Sense 上运行的多个机器学习项目,该设备具有 ARM Cortex - M4 CPU、1 MB 的闪存和 256 KB 的 RAM。此后,出现了两个显著的发展:
- TinyML 与 TensorFlow for Microcontrollers 同义,这主要是由于 TensorFlow 团队和相关供应商的推广。
- 创客社区成功地在一系列微控制器和更强大的硬件(如 Raspberry Pi 和 NVIDIA Jetson Nano)上运行了 TensorFlow,从而催生了一个更广泛的术语:EdgeAI。

从这个角度来看,TinyML 是更广泛的 EdgeAI 领域的一个子集,而 EdgeAI 又是 AI 的子集。本文主要关注 TinyML(CPU 频率在兆赫兹范围内的裸机硬件上的 AI),而非 EdgeAI(CPU 频率在吉赫兹范围内的便携式或移动设备上的 AI)。

另一个定义“微小”的角度是功耗。EDGE AI FOUNDATION 专注于边缘的超低功耗机器学习,但这个术语没有精确的定义,通常指毫瓦级的功耗。按照这个定义,Raspberry Pi Zero(1 GHz CPU 和 512 MB RAM)平均功耗为 500 - 700 mW,可被视为微小设备,但处于功耗范围的高端,其能耗是典型微控制器的十倍。

为了明确范围,本文将程序内存最多为 8 MB 且 RAM 最多为 4 MB 的微控制器视为有效的 TinyML 硬件。以下是一些 TinyML 和 EdgeAI 设备及其硬件规格的示例:
| 设备类型 | CPU | 闪存 | RAM |
| ---- | ---- | ---- | ---- |
| TinyML 设备(示例) | ARM Cortex - M4 | 1 MB | 256 KB |
| EdgeAI 设备(示例) | 1 GHz | - | 512 MB |

1.4 机器学习在微控制器上的应用原因

在微控制器上运行机器学习有诸多好处:
- 本地决策 :可以在本地进行决策,无需依赖互联网连接,提高了响应速度和数据安全性。例如,在工业自动化中,传感器节点可以实时分析数据并做出决策,避免了数据传输延迟和潜在的网络安全风险。
- 低功耗 :微控制器的功耗通常较低,适合电池供电的设备。这使得微小机器学习在物联网设备中具有很大的应用潜力,如智能手环、环境监测传感器等,可以延长设备的续航时间。
- 成本效益 :微控制器相对便宜,降低了设备的成本。对于大规模部署的物联网应用,如智能家居系统中的多个传感器节点,使用微控制器可以显著降低总体成本。

1.5 微小机器学习能做什么

微小机器学习在多个领域有广泛的应用:
- 健康监测 :可用于可穿戴设备,实时监测心率、血压、睡眠质量等健康指标。例如,智能手表可以通过内置的传感器收集数据,并利用微小机器学习算法分析数据,及时发现异常情况并提醒用户。
- 工业自动化 :在工业生产线上,微控制器可以运行机器学习模型,对设备状态进行实时监测和预测性维护。通过分析传感器数据,提前发现设备故障的迹象,减少停机时间和维修成本。
- 智能家居 :实现智能家电的自动化控制。例如,智能空调可以根据室内环境参数(温度、湿度、光照等)和用户的使用习惯,自动调整运行模式,提高能源效率和用户舒适度。

1.6 微小机器学习不能做什么

虽然微小机器学习有很多优点,但也有其局限性:
- 复杂模型处理能力有限 :由于微控制器的资源有限,无法运行过于复杂的模型。例如,一些需要大量计算资源的深度学习模型,如大规模的卷积神经网络(CNN),在微控制器上运行会面临很大的挑战。
- 数据处理能力受限 :微控制器的内存和处理速度有限,对于大规模数据集的处理能力较弱。在处理高分辨率图像或长时间序列数据时,可能会出现性能瓶颈。

1.7 机器学习术语表

1.7.1 监督学习与无监督学习
  • 监督学习 :使用带有标签的数据进行训练,模型的目标是学习输入数据和标签之间的映射关系。例如,在图像分类任务中,训练数据包含图像和对应的类别标签,模型通过学习这些数据来预测新图像的类别。
  • 无监督学习 :使用未标记的数据进行训练,模型的目标是发现数据中的内在结构和模式。例如,聚类算法可以将数据分为不同的组,每个组内的数据具有相似的特征。
1.7.2 回归与分类
  • 回归 :用于预测连续值。例如,预测房价、股票价格等。回归模型通过学习输入数据和连续输出值之间的关系,对新输入数据进行预测。
  • 分类 :用于预测离散的类别。例如,垃圾邮件检测、疾病诊断等。分类模型将输入数据划分为不同的类别。
1.7.3 指标

指标用于评估模型的性能。在不同的任务中,使用的指标也不同。例如,在二分类任务中,常用的指标有准确率、精确率、召回率和 F1 值等。
- 准确率 :预测正确的样本数占总样本数的比例。
- 精确率 :预测为正类的样本中实际为正类的比例。
- 召回率 :实际为正类的样本中被预测为正类的比例。
- F1 值 :精确率和召回率的调和平均值,综合考虑了精确率和召回率。

1.7.4 过拟合与欠拟合
  • 过拟合 :模型在训练数据上表现良好,但在测试数据上表现不佳。这是因为模型过于复杂,学习了训练数据中的噪声和细节,导致对新数据的泛化能力较差。
  • 欠拟合 :模型在训练数据和测试数据上的表现都不佳。这是因为模型过于简单,无法学习到数据中的复杂模式。
1.7.5 训练集、验证集与测试集
  • 训练集 :用于训练模型的数据集。
  • 验证集 :用于调整模型的超参数,评估模型在不同超参数设置下的性能,选择最优的超参数。
  • 测试集 :用于最终评估模型的性能,检验模型在未见过的数据上的泛化能力。
1.7.6 特征工程

特征工程是指从原始数据中提取和转换特征,以提高模型的性能。常见的特征工程方法包括:
- 特征缩放 :将特征的值缩放到相同的范围,如归一化和标准化。
- 特征选择 :选择对模型性能影响较大的特征,去除无关或冗余的特征。
- 特征提取 :从原始数据中提取新的特征,如主成分分析(PCA)。

1.7.7 数据类型

常见的数据类型包括:
- 表格数据 :以表格形式存储的数据,如 CSV 文件。每行代表一个样本,每列代表一个特征。
- 时间序列数据 :按时间顺序排列的数据,如股票价格、传感器数据等。时间序列数据通常具有时间相关性。
- 图像数据 :由像素组成的二维或三维数据,如照片、视频帧等。
- 音频数据 :声音信号的数字化表示,如语音、音乐等。

1.8 微小机器学习的工作流程

以下是微小机器学习的一般工作流程:

graph LR
    A[数据收集] --> B[数据预处理]
    B --> C[特征工程]
    C --> D[模型选择与训练]
    D --> E[模型评估]
    E --> F{性能是否满足要求?}
    F -- 是 --> G[模型部署]
    F -- 否 --> B
  1. 数据收集 :从各种来源收集相关数据,如传感器、数据库等。
  2. 数据预处理 :对收集到的数据进行清洗、缺失值处理、异常值处理等操作,以提高数据的质量。
  3. 特征工程 :从原始数据中提取和转换特征,以提高模型的性能。
  4. 模型选择与训练 :根据任务的特点选择合适的模型,并使用训练数据对模型进行训练。
  5. 模型评估 :使用验证集或测试集对训练好的模型进行评估,计算性能指标。
  6. 性能评估与调整 :如果模型的性能不满足要求,返回数据预处理或特征工程步骤,对数据或模型进行调整。
  7. 模型部署 :将训练好的模型部署到微控制器上,实现实际应用。

1.9 微小机器学习的挑战与机遇

1.9.1 挑战
  • 资源限制 :微控制器的资源有限,包括内存、处理能力和能源,这对模型的大小和复杂度提出了严格的要求。
  • 模型优化 :需要对模型进行优化,以减少计算量和内存占用,同时保持模型的性能。
  • 开发难度 :需要掌握传统机器学习和嵌入式系统编程的知识,对开发者的技术要求较高。
1.9.2 机遇
  • 物联网发展 :随着物联网的快速发展,对智能、低功耗设备的需求不断增加,微小机器学习为物联网设备提供了强大的支持。
  • 边缘计算 :微小机器学习使得在边缘设备上进行数据处理和决策成为可能,减少了数据传输和云端计算的压力。
  • 创新应用 :为各个领域带来了创新应用的可能性,如智能医疗、智能交通、智能家居等。

微小机器学习为我们带来了在小型硬件上运行机器学习的可能性,虽然面临着一些挑战,但也蕴含着巨大的机遇。通过合理选择模型、优化算法和进行有效的特征工程,我们可以在微控制器上实现高效的机器学习应用,推动各个领域的智能化发展。

2. 微小机器学习的实践应用

2.1 表格数据分类

2.1.1 所需硬件和软件

在进行表格数据分类时,需要特定的硬件和软件支持:
- 硬件 :如一些常见的微控制器开发板。
- 软件 :Python 环境以及相关的机器学习库,还需要创建 Python 虚拟环境。

2.1.2 数据采集

数据采集有多种方式:
1. 从串口监视器手动复制数据 :在 Arduino 开发中,可通过串口监视器查看数据,然后手动复制到本地进行后续处理。
2. 使用 Python 读取串口输出 :编写 Python 代码读取串口数据,示例代码如下:

import serial

ser = serial.Serial('COM3', 9600)  # 根据实际情况修改串口和波特率
while True:
    line = ser.readline().decode('utf-8').strip()
    print(line)
  1. 保存到 SD 卡 :将数据直接保存到 SD 卡中,方便后续读取和使用。
2.1.3 数据加载与检查

数据加载后,可按不同方式存储:
- 每个类别一个文件 :将不同类别的数据分别存储在不同的文件中,便于分类管理。
- 所有类别一个文件 :将所有类别的数据存储在一个文件中,方便统一处理。

2.1.4 数据操作与绘图

对表格数据进行操作,如数据筛选、排序等。同时,可使用绘图工具(如 Matplotlib)对数据进行可视化,直观展示数据特征。

2.1.5 特征工程

特征工程是提高模型性能的关键步骤,包括:
- 特征缩放 :将特征值缩放到相同的范围,常见的方法有归一化和标准化。
- 异常值识别 :通过统计方法(如 Z - score)识别数据中的异常值,并进行处理。
- 特征选择 :选择对模型性能影响较大的特征,可采用顺序特征选择、基于得分的选择、递归特征消除(RFE)等方法。

2.1.6 分类模型选择

常见的分类模型有:
- 决策树 :基于树结构进行决策,简单易懂,可解释性强。
- 随机森林 :由多个决策树组成的集成模型,提高了模型的准确性和稳定性。
- 极端梯度提升 :一种强大的梯度提升算法,在很多竞赛中表现优异。
- 逻辑回归 :用于二分类问题,通过逻辑函数将线性回归的输出映射到概率值。
- 支持向量机 :寻找最优的超平面来划分不同类别的数据。

2.1.7 模型部署到 Arduino

将训练好的模型部署到 Arduino 上,可按照以下步骤进行:
1. 生成适合 Arduino 的代码。
2. 在 Arduino Sketch 中使用生成的代码。
3. 注意可能出现的警告信息,如内存不足等问题。

2.2 表格数据回归

2.2.1 所需硬件与数据采集

同样需要特定的硬件支持,数据采集方式与表格数据分类类似。

2.2.2 数据加载、检查与绘图

加载数据后进行检查和绘图,绘图可分为单输入和多输入多散点图等情况,帮助直观了解数据关系。

2.2.3 特征工程

包括单调函数映射和多项式输入组合等方法,以提高模型的拟合能力。

2.2.4 回归模型选择

常见的回归模型有:
- 普通最小二乘法 :通过最小化误差平方和来拟合数据。
- 岭回归和套索回归 :在普通最小二乘法的基础上加入正则化项,防止过拟合。
- 决策树和随机森林 :也可用于回归问题,通过对数据进行划分和预测。
- 回归链 :将多个回归模型串联起来,提高预测的准确性。

2.2.5 模型部署

将训练好的回归模型部署到 Arduino 上,按照特定的步骤进行操作,实现实际应用。

2.3 时间序列分类

2.3.1 使用 Edge Impulse 进行时间序列分类
  1. 所需硬件和软件 :准备相应的硬件和安装 Edge Impulse 软件。
  2. 数据采集 :采集时间序列数据,如传感器数据等。
  3. 数据加载与检查 :加载采集到的数据并进行检查,确保数据质量。
  4. 特征工程 :提取时间域和频率域特征,提高模型的分类能力。
  5. Edge Impulse 工作流程 :包括 CSV 布局配置向导、文件上传、训练/测试分割、脉冲设计等步骤。
  6. 模型测试与部署 :对训练好的模型进行测试,然后部署到实际设备上。
2.3.2 使用 Python 进行时间序列分类
  1. 硬件要求与数据采集 :满足硬件要求,采集时间序列数据。
  2. 数据标注 :为采集到的数据进行标注,方便模型训练。
  3. 特征工程 :包括统计矩、自相关、形状度量、窗口化等方法。
  4. 分类策略 :采用一对一 vs. 多对多、情节时间序列分类链等策略。
  5. 模型部署到 Arduino :将训练好的模型部署到 Arduino 上。

2.4 音频唤醒词检测

2.4.1 硬件与软件要求

准备合适的硬件设备和相关软件,如音频采集模块和 Edge Impulse 软件。

2.4.2 数据采集

采集音频数据,可通过 Arduino Sketch 或 Python 代码实现。同时,可使用第三方数据集和合成唤醒词生成来扩充数据。

2.4.3 数据加载与检查

加载采集到的音频数据并进行检查,确保数据的质量和格式正确。

2.4.4 特征工程

提取音频特征,如梅尔频谱图和梅尔频率倒谱系数(MFCC)。

2.4.5 音频分类与模型部署

使用卷积神经网络进行音频分类,对模型进行测试后部署到实际设备上,实现连续分类功能。

2.5 对象检测

2.5.1 硬件与软件要求

准备适合对象检测的硬件设备和相关软件,如摄像头模块和 Edge Impulse 软件。

2.5.2 数据采集

通过 Arduino Sketch 收集图像数据,使用 Python 代码读取图像。

2.5.3 特征工程与脉冲设计

对采集到的图像数据进行特征工程处理,设计合适的脉冲。

2.5.4 模型测试与部署

对训练好的对象检测模型进行测试,部署到实际设备上,并可进行可视化调试。

2.6 从零开始的 TensorFlow

2.6.1 所需硬件和软件

准备相应的硬件和安装 TensorFlow 软件。

2.6.2 神经网络结构与训练

了解神经网络的结构,包括前向传播和反向传播过程。常见的神经网络有多层感知机、递归神经网络(RNN)、长短期记忆网络(LSTM)、一维卷积神经网络(1D CNN)和二维卷积神经网络(2D CNN)等,并掌握它们的训练和部署方法。

微小机器学习在各个领域都有广泛的应用前景,通过合理选择数据、模型和优化方法,可以在微控制器上实现高效的机器学习应用,推动智能设备的发展和创新。同时,随着技术的不断进步,微小机器学习将不断发展和完善,为更多领域带来变革。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐