2、深度学习基础回顾(上):神经网络核心概念、卷积神经网络(CNN)原理、激活函数与损失函数、优化器选择
各位同学,欢迎来到《基于深度学习的车道保持算法移植实战》的第一章。
说实话,很多做嵌入式移植的朋友,一上来就急着调模型、改代码。结果呢?模型精度上不去,推理速度也慢。我见过太多这样的案例了。根本原因是什么?就是基础没打牢。
这一章,咱们把深度学习最核心的几个概念过一遍。别嫌基础,这些都是后面做车道保持算法移植的「地基」。地基不稳,楼盖得再高也得塌。
2.1 神经网络核心概念:从感知机到多层网络
先聊聊神经网络最原始的形态——感知机。说白了,它就是模仿人脑神经元的一个数学函数。输入一堆特征,乘以权重,加上偏置,再经过一个激活函数,输出结果。
但感知机有个致命缺陷:它只能解决线性可分的问题。比如判断一个点是在直线左边还是右边,它行。但像异或(XOR)这种非线性问题,它就彻底歇菜了。
怎么解决?加层。把多个感知机堆叠起来,就成了多层感知机(MLP)。这就是深度学习的雏形。
核心公式回顾:
z = w1*x1 + w2*x2 + ... + wn*xn + b
a = σ(z) // σ为激活函数
我在做车道线检测项目时,早期尝试只用全连接层去拟合车道线曲线。结果呢?参数量爆炸,模型根本跑不动。后来才意识到,全连接层适合做「决策」,但不适合做「特征提取」。这个坑,我替你们踩过了。
2.2 卷积神经网络(CNN)原理:为什么它适合图像?
CNN的出现,彻底改变了图像处理的玩法。为什么?因为它引入了两个核心思想:局部连接和权值共享。
你想想看,一张1080p的图像,如果用全连接层,第一个隐藏层就需要几百万个参数。这谁受得了?但卷积层不一样,它只用一个小窗口(比如3x3)在图像上滑动,同一个窗口的权重在所有位置共享。
这样做的好处有两个:
- 参数骤减:参数量从百万级降到千级
- 平移不变性:不管车道线在图像左边还是右边,卷积核都能识别出来
我记得有一次,团队里新来的同事问:「为什么卷积核大小通常用奇数?」嗯,这个问题问得好。原因有两个:一是奇数核有明确的中心点,方便定位;二是奇数核在padding时能保持输入输出尺寸对称。3x3、5x5、7x7,这些都是经典尺寸。
个人经验:在车道保持任务中,我习惯用3x3的小卷积核堆叠多层,而不是用大卷积核。小核堆叠不仅参数量更少,还能获得更大的感受野,效果往往更好。
2.3 激活函数与损失函数:让网络「活」起来
激活函数的作用是什么?说白了,就是给网络引入非线性。如果没有激活函数,再多层网络也只是线性变换的叠加,那跟单层网络没区别。
常用的激活函数有这些:
| 函数名 | 公式 | 优点 | 缺点 |
|---|---|---|---|
| Sigmoid | 1/(1+e-x) | 输出范围(0,1),适合二分类 | 梯度消失严重,输出非零中心 |
| Tanh | (ex-e-x)/(ex+e-x) | 零中心,比Sigmoid好 | 仍有梯度消失问题 |
| ReLU | max(0, x) | 计算简单,缓解梯度消失 | 神经元「死亡」问题 |
| Leaky ReLU | max(αx, x) | 解决神经元死亡 | α需要手动调参 |
我曾经在训练一个车道线分割模型时,用了Sigmoid做隐藏层激活函数。结果训练了三天,loss就是不降。后来换成ReLU,半天就收敛了。这就是梯度消失的威力——你想想看,梯度在反向传播时每层都乘一个小于1的数,传到前面几层时基本就没了。
再来说损失函数。对于车道保持任务,我们通常用两种:
- 均方误差(MSE):用于回归任务,比如预测方向盘转角
- 交叉熵损失(Cross-Entropy):用于分类任务,比如判断车道线类型
避坑指南:我曾经在回归任务中误用了交叉熵损失,结果模型输出始终在0.5附近震荡。后来才发现,交叉熵期望输出是概率分布,而回归任务输出是连续值。两者根本不匹配。选损失函数时,一定要先搞清楚你的任务是分类还是回归。
2.4 优化器选择:让模型「学会」的引擎
有了网络结构和损失函数,接下来就是怎么让模型学会。这就是优化器的工作。
最基础的优化器是随机梯度下降(SGD)。它的思路很简单:沿着梯度反方向更新参数。但SGD有个问题——学习率不好调。调大了,loss震荡;调小了,收敛太慢。
后来出现了动量(Momentum)优化器。它引入了「惯性」的概念,让更新方向不仅取决于当前梯度,还受历史梯度影响。这就像推一个球下山,球会越滚越快,不会轻易停在局部极小值。
再后来,Adam优化器横空出世。它结合了动量和自适应学习率的优点,成了目前最流行的优化器之一。
| 优化器 | 特点 | 适用场景 |
|---|---|---|
| SGD | 简单,需要手动调学习率 | 数据量小,或需要精细调参 |
| SGD+Momentum | 加速收敛,减少震荡 | 大多数通用场景 |
| Adam | 自适应学习率,几乎不用调参 | 新手首选,快速验证 |
| RMSprop | 适合非平稳目标 | RNN或在线学习场景 |
我个人习惯是:先用Adam快速跑通流程,再换SGD+Momentum做精细调优。为什么?因为Adam虽然收敛快,但有时会收敛到泛化性能较差的局部最优点。而SGD虽然慢,但最终效果往往更好。
小技巧:在嵌入式平台上部署时,我建议尽量用SGD训练的模型。因为Adam引入了额外的动量项,模型参数分布更复杂,量化时精度损失往往更大。这是我在实际移植中踩过的坑,分享给你们。
好了,这一章的内容就到这里。咱们把神经网络的核心概念、CNN原理、激活函数与损失函数、优化器选择都过了一遍。这些内容看似基础,但每一个点都直接影响到后续的算法移植效果。
下一章,咱们会深入聊一聊「深度学习基础回顾(下)」,包括正则化、批归一化、数据增强等实战中必不可少的技术。到时候见。