【读论文】0001 - ImageNet Classification with Deep Convolutional Neural Networks - Alex Krizhevsky, 2012

Deep CNNs 的开山之作,也是沐神讲的第一篇论文。计划把沐神讲过的论文刷完,期间每读过一篇沐神讲过的文章,奖励自己可以读一篇自己感兴趣的文章。加油加油。

摘要

摘要开门见山,说自己训练了一个深度卷积神经网络的模型,在 ImageNet LSVRC-2010(ImageNet Large-Scale Visual Recognition Challenge)比赛中,top-1top-5 错误率分别达到了 37.5% 和 17.0%,远好于此前的 SOTA 水平。

这个模型有 6 千万个参数和 65 万个神经元,网络结构为:5 个卷积层 + 3 个全连接层 + 1000 way 的 softmax 层。5 个卷积层中,有一些后面还跟着最大池化层。

此外,为了让训练更快,这里使用了不饱和神经元,以及高效的 GPU 卷积操作。

为了减少全链接层的过拟合,这里采用了 dropout 技术。

最后,该模型的变体在 ILSVRC-2012 比赛中取得了 top-5 错误率 15.3% 的最好成绩,相对的,第二名的 top-5 错误率是 26.2%。

top-1 错误率:指置信度最高的那一个标签不正确的概率。
top-5 错误率:指置信度最高的五个标签中没有正确标签的概率。
不饱和神经元:指没有被挤压到一个特定区间的值,如 ReLU,最小值被限制成了 0,最大值无限制;相对的,饱和神经元指的是被挤压到一个特定区间的值,比如 sigmoid 被限制在了[0,1]区间,tanh 被限制在了[-1,1]区间。参考于:“深度碎片”在知乎的回答:什么是 non-saturating neurons 非饱和神经元?

介绍

当时(2012年)常见的目标识别,主要由机器学习算法来实现。要想提高性能,通常要依靠收集更大的数据集,训练更有效的模型,更好地防止过拟合等方法来实现。

但之前的数据集都偏小,用来应对一些简单的识别任务还不错,特别是在做了一些保留标签的数据转换,来实现数据增强后。比如 MINIST 数字识别数据集的错误率已经接近了人类表现水平(<0.3%)。

但现实环境中的对象比数字更复杂多变,因此要更好地识别它们就需要更大的训练集。

小数据集的缺点早就已经被认识到了,但直到最近,收集上百万已标注数据集才成为可能。(因为最近才有了大数据集,还是计算机算力得到了提升?)

最近的大数据集包括有几十万完全分割的图片数据集 LableMe,和有2万2000个分类,1500万张已标注的高分辨率图像数据集 ImageNet

为了学习这超大的数据集,我们就需要一个有更大容量的模型。同时,目标识别任务的复杂性意味着,即使有 ImageNet 这样大的数据集,也无法完全指定所有情况,所以我们的模型还需要很多先验知识来补偿那些我们没有的数据。

CNNs 就是这样的一种模型,它的容量可以随着深度和宽度的改变而改变,同时,它还对图像的性质(统计数据的平稳性像素依赖的局部性等)有强有力且基本正确的假设。

因此,相较于一般的前馈神经网络,CNNs 有较少的链接和参数,这使得它们更容易训练,虽然它们的理论最好表现要稍微差一丢丢。

尽管 CNNs 有不错的性质和相对有效的局部结构,但要想实现对大尺寸高分辨率的图片进行学习,代价还是太大了。不过好在现在的 GPU 配合高度优化的 2D 卷积的实现,我们已经有能力来训练很大的 CNNs 了,正好最近这些像 ImageNet 大的数据集已经包含了足够我们用来训练模型且不至于过拟合的已标注样本。

这篇论文的主要贡献:

  1. 在 ImageNet 的子集上,训练了差不多是当前最大的 CNN,在 ILSVRC-2010 和 ILSVRC-2012 比赛中达到了最好成绩。
  2. 高度优化了 2D 卷积以及其他所有的 CNNs 操作在 GPU 上的实现,并将之开源。
  3. 该 CNNs 网络包含了许多用来提高性能和较少训练时间的新的或不常见的特征(具体在第3节)
  4. 模型太大容易过拟合,本文提出了有效预防过拟合的技术(具体在第4节)
  5. 本文发现模型的层数对 DNNs 的性能影响非常大

最后,CNN 的大小被当时 GPU 内存容量和所需要的训练时长限制了,这个 CNN 在两块 GTX580 3GB GPU 上训练大概需要 5~6 天时间。所有的实验都预示着如果有更快的 GPU 和更大的数据集,模型的性能就会更好。

LableMe 的图片样例:
demo of label me
ImageNet 的图片样例:
demo of image net
统计数据的平稳性:我目前的理解,数据的平稳性指的是数据呈现出无趋势现象,即其被限制在一定的具有上下界的区域中(比如图片数据中全部都是0~255的值)。参考于:"beatuxlee" 在经管之家的回答:请问什么是数据的平稳性?以及"aihaly" 在 CSDN 的博客:数据的平稳性
像素依赖的局部性:指的是图片相邻近的像素之间很可能存在依赖关系(属于同一个物体)。参考于:"Mark.F" 在 StackExchange 的回答:"Stationarity of statistics" and "locality of pixel dependencies"。(该回答中也有对“统计数据的平稳性的理解”,大致是在同一区域内,很可能会出现重复的小patch。我认为这种解释和“像素依赖的局部性”有点重复,所以我更认同我上面的理解一些。)

讨论

本文也没有总结,有一个讨论。

我们的结果表明,一个大的、深的卷积神经网络能够使用纯监督学习在很有挑战性的数据集上达到破纪录的结果。

需要注意,如果删除某个卷积层,我们的网络性能就会下降。比如移除任意中间层都会导致网络的 top-1 性能损失约 2%。因此可以说,深度对实现我们的结果非常重要。

为了简化实验,我们没有采用任何无监督的预训练,即使我们预期它会有帮助(特别是在如果我们能获得足够的算力来显著增加网络的大小而标注的数据量没有对应增加的情况下)。

目前为止,随着网络增大,训练时间增长,我们的结果已经有了显著改善。但要达到人类视觉系统的水平,我们还有很多重要的事情要做。

最后,我们希望在视频序列上使用非常大且深的卷积网络,视频序列的时序结构可以提供非常有帮助的信息,这些信息在静态图像上不存在或很少出现。

数据集

ImageNet:有 1500 多万张已标记的高分辨率的图片,分属 22000 个类别。

ILSVRC:一个使用 ImageNet 子集进行的比赛,包含 1000 个类别,每个类别约有 1000 章图片,总共大约 120 万张训练图片,5 万张验证图片和 15 万张测试图片。其中 ILSVRC-2010 是唯一可以使用测试集标签的版本,因此本文在这个版本上做了大多数的实验。我们也在 ILSVRC-2012 版本中使用了我们的模型,这个版本的测试机标签是不可用的,具体细节在第 6 章。

ImageNet 中常用指标是 top-5 和 top-1 错误率,top-5 指最有可能的五个标签都不正确的几率。

ImageNet 由不同分辨率的图片组成,我们的模型要使用 256*256 的固定分辨率。对应的处理方式是先将图片短边缩放至 256 像素,再从长边取中间 256 像素的图像。此外,我们没有对图片做任何其他的处理,也就是直接在每个像素的原始 RGB 值上进行了训练。

模型架构

然后我们要介绍一些网络中用到的新的或不常见的特征,共四个,按照我们预估的重要程度排序,分别是:ReLU、多GPU训练、LRN、Overlapping 池化。

ReLU Nonlinearity

将神经元的输出 \(f\) 作为输入 \(x\) 的函数来建模的一般方法是 \(\rm tanh\)\(\rm sigmoid\) 图像。就梯度下降的训练时间而言,这些饱和的非线性函数,远比不饱和的非线性函数,\(\rm ReLU\) 要慢。使用 \(\rm ReLU\) 的网络在训练时比相同结构,使用 \(\rm tanh\) 的网络快好多倍。下图展示了,在 CIFAR-10 数据集上,使用相同的四层 CNN 结构,同样达到 25% 错误率时所需要的迭代次数。依此看来,要训练我们这么大的网络,就不能使用传统的饱和神经元模型。

我们不是第一个想到要调整 CNNs 中传统神经元模型的人,也有人提过其他的非线性函数 \(f(x)=|\rm tanh(x)|\),在 Caltech-101 数据集,平均池化后的对比度归一化上效果也很好。但这里的主要目的是预防过拟合,和我们使用的 ReLU 的加速能力明显不同,更快的学习速度对于在大数据集上训练的大模型的性能有很大影响。

ReLU tanh 速度对比图
ReLU(实线) 和 tanh(虚线) 在 CIFAR-10 数据集上同样达到 25% 错误率时所需的迭代次数对比

\(\rm tanh\)\(\rm tanh(x)=\displaystyle\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}\)
\(\rm sigmoid\)\(\rm sigmoid(x)=\displaystyle\frac{1}{1+e^{-x}}\)
\(\rm ReLU\)\(\rm ReLU(x)=\max(0, x)\)
三种激活函数对比图

在多 GPU 上进行训练

PS. 沐神说,后来随着 GPU 算力的提升,这个技能好久都没有人再用到过。再后来,到现在,随着模型又变得更大,新的 GPU 也 hold 不住以后,又有人开始搞这个了。看来在后续的学习过程中也可以偶尔翻翻老论文,说不定也会有新的收获。

单张 GTX580 GPU 只有 3GB 的内存,限制了能训练的模型网络的大小。实际上,120 万张图片在这样的 GPU 上根本无法训练。因此我们把网络分布在了两个 GPU 上。现在的 GPU 已经可以直接读写另外一个 GPU 的内存了,也就是很好地适应了跨 GPU 的并行运算。我们采用的并行方案是将内核对半放在每一个 GPU 上,另外,不同 GPU 只在特定的某些层相互通信。比如第 3 层的内核能获取到来自第 2 层的所有输入,而第 4 层的内核只能获取到来自同一张 GPU 上的第 3 层的输入。选择不同的连通模式,对于交叉验证来说是一个问题,但是我们可以精确地调整通信量,直到它的计算量可接受。

这个架构有点类似于 "High-Performance Neural Networks for Visual Object Classification" 中的柱状 CNN,只不过我们的列不是独立的。

这个方案对比独立的在每个 GPU 上训练一半卷积核的方法,将我们的 top-5 和 top-1 错误率分别降低了 1.2% 和 1.7%。而且,前者还比后者稍微快一些。

原文注:
实际上,在最终的卷积层中,单 GPU 网络和双 GPU 网络拥有相同数量的内核。因为网络大多数的参数都在第一个全链接层,这一层以最后一层卷积层的输出作为输入。
所以,为了使两个网络有大约相同数量的参数,我们没有将最后一层卷积层(以及它后面的第一层全链接层)的大小减半。
因此,这种比较还要更偏向于单 GPU 网络一些,因为它实际比双 GPU 网络的一半要大一些。

局部响应归一化(LRN)

PS. 这个技术在后来已经被证明没有明显效果了,现在更常用的是 Batch Normalization。

\(\rm ReLU\) 不需要对输入进行归一化,就能很好地应对饱和问题。因为只有在 \(\rm ReLU\) 接收到训练数据产生正值输入时,所在神经元才会进行学习。不过,我们发现在后面增加一个局部归一化方案,仍然会有助于模型泛化性能的提升。

定义 \(a_{x,y}^{i}\) 表示位于 \((x,y)\) 处的,经过核 \(i\) 计算,并应用 \(\rm ReLU\) 激活的神经元操作。对应的响应归一化操作 \(b_{x,y}^i\) 的表达式为:

$\displaystyle b_{x,y}^{i}=\frac{a_{x,y}^{i}}{\Big(k+\alpha\displaystyle\sum^{\min (N-1,i+\frac n2)}_{j=\max (0,i-\frac n2)}(a_{x,y}^{j})^2\Big)^\beta}$

其中 sum 操作是在同一个空间位置中,n 个邻近的内核映射上进行的。N 是这一层所有的内核数。这种内核映射的组合是在训练开始时随机确定的。这种响应归一化的实现,灵感来源于神经科学中的真实神经之间的侧抑制现象。公式中 \(k,n,\alpha\)\(\beta\) 是需要通过验证集来确定的超参数。在我们的实验中设置了 \(k=2\),\(n=5\),\(\alpha=10^{-4}\),\(\beta=0.75\) 。这个 LRN 归一化被用在某些层的 \(\rm ReLU\) 激活计算后。

这个方法有点类似于 "What is the best multi-stage architecture for object recognition?" 的局部对比度归一化,但由于我们不减去平均活跃度,所以我们的又可以被叫做“亮度归一化”。响应归一化将 top-1 和 top-5 的错误率分别降低了 1.4% 和 1.2%。我们在 CIFAR-10 数据集上验证了该方案的有效性,一个四层 CNN,在没有使用 LRN 的情况下测试错误率为 13%,使用后达到了11%。

重叠池化

CNN 中的池化层用来汇整同一个卷积核输出的临近的神经元的值,一般这种临近操作不会重叠。更准确说,池化层可以被看做是由间隔为 \(s\) 的池化单元组成的网络。每个池化单元的大小为 \(z \times z\)\(s=z\) 时,就是 CNN 中传统的局部池化。\(s<z\) 时,就是重叠池化。在我们的实验中,具有相同输出的 \(s=2\),\(z=3\) 池化,比 \(s=2\),\(z=2\) 池化,top-1 和 top-5 错误率分别下降了 0.4% 和 0.3%。我们还发现,重叠池化的模型更不容易发生过拟合。

整体架构

如图所示,模型总共有 8 层,前五层为卷积层,后三层为全连接层。最后一层全链接的输出由一个 1000 way 的 softmax 处理成 1000 个不同的类别分布。这个网络最大化了多项式逻辑回归的目标,也就相当于最大化了在预测分布下正确标签的对数概率的平均值。

第二、四、五层卷积层的卷积核只和与它在同一个 GPU 上的前一个层相连。第三层卷积层中的卷积核与第二层中的所有核映射相连。响应归一化层在第一和第二层卷积层后面。上一节中提到的最大池化层在响应归一化层以及第五层卷积层后面。\(\rm ReLU\) 激活层在所有卷积层和全链接层的后面。

整体架构图
整体架构图

图注:架构图明确显示了两个 GPU 之间的职责划分,一个 GPU 运行图顶部的层,另一个运行图底部的层。GPU 仅在某些特定的层才进行通信。每层网络的输入及最终输出依次为 150528、290400、186624、64896、64896、43264、4096、4096、1000。

  • 第一层卷积层通过 96 个 \(11\times11\times3\) 的卷积核,以 4 个像素的步长(也就是相邻两个核中心的距离)来对 \(224\times 224\times 3\) 的输入进行扫描。
  • 第二层卷积层连接第一层 LRN 和池化层的输出,用 256 个 \(5\times5\times48\) 的卷积核进行扫描。
  • 第三层卷积层连接第二层 LRN 和池化层的输出,用 384 个 \(3\times3\times256\) 的卷积核进行扫描。
  • 第四层卷积层连接第三层的输出,用 384 个 \(3\times3\times192\) 的卷积核进行扫描。
  • 第五层卷积层连接第四层的输出,用 256 个 \(3\times3\times192\) 的卷积核进行扫描。
  • 每一个全连接层都有 4096 个神经元,最后由一个 1000 way 的 softmax 转换成 1000 个不同的标签概率。

每层网络输入及最终输出:
第一层,卷积层输入:\(150528=224\times224\times3\)
第二层,卷积层输入:\(290400=55\times55\times48\times2\),原文中这里错写成了 \(253440=48\times48\times55\times2\)
第三层,卷积层输入:\(186624=27\times27\times128\times2\)
第四层,卷积层输入:\(64896=13\times13\times192\times2\)
第五层,卷积层输入:\(64896=13\times13\times192\times2\)
第六层,全连接层输入:\(43264=13\times13\times128\times2\)
第七层,全连接层输入:\(4096=2048\times2\)
第八层,全连接层输入:\(4096=2048\times2\)
第七层,全连接层过 softmax 后输出:\(1000\)
\(224\times224\times3\)
\(224\times224\) 的输入通过步长为 4,大小为 \(11\times11\) 的卷积核是无法输出 \(55\times55\) 个神经元的。因此,有人推断这里的输入应该是 \(227\times227\),也有人推断这里应该增加了 2 个像素的 padding。我个人比较认同与后者,首先 pytorch 中的 alexnet 实现也是采用了后者,其次后面在讲到数据增强时有提到,从 \(256\times256\) 像素的图像中可以扣出 2048 个 \(224\times224\) 像素的图像(虽然这里的 2048 也不对,应该是 2178),因此这里应该不是笔误,如果是 \(227\times227\) 的话就只能扣 1800 个了。

减少过拟合

这个神经网络架构有 6 千万个参数。虽然 ILSVRC 的 1000 个类别数据集中,每个训练样本都增加了 10 bit 的图像到标签的映射约束,但这不足以在学习这么多参数的时候很好地应对过拟合的发生。我们主要用了两种方法来对抗过拟合。

数据增强

图像数据中最简单且常见的应对过拟合的方式就是保留标签式的图像转换来进行人工的数据扩充。

我们使用了两种不同形式的数据增强,两种转换都可以只消耗很少的计算量,直接从原始图片中获得。因此,我们不需要再储存转换后的图片文件。

在我们的实现中,图片转换是利用 Python 在 CPU 上,并且是在 GPU 训练前一批数据的同时进行计算的。因此,这种数据增强策略其实可以说是零计算消耗的。

第一种数据增强包括图像平移和水平镜像。我们从 \(256\times256\) 的图像中,随机提取出 \(224\times224\) 的 patch,加上翻转,总共相当于把训练图片扩充了 2178 倍。虽然这样生成的样本之间有较高的相互依赖。但若不如此,我们的网络会出现严重的过拟合。

测试的时候,我们从图片及其水平镜像的四角和中心总共提取 10 个块进行预测,并对这 10 个块最后的 softmax 输出进行平均。

第二种数据增强是改变训练图像中 RGB 通道的强度。具体来讲,我们对训练集图片的 RGB 像素进行了 PCA 提取。对于每个训练图片,我们改变几个经 PCA 找到的主成分,再将其主成分按比例增减,增减的幅值与图片对应的特征值和一个高斯随机变量的乘积成正比。这个高斯随机变量的均值为 0,标准差为 0.1。

因此,对于每个 RGB 像素 \(I_{xy}=[I_{xy}^R,I_{xy}^G,I_{xy}^B]^T\),我们添加如下的量:

$[p_1,p_2,p_3][\alpha_1\lambda_1,\alpha_2\lambda_2,\alpha_3\lambda_3]^T$

其中,\(p_i\)\(λ_i\) 分别是 RGB 像素值的 \(3\times3\) 的协方差矩阵的第 \(i\) 个特征向量和特征值。\(\alpha_i\) 是前面提到过的随机变量。对某个训练图像的所有像素,每个 \(\alpha_i\) 只获取一次,直到图像下一次训练,才重新获取。这个方案近似模拟了一个很重要的特性,即光照强度和颜色发生变化时,物体本身并没有发生变化。这个方案可以将 top-1 错误率提升 1%

10 bit 的图像到标签的映射约束:有人解释,这里的 10 bit 的约束,指的是我们每个样本需要至少 10 bit 的信息,才能表达完整 1000 个类别(\(2^{10}=1024>1000\))。我感觉这样解释不太对,但又找不到更好的解释目前。参考于:"Jaden Travik" 在 StakeExchange 的回答:"Why do we need 10 bits to represent the 1000 classes in AlexNet?"
2178:作者在这里写的是2048,应该是由 \((256-224)^2*2\) 计算所得。但其实应该是 \((256-224+1)^2*2=2178\) 才对。
改变训练图像中 RGB 通道的强度: 我理解是以 PCA 的思想,找到图片中较重要的特征,再对这些特征乘以一个高斯随机变量做变化,从而得到新的图片。而并不是真的要先进行主成分分析及提取。参考于:koshian2 的博客:PCA Color Augmentationを使ってみよう 以及其中提到的:kechan 的代码:pca_aug.py

丢弃

综合多个不同模型的预测结果是减少测试错误率的有效方法,但是对于一个已经用了好几天才训练出来的大型神经网络模型来说,这样消耗太大了。最近推出的一种叫 ‘dropout’ 的技术,以 0.5 的概率随机将每个隐藏神经元的输出设置为 0。这些被‘丢弃’的神经元不对前馈做贡献,也不参与反向传播。

这样,对于每次的输入,神经网络都会通过不同的架构进行采样,不过所有这些架构共享权重。

这个技术减少了神经元之间复杂的协同适应,因为一个神经元不能依赖于其他某个神经元的存在。也就是强制它学习了更鲁棒的特征,不同的神经元的这些随机特征相互结合,对模型性能的提升非常有效果。测试时,我们使用所有的神经元,但对它们的输出乘以 0.5,使它接近于使用 dropout 网络产生的预测分布的几何平均值。

我们在前两层全连接层后使用了 dropout。使用 dropout 之前,我们的网络过拟合很严重,使用 dropout 后,我们大约可以将迭代次数增加一倍。

学习的细节

我们用 SGD(随机梯度下降)来训练我们的模型,其中 batch size(批次大小)是 128,momentum(动量)是 0.9,weight decay(权重衰减)是 0.0005。我们发现,少量的权重衰减对模型的学习很重要,它不仅可以当做一个正则化器使用,还可以用来减少模型的训练误差。

我们权重更新的规则是:

$v_{i+1}:=0.9·v_i-0.0005·\epsilon·w_i-\epsilon·\displaystyle\Big<\frac{\partial L}{\partial w}|_{w_i}\Big>_{D_i}\\w_{i+1}:=w_i+v_{i+1}$

其中 \(i\) 是迭代索引,\(v\) 是动量变量,\(\epsilon\) 是学习率,\(\Big<\displaystyle\frac{\partial L}{\partial w}|_{w_i}\Big>_{D_i}\) 是第 \(i\) 批次 \(D_i\) 上,目标函数在 \(w_i\) 出计算的,关于 \(w\) 的微分的平均。

我们以均值为 0,标准差 0.01 的高斯分布初始化每层的权重。我们以常数 1 初始化了第二、四、五层卷积层及全连接层的神经元偏置,这种初始化方式可以通过给 ReLU 提供正值输入来加速早期阶段的学习。我们用常数 0 来初始化剩余层的神经元偏置。

我们在所有的层中使用相同的学习率,并通过训练手动调整。手动调整的触发方式方式是当验证错误率不再提高时,就将学习率除以 10。学习率初始化为 0.01,减少 3 次后终止学习。

我们在两张NVIDIA GTX 580 3GB 的 GPU 上对120万张图片进行了90个周期的训练,耗时五到六天。

结果

我们在 ILSVRC-2010 上的结果见下表:

Model Top-1 Top-5
Sparse coding 47.1% 28.2%
SIFT + FVs 45.7% 25.7%
CNN 37.5% 17.0%

我们网络的 top-1 和 top-5 错误率分别降低到了 37.5% 和 17.0%(不使用前面提到过的,通过 10 个 patch 算平均的方法的话,我们的错误率是 39.0% 和 18.3%)

ILSVRC-2010 比赛时的最好成绩是 47.1% 和 28.2%,采用的方法是对 6 个不同特征训练的稀疏编码模型的预测结果进行平均。

后来至今,已公布的最好结果分别是 45.7% 和 25.7%,采用的方法是对两个分类器的预测进行平均。该分类器是在从两种类型的密集采样特征种计算出的 Fisher Vectors(FVs,费舍尔向量)上训练所得。

我们的模型还用来测试了 ILSVRC-2012 比赛数据集,结果见下表:

Model Top-1(val) Top-5(val) Top-5(test)
SIFT+FVs - - 26.2%
1 CNN 40.7% 18.2% -
5 CNNs 38.1% 16.4% 16.4%
1 CNN* 39.0% 16.6% -
7 CNNs* 36.7% 15.4% 15.3%

其中带有 * 号的模型是经过在整个 ImageNet 2011 秋季版数据预训练得到的。

因为 ILSVRC-2012 的测试集的标签是不公开的,所以我们无法报告我们尝试过的所有模型在测试集的错误率。下面我们交替使用了验证错误率和测试错误率,因为在我们的实验中,二者相差不会超过 0.1%。

本文介绍的 CNN 的 top-5 错误率是 18.2%,将五个相似 CNN 的预测结果做平均,可以使错误率降到 16.4%。在一个 CNN 的最后一个池化层上再加上第六个卷积层,对 ImageNet 2011 秋季版本(1500 万张图片,2.2 万各类别)进行分类,然后在 ILSVRC-2012 上微调,可以使错误率降到 16.6%。用两个这样的 CNN 和前面提到的五个相似 CNN 做平均,可以使错误率降到 15.3%。在同样的数据上,第二名的错误率是 26.2%,它是对几个在 FVs 上训练的分类器的预测进行了平均。这些 FVs 是根据不同类型的密集采样特征计算来的。

最后,我们还测试了 2009 秋季版的 ImageNet 的错误率,该版本包含 10184 个类别,890 万张图片。我们按照文献中的管理,将一半图像用来训练,另一半用来测试。由于该数据集没有特定的测试集,我们自己的拆分必然不同于此前作者的拆分,但这影响不大。我们在这个数据集上的 top-1 和 top-5 错误率分别达到了 67.4% 和 40.9%,使用的是上面描述的最后池化层后有额外第6层卷积的网络。相较而言,这个数据集上已公开的错误率分别是 78.1% 和 60.9%。

定性评价

下图展示了两个数据连接层学习到的卷积核。

两个数据连接层学习到的卷积核

\(224\times224\times3\) 的输入图像上,第一层卷积层学习了 \(96\)\(11\times11\times3\) 的卷积核。前 \(48\) 个内核是在 \(GPU1\) 上学习的,后 \(48\) 个是在 \(GPU2\) 上学习的。

网络学习到了各种频率的和方向选择的内核,以及各种色彩块。注意两个 GPU 表现出的差异,这是之前提到的受限连接的结果。GPU1 上的核很大程度上与颜色无关,GPU2 上的核很大程度上与颜色有关。这样的特殊性每次运行都会产生,且独立于任何特定的权重初始化行为(只与 GPU 编号有关)。

只与 GPU 编号有关:原文写的是 'modulo a renumbering of the GPUs',我的理解是图像体现出来的差别和所有的初始化设置都没关系,只和在哪块 GPU 上有关系。但目前我还不明白为什么会有这种现象,待后续复现的时候可以验证一下看。

两个数据连接层学习到的卷积核

左展示了八个 ILSVRC-2010 测试图像和我们的模型认为最有可能的五个标签。正确的标签用红色表示。
右第一列展示了五张 ILSVRC-2010 测试图像。其余列是模型最后一个隐藏层中产生特征向量与展示图像的特征向量欧氏距离最小的来自训练集的六张图片。

左图中,我们通过对 8 个测试图像进行预测来评估网络的学习情况。可以看到,即使是偏离中心的对象,比如左上角的螨虫,也能被网络识别到。预测可能性排名前五的的大多数标签看起来都比较合理,比如豹子的其他可能性都是猫类的。某些误差的产生,也是因为照片目标的模棱两可造成的,比如格栅、樱桃等。

另一种探讨模型学习效果的方法是考虑图像在最后 4096 位隐藏层输出的特征向量。如果两个图像产生的特征向量之间欧氏距离较小,我们可以说较高级别的神经网络认为这两张图片相似。右图展示了来自测试集中的五个图像和来自训练集中的六个图像。根据该度量,这些图像最相似。可以看到在像素级别,搜索出来的训练集图像与第一列的图片的 L2距离 通常是不接近的。比如找到的狗和大象是以各种姿势出现的。我们在补充材料中给出了更多测试图像的结果。

直接通过使用两个 4096 维向量真实值去计算欧氏距离效率很低,我们可以通过训练自动编码器将这些向量压缩成短的二进制码来提高计算效率。这应该会产生比将自动编码器直接应用到原始像素更好的图像检索方法,后者不使用图像标签,因此更倾向于检索具有相似边缘模式的图像,而不管它们在语义上是否相似。

L2 距离(欧氏距离)\(d(x,y):=\displaystyle\sqrt{\sum^{n}_{i=1}(x_i-y_i)^2}\)
相似边缘模式:我理解的,应该是看起来有相似形状的图案。比如将站着的狗和坐着的狗分成不同类别,而和站着的猫分成同一类别。

总结评论

2022-10-03
算是正经读的第一篇文章,没有对比,也不知道哪里好哪里不好。创新和贡献在上面已经说过了,关于文章内容暂时就没有什么要说的了。后续复现的时候遇到什么问题再看看吧。

这篇 blog,断断续续写了一个多月,写的还有点不伦不类,翻译不像翻译,总结不像总结。后面应该调整调整,慢慢形成自己的风格才是。

另外,在写这篇博客的时候,想着同时复现一下,后来发现有点难,先放弃了,先发表文章吧,后续再复现。

posted @ 2022-10-03 20:47  washing  阅读(0)  评论(0编辑  收藏  举报