第3章:深度学习基础——神经网络前向传播与反向传播

各位同学,欢迎来到第三讲。前面我们聊了机器人控制的基本框架,也提到了端到端方法的核心思路。今天,咱们得把地基打牢——深度学习的基础。说白了,就是搞明白神经网络到底是怎么工作的。

我刚开始接触这个领域时,也觉得神经网络像个黑盒子。输入一堆数据,输出一个结果,中间发生了什么?嗯,今天我们就把它拆开看看。

3.1 神经网络前向传播

前向传播,名字听着挺唬人。其实很简单——就是数据从输入层,一层一层往前传,最后得到输出。

想象一下,你有一个三层网络:输入层、隐藏层、输出层。每个神经元做的事情就两件:

  1. 把上一层的输出加权求和
  2. 通过一个激活函数做非线性变换

用数学表达就是:

z = W * x + b
a = f(z)

其中W是权重矩阵,b是偏置,f是激活函数。

我个人习惯把前向传播看作一个「流水线」。数据从入口进去,经过一道道工序(每一层),最后变成成品(预测结果)。

关键点:前向传播本身不学习,它只是计算。学习发生在反向传播阶段。

3.2 反向传播——神经网络的学习引擎

反向传播才是真正有意思的部分。为什么?因为它让网络学会了「纠错」。

流程是这样的:

  1. 前向传播得到预测值
  2. 计算预测值和真实值的差距(损失)
  3. 把这个差距反向传回去,更新每一层的权重

核心思想就是链式法则。你想想看,损失函数对权重的梯度,可以分解成一系列偏导数的乘积。

∂L/∂W = ∂L/∂a * ∂a/∂z * ∂z/∂W

我在项目中遇到过一个问题:梯度消失。当时训练一个深层网络,发现前面几层的权重几乎不动。查了半天,原来是激活函数选错了。

避坑指南:我曾经在训练一个10层以上的网络时,用了Sigmoid激活函数。结果前面几层的梯度小到几乎为零,网络根本学不动。后来换成ReLU,问题就解决了。

3.3 常见激活函数

激活函数的选择,直接影响网络的表达能力。我给大家总结一下常用的三种:

激活函数 公式 优点 缺点
Sigmoid f(x) = 1/(1+e^(-x)) 输出范围(0,1),适合二分类 梯度饱和,容易梯度消失
Tanh f(x) = (e^x-e^(-x))/(e^x+e^(-x)) 输出范围(-1,1),零中心 同样有梯度饱和问题
ReLU f(x) = max(0,x) 计算简单,缓解梯度消失 神经元可能「死掉」

我个人最常用的是ReLU。为什么?简单、有效。但要注意,ReLU有个问题——如果输入一直为负,这个神经元就永远不激活了。这就是所谓的「神经元死亡」。

怎么解决?我建议可以试试Leaky ReLU或者ELU。不过这是后话了,咱们先把基础打牢。

3.4 损失函数设计

损失函数,说白了就是衡量网络预测得好不好的标尺。不同的任务,用不同的损失函数。

3.4.1 均方误差(MSE)

MSE适合回归问题。比如预测机器人的关节角度、末端位置等连续值。

MSE = (1/n) * Σ(y_pred - y_true)²

我记得有一次做机器人抓取任务,用MSE做损失函数。效果还行,但收敛速度有点慢。后来发现,如果预测值和真实值差距很大,MSE的梯度会很大,容易导致训练不稳定。

3.4.2 交叉熵损失

交叉熵适合分类问题。比如判断机器人抓取的是杯子还是瓶子。

CrossEntropy = -Σ y_true * log(y_pred)

你想想看,交叉熵为什么比MSE更适合分类?因为它的梯度特性更好。当预测值离真实值很远时,梯度很大,能快速纠正错误。

小技巧:做分类任务时,最后一层用Softmax激活函数,配合交叉熵损失,效果通常不错。这是业界标配。

3.5 一个完整的训练流程

好了,我们把前面讲的串起来,看看一个完整的训练流程长什么样:

# 伪代码示例
for epoch in range(num_epochs):
    # 前向传播
    z1 = W1 * x + b1
    a1 = ReLU(z1)
    z2 = W2 * a1 + b2
    a2 = Softmax(z2)
    
    # 计算损失
    loss = CrossEntropy(a2, y_true)
    
    # 反向传播
    dW2, db2 = compute_gradient(loss, W2)
    dW1, db1 = compute_gradient(loss, W1)
    
    # 更新权重
    W1 -= lr * dW1
    W2 -= lr * dW2

这个流程,说白了就是「前向算结果,反向算梯度,更新权重」。循环往复,直到网络收敛。

我刚开始做端到端控制时,总觉得训练过程很慢。后来发现,问题出在学习率上。学习率太大,网络震荡;学习率太小,收敛太慢。嗯,这里要注意,学习率是个需要调的超参数。

3.6 本章小结

今天的内容,是后续所有章节的基础。我建议大家:

  • 动手实现一个简单的前向传播和反向传播
  • 试试不同的激活函数,观察梯度变化
  • 理解MSE和交叉熵的区别

下一章,我们会把这些知识应用到机器人控制中。到时候你会发现,这些基础概念有多重要。

记住,深度学习不是魔法。它只是一套数学工具,用好了,能解决很多实际问题。