Skip to content

终于,我要“学习”了

如果你曾跟我一个课题组,那你一定知道,我对“深度学习”、“LSTM”这些玩意儿是有多么不屑一顾。我宣传着“这些玩意儿没啥实际意义”、“真搞安全你敢用吗”,我觉得我没说错,我这么想有三个原因:

  1. 我虽然是半路出家(我直到考研那会儿偶然才看到《控制之美》这本课外书)搞控制和系统的,但是这些东西在我眼里本质是不知道模型的系统辨识
  2. 我觉得“应用”这些玩意儿没啥难度,反正是个黑盒子,你喂一些输入,算一些输出,只要有(足够的)输入你就有输出,就能学出来东西,这让搞科研看起来像是体力活儿,这不是搞研究该干的
  3. AI一直以来都没有可解释性,所以根本不知道边界在哪里,也就是分布外(Out Of Distribution,OOD)完全摸瞎了

所以我一直抱着一种“这东西我明白它是什么,我知道怎么用,我知道为什么不能用”的心态。我经常拿它打趣

“哪有毕不了业的?你写不出文章你就把你所有数据喂给机器学习,总能学个什么东西出来,再编编故事不就有论文了吗?”

可我真的知道吗?

看看现在,各种“注意力”、“门控”高大上的名词,这些东西还是我理解的“系统辨识”吗?

如今,研究生毕业的工作基本完成了,我有时间来看一看这些熟悉又陌生的玩意儿,得益于我“东一榔头,西一棒子”,加上与各位大语言模型老师(比如DeepSeek,GLM,不一一列举)的讨论,我发现我对这些玩意儿还是有点自己的理解,也许对别人有用吧。

是与不是?这是机器要先回答的问题

我追根溯源,一切的开始应该是

y^=sgn(WX+b)

也就是,用一组线性方程 WX+b,来回答 y^ 是与不是的问题,通过对线性方程取正负,至少我们可以把输入分成两类。

用数学语言写出“分开”的目标,这显然是

minL=1N(yy^)2

让最后结果的误差最小。

如果略对系统辨识有研究或者读过我的文章,就能敏锐发现,这完全就是输出误差法

minL=1N(y(t)y^(t))2

可以看到这里多个 (t),也就是说输出误差早考虑了“时间”问题,但是感知机没有。

毕竟分一分猫和狗这种问题,不会说今年它是猫,明年它是狗。

决策边界: w₁·x₁ + w₂·x₂ + b = 0 |

调一调这些滑块,可以看到,两类样本基本分开了。还能回忆起高中数学吗?这就好像是线性规划一样,甚至是更简单的那种。

但是有意思的是,它甚至没法对异或作出分类。原因很简单,异或的 ()

(0,00),(0,11)(1,01),(1,10)

根本没法画一条线,让一边都是1,另一边都是0。不信可以试试看:

决策边界: w₁·x₁ + w₂·x₂ + b = 0 |

⚠️ XOR问题:线性分类器无法同时正确分类所有4个点!

但,高中数学解决不了的问题,小学数学却可以🥰!

分段函数,小学课本中就有的伟大思想

我还记得小学数学里,在算什么出租车计价、阶梯水费这种东西,实际上就是分段函数,比如说这个出租车计价函数

y={10,x<36.1+1.3x,x3

物理意义非常明确:三公里以内起步价十块钱,三公里以上一公里一块三。

之前说过一个感知机一条线,那么这个出租车计价函数两条线,自然就是要两个感知机。那么条件怎么表示呢?其实换种方法理解条件,比如说 x3,这不就是

x={0,x(,3)x,x[3,)

也就是说,我们需要一半是0,另一半是 x 的一个函数,搞学习这帮人把它叫ReLU(搞学习这帮人真的很喜欢给每个东西取个新名字)

ReLU(x)={0,x(,0)x,x[0,)

显然 x3 就是 ReLU(x3)

那么我们就可以把上面的分段函数表达为一个函数

y=ReLU(w1x+b1)+ReLU(w2x+b2)

这实际上就是单个隐藏层有两个感知机的两层多层感知机(Multi Layer Perceptron,MLP)。

可以试试调一调它们的权重 w 和偏差 b,会调出来最终的计价函数曲线的!还可以调一调计价分界点,看一看不同情况下,这个两层感知机怎么去适应和贴近目标的函数曲线。

目标计价: ≤3km: 10元 | >3km: 10+2(x-3)

当前输出: ReLU(w₁x+b₁) + ReLU(w₂x+b₂) = 0.0元 (x=5km)

可以想到,如果三层、四层、五层……就会能画出越来越多的分段,我就不单独做个交互展示了,可以拿支笔在纸上画一画。

重要的是,由于分段变多了,它就可以拐越来越多的弯,所以变成什么呢?不断用直线的组合来去逼近曲线。

这让我想到3D建模了,多边形建模就是在干这样的事情,通过很多直的边来逼近一个曲线,分段越多,曲线越光滑。

对人来说非常好理解,但是机器不知道,机器只知道输入是 x 输出是 y ,得到的大概是些 (0,10),(2.5,10),(3,10),(7,15.2) 这样的 (x,y) 的数据。

这些点给出来,我们的视觉能看到“曲线”或者“分段函数”的影子,但是机器没有“视觉”(当然也有“机器视觉”,不过那并不跟此一个概念),没法看出来“分段函数”的存在。事实上,作为人类,光盯着一个 xy 的映射表,基本上也看不出任何东西。

可以发现,到现在,我们已经把条件和表达量化并计算了,但是目标量化了还没有计算。把这个两层MLP代入之前的目标函数

minL(w1,b1,w2,b2)=1Ni=1N(ReLU(w1xi+b1)+ReLU(w2xi+b2)yi)2

于是问题变成了:找一组参数 (w1,b1,w2,b2)L 最小

解这个问题肯定不是随机调调参数碰运气,很容易想到的一个方案是,调一个参数,看一看结果怎么变,如果变小了那就试试继续这么调;如果变大了那就往反方向调。一个变量对另一个变量变化量的关系……对,就是偏导数!那么现在问题进一步变成了计算这四个值,看正负,然后调整的问题

Lw1,Lb1,Lw2,Lb2

Lw1 算出来本就有正负,如果是正的就需要缩小,负的就需要放大,那就意味着需要一个比例 η 来做这个事情,变成

w1:=w1ηLw1

这里前面加了个 ,因为和放大缩小的方向与计算结果是相反的。嗯,是的,搞学习这帮人又取新名字了,称这个比例 η学习率;然后给 的过程取名叫梯度下降

现在可以自动化这个过程了,就像下面这个自动学习的MLP。

🧠 MLP 参数
📉 采样点MSE损失:0.0000几乎一致
🎯 目标函数(采样点)
目标计价: ≤3.0km: 10元|>3.0km: 10+2.00(x−3.0) 采样点(10个) ReLU₁ ReLU₂ MLP输出 采样点均匀分布在0~10km,MLP通过两个ReLU神经元之和来逼近这些点。 调整目标函数后点击"自动学习"观察梯度下降如何学习参数。

有些时候不一定能学出来,可以多点几次反复迭代。

但其实更要命的是当 w1w2 时根本学不出来!

其实想一想,“偏导数”、“反向调整”,这不就是Jacobian和反馈增益吗?搞学习的重新发明了控制的方法(赞美自动化之神!)

xt+1:=xt+Ketw1:=w1ηLw1

这就是典型的比例积分控制器(积分来自于 x(t) 本身就包含 et1),比例部分增益矩阵就是一个增益乘以雅可比矩阵 L(雅可比矩阵就是给每个输出对状态求偏导) K=ηL

那么就会很自然想到,之前一直在操作向量,既然都能想到矩阵了,MLP不也能变成矩阵吗?

是的,网络不叠怎么叫网络呢?