第三章 机器学习与深度学习基础:监督学习、无监督学习、神经网络结构、损失函数、优化器
嵌入式AI与TinyML的落地,本质上是在资源受限的MCU或边缘处理器上运行经过压缩和优化的机器学习模型。要真正理解模型为何如此设计、为何选择某种量化策略、为何推理延迟有差异,必须回到机器学习与深度学习的基础原理。本章将围绕监督学习与无监督学习的范式差异、神经网络的核心结构、损失函数的设计逻辑以及优化器的工作机制展开,为后续模型压缩、算子移植和硬件加速奠定理论基础。
3.1 监督学习与无监督学习:范式与适用边界
3.1.1 核心原理
监督学习(Supervised Learning)依赖成对的输入-输出样本(X, Y)来学习映射函数 f: X→Y。训练过程中,模型通过比较预测输出与真实标签的差异来调整内部参数。在嵌入式AI场景中,监督学习是最主流的范式,例如语音唤醒词识别(输入是MFCC特征,输出是"唤醒/非唤醒"标签)、工业振动异常分类(输入是FFT频谱,输出是设备状态类别)。
无监督学习(Unsupervised Learning)则只提供输入数据 X,模型需要自行发现数据中的结构或分布规律。典型任务包括聚类(K-Means、DBSCAN)和降维(PCA、AutoEncoder)。在TinyML中,无监督学习常用于传感器数据异常检测——设备在正常工况下采集大量数据训练自编码器,当推理时重建误差超过阈值即判定为异常,无需标注故障样本。
3.1.2 判断方法:如何选择学习范式
- 是否有标签? 有标签且任务明确(分类/回归)→ 监督学习;无标签且需要探索数据内在结构 → 无监督学习。
- 标注成本是否可承受? 嵌入式场景中,传感器数据标注往往需要人工逐段标记,成本极高。若标注预算有限,可考虑半监督或自监督方案。
- 任务目标是什么? 需要明确输出类别或数值 → 监督学习;需要检测数据分布偏移或异常 → 无监督学习更合适。
| 对比维度 | 监督学习 | 无监督学习 |
|---|---|---|
| 训练数据 | 带标签 (X, Y) | 无标签 (X) |
| 典型任务 | 分类、回归、目标检测 | 聚类、降维、异常检测 |
| 嵌入式应用 | 关键词识别、视觉分类 | 传感器漂移补偿、设备健康监测 |
| 模型大小 | 通常较大,需压缩 | 可较小,适合MCU |
| 推理延迟 | 取决于网络深度 | 通常为单次前向或距离计算 |
3.1.3 案例拆解:基于无监督学习的电机异常检测
某工厂需要在STM32F407上部署电机轴承异常检测系统。初始方案采用监督学习,但收集故障数据需要人为破坏轴承,成本高且风险大。改用无监督方案:在正常工况下采集振动信号,提取RMS、峰值因子、频带能量等8维特征,训练一个三层自编码器(输入8→隐藏4→输出8)。部署时,模型仅需约2KB Flash和12KB RAM。推理时计算重建误差MSE,当MSE超过阈值0.35时判定为异常。实际运行3个月后,成功提前48小时预警一次轴承磨损,而传统阈值法(仅监测RMS)未能发现。
复盘关键点:自编码器的隐藏层维度选择(4维)需保证重建精度与泛化能力的平衡;阈值设定需在误报率与漏报率之间折中,可通过正常数据分布的P99分位数确定。
3.2 神经网络结构:从感知机到深度网络
3.2.1 核心原理
神经网络的基本单元是神经元,每个神经元执行加权求和后通过激活函数输出:y = σ(W·x + b)。多个神经元组成层,多层堆叠形成深度网络。在嵌入式AI中,最常见的结构包括:
- 全连接层(Dense):每个输入节点与每个输出节点相连,参数量大,适合小尺寸特征向量。
- 卷积层(Conv):通过共享权重和局部感受野大幅减少参数,适合图像和频谱特征。
- 深度可分离卷积(Depthwise Separable Conv):将标准卷积拆分为逐通道卷积和逐点卷积,参数量降低至约1/8,是MobileNet等轻量网络的核心。
- 循环结构(LSTM/GRU):处理时序数据,但计算量大,在MCU上需谨慎使用。
3.2.2 操作流程:设计轻量网络结构
- 输入特征分析:确定特征维度(如MFCC 40维、图像32×32×3)。
- 选择基础算子:优先使用Conv 1×1、3×3、Depthwise Separable Conv。
- 确定层数与通道数:MCU场景建议总参数量不超过500K,层数不超过20层。
- 激活函数选择:ReLU计算简单,但需注意Dead ReLU问题;嵌入式端可用ReLU6(限制输出范围,利于量化)。
- 验证计算量:估算乘加运算次数(MACs),确保在目标MCU上满足实时性要求。
嵌入式网络结构示例(关键词识别):
输入: 40维MFCC特征 (10帧 × 40维)
网络结构:
Conv2D (1×3, 16通道) → ReLU6 → MaxPool(1×2)
DepthwiseConv2D (3×3, 16通道) → ReLU6
Conv2D (1×1, 32通道) → ReLU6 → GlobalAvgPool
Dense (4类) → Softmax
参数量: ~8.2K | MACs: ~1.1M | 模型大小: ~32KB (int8量化)
3.2.3 常见误区
- 误区一:网络越深越好。在MCU上,过深网络导致延迟剧增且梯度消失风险上升。应优先保证精度满足需求即可。
- 误区二:忽略输入尺寸。图像输入从224×224降到32×32,计算量可减少约49倍,但精度也会下降,需通过数据增强弥补。
- 误区三:使用浮点模型直接部署。嵌入式端应使用int8量化模型,但需注意量化敏感层(如BatchNorm)的融合处理。
3.3 损失函数:量化预测误差
3.3.1 核心原理
损失函数(Loss Function)是模型优化的目标函数,它量化了预测值与真实值之间的差异。在嵌入式AI中,损失函数的选择直接影响训练收敛速度和最终精度,同时也会影响量化后的鲁棒性。
| 任务类型 | 损失函数 | 公式 | 特点 |
|---|---|---|---|
| 二分类 | Binary Cross-Entropy | -(y·log(p) + (1-y)·log(1-p)) | 对概率输出敏感,梯度稳定 |
| 多分类 | Categorical Cross-Entropy | -Σ y_i·log(p_i) | 配合Softmax使用 |
| 回归 | MSE (L2) | (1/n)·Σ(y - ŷ)² | 对大误差惩罚大,但受离群点影响 |
| 回归(鲁棒) | Huber Loss | 0.5·δ² if |x|≤δ else δ·(|x|-0.5δ) | 结合L1/L2优点,抗离群点 |
3.3.2 判断方法:如何选择损失函数
- 分类问题:优先使用交叉熵损失。若类别极度不平衡(如异常检测中正常样本占99%),可考虑Focal Loss或加权交叉熵。
- 回归问题:若误差分布近似高斯,用MSE;若存在离群点,用Huber Loss更稳健。
- 嵌入式特殊考虑:量化训练时,损失函数应尽量平滑,避免剧烈梯度变化导致量化误差放大。
3.3.3 实战场景:语音唤醒词损失函数调优
某TinyML语音唤醒项目使用二分类(唤醒/非唤醒),初始使用标准Binary Cross-Entropy,但误唤醒率高达每小时3次。分析发现负样本(非唤醒词)占比超过95%,模型偏向预测"非唤醒"。解决方案:将损失函数改为加权交叉熵,正样本权重设为5.0,负样本权重设为1.0。同时引入Focal Loss的γ=2.0,降低易分类样本的损失贡献。调整后误唤醒率降至每小时0.3次,唤醒率从92%提升至96%。
风险提示:在嵌入式设备上,损失函数的选择还会影响量化后的精度。例如,使用MSE训练的回归模型在int8量化后可能产生较大误差,建议在训练阶段就加入伪量化操作(QAT),使损失函数适应量化噪声。
3.4 优化器:驱动参数更新
3.4.1 核心原理
优化器(Optimizer)负责根据损失函数计算出的梯度来更新网络权重。其核心是梯度下降法:W_new = W_old - lr × ∂L/∂W。在嵌入式AI训练中,优化器的选择影响收敛速度和最终精度,但在推理阶段优化器不参与计算,因此对部署无直接影响。然而,理解优化器有助于调试训练过程。
3.4.2 常用优化器对比
| 优化器 | 更新规则 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| SGD (Momentum) | v = αv - lr·g; W += v | 泛化性好,内存占用低 | 收敛慢,需调学习率 | 数据量充足,训练时间充裕 |
| Adam | 自适应学习率 + 动量 | 收敛快,对学习率不敏感 | 可能过拟合,内存占用高 | 小数据集,快速原型验证 |
| RMSProp | 梯度平方指数加权平均 | 适合非平稳目标 | 需手动设置衰减率 | RNN训练 |
3.4.3 操作流程:训练配置与调参
- 初始化:使用He初始化(ReLU)或Xavier初始化(Sigmoid)。
- 学习率设定:初始lr=0.001(Adam)或0.01(SGD),配合余弦退火或Step Decay。
- 批次大小:MCU训练通常使用小批次(8-32),避免内存溢出。
- 早停策略:监控验证集损失,连续5个epoch不下降则停止。
- 量化感知训练:在训练后期冻结BN层,使用伪量化节点模拟int8推理。
经验提醒:在嵌入式AI项目中,训练阶段的优化器选择对最终部署影响有限,但训练策略(如数据增强、正则化)对量化模型的鲁棒性影响显著。建议在训练时加入随机噪声和随机裁剪,提升模型对传感器噪声的容忍度。
3.4.4 案例复盘:优化器导致训练不收敛
某团队在训练一个用于Cortex-M4的跌倒检测模型时,使用Adam优化器,学习率设为0.01,结果训练损失震荡不下降。排查发现:数据集仅2000个样本,Adam的自适应学习率在后期过大导致参数震荡。解决方案:改用SGD+Momentum(momentum=0.9),初始学习率0.005,并加入Cosine Annealing调度。训练50个epoch后,验证集准确率从78%提升至91%。复盘结论:小数据集上Adam并非万能,SGD配合良好调度往往更稳定。
3.5 本章总结与嵌入式视角
监督学习与无监督学习构成了嵌入式AI的两大方法论支柱:前者用于明确分类/回归任务,后者用于数据探索与异常检测。神经网络结构决定了模型的计算量与参数量,直接影响MCU上的推理延迟和内存占用。损失函数指导模型学习方向,在量化场景下需关注其平滑性。优化器虽不参与推理,但影响训练收敛质量,进而影响量化后的精度。
在TinyML工程实践中,建议遵循以下原则:优先选择参数量小于500K的轻量网络;使用int8量化时,训练阶段加入伪量化操作;损失函数选择需结合数据分布与量化误差;优化器首选Adam进行快速验证,最终模型使用SGD+Momentum精调。掌握这些基础,才能在后序章节中深入理解模型压缩、算子优化和硬件加速的真正价值。