4、机器学习基础回顾:复习神经网络、卷积神经网络(CNN)、循环神经网络(RNN)的基本概念,以及它们在视觉和语音任务中的应用
在进入TinyML机器人AI项目之前,我们必须先夯实机器学习的基础。TinyML的核心挑战在于:如何在资源极度受限的微控制器(MCU)上运行高效的神经网络推理。这要求我们不仅要理解神经网络的工作原理,还要清楚不同网络架构(CNN、RNN)在视觉与语音任务中的适用边界。本章将系统回顾这些基础概念,并重点剖析它们在TinyML场景下的工程化应用与约束。
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 必需 |
4.2 卷积神经网络(CNN):视觉任务的主力架构
CNN通过卷积核(滤波器)在输入图像上滑动,提取局部特征。其核心优势在于参数共享和局部连接,大幅减少了参数量。一个卷积层包含多个滤波器,每个滤波器负责检测一种特定模式(如边缘、纹理、形状)。池化层(Max Pooling / Average Pooling)用于下采样,降低空间维度并增强平移不变性。
CNN在视觉任务中的典型流程
- 输入预处理:将图像缩放到固定尺寸(如96×96),归一化到[0,1]或[-1,1]范围。
- 特征提取:通过多个卷积+激活+池化组合,逐步提取从低级到高级的特征。
- 全局池化:使用全局平均池化(GAP)替代全连接层,减少参数量。
- 分类输出:通过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以内。
常见误区: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秒音频切成40ms帧,步长20ms,得到50帧。
- 特征提取:每帧提取13维MFCC特征,形成50×13的特征序列。
- RNN编码:将特征序列输入GRU层,输出最后的隐藏状态。
- 分类:通过全连接层输出唤醒词类别概率。
案例拆解:语音唤醒词“小智小智”
在ESP32-S3(240MHz, 512KB SRAM)上实现唤醒词检测,要求误唤醒率低于1次/24小时。
- 模型结构:2层GRU(每层32单元)+ 全连接分类(3类:唤醒词、其他语音、静音)。
- 参数量:约28K,模型大小112KB(INT8)。
- 推理时间:每200ms滑动窗口推理一次,耗时约35ms,满足实时性。
- 关键优化:使用16位定点数运算,避免浮点库依赖;将GRU的矩阵乘法拆分为小矩阵分块计算,降低内存峰值。
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-200ms | 30-100ms |
| 量化难度 | 较低(INT8友好) | 较高(对精度敏感) |
在TinyML机器人项目中,视觉和语音往往需要协同工作。例如,机器人通过语音指令“走到桌子前”,然后使用视觉识别桌子位置。此时,系统需要同时运行一个语音唤醒模型和一个视觉检测模型。由于MCU资源有限,通常采用时分复用策略:语音模型持续监听,一旦唤醒,立即切换至视觉模型执行任务。
模型压缩与部署要点
- 量化:将FP32权重映射到INT8,可减少4倍内存占用,推理速度提升2-4倍。注意对RNN的量化需要更细致的校准。
- 剪枝:移除权重接近零的连接,可减少30-50%参数量,但需要硬件支持稀疏计算。
- 知识蒸馏:用大模型指导小模型训练,小模型能获得接近大模型的精度。
- 算子融合:将卷积+BN+ReLU融合为单一算子,减少内存访问次数。