1.6 数学分析补课 极限、级数与收敛
1.极限的直觉:无限靠近但不必到达
说起来,前面那几章讲微积分、讲梯度下降的时候,我们一直在用一个东西,却始终没停下来好好打量它,那就是极限。深度学习里有大量概念,像导数、连续、收敛、无穷逼近,归根到底都站在极限这块基石上。这一章就当成一次补课,我们把极限这件事从头捋一遍,不抠严格证明,先把直觉立起来。
我先讲一个最朴素的味道。极限刻画的是这样一种情形:一个量在不断地变化,朝着某个目标值靠过去,靠得越来越近,近到你想多近就能多近,可它未必真的抵达那个目标。我拿小张的例子来说。小张每天傍晚去食堂吃饭,从宿舍到食堂一共要走1000步。他给自己定了个规矩,第一天走完剩下路程的一半,第二天再走剩下的一半,第三天又走剩下的一半,如此类推。第一天他走500步,第二天走250步,第三天走125步,每一步越走越短,可不管他走多少天,他离食堂总还差那么一点点。这个不断逼近、却始终差一丢丢的目标位置,就是我们说的极限。
把这件事说精确一点,数学上用的是 - 这套语言。设有一个函数 ,其中 是自变量, 表示把 映射成某个输出的函数。我们说 在 趋近于 时的极限是 ,记作 ,这里 是极限符号, 是 趋近的那个目标点, 是函数值最终靠拢的那个值。这句话翻译成人话,就是说不管你给一个多小的误差范围 ( 是一个希腊字母,表示任意小的正数),我总能找到一个够近的范围 ( 也是一个希腊字母,表示 离 多近),只要 落在这个范围里, 和 的差距就小于你给的 。这便是经典的 - 说法。
讲到这儿不妨停一停,说一句心里话。初次接触这套写法的人,多半会被那两个希腊字母弄得有点发懵。其实严格证明这件事,咱们做工程的同学不必抠得太死,把那股味道尝出来就够了。极限说的是一种你能把它逼到任意小、却又不强求它真到的状态,这股子无限逼近的味道,是后面所有讨论的底色。我记得以前翻过一本讲数学史的小书,说古希腊人为了算圆的面积,把圆切成越来越多的小三角形,切得越细面积越接近,其实就是在用极限的想法,只不过他们当时还没给这套想法起一个正式的名字。
2.收敛:越往后越稳
极限是说一个量靠拢某个值,那收敛呢,说的是一整串东西在往一个值上靠,而且越往后越稳。
我们先把对象说清楚。一串按顺序排好的数叫数列,记作 ,其中 表示第 个数, 是这串数的序号。如果这串数随着 越来越大,稳定地靠拢一个固定的值 ,我们就说这个数列收敛到 ,记作 ,这里 表示无穷大, 是这串数最终靠拢的目标值。不收敛的情况也叫发散,发散的数列要么越跑越远,要么来回晃荡,找不到一个落点。
这件事和深度学习的训练勾连得格外紧。我们做梯度下降,本质上是逐步调整参数,让损失一步步往低处走。把每一步的损失值记下来排成一列,就得到一条损失曲线。训练最关心的事,一是这条损失能不能收敛,二是它最终收敛到哪一个值。理想情形下,损失该平稳地下降,最后稳定在某个比较小的数上,这就意味着模型找到了一组比较合适的参数。可要是学习率设得不合适,损失就会来回抖动,怎么都稳不下来,这正好对应着数列不收敛的样子。前面3.10 节讲训练稳定性,提到梯度爆炸和梯度消失,其实都是把收敛这件事搞砸了的典型例子。
我再举一个稍微远一点的例子。小明写爬虫去抓一个网站的数据,他设了个规则,每隔一阵子重试一次失败的请求,重试间隔按 这样衰减,第 次的间隔是 。这串数显然收敛到 ,意思就是每次重试的成功概率按 一路衰减并收敛到 ,越往后越接近无效尝试。这种越往后变化越小的特征,正是收敛的本质。说穿了,收敛就是事情渐渐安稳下来,不再大起大落。
3.级数:把一串数加起来
把一串数一个个加起来,就得到级数。设数列是 ,把它们的前 项加起来,记作 ,其中 叫作部分和,表示前 项的总和。当 越来越大, 要是稳定地靠拢某个值 ,我们就说这个级数收敛,和是 。要是 一路膨胀或者来回震荡,我们就说它发散。
级数里有一支格外重要的,叫泰勒级数。泰勒级数我们联系1.5 节微积分来讲,那一篇里我们说过导数,这里正好接上。泰勒级数的核心想法是这样:一个看起来挺复杂的函数,要是在某一点附近足够光滑,就可以用一串多项式去一点点地逼近它。设这个函数仍是 ,我们在 这一点附近展开它(这里 仍是一个具体的点,和第一节里那个目标点是一回事),泰勒级数写成:
这里几个符号都得说清楚。 是求和符号, 是从 开始的整数下标, 表示 在 这一点的第 阶导数( 就是 本身), 是 的阶乘,意思是 ,并规定 。整套公式的意思,就是用 在 处的各阶导数信息,拼出一个无穷级数去近似原来的 。
这里我想用一个比喻。泰勒级数有点像学一首新曲子。一开始你只记住了主旋律,这是第零阶近似,只有个大概轮廓。再往后你加上第一段和声、第二段装饰音、第三段更细的表情记号,每多记一段,演奏就和原曲贴近一分。理论上你把无穷多段都记下来,曲子就被你完整复刻了。当然实际上没人能记到无穷,记到前几段往往已经够像。函数逼近也是这个道理,取前几项就能把函数在 附近的样子刻画得相当准。
泰勒级数在深度学习里到处都是影子。比如激活函数在零点附近的行为,常用前几项泰勒展开来近似分析。再比如各种优化算法,要分析它在最优点附近究竟在做什么,也得把损失函数在当前参数处展开成泰勒级数,看一次项、二次项各自说了什么话。前面1.5 节讲导数的时候,我们其实已经用过泰勒级数最前面的两项,就是 ,其中 是 在 处的一阶导数,这一阶近似就是用一条切线去代替原来的函数。说起来,梯度下降每一步走的那个方向,恰恰就是从这一阶近似里推出来的。
4.绝对收敛和一致收敛:先知道有这回事
最后这一节我们轻轻点两个概念,先知道有这回事,遇到再深究也不迟。
一个叫绝对收敛。如果一个级数各项取绝对值之后加起来仍然收敛,我们就说原级数绝对收敛。设原级数是 , 是第 项,那么绝对收敛说的就是 也收敛,这里 表示 的绝对值。绝对收敛的级数好处不少,最讨喜的一点是项的顺序可以随便调换,和不改变,这在工程计算里是个挺省心的性质,遇到错位相加的场合不用提心吊胆。
另一个叫一致收敛。一致收敛说的是一串函数序列,在某段范围里收敛得整整齐齐,没有哪一处比别人慢半拍。设函数序列是 ,其中 表示第 个函数,如果它在某个范围里一致地靠拢到一个目标函数 ,那这段范围里每一个 收敛的速度都被一个共同的界限管住,没有特别拖后腿的点。这件事的好处在于,只要序列一致收敛,很多好性质(像连续、可导这些)就能从每一项顺顺当当地传给极限函数。这一节我们点到为止,记住一句话就够,一致收敛就是大家整整齐齐一起到位,收敛速度被一个共同的界限管住。
5.回到深度学习:极限和收敛到底帮上什么忙
讲了这么多抽象的东西,最后我们回到本行,看看极限和收敛在深度学习里到底派什么用场。
第一件,归一化为什么管用。我们前面讲过BatchNorm、LayerNorm这类归一化层,把中间结果重新拉回到均值 、方差 附近,这里 表示均值为零, 表示方差为一。从极限的角度看,归一化其实是在控制每一层数值的取值范围,让激活函数始终工作在它那一段相对线性、导数又不太接近零的区间里。设激活函数是 , 是这一层算出来的输入, 是 在 处的导数,只要 不至于跑得太大或者太小, 就能保持一个健康的非零值,梯度信号传得动,训练才能稳定地往低处收敛。归一化之所以有效,归根到底是在守护这条收敛的路。
第二件,激活函数在极端输入下的行为。拿Sigmoid来说,输入 要是很大或者很小, 就贴近 或 ( 表示Sigmoid这个函数),这件事用极限写出来就是 和 。一旦走到这种极端,激活函数几乎不再变化,导数也跟着趋零,这正是3.10 节讲过的饱和区。极限帮我们把这种极端行为说得清清楚楚,不用再凭感觉猜。
第三件,优化算法的收敛性。梯度下降也好,Adam这类更高级的优化器也好,本质上都在产生一串参数序列 ,其中 表示第 步的参数取值。我们关心的核心问题就那么几个,这串序列会不会收敛,收敛到哪里,收敛得有多快。理想的情形是它收敛到损失的某个局部最小值甚至全局最小值,那训练就算成了。可要是学习率设得过大,序列会在最小值附近来回跳,永远稳不住,这就对应着发散。学习率设得过小,序列倒是稳,可收敛得慢得让人着急,跑一个晚上损失才挪动一点点。怎么选学习率、怎么设计优化器,本质上都是在调和稳和快这两件事,让序列既能稳得住、又能走得动。小明前两天跟我抱怨他的损失曲线死活下不去,我让他把学习率减半试试,其实就是想让序列走得稳一些,少在最小值附近来回晃。
最后再多说一句。极限和收敛这些概念,初看像走形式,可一旦真去调参、去看损失曲线、去诊断训练哪里出了毛病,它们就成了手里的尺子。读到这里,你大概能体会到,深度学习里那一堆调参经验,背后其实是有数学撑着的,只不过大家平时忙着跑模型,顾不上回头认它。我之前看过一本讲数值优化的书,作者说过一句我印象很深的话,说优化的艺术,就是把收敛性和收敛速度这两件事,反复往一处凑。这话放在深度学习上,一样贴切。
练习
Q1. 用课文里小张走食堂的例子,说清极限"无限靠近但不必到达"这股味道。- 那套说法大致在讲什么?
小张第一天走 500 步、第二天 250 步、第三天 125 步……每步越走越短,可不管走多少天,他离食堂总还差那么一点点,永远在逼近却始终没真到。这就是极限——一个量朝着目标值靠,靠得你想多近就能多近,可未必真抵达。- 说的是:不管你给一个多小的误差范围 ,我总能找到一个够近的范围 ,只要 落进去, 和目标值 的差距就小于 ,把"无限逼近"这件事说精确了。
Q2. 训练时损失曲线如果一直抖动下不去,或者挪动得特别慢,分别对应学习率设成了什么情况?从收敛的角度怎么看?
学习率设得过大,参数会在最小值附近来回跳,序列稳不住,对应发散——损失抖动下不去。学习率设得过小,序列倒是稳,可每步挪得太少,收敛慢得让人着急,跑一晚上损失才动一点点。理想情形是损失平稳下降、最后稳定在某个比较小的数上。怎么选学习率,本质上就是在调和"稳"和"快"这两件事。
Q3. 课文最后点到"绝对收敛"和"一致收敛"两个概念,各一句话说说它们在讲什么?另外归一化为啥能帮训练稳定收敛?
绝对收敛是说一个级数各项取绝对值之后加起来仍然收敛,好处是项的顺序可以随便换、和不变。一致收敛是说一串函数序列在某段范围里整整齐齐一起到位,收敛速度被一个共同的界限管住,没有特别拖后腿的点,好性质能顺顺当当地传给极限函数。归一化(BatchNorm、LayerNorm)把中间结果拉回均值 0、方差 1 附近,让激活函数始终工作在导数不太接近零的区间,梯度信号传得动,训练才稳得住——说穿了它是在守护这条收敛的路。