第2章 数学基础回顾:线性代数核心概念、概率论与信息论基础、优化理论入门
各位同学,欢迎来到第2章。说实话,数学基础这块,很多做机器人控制的朋友一开始都觉得头疼。我当年刚入行时也这么想——直到我在项目里被一个矩阵求逆的问题卡了整整三天。从那以后,我养成了一个习惯:先把数学底子打扎实,再碰代码。
这一章,我们不讲太深的理论推导。我会把线性代数、概率论和优化理论里,跟端到端控制最相关的几个核心概念拎出来。你想想看,这些工具说白了就是我们搭模型的砖瓦和水泥。准备好了吗?我们开始。
2.1 线性代数核心概念
2.1.1 矩阵运算:从向量到变换
矩阵运算,说白了就是描述「怎么把一组数变成另一组数」。在机器人控制里,最常见的场景就是坐标变换。比如,你有一个机械臂的关节角度,想算出末端执行器的位置——这就是一个典型的矩阵乘法。
我个人习惯把矩阵乘法看作「线性组合」:
# 举个简单的例子:2x2矩阵乘以2x1向量
import numpy as np
A = np.array([[1, 2],
[3, 4]])
x = np.array([5, 6])
y = A @ x # 等价于 np.dot(A, x)
print(y) # 输出 [17, 39]
嗯,这里要注意:矩阵乘法的顺序不能乱。A @ x 和 x @ A 完全是两码事。我在项目中遇到过一位同事,把状态转移矩阵乘反了,结果仿真出来的机器人轨迹直接飞到了天花板——避坑指南:写代码前先画个维度图。
2.1.2 特征值分解:理解系统的「固有频率」
特征值分解,听起来高大上,其实核心就一句话:找到一个矩阵的「主轴方向」和「伸缩比例」。
为什么会这样?你想想看,一个矩阵作用在一个向量上,无非就是旋转和缩放。特征向量就是那些「只被缩放、不被旋转」的特殊方向。对应的特征值,就是缩放倍数。
在机器人控制里,特征值分解常用于分析系统的稳定性。比如,一个线性系统的状态转移矩阵,如果所有特征值的模都小于1,那系统就是稳定的。我当年做四旋翼无人机控制时,就用这个判断过PID参数的合理性。
重要结论: 特征值分解只适用于方阵。如果你的矩阵不是方阵,那就得用奇异值分解(SVD)——这个我们后面会讲到。
2.2 概率论与信息论基础
2.2.1 熵:不确定性的度量
熵这个概念,我第一次接触是在信息论课上。老师问:「如果一个事件100%会发生,它带给你多少信息?」答案是0。因为没有任何不确定性。
熵的公式很简单:
H(X) = - Σ p(x) log p(x)
说白了,熵就是「平均惊讶程度」。一个均匀分布(比如掷骰子)的熵最大,因为每次结果都让你意外。一个确定性分布(比如太阳从东边升起)的熵为0。
在端到端控制里,熵常用于衡量策略的随机性。比如,一个强化学习智能体如果策略熵太低,说明它太「固执」,容易陷入局部最优。我建议在训练初期适当提高熵,让智能体多探索探索。
2.2.2 KL散度:两个分布之间的距离
KL散度,全称是Kullback-Leibler散度。它衡量的是「用一个分布Q去近似另一个分布P时,损失了多少信息」。
公式长这样:
D_KL(P || Q) = Σ p(x) log(p(x) / q(x))
注意,KL散度不是对称的——D_KL(P||Q) 不等于 D_KL(Q||P)。所以它严格来说不是「距离」,而是一种「方向性的差异度量」。
我在项目中用过KL散度做模型蒸馏。当时要把一个大模型的知识压缩到一个小模型里,目标就是最小化两个模型输出分布的KL散度。效果还不错,模型大小压缩了10倍,精度只掉了2%。
小技巧: 如果你想让两个分布尽量接近,可以用对称版本的JS散度(Jensen-Shannon divergence),它是KL散度的对称化版本。
2.3 优化理论入门
2.3.1 梯度下降:最朴素的寻路算法
梯度下降,说白了就是「沿着山坡最陡的方向往下走」。你站在一个山谷里,想找到最低点,那就每步都朝下坡最陡的方向迈一步。
数学上,梯度就是函数在某一点的方向导数最大值。更新公式很简单:
θ_new = θ_old - η * ∇J(θ_old)
其中η是学习率,∇J是损失函数的梯度。
嗯,这里有个坑:学习率太大,你会跳过最低点,甚至发散;学习率太小,你走到猴年马月也到不了。我刚开始调参时,经常把学习率设得太大,结果损失曲线像过山车一样上下乱窜。后来我学乖了,先用一个小的学习率跑几步,观察一下趋势再调整。
避坑指南: 我曾经在训练一个深度强化学习模型时,忘了对输入做归一化。结果梯度爆炸,模型直接崩了。记住:梯度下降对输入尺度非常敏感,一定要先做标准化。
2.3.2 凸优化:为什么我们喜欢凸函数
凸优化,是优化理论里最「友好」的一类问题。为什么?因为凸函数只有一个全局最小值,没有那些烦人的局部最优。
判断一个函数是不是凸函数,有个简单方法:看它的二阶导数(或Hessian矩阵)是否半正定。如果是,那它就是凸的。
在端到端控制里,很多损失函数其实是非凸的。比如神经网络的损失函数,通常有成千上万个局部极小值。那怎么办?我们只能退而求其次,找一个「足够好」的局部最优解。这就是为什么深度学习里要用随机梯度下降——加点随机性,帮我们跳出局部陷阱。
我个人习惯,在写优化代码前,先画一下损失函数的等高线图。看一眼就知道问题是不是凸的,心里有个底。
2.4 本章小结
这一章我们聊了三个数学工具:
- 线性代数:矩阵运算是基础,特征值分解帮我们理解系统本质
- 概率论与信息论:熵衡量不确定性,KL散度度量分布差异
- 优化理论:梯度下降是核心算法,凸优化是理想情况
这些概念,在后面的章节里会反复出现。你如果现在觉得有点模糊,没关系,先有个印象。等我们讲到具体应用时,我会再带大家回顾。
下一章,我们将进入深度学习的基础——神经网络与反向传播。到时候我们会用上今天讲的梯度下降,看看它到底是怎么工作的。
好,今天就到这里。有问题随时找我。