机器会做梦吗?
'
“机器会做梦”这一概念绝不是一场噩梦。
编译| Light 排版| Sybil
出品 | 科技智谷
人会做梦,那么机器会做梦吗?
对于这一问题,阿西莫夫等一众科幻作家在《Robot Dreams》、《I,Robot》、《Eva》等文学作品中给予了深刻的展现与讨论;而在大家更耳熟能详的《银翼杀手》、《机械公敌》、《人工智能》等影视作品中,也出现过机器人做梦的相关场景,机器是会做梦是吗?
答案是不会,机器虽然可能会输出类似于人类做梦的诡异行为(可以了解“DeepMind”、“DREAM”与RobDREAM等项目),但你要明白它们完全依赖于输入,这是机器学习的标准,所以研究人员将这种行为称为神经风格转移。它包括给神经网络一个内容图像和一个风格图像,然后要求它按照风格图像的样式重新创建内容图像。
怎么做梦
我发现任何深度学习概念的一个迷人之处在于它的生物根基。
为了理解神经风格传递是如何工作的,我们需要理解卷积神经网络(CNNs)是如何工作的。而在了理解中枢神经系统之前,我们还需要理解我们自己的视觉皮层是如何工作的。
这听起来像是一项艰巨的工作,但老实说,它非常容易理解。有很多词听起来既聪明又酷,所以你可以留下最好的印象!
一、眼睛和大脑
我们的眼睛是不可思议的,而更不可思议的是我们的大脑。我们的大脑是我们意识和次意识的中心。
你可能已经知道,眼睛通过我们的视觉皮层向大脑反馈信息,然后形成我们的视觉。但真正有趣的是,大脑是如何建立起我们的视觉。
有无数的神经元连接眼睛和我们的视觉皮层。在一端,我们有单独的细胞(视杆和视锥),它们各自负责我们视觉的微小部分。而在另一端,我们有一个完全形成的、无缝的(在大多数情况下)世界的视觉感知。
早在20世纪60年代和70年代,Hubel和Wiesel就发现了我们的视觉是如何建立起来的线索。他们用猫做实验,给猫看一束不同角度的光。当分析V1神经元(连接到初级视觉皮层的神经元)的放电率或激活时。他们发现这个神经元的射速和光条的旋转有关联。这是一个如此惊人的发现,因为它表明不同的神经元负责从我们从眼睛接收的视觉输入中检测不同的模式。
大脑的视觉输入图
这里我们有4个不同的神经元连接到大脑,每个神经元对一条线的特定方向做出反应。在我们深入说下去之前,让我们把一些机器学习术语放进去……神经元发现的这些非常简单的特征就是我们所说的低级特征,与更复杂的高级功能相反。所以我们有一些低级的特性,这些特性是我们所看到的一切的基本构件。你可以想象有数百万个这样的功能。
有点像你打开一个新的乐高套装,你有似乎是数以百万计的不同类型的砖块来玩,并把它们放在一起,以建立高级功能。而这正是我们的大脑所做的。这些神经元与更多的神经元相连,这些神经元已经学会了识别从其输入中建立的特征。
显示建立更高级特征的两层神经元的示意图
上图向我们展示了一个非常简单的例子,说明我们可以用低层次的特征建立一些结构。就我们的乐高套装而言,我们正在把头几块砖放在一起,想象着我们可以建造什么!'。
显示简单的房子或船如何被视觉通路中的高级神经元识别的示意图
更进一步,我们可以看到每一层新的神经元可以构建出多么复杂(或更高级)的结构。这里我们有几幅相当出色的房子和船的图画。我们的三级视觉路径现在能够识别。因此,当大脑通过这两个神经元接收到冲动(或动作电位)时,这意味着在我们的视觉感知中,有一所房子和一艘船。或者,如果这只是一个冲动,那么它要么是一所房子,要么是一艘船,取决于哪一个,你明白了吗?
二、从眼睛到细胞神经网络?
如果你看了上一节(希望你看了),那么你已经知道CNN的基本工作原理了!
回去看看上一张图,我们需要对这个图做的就是添加一些数学符号,并将其重塑为机器学习中的神经网络,然后就可以了。
细胞神经网络的来龙去脉是一些广泛研究的主题,我们在此不做赘述。对于本文,您只需要知道细胞神经网络通常由几个卷积层组成,这些卷积层负责构建我们在上面探讨的更高级别的特征。然后通常是一些汇集层,用来缩小图像的大小,迫使细胞神经网络寻找更高层次的特征。
再从上一张图来看,你认为 '内容 '和 '风格 '在这个非常基本的神经网络中处于什么位置?这里考虑的内容是更明显的,因为更高层次的特征,如房子和船,最有可能代表图像的内容。而不是一行或一些非常低级的细节。
另一方面,让我们思考一下图像的风格是什么?想象一下我刚刚画了一幅绝对的杰作,很像这里看到的这幅。
这个图像风格的一个重要因素是笔触。笔触可能是图像的大特征,但是与图像内容相比,它们是相对低级的特征。因此,我们可以想象,该图像的更多风格表现将位于此前图画的左侧。或者说我们的CNN中每个卷积层的低层。
VGG-19架构
现在让我们来看看一个实际的CNN架构。上图显示了在高级神经元识别中开发的著名的VGG-19模型的体系结构。输入从左边输入,输出在右边返回给我们。在中间,我们所有的神经元结合在一起,识别从低级到高级的特征。
在每个卷积层(上图中绿色阴影部分),我们重复前面描述的过程。在卷积层的第一维(低级)中搜索简单特征,直到卷积层的最后一维(高级)中搜索更复杂的特征。然后,我们有一个最大池层,减少了图像的大小,我们再次重复这个过程。
这些最大集合层是非常重要的,因为当他们减少图像的大小时,我们失去了图像的更精细的细节。因此,在每一步,我们自然是在寻找更大的特征。我们还注意到,每个卷积层的深度从左到右增加。这是因为我们在更大的范围内发现了更复杂的特征,这些特征对图像内容来说比低层的更重要。例如,一个真正复杂的笔触或铅笔标记不如所画的整体形状重要。
现在很明显,每张图像都是不同的,所以定义一个特定的层是不容易的,每一层都是不同的,在一个最好地定义图像内容的CNN中定义一个特定的点也是不容易的。然而,根据经验,我们通常不希望内容规模很小,或者很大,介于两者之间通常是一个很好的起点。
关于风格,这可以体现在任何规模上,因此在每个卷积层有一些权重是个好主意。然而,正如我们所希望的那样,在卷积层开始变得更加复杂和更加基于内容的表述之前,在卷积层的早期选择你的风格层也是一个好主意。
生成图像
要生成图像,我们必须首先选择包含我们的内容和风格的图层,例如:
content = ' conv4 _ 2 '
style = {
“con v1 _ 1”:1.0,
“con v2 _ 1”:0.75,
“con v3 _ 1”:0.2,
“con v4 _ 1”:0.2,
“con V5 _ 1”:0.2
}
与样式层相关联的数字是我们希望赋予每个层的权重。因此,我们希望样式更多地由conv1_1图层决定,具有最低级别的要素,而不是任何其他图层。但同样,这也是可以根据你的输入和偏好来玩的东西。
现在我们将把我们的内容和风格图像分别传入我们的CNN。当我们这样做的时候,我们可以分别找到内容层conv4_2的基本表示以及内容和样式图像的每个样式层。现在我们有目标了!基本上,我们希望有一个通过美国有线电视新闻网的图像,并重现我们在通过样式图像时为我们选择的样式图层找到的相同样式表示。然后还有我们在通过内容图像时为所选内容层找到的相同内容表示。这就是乐趣开始的地方…
首先,我们需要一个我们形象的起点。由于我们最有可能尝试拥有一个看起来更像我们的内容图像但风格不同的最终产品,我们将继续制作一个内容图像的副本作为我们的初始输入。
在这一点上,我们稍微偏离了您可能习惯的常规机器学习设置。
我们实际上不是在这里训练模型,我们实际上是在训练图像。因此,我们没有将反向传播图与有线电视新闻网的权重联系起来,而是将其与输入图像(单个像素)的权重联系起来。这样,当我们发现从输入图像中找到的所选特征和我们之前准备的基本特征之间的内容和样式丢失时,执行反向传播就能导致输入图像略有变化,而不是CNN。
背后的原理是什么?
我们现在只需要一个损失函数。我们将从内容丢失开始,因为这稍微更容易解释,它只是“conv4_2”的要素图与基本内容图像(C)和新图像(X)之间的均方误差。
含量损失方程
现在对于图像的风格,我们需要简单介绍一下Gram Matrices。这些听起来比实际情况复杂得多,因此出于本文的目的,我将简单地将其描述为高维点积。直觉告诉我们,对于风格,我们并不真的想在图像的完全相同的地方重现完全相同的笔触。我们只是想在整个图像中有一个类似的风格。因此,最好根据样式表示的相似程度来计算损失,就像余弦相似度或点积一样。当然,我们必须记住,我们使用的是特征地图,它比通常的点积具有更高的维度。所以我们实际上需要使用一个Gram Matrix来封装输入X的样式和基本样式图像s之间的相关性。
风格损失方程
上图显示了封装成一个配方的情况,其中每个所选样式层的gram矩阵的均方误差损失乘以它们的权重(在上面的代码块中定义),然后求和。最后我们得到一个总损失函数,其特征在于α和β超参数乘以损失。这些决定了风格会在多大程度上被强加到最终的形象中,并留给我们自己去定义。
以上便是关于机器“做梦”的全部,如果你想尝试,GitHub上存在许多代码应该很容易使用与体验,只需将你自己的图片添加到内容和样式文件夹中,然后用新的文件名运行代码即可。