[博客翻译]数学的魅力与神经网络:分形之美


原文地址:https://sohl-dickstein.github.io/2024/02/12/fractal.html


几个月前,我的五岁女儿从幼儿园回家,对我们宣称数学是愚蠢的!自那以后,我们一直在努力(至今成效显著)激发她对数学的热情,并为她的数学成就感到自豪。其中一项成功是她现在对分形产生了浓厚的兴趣,特别喜欢观看曼德布罗特集和曼德尔球分形的深度缩放视频,还喜欢吃罗马花椰菜。

女儿的兴趣让我对分形有了更多思考,并联想到我热衷的人工神经网络。

我发现生成许多分形的方法与训练神经网络的过程有相似之处:

  1. 都涉及反复应用一个函数到其输出上。
  2. 在两种情况下,该函数都有控制其行为的超参数。
  3. 反复应用函数会产生因超参数不同而或发散至无穷大或保持有界的状态。

这种启发下,我在神经网络训练的超参数景观中寻找分形结构,并确实发现了它!神经网络训练成功或失败的超参数边界具有(美丽、有机的)分形结构。以下细节及精彩视频。

对于更技术性的介绍,请参阅短篇论文《神经网络可训练性的边界是分形的》。

神经网络训练与超参数

为了训练人工神经网络,我们需要迭代更新其参数以提高性能。通常通过损失函数进行梯度下降来实现这一目标。损失函数衡量了神经网络的表现。通过梯度下降降低损失,我们可以找到使神经网络表现良好的参数值。

训练依赖于超参数,它们指定了参数更新步骤的执行方式和网络初始化的方式。例如,常见的超参数是学习率,它设置了每次训练步长模型参数更新的幅度。

如果学习率过大,参数更新步长就会太大,导致训练过程中参数发散(趋向无穷),进而使得训练损失变得非常糟糕。如果学习率过小,训练步长太短,需要大量的训练步骤才能训练好神经网络,这会使训练变得缓慢且成本高昂。实际上,我们通常希望在不使参数发散的情况下尽可能增大学习率。

可视化超参数空间

我们可以可视化调整超参数(如学习率)如何影响神经网络的训练速度或发散程度。在下图中,每个像素对应相同网络、相同初始化和相同数据的训练运行,但使用不同的超参数。蓝色至绿色表示训练收敛,网络成功训练;红色至黄色表示训练发散。颜色越浅,收敛或发散的速度越快。

实验中使用的神经网络简单小巧,包含输入层、tanh非线性层和输出层。图像中,x轴改变输入层参数的学习率,y轴改变输出层参数的学习率。

1.png

图1: 超参数景观:展示神经网络训练成功如何取决于学习率超参数。每个像素代表一次指定输入和输出层学习率的训练运行。蓝色-绿色表示训练收敛,红色-黄色表示训练发散。最亮的蓝绿色区域表示最佳性能的超参数,通常靠近训练收敛与发散的边界区域,这是普遍规律。

神经网络训练的最佳超参数——显示为最淡的蓝绿色,即网络训练最快的部分——接近于训练收敛和发散之间的边界。这是一个一般性质。神经网络训练的最佳超参数往往处于稳定性边缘。例如,如同上述提到的,在网格搜索中,最佳学习率通常是能收敛而非发散的最大学习率。

神经网络可训练性的边界是分形的

由于在此边界附近能找到最佳超参数,因此我们对其进行了深入研究。请播放下面的视频(建议全屏播放并提高播放分辨率):

随着我们对导致训练成功(蓝色)和失败(红色)的超参数配置边界的放大,我们在各个尺度上都发现精致的结构。神经网络可训练性的边界是分形的!

(如果您观看到视频最后,会注意到画面变得方块状。在训练网络时,我使用了float64数值类型,它可以存储大约16位小数的精度。当放大到需要超过16位精度来区分像素时,就会出现这种情况。)

这种行为具有普适性。无论更改数据、架构还是观察的超参数,我们都能看到分形。不过,对于不同的选择,分形看起来会有所不同。网络和训练设计决策也有艺术效果!

2.png

图2: 我尝试的所有实验配置中,神经网络训练产生的分形。摘自相关论文,展示了每种实验条件下的分形部分。实验条件改变了网络中的非线性、数据集大小、批量训练与完整批处理,以及观察的超参数。

以下是图2中总结的多样化配置的剩余分形缩放视频。您可以在此Colab中找到这些实验的代码。

  1. 将激活函数改为恒等函数,即网络是一个深线性网络,没有非线性。
  2. 改变激活函数为ReLU,这个分形很有趣,因为ReLU的分段线性结构在分形的直线上明显可见,将区域划分开来。
  3. 使用单个数据点训练(其他实验使用与模型自由参数数量相同的训练数据点)。
  4. 使用16的批量大小训练(其他实验使用完整的批量训练)。
  5. 观察不同的超参数:添加了一个设置网络权重初始化均值的超参数。我根据这个权重初始化超参数(x轴)和单一学习率超参数(y轴)来可视化训练成功。其他实验则根据各层的学习率超参数来可视化训练成功。这个分形格外美观,我喜欢它如何呈现周期性的模式,其中看似噪声的内容在更高分辨率下解析为结构。

其实并不那么奇怪

现在我已经向您展示了令人惊讶和美丽的现象,让我告诉您为什么我们应该一开始就预料到这一点。在学术论文中,我会先讲这部分,好像我一直知道会有分形一样——当然,直到运行实验之前,我也不知道会发现什么!

分形源于函数的重复迭代

创建分形的一种常见方法是反复迭代一个函数,并识别函数行为变化的边界,这些边界称为迭代函数的分歧边界;在这个边界处,函数迭代导致两侧序列发生戏剧性变化。

例如,生成曼德布罗特集就是反复迭代函数$f(z;c) = z^2 + c $,复杂平面上的$c $值决定了迭代后函数是发散还是有界。参数$ c $是函数$ f(z;c) $的一个(超)参数,类似于神经网络训练中的学习率。

3.png

图3: 曼德布罗特分形由反复迭代一个简单函数生成,类似于训练神经网络时迭代更新步骤。

其他由分歧边界形成的分形包括磁体分形、Lyapunov分形、二次朱利亚集和燃烧船分形。

优化可以产生分形

特别是,牛顿分形是一类相关的分歧分形,由反复迭代牛顿法找寻多项式根生成。牛顿法是一种优化算法,因此牛顿分形证明了优化过程可以生成分形。

4.png

图4: 牛顿分形,如图所示,是由迭代牛顿法来找到多项式的根,根据初始条件给定特定根的颜色编码。牛顿分形激励了我们关于通过训练(即优化)神经网络产生分形行为的想法。

人工神经网络通过反复迭代函数进行训练

当我们通过梯度下降的步骤训练神经网络时,我们就像曼德布罗特、牛顿和其他分形那样反复迭代固定函数。

与牛顿分形类似,这个固定函数对应于优化算法。

具体来说,使用常数学习率的最陡下降法训练神经网络时,我们迭代固定函数:

$ f(\theta;\eta) = \theta - \eta g(\theta) $

其中$\eta$是学习率超参数,$\theta$是神经网络的参数,$g(\theta)$是损失函数的梯度。

神经网络训练和传统分形生成之间有许多差异。前面讨论的所有分形都涉及单个(复值)数字的函数迭代。

定义迭代函数的方程简洁明了,可以用一行文字写下。

另一方面,神经网络训练迭代神经网络所有参数的函数。有些神经网络拥有万亿级别的参数,意味着迭代函数的输入和输出需要用万亿个数字描述,每个参数一个。大型神经网络的参数更新方程同样比传统分形迭代的函数要复杂得多,可能需要多行甚至多页的文字来表述。

然而,训练神经网络可以看作是生成传统分形的迭代过程的扩大版本。

我们不应惊讶于它以与更简单的迭代过程类似的方式产生分形。

结束语

元学习是艰难的,但我相信元学习将在未来几年内重塑人工智能领域。在元学习中,我们学习AI管道中传统上手工设计的方面。例如,我们可能会元训练用于初始化、优化或正则化的函数。如果深度学习教会我们一件事,那就是通过足够的计算力和数据,训练的神经网络可以超越并替换手动设计的启发式方法;在元学习中,我们将同样的教训应用于替换用于训练神经网络本身的启发式方法。