终于,我要“学习”了
如果你曾跟我一个课题组,那你一定知道,我对“深度学习”、“LSTM”这些玩意儿是有多么不屑一顾。我宣传着“这些玩意儿没啥实际意义”、“真搞安全你敢用吗”,我觉得我没说错,我这么想有三个原因:
- 我虽然是半路出家(我直到考研那会儿偶然才看到《控制之美》这本课外书)搞控制和系统的,但是这些东西在我眼里本质是不知道模型的系统辨识
- 我觉得“应用”这些玩意儿没啥难度,反正是个黑盒子,你喂一些输入,算一些输出,只要有(足够的)输入你就有输出,就能学出来东西,这让搞科研看起来像是体力活儿,这不是搞研究该干的
- AI一直以来都没有可解释性,所以根本不知道边界在哪里,也就是分布外(Out Of Distribution,OOD)完全摸瞎了
所以我一直抱着一种“这东西我明白它是什么,我知道怎么用,我知道为什么不能用”的心态。我经常拿它打趣
“哪有毕不了业的?你写不出文章你就把你所有数据喂给机器学习,总能学个什么东西出来,再编编故事不就有论文了吗?”
可我真的知道吗?
看看现在,各种“注意力”、“门控”高大上的名词,这些东西还是我理解的“系统辨识”吗?
如今,研究生毕业的工作基本完成了,我有时间来看一看这些熟悉又陌生的玩意儿,得益于我“东一榔头,西一棒子”,加上与各位大语言模型老师(比如DeepSeek,GLM,不一一列举)的讨论,我发现我对这些玩意儿还是有点自己的理解,也许对别人有用吧。
是与不是?这是机器要先回答的问题
我追根溯源,一切的开始应该是
也就是,用一组线性方程
用数学语言写出“分开”的目标,这显然是
让最后结果的误差最小。
如果略对系统辨识有研究或者读过我的文章,就能敏锐发现,这完全就是输出误差法
可以看到这里多个
,也就是说输出误差早考虑了“时间”问题,但是感知机没有。 毕竟分一分猫和狗这种问题,不会说今年它是猫,明年它是狗。
决策边界: w₁·x₁ + w₂·x₂ + b = 0 |
调一调这些滑块,可以看到,两类样本基本分开了。还能回忆起高中数学吗?这就好像是线性规划一样,甚至是更简单的那种。
但是有意思的是,它甚至没法对异或作出分类。原因很简单,异或的
根本没法画一条线,让一边都是1,另一边都是0。不信可以试试看:
决策边界: w₁·x₁ + w₂·x₂ + b = 0 |
⚠️ XOR问题:线性分类器无法同时正确分类所有4个点!
但,高中数学解决不了的问题,小学数学却可以🥰!
分段函数,小学课本中就有的伟大思想
我还记得小学数学里,在算什么出租车计价、阶梯水费这种东西,实际上就是分段函数,比如说这个出租车计价函数
物理意义非常明确:三公里以内起步价十块钱,三公里以上一公里一块三。
之前说过一个感知机一条线,那么这个出租车计价函数两条线,自然就是要两个感知机。那么条件怎么表示呢?其实换种方法理解条件,比如说
也就是说,我们需要一半是0,另一半是
显然
就是
那么我们就可以把上面的分段函数表达为一个函数
这实际上就是单个隐藏层有两个感知机的两层多层感知机(Multi Layer Perceptron,MLP)。
可以试试调一调它们的权重
目标计价: ≤3km: 10元 | >3km: 10+2(x-3)
当前输出: ReLU(w₁x+b₁) + ReLU(w₂x+b₂) = 0.0元 (x=5km)
可以想到,如果三层、四层、五层……就会能画出越来越多的分段,我就不单独做个交互展示了,可以拿支笔在纸上画一画。
重要的是,由于分段变多了,它就可以拐越来越多的弯,所以变成什么呢?不断用直线的组合来去逼近曲线。
这让我想到3D建模了,多边形建模就是在干这样的事情,通过很多直的边来逼近一个曲线,分段越多,曲线越光滑。
对人来说非常好理解,但是机器不知道,机器只知道输入是
这些点给出来,我们的视觉能看到“曲线”或者“分段函数”的影子,但是机器没有“视觉”(当然也有“机器视觉”,不过那并不跟此一个概念),没法看出来“分段函数”的存在。事实上,作为人类,光盯着一个
可以发现,到现在,我们已经把条件和表达量化并计算了,但是目标量化了还没有计算。把这个两层MLP代入之前的目标函数
于是问题变成了:找一组参数
解这个问题肯定不是随机调调参数碰运气,很容易想到的一个方案是,调一个参数,看一看结果怎么变,如果变小了那就试试继续这么调;如果变大了那就往反方向调。一个变量对另一个变量变化量的关系……对,就是偏导数!那么现在问题进一步变成了计算这四个值,看正负,然后调整的问题
这里前面加了个
现在可以自动化这个过程了,就像下面这个自动学习的MLP。
有些时候不一定能学出来,可以多点几次反复迭代。
但其实更要命的是当
时根本学不出来!
其实想一想,“偏导数”、“反向调整”,这不就是Jacobian和反馈增益吗?搞学习的重新发明了控制的方法(赞美自动化之神!)
这就是典型的比例积分控制器(积分来自于
那么就会很自然想到,之前一直在操作向量,既然都能想到矩阵了,MLP不也能变成矩阵吗?
是的,网络不叠怎么叫网络呢?
