免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

第286篇 深度学习基础——机器人工程师必须搞懂的神经网络

第286篇 深度学习基础——机器人工程师必须搞懂的神经网络 产品化流程讲完了系统级话题告一段落。从今天开始我们进入一个全新的板块——AI感知。这个板块大概会持续15篇左右覆盖目标检测、语义分割、实例分割、位姿估计、点云处理等机器人视觉的核心技术。第一篇从深度学习基础讲起。你可能已经知道一些概念——反向传播、梯度下降、损失函数。但面试的时候面试官会考你对这些概念的理解深度。不是让你背定义而是看你能不能用通俗的语言把原理讲清楚。搞懂基础才能理解后面的高级模型。YOLO为什么快、DETR为什么用Transformer、Mask R-CNN怎么做实例分割——这些问题的答案都藏在基础概念里。一、神经网络的基本结构神经网络由神经元节点和连接权重组成。一个最基本的神经元做这么一件事接收多个输入每个输入乘以一个权重加上偏置过激活函数得到输出。# 单个神经元 output activation( sum(w * x for w, x in zip(weights, inputs)) bias )多个神经元排成一层就是一层网络。多层网络堆叠就是深度神经网络。深度学习这个名字就来源于此——网络层数多。激活函数的作用是引入非线性。没有激活函数不管多少层网络都等价于一个线性变换。常用的激活函数ReLUmax(0,x)最常用、Sigmoid输出0到1二分类用、Tanh输出-1到1。损失函数衡量模型预测和真实值的差距。分类任务用交叉熵损失CrossEntropy它衡量的是预测概率分布和真实分布的差异。二分类用BCEBinary Cross Entropy多分类用CECross Entropy。回归任务用均方误差MSE对大误差惩罚更重也可以用L1损失MAE对异常值更鲁棒。训练的目标就是最小化损失函数。二、反向传播与梯度下降训练神经网络的核心算法是反向传播Backpropagation。简单说就是前向传播算出损失反向传播算出每个权重对损失的贡献梯度然后用梯度下降更新权重。梯度下降有三种变体批量梯度下降BGD用全部数据算梯度、随机梯度下降SGD用一个样本算梯度、小批量梯度下降Mini-batch SGD用一小批数据算梯度。实际中几乎都用Mini-batch SGDbatch 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(), lr1e-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卷积神经网络。如果这篇文章对你有帮助欢迎点赞支持一下你的鼓励是我持续更新的动力
返回列表