第2章:深度学习基础回顾

各位同学,咱们今天聊聊深度学习的基础。说实话,这部分内容我讲过很多次,但每次讲都有新感悟。你想想看,没有扎实的基础,后面做边缘计算部署就是空中楼阁。我个人习惯把这一章叫做「热身运动」——虽然基础,但决定了你后面能跑多远。

2.1 神经网络原理:从感知机到多层网络

神经网络这东西,说白了就是模仿人脑的神经元结构。我刚开始学的时候也觉得玄乎,后来发现核心就三个东西:输入、计算、输出。

先看最简单的感知机。它接收多个输入,每个输入有个权重,加起来过个激活函数,输出0或1。嗯,就这么简单。但单层感知机有个致命问题——它解决不了异或问题。我在项目中遇到过这种情况,当时用单层网络死活拟合不了数据,后来换成多层才搞定。

多层神经网络就是堆叠多个这样的层。每一层把上一层的输出当作输入,继续做加权求和加激活。为什么多层就能解决复杂问题?因为每一层都在提取更高层次的特征。你想想看,第一层可能只看到边缘,第二层就能看到形状,第三层就能识别物体了。

核心公式回顾:

z = w1*x1 + w2*x2 + ... + wn*xn + b
a = σ(z)  // σ是激活函数

反向传播就是根据输出误差,从后往前逐层调整权重w和偏置b。这个过程我建议你手推一遍,虽然现在框架都帮你做了,但理解原理对调参很有帮助。

2.2 卷积神经网络核心概念

CNN是处理图像数据的利器。为什么不用全连接?因为图像太大了。一张256x256的彩色图,展开就是196608个像素,全连接层参数多到爆炸。CNN通过局部连接和权值共享,把参数量降了几个数量级。

核心操作就三个:

  • 卷积:用一个小窗口(卷积核)在图像上滑动,提取局部特征。我习惯用3x3的核,效果稳定计算量也小。
  • 池化:下采样操作,常见的有最大池化和平均池化。说白了就是降维,保留主要特征丢掉冗余信息。
  • 激活:ReLU现在最常用,f(x)=max(0,x)。为什么不用sigmoid?因为梯度消失问题,深层网络里sigmoid容易让梯度变0,网络就学不动了。

避坑指南:我曾经在边缘设备上部署CNN模型,发现推理速度慢得离谱。后来排查发现是卷积核尺寸选太大了。在边缘计算场景下,我建议优先用3x3卷积,配合深度可分离卷积,能大幅减少计算量。

2.3 常用框架对比:PyTorch vs TensorFlow

这两个框架我都用过,各有千秋。直接上对比表:

特性 PyTorch TensorFlow
上手难度 低,更像Python 中等,概念较多
调试体验 极好,可以随时print 一般,需要tf.print
部署支持 TorchScript/TorchServe TFLite/TensorRT
边缘计算 通过ONNX转换 原生支持TFLite
社区生态 学术界主流 工业界广泛

我个人习惯用PyTorch做研究和原型开发,因为调试方便。但到了边缘部署阶段,我经常把模型转成ONNX,再用TensorRT优化。你问我哪个更好?其实没有绝对答案。我建议你两个都试试,找到自己顺手的。

注意:别在框架选择上花太多时间。我见过有人纠结了两个月还没开始写代码。先选一个上手,后面迁移成本其实不高。

2.4 模型训练与推理流程

训练和推理是两回事,很多人混为一谈。我简单梳理一下:

训练流程

  1. 数据准备:收集、清洗、标注、增强。这一步占了我项目60%的时间。
  2. 模型定义:选网络结构,设置超参数。
  3. 前向传播:输入数据,计算输出。
  4. 计算损失:用损失函数衡量预测值和真实值的差距。
  5. 反向传播:计算梯度,更新参数。
  6. 迭代:重复2-5步,直到收敛。

代码示例(PyTorch风格):

for epoch in range(num_epochs):
    for images, labels in dataloader:
        outputs = model(images)
        loss = criterion(outputs, labels)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

推理流程

推理就简单多了:加载训练好的模型,输入新数据,直接得到输出。没有反向传播,没有梯度计算。在边缘设备上,我们通常会对模型做量化、剪枝等优化,减少计算量和内存占用。

关键区别:训练需要梯度,推理不需要。所以推理时我们可以把模型转为半精度甚至整型,速度能提升2-4倍。我在树莓派上部署过,量化后推理时间从200ms降到了60ms,效果还不错。

2.5 边缘计算场景下的特殊考量

在边缘设备上跑深度学习,跟云端完全是两码事。我踩过的坑不少,总结几点:

  • 内存限制:边缘设备内存通常只有几百MB到几GB,模型不能太大。我建议用MobileNet、ShuffleNet这类轻量网络。
  • 算力限制:没有GPU?用CPU推理也行,但要优化。比如用NCNN、MNN这些推理框架。
  • 功耗限制:电池供电的设备,不能一直全速运行。可以考虑用NPU或TPU加速。
  • 实时性要求:很多场景需要毫秒级响应,模型不能太复杂。

我的经验:做边缘计算项目,先确定硬件规格,再选模型。别反过来。我曾经在项目中期才发现设备跑不动选好的模型,结果推倒重来,浪费了两周时间。

好了,深度学习基础就回顾到这里。下一章我们开始讲模型压缩和量化,这是边缘计算部署的关键技术。有什么问题欢迎交流。