第286篇 深度学习基础——机器人工程师必须搞懂的神经网络
产品化流程讲完了,系统级话题告一段落。从今天开始,我们进入一个全新的板块——AI感知。这个板块大概会持续15篇左右,覆盖目标检测、语义分割、实例分割、位姿估计、点云处理等机器人视觉的核心技术。
第一篇从深度学习基础讲起。你可能已经知道一些概念——反向传播、梯度下降、损失函数。但面试的时候,面试官会考你对这些概念的理解深度。不是让你背定义,而是看你能不能用通俗的语言把原理讲清楚。
搞懂基础才能理解后面的高级模型。YOLO为什么快、DETR为什么用Transformer、Mask R-CNN怎么做实例分割——这些问题的答案都藏在基础概念里。
一、神经网络的基本结构
神经网络由神经元(节点)和连接(权重)组成。一个最基本的神经元做这么一件事:接收多个输入,每个输入乘以一个权重,加上偏置,过激活函数,得到输出。
# 单个神经元
output = activation(
sum(w * x for w, x in zip(weights, inputs)) + bias
)
多个神经元排成一层就是一层网络。多层网络堆叠就是深度神经网络。"深度"学习这个名字就来源于此——网络层数多。
激活函数的作用是引入非线性。没有激活函数,不管多少层网络都等价于一个线性变换。常用的激活函数:ReLU(max(0,x),最常用)、Sigmoid(输出0到1,二分类用)、Tanh(输出-1到1)。
损失函数衡量模型预测和真实值的差距。分类任务用交叉熵损失(CrossEntropy),它衡量的是预测概率分布和真实分布的差异。二分类用BCE(Binary Cross Entropy),多分类用CE(Cross Entropy)。回归任务用均方误差(MSE),对大误差惩罚更重;也可以用L1损失(MAE),对异常值更鲁棒。训练的目标就是最小化损失函数。
二、反向传播与梯度下降
训练神经网络的核心算法是反向传播(Backpropagation)。简单说就是:前向传播算出损失,反向传播算出每个权重对损失的贡献(梯度),然后用梯度下降更新权重。
梯度下降有三种变体:批量梯度下降(BGD,用全部数据算梯度)、随机梯度下降(SGD,用一个样本算梯度)、小批量梯度下降(Mini-batch SGD,用一小批数据算梯度)。实际中几乎都用Mini-batch SGD,batch size通常取16、32、64。
# 参数更新
for param in model.parameters():
param.data -= learning_rate * param.grad.data
学习率是最关键的超参数。太大训练不稳定,太小训练太慢。常用策略:warmup(从小学习率逐渐增大)、cosine annealing(余弦退火,学习率先大后小再大)、ReduceLROnPlateau(指标不下降时减小学习率)。
优化器方面,Adam是目前最常用的。它结合了动量(积累历史梯度方向)和自适应学习率(每个参数单独调学习率)两个优点。AdamW是Adam的改进版,加了权重衰减的正则化。在目标检测任务里,SGD with momentum有时候比Adam泛化更好——虽然收敛慢一些,但最终精度更高。选优化器没有绝对标准,要实验对比。
三、过拟合与正则化
过拟合是深度学习最常见的问题。模型在训练集上表现很好,在测试集上表现很差——它"记住"了训练数据,但没有学到泛化规律。
检测过拟合的方法很简单:看训练损失和验证损失。训练损失一直在降,验证损失降到某个点开始上升,就是过拟合了。
应对过拟合的手段:
数据增强:最直接的方案。训练数据越多,模型越难记住。图像领域常用的增强:随机翻转、旋转、裁剪、颜色抖动、MixUp、CutMix。机器人场景还有特殊的增强方式——仿真数据增强。用仿真引擎生成大量带标注的训练数据,弥补真实数据不足的问题。Sim2Gap(仿真到真实的差距)是另一个话题,后面会聊。
Dropout:训练时随机让一部分神经元不工作。迫使网络不依赖某几个神经元,提升泛化能力。Dropout rate通常取0.1到0.5。
权重衰减(L2正则化):在损失函数里加上权重的平方和。惩罚过大的权重值,让模型更"平滑"。
Batch Normalization:对每一层的输入做归一化。除了加速训练,还有轻微的正则化效果(因为mini-batch的统计量有随机性)。
# BatchNorm用法
import torch.nn as nn
model = nn.Sequential(
nn.Linear(256, 128),
nn.BatchNorm1d(128),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(128, 10)
)
四、训练实战要点
理论讲完了,实际训练模型有几个容易踩的坑。
数据预处理:输入数据要归一化。图像通常除以255再减去均值除以标准差。不做归一化,不同特征的量级差异大会导致训练不稳定。
训练/验证/测试集划分:通常7:2:1或者8:1:1。划分要保证随机性,不能按类别顺序切分。数据量小的话用交叉验证(k-fold),把数据分成k份轮流做验证集。
GPU训练:用.cuda()把模型和数据搬到GPU上。多GPU训练用DataParallel或者DistributedDataParallel。batch size要尽量大(在显存允许的范围内),训练更稳定。显存不够的话用混合精度训练(AMP),用FP16代替FP32能省将近一半显存。
# 基本训练循环
model = MyModel().cuda()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()
for epoch in range(num_epochs):
for inputs, labels in train_loader:
inputs, labels = inputs.cuda(), labels.cuda()
outputs = model(inputs)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
模型保存:训练过程中定期保存checkpoint。保存内容通常包括模型权重、优化器状态、当前epoch、最佳验证指标。用于断点续训和选择最佳模型。推荐保存最近N个checkpoint和验证指标最好的那个,不要每个epoch都保存(太占磁盘空间)。
常见训练问题的排查:训练损失一直不降——检查学习率是否太大或太小、数据预处理是否正确、标签是否有误。训练损失降了但验证损失不降——过拟合了,加正则化。损失突然变成NaN——学习率太大或者出现了除零操作,降低学习率或者加梯度裁剪。
五、面试高频追问
Q:反向传播的过程能详细说一下吗? A:前向传播计算每一层的输出和损失值。反向传播用链式法则从损失往回算梯度——每一层的梯度等于上一层传来的梯度乘以本层的局部梯度。算完梯度后更新权重。关键数学工具是链式法则。
Q:为什么ReLU比Sigmoid好用? A:两个原因。一是Sigmoid在两端梯度接近0(梯度消失),深层网络训练不动。ReLU在正区间梯度恒为1,不存在这个问题。二是ReLU计算简单(一个max操作),比Sigmoid的指数运算快很多。
Q:学习率怎么调? A:没有固定答案,要靠实验。一般先用较大的学习率(比如1e-3)快速训练,然后用学习率调度策略逐步降低。Adam默认学习率1e-3通常是个好的起点。如果训练不稳定就降低学习率,如果训练太慢就增大学习率。
深度学习基础是后面所有AI感知技术的基石。神经网络结构、反向传播、正则化、训练技巧,这些概念理解透了,后面的模型才能看懂。基础不牢地动山摇,务必把这篇的内容吃透。下一篇我们聊CNN卷积神经网络。
深度学习基础是AI感知的起点。神经网络基本结构、反向传播与梯度下降、过拟合与正则化方法、训练实战要点,这四个维度覆盖了深度学习最核心的基础知识内容。
上一篇:第285篇 产品化流程
下一篇聊CNN卷积神经网络。
如果这篇文章对你有帮助,欢迎点赞支持一下,你的鼓励是我持续更新的动力!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)