022 过拟合与欠拟合:正则化、Dropout与早停
上周调试一个手势识别模型,在STM32上跑,训练集准确率98%,验证集直接掉到62%。我盯着终端输出看了十分钟,脑子里只有一个念头:这模型把训练集的噪声全背下来了。如果你也遇到过类似情况——模型在训练数据上表现完美,一到新数据就翻车——那恭喜你,你撞上了嵌入式机器学习最经典的坑:过拟合。
从一次失败的部署说起
事情是这样的。我用TinyML做了一套基于加速度计的空中写字识别,采集了500组数据,每组包含200个采样点。模型结构很简单:两层Conv1D加两层全连接,总共不到30K参数。训练时loss曲线漂亮得像教科书插图,验证集准确率也稳定在85%以上。我信心满满地烧录到Cortex-M4上,结果实际测试时,写同一个字母“A”,十次里有四次识别成“O”。
问题出在哪?我回看训练数据,发现采集时有个习惯:每次写“A”都从左上角起笔,写“O”都从正上方起笔。模型学到的不是字母的形状特征,而是起笔位置的统计规律。这就是典型的过拟合——模型记住了训练数据中的偶然模式,而不是真正的泛化特征。
欠拟合:另一个极端
过拟合的反面是欠拟合。模型太简单,连训练数据的基本规律都学不到。比如你用线性模型去拟合正弦波,无论怎么调参,loss都降不下去。在嵌入式场景下,欠拟合往往是因为模型容量不够——参数太少,层数太浅,或者特征提取能力不足。
我见过有人为了追求极致的模型体积,把卷积核从3x3改成1x1,结果准确率从92%掉到70%。这不是优化,是自废武功。模型容量和部署资源之间需要平衡,但平衡的前提是模型先