深度神经网络成长记:带你了解它的工作原理!

点击上方关注,All in AI中国

深度学习为什么如此有效,这是一个谜,也因此,对于深度学习的理论理解成为了一个非常活跃的研究领域。

在本教程中,我们将以一种不寻常的方式讨论一些小问题。我们会用神经网络为我们绘制抽象图像,然后我们解释这些图像,以便对可能发生的事情形成一种直觉。另外,作为奖励,在本教程结束时,您将能够生成如下图像(所有内容都少于100行PyTorch代码。请在此处查看随附的Jupyter笔记本:https://github.com/paraschopra/abstract-art-neural-network):

深度神经网络成长记:带你了解它的工作原理!

我的神经网络在成长时想成为一名画家

这个图像是如何生成的?

这个图像是由一个名为Compositional Pattern Producing Networks(CPPN)的简单架构生成的,我通过这篇博文介绍了这个架构。在该博客文章中,作者通过用JavaScript编写的神经网络生成抽象图像。我的代码在PyTorch中实现它们。

通过神经网络生成图像的一种方法是让它们一次输出完整的图像,如下所示,称为“生成器”的神经网络将随机噪声作为输入,并在输出层中生成整个图像(使用宽度*高度)。

深度神经网络成长记:带你了解它的工作原理!

图像来自生成性对抗网络简介

与输出整个图像相反,CPPN(我们将要探索的架构)输出给定位置处的像素颜色。

深度神经网络成长记:带你了解它的工作原理!

通过TensorFlow生成抽象模式的图像

忽略上图中的z和r,注意网络正在接收像素的x、y坐标,并输出该像素应该是什么颜色(用c表示)。这种网络的PyTorch模型如下所示:

深度神经网络成长记:带你了解它的工作原理!

请注意,它需要2个输入,并有3个输出(像素的RGB值)。生成整个图像的方式是提供所需图像(特定大小)的所有x,y位置,并将这些x,y位置的颜色设置为网络输出的颜色。

用神经网络进行实验

我第一次尝试运行你在上面看到的神经网络时,最终生成了这些图像。

深度神经网络成长记:带你了解它的工作原理!

如果有人要购买这幅画的画,我会马上卖掉。

我花了很多时间挠头思考为什么不管输入是什么x,y位置,网络输出都是灰色的。理想情况下,这不应该发生,因为对于这样一个深度网络。更改输入值会改变输出值。我也知道每次初始化神经网络时,由于其参数的随机初始化(权重和偏差),它有可能生成一个全新的图像。但显然,即使经过多次尝试,我从神经网络中得到的都只是灰色粘性物质,为什么?

我怀疑所用的具体激活功能:tanh。也许后续层中的多个tanh序列将所有输入数字压缩到接近0.5。在输出层(代表灰色)。但是,我关注的博客文章也使用了tanh。我所做的只是将用JavaScript编写的博客神经网络转换为PyTorch *而不进行任何修改。

我终于找到了罪魁祸首。这是PyTorch在初始化新神经网络时初始化权重的方式。根据他们的用户论坛,他们使用从-1 / sqrt(N)到+ 1 / sqrt(N)范围内随机抽取的数字初始化权重,其中N是层中传入连接的数量。因此,如果隐藏层的N = 16,则权重将从-1/4初始化为+1/4。我的假设是为什么这导致了一个灰色的粘性物质是因为权重来自一个小范围并且变化不大。

如果网络中的所有权重都在-1/4到+1/4之间,当乘以任何输入并加在一起时,可能会发生类似中心极限定理的影响。

中心极限定理(CLT)确定,在某些情况下,添加独立的随机变量,即使原始变量本身不是正态分布,它们的正确归一化和趋向于正态分布(非正式地称为“钟形曲线”)。

回想一下如何计算后续图层的值。

深度神经网络成长记:带你了解它的工作原理!

介绍我们都需要的神经网络

在我们的例子中,第一个输入层有2个值(x,y),第二个隐藏层有16个神经元。因此,第二层上的每个神经元得到2个值乘以从-1/4到+1/4的权重。将它们相加,然后从激活函数tanh开始,成为要传递给第三层的新值。

现在,从第二层开始,有16个输入要传递给第三层中的16个神经元中的每一个。想象一下,这些值中的每一个都用z表示。那么第三层中每个神经元的值是:

深度神经网络成长记:带你了解它的工作原理!

这里我们再做一个猜测。因为权重的方差较小(-1/4到+1/4),z的值(输入x,y乘以权重然后通过tanh函数)也不会发生很大变化(因此会变得相似)。所以这个等式可以看作:

深度神经网络成长记:带你了解它的工作原理!

并且,对于每个神经元,从-0.25到+0.25绘制的16个权重之和的最可能值变为零。即使在第一层中,总和不接近于零,网络的八层给出了上述等式足以最终产生接近零的值的机会。因此,无论输入值(x,y)如何,进入激活函数的总值(权重*输入之和)总是接近零值,tanh映射到零(因此,所有后续层中的值保持为零) )。

深度神经网络成长记:带你了解它的工作原理!

X轴是TanH的输入,输出Y轴。请注意,0映射到0。

灰色的原因是什么?这是因为sigmoid(最后一层的激活函数)将此传入值设为零并映射到0.5(0.5表示灰色,0表示黑色,1表示白色)。

深度神经网络成长记:带你了解它的工作原理!

注意Sigmoid如何将0输入值映射到0.5

如何修复灰色粘性物质?

由于罪魁祸首是权重的微小变化,我的下一步是增加它。我更改了默认初始化函数,将权重从-100分配到+100(而不是-1/4到+1/4)。现在运行神经网络,这是我得到的:

深度神经网络成长记:带你了解它的工作原理!

瞧!灰色粘性物质现在是一些颜色

现在,这是一些进步。我的假设是正确的。

但生成的图像仍然没有太多结构,这很简单。

这个神经网络在引擎盖下做的是将输入与权重相乘,将它们推过tanh,最后通过sigmoid输出颜色。由于我固定了权重,我可以修复输入以使输出图像更有趣吗?

请注意,当我输入X,Y作为原始像素坐标从0,0开始并以128,128结束(这是图像的大小)时,生成上面的图像。这意味着我的网络从来没有把负数作为输入,而且由于这些数字很大(比如X,Y可能是100,100),tanh要么得到一个非常大的数字(它被压扁到+1)或者非常小的数字(它压缩到-1)。这就是为什么我看到的是三原色的简单组合(例如,0,1,1的R,G,B输出表示您在上图中看到的青色)。

如何使图像更有趣?

就像在原始博客文章(我正在关注)中一样,我决定将X和Y标准化。因此,我输入(X / image_size)-0.5而不是输入X.这意味着X和Y的值在-0.5到+0.5的范围内(与图像大小无关)。这样做我得到了以下图像:

深度神经网络成长记:带你了解它的工作原理!

一些进步!

值得注意的是,在上一张图片中,线条正在向右下方增长(因为X,Y值正在增加)。这里,由于X,Y值被归一化并且现在包括负数,所以这些线都在均匀地向外生长。

但是,图像仍然不够。

如何使图像更有趣?

如果你仔细注意,你会发现在图像的中间,似乎有更多的结构而不是边缘。这是数学之神的暗示,我们应该放大那里寻找美。

有三种放大图像中心的方法:

  • 制作大图像。由于像素坐标被标准化,我们可以简单地运行神经网络以产生更大的图像。之后,我们可以通过图像编辑工具放大中间位置,看看我们发现了什么。
  • 将X和Y输入相乘少量(缩放系数),这有效地实现了同样的目的(并且避免了我们在其他不感兴趣的区域上运行浪费的计算),就像前面的方法一样
  • 由于输出是由输入*权重决定的,而不是减少输入值,我们还可以通过将权重值从-100,+ 100减少到+ 3,-3之类的其他东西进行缩放(同时记住不要减少太多。还记得如果权重在-0.25到+0.25范围内,会出现灰色粘性物质吗?)

当我采用第二种方法并将X和Y乘以0.01时,这就是我得到的:

深度神经网络成长记:带你了解它的工作原理!

我称之为神经蒙德里安(Neural-Mondrian)!

当我采用第三种方法并将权重初始化为-3到+3之间时,这是我得到的图像。

深度神经网络成长记:带你了解它的工作原理!

更多实验

我将权重初始化更改为正态分布(平均值为0,标准差为1)并生成多个图像(来自随机初始化)。

深度神经网络成长记:带你了解它的工作原理!

当我删除所有隐藏的图层(只输入到输出映射):

深度神经网络成长记:带你了解它的工作原理!

0个隐藏层

当我只保留一个隐藏层(而不是默认的8个隐藏层)时:

深度神经网络成长记:带你了解它的工作原理!

1个隐藏层

当我将隐藏图层的数量加倍到16时:

深度神经网络成长记:带你了解它的工作原理!

16个隐藏层,每个隐藏层有16个神经元

可以想象,随着隐藏图层数量的增加,图像变得越来越复杂。我想知道如果不将层加倍,我会将层数保持为常数(8),但每层的神经元数量增加一倍(从16到32)会发生什么。这是我得到的:

深度神经网络成长记:带你了解它的工作原理!

8个隐藏层,每个隐藏层32个神经元

请注意,即使网络中的权重总数在上述两种情况下相似,但具有双层的网络比每层具有双倍神经元的网络更像素化。像素表示在那些区域中功能急剧变化,因此如果我们进一步缩放,可以找到更多的结构。

当然,所有这些都是另一种说深度使神经网络更具表现力的方式。正如“深度神经网络的表现力”论文所暗示的那样:

计算函数的复杂性随着深度呈指数增长

这正是我们所看到的。通用逼近定理说理论上,即使有一个隐藏层,足够大的神经网络也可以表达任何函数。但是,在实践中,网络越深,输入越复杂 - >输出映射,它就能够展现出来。

实验没有意义,但很有趣

如果我们将每层神经元的数量从8增加到128(增加一个数量级),该怎么办?

深度神经网络成长记:带你了解它的工作原理!

Neuro-pollock

如果我们从每个隐藏层的128个神经元开始,但是在每个后续层中逐渐将它们减半,如下所示。

深度神经网络成长记:带你了解它的工作原理!

这是我得到的:

深度神经网络成长记:带你了解它的工作原理!

这个看起来比其他更“自然”。

这儿有数以吨记的更多的实验可以做,并获得有趣的图像。所以我留在这里(https://github.com/paraschopra/abstract-art-neural-network),让你可以尝试更多架构,激活和层。

或者你可以将神经网络生成的图像与神经网络生成的哲学结合起来,并制作如下:

深度神经网络成长记:带你了解它的工作原理!

作者:Paras Chopra

来源:https://towardsdatascience.com/making-deep-neural-networks-paint-to-understand-how-they-work-4be0901582ee

深度神经网络成长记:带你了解它的工作原理!

编译出品

相关推荐