4、机器学习基础回顾:复习神经网络、卷积神经网络(CNN)、循环神经网络(RNN)的基本概念,以及它们在视觉和语音任务中的应用

在进入TinyML机器人AI项目之前,我们必须先夯实机器学习的基础。TinyML的核心挑战在于:如何在资源极度受限的微控制器(MCU)上运行高效的神经网络推理。这要求我们不仅要理解神经网络的工作原理,还要清楚不同网络架构(CNN、RNN)在视觉与语音任务中的适用边界。本章将系统回顾这些基础概念,并重点剖析它们在TinyML场景下的工程化应用与约束。

神经网络基础 DNN 全连接网络 特征向量 → 分类/回归 CNN 卷积神经网络 图像特征提取 + 空间不变性 RNN 循环神经网络 时序依赖 + 状态记忆 视觉任务 图像分类 / 目标检测 姿态估计 / 缺陷检测 语音任务 唤醒词检测 / 命令识别 声纹验证 / 情感分析 TinyML 部署 量化 / 剪枝 / 蒸馏 内存 < 512KB TinyML 约束:内存 < 512KB | Flash < 2MB | 功耗 < 100mW 模型压缩与硬件加速是落地关键

4.1 神经网络核心原理:从感知机到反向传播

神经网络本质上是一个由大量参数(权重和偏置)组成的非线性函数逼近器。其基本单元是神经元,模拟生物神经元的“加权求和 + 非线性激活”行为。一个典型的全连接层执行以下数学运算:y = f(W·x + b),其中 W 是权重矩阵,x 是输入向量,b 是偏置,f 是激活函数(如ReLU、Sigmoid、Tanh)。

在TinyML场景中,我们通常使用ReLU作为默认激活函数,因为它的计算成本极低(仅需比较操作),且能有效缓解梯度消失问题。Sigmoid和Tanh涉及指数运算,在MCU上会消耗较多时钟周期,应谨慎使用。

核心原理:前向传播与损失函数

前向传播是数据从输入层流向输出层的过程。对于分类任务,输出层通常使用Softmax函数将logits转换为概率分布。损失函数衡量预测值与真实标签之间的差异,常用的有交叉熵损失(分类)和均方误差(回归)。训练过程就是通过反向传播算法计算损失对每个参数的梯度,然后使用梯度下降法更新参数。

判断方法:网络是否适合TinyML部署

评估维度适合TinyML不适合TinyML
参数量< 500K> 10M
计算量(MACs)< 50M> 1G
内存峰值< 256KB> 1MB
数值精度INT8 量化FP32 必需
经验提醒:在TinyML项目中,不要盲目追求高精度。一个在ImageNet上达到90%准确率的ResNet-50,其参数量约25M,完全无法在MCU上运行。相反,一个为特定场景设计的轻量级CNN(如MobileNetV1的0.25倍宽度)可能只有400K参数,却能在有限数据集上达到95%以上的准确率。

4.2 卷积神经网络(CNN):视觉任务的主力架构

CNN通过卷积核(滤波器)在输入图像上滑动,提取局部特征。其核心优势在于参数共享和局部连接,大幅减少了参数量。一个卷积层包含多个滤波器,每个滤波器负责检测一种特定模式(如边缘、纹理、形状)。池化层(Max Pooling / Average Pooling)用于下采样,降低空间维度并增强平移不变性。

CNN在视觉任务中的典型流程

  1. 输入预处理:将图像缩放到固定尺寸(如96×96),归一化到[0,1]或[-1,1]范围。
  2. 特征提取:通过多个卷积+激活+池化组合,逐步提取从低级到高级的特征。
  3. 全局池化:使用全局平均池化(GAP)替代全连接层,减少参数量。
  4. 分类输出:通过1×1卷积或小全连接层输出类别概率。

案例拆解:TinyML图像分类实战

假设我们要在STM32F746(Cortex-M7, 216MHz, 320KB RAM)上实现一个“机器人视觉避障”功能,识别前方物体是“可通行”还是“障碍物”。

  • 输入:OV7670摄像头,QVGA分辨率(320×240),但实际输入到网络时缩放到64×64灰度图。
  • 网络结构:3个卷积层(8/16/32通道)+ 2个最大池化层 + 1个全局平均池化 + 2个全连接输出。
  • 参数量:约45K,模型大小约180KB(INT8量化后)。
  • 推理时间:约120ms/帧,满足10FPS的实时性要求。
  • 关键优化:使用CMSIS-NN库加速卷积运算,将浮点模型量化为INT8,内存峰值控制在150KB以内。
结果对比:原始FP32模型准确率96.2%,INT8量化后准确率94.8%,仅下降1.4个百分点,但推理速度提升3.2倍,内存占用减少75%。在MCU上,这种精度损失是可接受的。

常见误区:CNN的“深度”迷信

很多初学者认为网络越深越好。但在TinyML中,过深的网络会导致梯度消失、内存溢出和推理延迟。对于简单的视觉任务(如区分3-5类物体),3-5个卷积层通常足够。此外,不要忽视数据增强的作用——在MCU上无法运行复杂的数据增强,但可以在训练阶段使用随机裁剪、翻转、亮度调整等操作提升模型鲁棒性。

4.3 循环神经网络(RNN):语音时序任务的利器

RNN专为处理序列数据设计,其核心是隐藏状态(Hidden State),能够记忆之前时间步的信息。基本RNN单元的计算公式为:h_t = tanh(W_ih·x_t + W_hh·h_{t-1} + b_h)。然而,标准RNN存在梯度消失/爆炸问题,难以捕捉长距离依赖。因此,实际应用中更常使用LSTM(长短期记忆网络)或GRU(门控循环单元)。

语音任务中的RNN应用模式

在TinyML语音场景中,RNN通常不直接处理原始音频波形,而是处理梅尔频率倒谱系数(MFCC)或梅尔频谱图特征。典型的流程是:

  1. 音频分帧:将1秒音频切成40ms帧,步长20ms,得到50帧。
  2. 特征提取:每帧提取13维MFCC特征,形成50×13的特征序列。
  3. RNN编码:将特征序列输入GRU层,输出最后的隐藏状态。
  4. 分类:通过全连接层输出唤醒词类别概率。

案例拆解:语音唤醒词“小智小智”

在ESP32-S3(240MHz, 512KB SRAM)上实现唤醒词检测,要求误唤醒率低于1次/24小时。

  • 模型结构:2层GRU(每层32单元)+ 全连接分类(3类:唤醒词、其他语音、静音)。
  • 参数量:约28K,模型大小112KB(INT8)。
  • 推理时间:每200ms滑动窗口推理一次,耗时约35ms,满足实时性。
  • 关键优化:使用16位定点数运算,避免浮点库依赖;将GRU的矩阵乘法拆分为小矩阵分块计算,降低内存峰值。
风险提示:RNN在MCU上的部署比CNN更复杂,因为其循环结构导致中间状态需要持续存储。务必计算好隐藏状态的内存占用:2层 × 32单元 × 2(状态+候选)× 2字节(INT16)= 256字节,这看似很小,但加上特征缓存和中间激活值,总内存可能突破300KB。建议使用静态内存分配,避免动态malloc。

常见误区:RNN与CNN的选择困惑

对于语音命令识别,CNN(尤其是时序卷积TCN)在某些场景下比RNN更高效,因为CNN可以并行处理所有时间步,而RNN必须串行。但在TinyML中,由于模型规模小,RNN的串行计算开销并不明显。选择原则是:如果任务需要捕捉长期依赖(如整句理解),选RNN;如果任务基于局部特征(如关键词检测),CNN或TCN可能更合适。

4.4 视觉与语音任务的对比与融合

维度视觉任务(CNN)语音任务(RNN/CNN)
输入形式图像矩阵(H×W×C)特征序列(T×D)
核心操作卷积、池化循环计算、门控
内存瓶颈特征图存储隐藏状态序列
典型延迟50-200ms30-100ms
量化难度较低(INT8友好)较高(对精度敏感)

在TinyML机器人项目中,视觉和语音往往需要协同工作。例如,机器人通过语音指令“走到桌子前”,然后使用视觉识别桌子位置。此时,系统需要同时运行一个语音唤醒模型和一个视觉检测模型。由于MCU资源有限,通常采用时分复用策略:语音模型持续监听,一旦唤醒,立即切换至视觉模型执行任务。

模型压缩与部署要点

  • 量化:将FP32权重映射到INT8,可减少4倍内存占用,推理速度提升2-4倍。注意对RNN的量化需要更细致的校准。
  • 剪枝:移除权重接近零的连接,可减少30-50%参数量,但需要硬件支持稀疏计算。
  • 知识蒸馏:用大模型指导小模型训练,小模型能获得接近大模型的精度。
  • 算子融合:将卷积+BN+ReLU融合为单一算子,减少内存访问次数。
总结复盘:本章回顾了神经网络、CNN和RNN的核心概念。在TinyML项目中,务必牢记三个原则:模型要小(参数量<500K)、计算要省(MACs<50M)、内存要控(峰值<256KB)。选择网络架构时,先明确任务类型(视觉/语音/多模态),再根据MCU资源约束进行裁剪和量化。下一章将深入TinyML的部署工具链,介绍如何将训练好的模型转换为可在MCU上高效运行的代码。