WARNING:如标题所示,本文是一点随想,非常不严格,甚至有可能是错的。

过参数化谜题和双重下降

在深度学习中一直存在一个问题:为什么如此过度参数化(相对于输入特征)的网络能在测试集上有着良好的性能?试图对这个问题进行解答的论文汗牛充栋,我就不一一赘叙了。但是我想指出,长久以来我一直以为这是一个只在深度学习中出现的事情。然而,在去年我了解到在传统的线性回归中也存在一个类似的奇怪现象:双重下降(double descent)。顾名思义,双重下降是说,当你用一定参数的线性模型去拟合一个数据集的时候,如果不断增加参数的个数,在训练集上你会观察到损失函数一直单调下降;然而在测试集上你会首先发现损失降低,然后迅速升高,然后再降低。也就是说,似乎在参数增长的过程中某种“相变”发生了。这个现象如此普遍以至于随便写个人造数据集都可以复现出来。

彩票假说 Lottery hypothesis

在了解到这个现象以后,我发现,它可能和过参数化是有关系的。当然,它们之间的关系还多了一层:双重下降还需要解释中间损失爆炸的那一段,这个我们后面会再说到。现在让我们先关注在过参数化上。不过在进入主题之前,我们还要介绍一个概念叫做彩票假说:彩票假说是说,当我们训练好一个庞大的网络用于做某种任务的时候,我们会发现,这个网络中不是所有的节点都是同等重要的——我们可以移除掉大量的节点而使得剪枝以后的稀疏网络具有和原始网络差不多的性能。当然这没有那么令人吃惊,毕竟生物学上也是这么玩的。真正令人惊讶的是,如果我们找到这个剪枝过的网络的初始权重,然后对其进行训练,就会发现,直接训练这个小网络的结果和训练大网络的结果是差不多的。这好像在暗示:解就在那里,与其说你是求解,不如说你只是找到了解。

其实我更愿意称彩票假说为“雕塑假说”,因为找到解的过程就像从大理石中雕出一尊像来一样,像就在那里,你只是去找到它而已。同时,如果你有一块奇石,其原始形状就很像你心中的物体,那么雕琢的过程自然也特别简单。

连接彩票假说和过参数化

不难看出,彩票假说和过参数化之间存在紧密的关系。设想一个情况吧:假如我们有了一个网络,这个网络的性质是如此之好,以至于我们再减一分,其行为就会大大改变。我们把这个网络叫做一个不可约网络。接下来我们做一些看上去无聊的事情:我们往其中增加一些节点,并且让这些增加的节点不影响这个网络的行为。

一种最简单的、达到这个吃饱了没事干的目的的途径是:我们增加一些节点,这些节点的 incoming weights全部设置为0. 在这个情况下,这些节点实际上不起任何作用,因此自然扩增以后的网络行为丝毫不改变。不过这种途径是平凡的。

另一种比较好一点的途径是我们对原来的网络进行“有丝分裂”。比方说有一个神经元,它接收就两个权重 0.4, 0.6,那我们将这个神经元复制一份,并将得到的两个神经元的权重分别设置为 0.2, 0.3. 只要接下来能合并这两个神经元的行为,这样一来这个网络的行为也丝毫不会改变。而且这个操作还可以做很多次,对每个神经元都做一次,甚至还可以对做过一次的神经元再做一次,无穷无尽地执行下去。

对称性来帮忙

可以看到,在上面这个方法里,我们已经发现,可以创造出很多看上去在干活但是实际上完全等价于我们的不可约网络的巨大的网络了。那么有没有办法能更加系统性地描述上面的方案呢?或者说,我们有没有更好的方案呢?如果我们考虑刚刚的有丝分裂的话就会发现,将0.4拆成两个0.2其实只是一个特例,理论上我们可以将0.4拆成任意两个数字的和。也就是0.4=x+y. 这是什么?这是一条线。也就是说,每进行一次这样的分裂,我们实际上创造了一整组解,用代数的话来说,我们创造了一个子空间。所有这两个参数在在这个子空间内其他参数不动的网络,其行为都是等价于最初的不可约网络的。而且,在这个子空间上,我们还可以发现一件事:就是0.4=0.1+0.3=0.3+0.1, 这意味着,我们可以交换两个神经元的位置而不改变网络的行为。加法的对称性在这里帮了我们大忙——实际上哪怕对于原始的不可约网络我们也可以做同样的事情。

如果我们不断地增加这种吃空饷但是看起来在工作的神经元,理论上来说,我们将不断地创造非常非常多的等价网络。而且,一旦增加到某个程度以后,我们会发现,这条路子是不可逆的。也就是说,知道总和是0.4不会告诉你它是从0.2和0.2还是从0.1和0.3的和得到的,就更不要提它们的顺序了。

这样一来,如果说,我们的不可约网络是某个问题的最优解的话,现在我们创造了大量的对这个问题的最优解,它们可能是一些大网络的训练结果。而且更好的是,这些结果很有可能是可以被前面我们所说的线连接起来的,也就是说,它们可以被很容易地找到,如果你能找到其中一个的话。如果我们把随机梯度下降 SGD想象成是在参数空间里做某种有指向性的随机漫步的话,那么直观上,我们能找到这么一条线然后滑向最优解的可能性好像是很高的,毕竟就像我们刚刚说的,这里面存在大量的子空间都是最优的。

解的容量与密度

然而,上面这个直观理解需要进一步探索:我们无法保证解空间的扩张速度和最优子空间的扩张速度相比之下是后者更快。解空间的扩展速度和什么有关系?想想Hopfield Network吧。原始的 Hopfield network能存储的信息量和网络的尺寸成正比,多项式版本的则和次数的减一次方成正比。而众所周知,Hopfield network 和 DNN 之间存在一个对偶性——这暗示我们,解空间的扩张速度和乘法有关。如果我们将一次变换看成一个自由度的增加,那么解空间的扩张速度,应该定义为增加自由度以后的解的允许个数和增加之前的个数之比。这个定义说明:如果我们增加网络的深度,那么解的增加是指数的。如果我们增加网络的宽度,则解的增加是依赖于原有的网络尺寸的。这个现象从另一个角度可以更方便地理解:容量和可调整的路径的条数有关。

从这个角度看,深度为网络带来更大的容量。当然这是一个妇孺皆知的结果。目前也已经存在大量的工作说明了确实如此。不过,从另一个角度看,增加深度,由于增加了容量,也就让loss landscape变得更加崎岖了。为了抵消这种麻烦,我们可以增加网络的宽度。当宽度增大时,我们想到的最容易的办法就是上面所说的分裂法。为了方便,我们在这里只考虑离散的分裂而不考虑覆盖整个子空间的所有分裂。不难看出,离散的分裂的个数和排列的个数是有关的,而利用斯特林公式我们可以发现,这个数量的扩张也是指数级别的,而且其底是和数量有关的。这可能就带来一个有趣的现象:当增加宽度时,解的密度扩张,当增加深度时,解的密度可能降低,即使两者都使得解变多了。如果成立的话,这个推论可以用来做很多事情,both computationally and biologically.

生物学暗示

在上面说分裂神经元的时候,你可能已经想到了那个著名的实验,当手指和碟片的接触面积扩大以后,猴子的皮层中对应手指区域的面积也增大了。考虑到分裂神经元需要知道分裂之前的权重情况,我们不难推测,生物神经元完全可以采取一个类似的策略来“分裂”自己。现在问题来了:这个策略是什么?

很简单,假设有一个空闲神经元需要成为分裂对象,那么它只要找到自己的待分裂对象,然后进行hebbian learning,使得自己变成它的副本。当这个工作完成以后,只要启动一个合适的lateral inhibition,使得两个神经元总的活动水平等于之前一个神经元的,分裂操作就完成了。没错,这个操作就是layer normalization,只不过在这里它运行在一个子网络里。

但是这么做是为什么呢?众所周知,layer normalization 能提高性能。如果采用我们上面的解释框架来看的话,layer normalization 消除了网络对于加法的和的考量,使得任意的组合都可以被用于进行分裂。这样来看的话,这种皮层的扩张操作能加快网络对于新数据的学习速度。

与此同时,如果我们在解稳定以后,开放这个normalization,使得两个神经元都可以自己做自己的梯度下降,等于是我们允许子空间独立发展,那么整个网络的性能可能在瓶颈以后得到进一步提升。实际上这个工作已经有人做了,而且做的很漂亮。但是在这里我想说,根据前面我们讨论的结果,这个策略在生物学上可能意义更大。

回到双重下降和其他

其实这个话题可以继续延伸下去,我能想到的深度学习里的很多问题都与此有关。不过由于时间限制暂不展开。我们只简单谈一下这个和前面我们提过的双重下降的关系。双重下降里的训练集损失持续下降可以被看作上面所说的解的密度的扩张的自然结果。然而我们需要解释为什么测试集上的损失会在半路上爆炸一次。如果我们考虑刚刚的解扩张的办法的话,就会发现我们忽视了一个事情,那就是SGD平等地对待所有的神经元,在扩大解的时候,我们是假设了原始网络大部分不动的。如果这些部分可以动的话,那么在临界解的周围,完全可能存在一些扰动使得网络对输入的敏感性增大。而一旦过参数化以后,原始网络的占比非常小,大网络是多个最优子网络的叠加。此时改动一个小网络对整体的影响很小,因此一些随机因素也就无法兴风作浪了。

其实从这个角度考虑的话,我们还可以延展出更多的话题,其中甚至包括循环网络训练的可能策略,稀疏注意力等等。不过这些想法甚至还处于更加原始的状态,目前不适宜展示。