ADD / XOR / ROL
一个关于逆向工程、数学、政治、经济等主题的博客…
2025年4月5日 星期六
帮助我更好理解神经网络的实验,第2篇
在这篇文章中,我将解释目前对神经网络的思考。在之前的文章中,我解释了"神经网络的折纸视角"(在某些圈子里也称为"多面体透镜")的直观理解。本文将深入探讨其数学细节。
神经网络层的标准教科书解释通常如下:
σ(Wx + b)
其中 σ: R → R 是非线性函数(如sigmoid或ReLU等),W是连接到神经元输入边的权重矩阵,b是"偏置"向量。个人认为这种表示法有些繁琐,我更喜欢将偏置向量并入权重矩阵,这样可以将神经网络视为"矩阵乘法与非线性函数交替应用"。
我真的不喜欢考虑除ReLU和leaky ReLU之外的其他非线性函数——也许随着时间的推移我将不得不接受它们的存在,但目前我考虑的所有神经网络都是ReLU或leaky ReLU。暂时我们还假设网络最终输出一个实向量,因此它(还)不是分类器。
假设我们有一个k层的网络,每层的神经元数量为n₁,…,nₖ。网络在维度为i和o的实向量空间(或其近似)之间映射:
NN: Rⁱ → Rᵒ
我想首先将偏置向量并入矩阵乘法,因为这大大简化了表示法。输入向量x通过附加1来扩展,偏置向量b附加到W:
W’ = [W b], x = [x 1]
这样,我们可以将σ(Wx + b)写作σ(W’x)。
在我们的情况下,σ始终是ReLU或leaky ReLU,因此"1"将再次映射为"1"。为了后续能够很好地组合,我还希望σ(W’x)的输出像我们的输入向量x一样,最后一个分量为1。为了实现这一点,我需要在W’的末尾附加一行全零并以1结尾。最终我们得到:
W = [W b; 0,…,1], x = [x 1]
上一篇文章解释了为什么神经网络将输入空间划分为多面体,在这些多面体上近似函数将完全是线性的。考虑数据点x₁。如果在x₁上评估神经网络,一些ReLU会被激活(因为它们的输入数据之和大于0),而一些则不会。对于给定的x₁,将有k个布尔向量表示神经网络中每个ReLU的激活(或非激活)。这意味着我们有一个函数,对于给定的输入向量、层和层中的神经元编号,在ReLU情况下返回0或1,在leaky ReLU情况下返回0.01和1。
我们称这个函数为a。我们可以让它成为一个有三个参数(层、神经元索引、输入向量)的函数,但我更喜欢将层和神经元索引移到索引中,所以我们有:
对于ReLU:aₗ,ₙ: Rⁱ → {0,1}
对于leaky ReLU:aₗ,ₙ: Rⁱ → {0.01,1}
这为我们提供了整个网络的非常线性代数式的表达式:
NN(x) = W₁A₁…WₖAₖx = ∏ᵢ₌₀ᵏ(WᵢAᵢ)x
其中Aₖ的形式为:
Aₖ = diag(aₖ,₁(x), …, aₖ,ₙₖ(x), 1)
现在我们可以非常清楚地看到,一旦激活模式确定,整个函数就变成线性的,只是一系列矩阵乘法,其中每隔一个矩阵是对角矩阵,对角线上是激活模式的像。
这种表示显示,只要激活模式不变,函数就保持相同(且线性)——同一多面体上的点将具有相同的激活模式,因此我们可以使用激活模式作为"多面体标识符"——对于任何输入点x,我可以通过网络运行它,如果第二个点x′具有相同的模式,我知道它位于同一多面体上。
因此,我可以从这一点出发,为单层神经网络制作类似第1部分中创建的电影——我们可以将任意二维图像作为我们希望学习的未知分布,然后可视化训练动态:显示输入空间如何被切割成不同的多面体,在这些多面体上函数被线性近似,并展示这种划分和近似在不同形状网络的训练过程中如何演变。
我们取大小为1024x1024的输入图像,因此是1兆字节的字节大小值,并从中采样5000个数据点——约占图像总点数的0.4%。我们为MLP指定一个形状,并训练6000步,可视化进度。
为简单起见,我们尝试学习一个白色背景上的黑色圆环,具有清晰定义的边缘——首先使用每层14个神经元、深度为6层的网络。
在左侧,我们看到评估的神经网络及其生成的用于分割输入空间的多面体边界。在中心,我们只看到神经网络的输出——神经网络到目前为止"学习"重现的内容。在右侧,我们看到原始图像,几乎难以察觉的红点是5000个训练点,蓝点是1000个点的验证集。
以下是训练运行动态的电影:
这相当整洁,那么不同形状的神经网络呢?如果我们在训练过程中强制神经网络通过2个神经元的瓶颈会发生什么?
最后一个网络有10层,每层10个神经元,然后是一层2个神经元,接着是另外3层,每层10个神经元。就参数数量而言,它与其他网络大致相当,但表现出明显不同的训练动态。
如果我们极大地过度参数化一个网络会发生什么?它会过拟合我们的底层数据,并找到一种方法来分割输入空间以减少训练集上的误差,而不重现圆形吗?
让我们试试——一个20个神经元、40层深的网络怎么样?这应该使用大约20k个浮点参数来学习5000个数据点,所以也许它会过拟合?
事实证明这个例子没有过拟合,但它提供了特别丰富的动态:大约第1000个epoch,我们可以看到网络似乎已经掌握了圆形的一般形状,大多数多面体边界似乎迁移到这个圆上。网络有点摇摆,但似乎有进展。到第2000个epoch,我们认为已经看到了一切,网络将围绕圆巩固。在第3000到4000个epoch之间,某些东西破裂了,损失飙升,网络似乎正在解体,训练发散。到第4000个epoch,它重新稳定下来,但输入空间划分的配置非常不同。这个视频大约在第5500个epoch结束。
这非常迷人。没有过拟合的迹象,但我们可以看到随着网络变深,训练变得不那么稳定:圆似乎摇摆得更厉害,并且我们有这些奇怪的、看似灾难性的相变,之后网络必须重新稳定。尽管只有相对较少的数据点和足够的能力来过拟合它们,但网络似乎准确地捕捉到了"圆形"形状。
只要有时间,我就会继续深入研究这一点,希望这既有趣又有信息量。我的下一个任务是构建一个工具,对于输入空间中的给定点,提取描述该点所在多面体的线性不等式系统。如果您想讨论任何这些内容,请随时联系!