第三章 机器学习与深度学习基础:监督学习、无监督学习、神经网络结构、损失函数、优化器

嵌入式AI与TinyML的落地,本质上是在资源受限的MCU或边缘处理器上运行经过压缩和优化的机器学习模型。要真正理解模型为何如此设计、为何选择某种量化策略、为何推理延迟有差异,必须回到机器学习与深度学习的基础原理。本章将围绕监督学习与无监督学习的范式差异、神经网络的核心结构、损失函数的设计逻辑以及优化器的工作机制展开,为后续模型压缩、算子移植和硬件加速奠定理论基础。

机器学习范式与神经网络训练闭环 监督学习 输入 X + 标签 Y 任务:分类 / 回归 典型:图像分类、目标检测 TinyML:唤醒词识别 需要标注数据集 无监督学习 输入 X,无标签 任务:聚类 / 降维 典型:K-Means、PCA TinyML:传感器异常检测 无需人工标注 神经网络结构 输入层 → 隐藏层 → 输出层 全连接 / 卷积 / 循环 激活函数:ReLU / Sigmoid 参数:权重 W + 偏置 b 前向传播计算输出 损失函数(Loss Function) 分类:交叉熵损失(Cross-Entropy) 回归:均方误差(MSE) 作用:衡量预测值与真实值的差距 优化器(Optimizer) SGD / Adam / RMSProp 核心:反向传播 + 梯度下降 作用:更新权重以最小化损失 训练闭环:前向传播 → 计算损失 → 反向传播 → 更新权重 嵌入式部署时:只保留前向传播,权重固定为常量 迭代训练

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 操作流程:设计轻量网络结构

  1. 输入特征分析:确定特征维度(如MFCC 40维、图像32×32×3)。
  2. 选择基础算子:优先使用Conv 1×1、3×3、Depthwise Separable Conv。
  3. 确定层数与通道数:MCU场景建议总参数量不超过500K,层数不超过20层。
  4. 激活函数选择:ReLU计算简单,但需注意Dead ReLU问题;嵌入式端可用ReLU6(限制输出范围,利于量化)。
  5. 验证计算量:估算乘加运算次数(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 操作流程:训练配置与调参

  1. 初始化:使用He初始化(ReLU)或Xavier初始化(Sigmoid)。
  2. 学习率设定:初始lr=0.001(Adam)或0.01(SGD),配合余弦退火或Step Decay。
  3. 批次大小:MCU训练通常使用小批次(8-32),避免内存溢出。
  4. 早停策略:监控验证集损失,连续5个epoch不下降则停止。
  5. 量化感知训练:在训练后期冻结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精调。掌握这些基础,才能在后序章节中深入理解模型压缩、算子优化和硬件加速的真正价值。