在阅读机器学习相关内容时,我经常看到“输入向量”或“特征向量”的提及,这是一种用于存储神经网络输入的一维张量。例如,一个28×28的灰度图像将被视为一个784维的向量。
此外,我还经常看到图像被描述为具有四维张量,维度包括批次数量、颜色通道、高度和宽度。例如,在弗朗索瓦·肖莱的《用Python进行深度学习》中就是这样描述的。
我想知道,为什么会有这些不同的描述方式?什么时候使用一种方式而不是另一种呢?
回答:
有两个主要考虑因素。
首先是由于批处理。由于我们通常希望基于多个训练样本(而不仅仅是一个)的梯度计算来执行每个优化步骤,因此同时进行所有样本的计算是有帮助的。因此,许多库的标准做法是将第一个维度设为批处理维度,并且所有操作都是独立地应用于第一个维度上的每个子张量。因此,实际代码中的大多数张量至少是二维的:[batch, any_other_dimensions...]
。然而,从神经网络的角度来看,批处理是一个实现细节,因此为了清晰起见,通常会被省略。你提到的链接谈到了784维的向量,这些向量在实践中几乎无疑是以批处理的方式处理的,因此批处理大小为16的示例张量将是[batch, features] = [16, 784]
。总结来说,我们将第一个维度解释为批处理维度,然后是any_other_dimensions...
,在上面的例子中恰好是一个大小为784的features
维度。
然后是四维张量,它们在使用卷积神经网络而不是全连接网络时出现。全连接网络使用完整的矩阵,这意味着前一层中的每个神经元都会影响后一层中的每个神经元。卷积神经网络可以被视为使用一种特殊结构的稀疏矩阵,其中前一层中的每个神经元只影响后一层中某些神经元,即那些在其位置附近一定距离内的神经元。因此,卷积施加了一种空间结构,需要在中间张量中反映出来。与[batch, features]
不同,我们需要[batch, x, y]
来反映数据的空间结构。最后,在日常实践中,卷积神经网络有一点全连接网络的混合:它们具有空间上局部化的多个“特征”的概念——这产生了所谓的“特征图”,张量升级为4d:[batch, feature, x, y]
。每个值tensor_new[b, f, x, x]
是基于所有前一个值tensor_previous[b', f', x', x']
计算的,受以下约束:
b = b'
:我们不混合批处理元素x'
与x
最多相距一定距离,y'
同理:我们只使用空间邻域内的值- 所有
f'
都被使用:这是“全连接”部分。
卷积神经网络比全连接网络更适合视觉任务,后者在图像足够大时变得不可行(想象一下存储一个大小为(1024 * 1024) ^ 2
的全连接矩阵,用于1024 x 1024px
的图像)。在CNN中,4d张量特定于2d视觉,你可以在1d信号处理(例如声音)中遇到3d张量:[batch, feature, time]
,在3d体数据处理中遇到5d张量[batch, feature, x, y, z]
,以及在既不是全连接也不是卷积的其他类型的网络中遇到完全不同的布局。
总结:如果有人告诉你他们使用的是1d向量,那是简化了的:几乎可以肯定他们至少使用了两个维度,用于批处理。然后,在2d计算机视觉的背景下,卷积网络是标准的,它们伴随着4d张量。在其他场景中,你可能会看到不同的布局和维度。更多的阅读可以谷歌以下关键词:fully connected neural networks
,convolutional neural networks
,minibatching
或stochastic gradient descend
(这两个术语密切相关)。