引言
深度学习目前已成为发展最快、最令人兴奋的机器学习领域之一,许多卓有建树的论文已经发表,而且已有很多高质量的开源深度学习框架可供使用。然而,论文通常非常简明扼要并假设读者已对深度学习有相当的理解,这使得初学者经常卡在一些概念的理解上,读论文似懂非懂,十分吃力。另一方面,即使有了简单易用的深度学习框架,如果对深度学习常见概念和基本思路不了解,面对现实任务时不知道如何设计、诊断、及调试网络,最终仍会束手无策。
本系列文章旨在直观系统地梳理深度学习各领域常见概念与基本思想,使读者对深度学习的重要概念与思想有一直观理解,做到“知其然,又知其所以然”,从而降低后续理解论文及实际应用的难度。本系列文章力图用简练的语言加以描述,避免数学公式和繁杂细节。本文是该系列文章中的第三篇,旨在介绍深度学习在计算机视觉的其他任务的应用。
▌网络压缩(network compression)
尽管深度神经网络取得了优异的性能,但巨大的计算和存储开销成为其部署在实际应用中的挑战。有研究表明,神经网络中的参数存在大量的冗余。因此,有许多工作致力于在保证准确率的同时降低网路复杂度。
低秩近似 用低秩矩阵近似原有权重矩阵。例如,可以用SVD得到原矩阵的最优低秩近似,或用Toeplitz矩阵配合Krylov分解近似原矩阵。
剪枝(pruning) 在训练结束后,可以将一些不重要的神经元连接(可用权重数值大小衡量配合损失函数中的稀疏约束)或整个滤波器去除,之后进行若干轮微调。实际运行中,神经元连接级别的剪枝会使结果变得稀疏,不利于缓存优化和内存访问,有的需要专门设计配套的运行库。相比之下,滤波器级别的剪枝可直接运行在现有的运行库下,而滤波器级别的剪枝的关键是如何衡量滤波器的重要程度。例如,可用卷积结果的稀疏程度、该滤波器对损失函数的影响、或卷积结果对下一层结果的影响来衡量。
量化(quantization) 对权重数值进行聚类,用聚类中心数值代替原权重数值,配合Huffman编码,具体可包括标量量化或乘积量化。但如果只考虑权重自身,容易造成量化误差很低,但分类误差很高的情况。因此,Quantized CNN优化目标是重构误差最小化。此外,可以利用哈希进行编码,即被映射到同一个哈希桶中的权重共享同一个参数值。
降低数据数值范围 默认情况下数据是单精度浮点数,占32位。有研究发现,改用半精度浮点数(16位)几乎不会影响性能。谷歌TPU使用8位整型来表示数据。极端情况是数值范围为二值或三值(0/1或-1/0/1),这样仅用位运算即可快速完成所有计算,但如何对二值或三值网络进行训练是一个关键。通常做法是网络前馈过程为二值或三值,梯度更新过程为实数值。
此外,有研究认为,二值运算的表示能力有限,因此其使用一个额外的浮点数缩放二值卷积后的结果,以提升网络表示能力。
精简结构设计 有研究工作直接设计精简的网络结构。例如,
瓶颈(bottleneck)结构及1×1卷积。这种设计理念已经被广泛用于Inception和ResNet系列网络设计中。
分组卷积。
扩张卷积。使用扩张卷积可以保持参数量不变的情况下扩大感受野。
知识蒸馏(knowledge distillation) 训练小网络以逼近大网络,但应该如何去逼近大网络仍没有定论。
软硬件协同设计 常用的硬件包括两大类:(1). 通用硬件,包括CPU(低延迟,擅长串行、复杂运算)和GPU(高吞吐率,擅长并行、简单运算)。(2). 专用硬件,包括ASIC(固定逻辑器件,例如谷歌TPU)和FPGA(可编程逻辑器件,灵活,但效率不如ASIC)。
▌细粒度图像分类(fine-grained image classification)
相比(通用)图像分类,细粒度图像分类需要判断的图像类别更加精细。比如,我们需要判断该目标具体是哪一种鸟、哪一款的车、或哪一个型号的飞机。通常,这些子类之间的差异十分微小。比如,波音737-300和波音737-400的外观可见的区别只是窗户的个数不同。因此,细粒度图像分类是比(通用)图像分类更具有挑战性的任务。
细粒度图像分类的经典做法是先定位出目标的不同部位,例如鸟的头、脚、翅膀等,之后分别对这些部位提取特征,最后融合这些特征进行分类。这类方法的准确率较高,但这需要对数据集人工标注部位信息。目前细粒度分类的一大研究趋势是不借助额外监督信息,只利用图像标记进行学习,其以基于双线性CNN的方法为代表。
双线性CNN (bilinear CNN) 其通过计算卷积描述向量(descriptor)的外积来考察不同维度之间的交互关系。由于描述向量的不同维度对应卷积特征的不同通道,而不同通道提取了不同的语义特征,因此,通过双线性操作,可以同时捕获输入图像的不同语义特征之间的关系。
精简双线性汇合 双线性汇合的结果十分高维,这会占用大量的计算和存储资源,同时使后续的全连接层的参数量大大增加。许多后续研究工作旨在设计更精简的双线性汇合策略,大致包括以下三大类:
(1) PCA降维。在双线性汇合前,对深度描述向量进行PCA投影降维,但这会使各维不再相关,进而影响性能。一个折中的方案是只对一支进行PCA降维。
(2) 近似核估计。可以证明,在双线性汇合结果后使用线性SVM分类等价于在描述向量间使用了多项式核。由于两个向量外积的映射等于两个向量分别映射之后再卷积,有研究工作使用随机矩阵近似向量的映射。此外,通过近似核估计,我们可以捕获超过二阶的信息(如下图)。
(3) 低秩近似。对后续用于分类的全连接层的参数矩阵进行低秩近似,进而使我们不用显式计算双线性汇合结果。
▌“看图说话”(image captioning)
“看图说话”旨在对一张图像产生对其内容一两句话的文字描述。这是视觉和自然语言处理两个领域的交叉任务。
编码-解码网络(encoder-decoder networks) 看图说话网络设计的基本思想,其借鉴于自然语言处理中的机器翻译思路。将机器翻译中的源语言编码网络替换为图像的CNN编码网络以提取图像的特征,之后用目标语言解码网络生成文字描述。
Show, attend, and tell 注意力(attention)机制是机器翻译中用于捕获长距离依赖的常用技巧,也可以用于看图说话。在解码网络中,每个时刻,除了预测下一个词外,还需要输出一个二维注意力图,用于对深度卷积特征进行加权汇合。使用注意力机制的一个额外的好处是可以对网络进行可视化,以观察在生成每个词的时候网络注意到图像中的哪些部分。
Adaptive attention 之前的注意力机制会对每个待预测词生成一个二维注意力图(图(a)),但对于像the、of这样的词实际上并不需要借助来自图像的线索,并且有的词可以根据上文推测出也不需要图像信息。该工作扩展了LSTM,以提出“视觉哨兵”机制以判断预测当前词时应更关注上文语言信息还是更关注图像信息(图(b))。此外,和之前工作利用上一时刻的隐层状态计算注意力图不同,该工作使用当前隐层状态。
▌视觉问答(visual question answering)
给定一张图像和一个关于该图像内容的文字问题,视觉问答旨在从若干候选文字回答中选出正确的答案。其本质是分类任务,也有工作是用RNN解码来生成文字回答。视觉问答也是视觉和自然语言处理两个领域的交叉任务。
基本思路 使用CNN从图像中提取图像特征,用RNN从文字问题中提取文本特征,之后设法融合视觉和文本特征,最后通过全连接层进行分类。该任务的关键是如何融合这两个模态的特征。直接的融合方案是将视觉和文本特征拼成一个向量、或者让视觉和文本特征向量逐元素相加或相乘。
注意力机制 和“看图说话”相似,使用注意力机制也会提升视觉问答的性能。注意力机制包括视觉注意力(“看哪里”)和文本注意力(“关注哪个词”)两者。HieCoAtten可同时或交替产生视觉和文本注意力。DAN将视觉和文本的注意力结果映射到一个相同的空间,并据此同时产生下一步的视觉和文本注意力。
双线性融合 通过视觉特征向量和文本特征向量的外积,可以捕获这两个模态特征各维之间的交互关系。为避免显式计算高维双线性汇合结果,细粒度识别中的精简双线性汇合思想也可用于视觉问答。例如,MFB采用了低秩近似思路,并同时使用了视觉和文本注意力机制。
▌网络可视化(visualizing)和网络理解(understanding)
这些方法旨在提供一些可视化的手段以理解深度卷积神经网络。直接可视化第一层滤波器 由于第一层卷积层的滤波器直接在输入图像中滑动,我们可以直接对第一层滤波器进行可视化。可以看出,第一层权重关注于特定朝向的边缘以及特定色彩组合。这和生物的视觉机制是符合的。但由于高层滤波器并不直接作用于输入图像,直接可视化只对第一层滤波器有效。
t-SNE 对图像的fc7或pool5特征进行低维嵌入,比如降维到2维使得可以在二维平面画出。具有相近语义信息的图像应该在t-SNE结果中距离相近。和PCA不同的是,t-SNE是一种非线性降维方法,保留了局部之间的距离。下图是直接对MNIST原始图像进行t-SNE的结果。可以看出,MNIST是比较容易的数据集,属于不同类别的图像聚类十分明显。
可视化中间层激活值 对特定输入图像,画出不同特征图的响应。观察发现,即使ImageNet中没有人脸或文字相关的类别,网络会学习识别这些语义信息,以辅助后续的分类。
最大响应图像区域 选择某一特定的中间层神经元,向网络输入许多不同的图像,找出使该神经元响应最大的图像区域,以观察该神经元用于响应哪种语义特征。是“图像区域”而不是“完整图像”的原因是中间层神经元的感受野是有限的,没有覆盖到全部图像。
输入显著性图 对给定输入图像,计算某一特定神经元对输入图像的偏导数。其表达了输入图像不同像素对该神经元响应的影响,即输入图像的不同像素的变化会带来怎样的神经元响应值的变化。Guided backprop只反向传播正的梯度值,即只关注对神经元正向的影响,这会产生比标准反向传播更好的可视化效果。
梯度上升优化 选择某一特定的神经元,计算某一特定神经元对输入图像的偏导数,对输入图像使用梯度上升进行优化,直到收敛。此外,我们需要一些正则化项使得产生的图像更接近自然图像。此外,除了在输入图像上进行优化外,我们也可以对fc6特征进行优化并从其生成需要的图像。
DeepVisToolbox 该工具包同时提供了以上四种可视化结果。该链接中提供了一个演示视频:Jason Yosinski
Jason Yosinski
遮挡实验(occlusion experiment) 用一个灰色方块遮挡住图像的不同区域,之后前馈网络,观察其对输出的影响。对输出影响最大的区域即是对判断该类别最重要的区域。从下图可以看出,遮挡住狗的脸对结果影响最大。
Deep dream 选择一张图像和某一特定层,优化目标是通过对图像的梯度上升,最大化该层激活值的平方。实际上,这是在通过正反馈放大该层神经元捕获到的语义特征。可以看出,生成的图像中出现了很多狗的图案,这是因为ImageNet数据集1000类别中有200类关于狗,因此,神经网络中有很多神经元致力于识别图像中的狗。
对抗样本(adversarial examples) 选择一张图像和一个不是它真实标记的类别,计算该类别对输入图像的偏导数,对图像进行梯度上升优化。实验发现,在对图像进行难以察觉的微小改变后,就可以使网络以相当大的信心认为该图像属于那个错误的类别。实际应用中,对抗样本会将会对金融、安防等领域产生威胁。有研究认为,这是由于图像空间非常高维,即使有非常多的训练数据,也只能覆盖该空间的很小一部分。只要输入稍微偏离该流形空间,网络就难以得到正常的判断。
▌纹理生成(texture synthesis)和风格迁移(style transform)
给定一小张包含特定纹理的图像,纹理合成旨在生成更大的包含相同纹理的图像。给定一张普通图像和一张包含特定绘画风格的图像,风格迁移旨在保留原图内容的同时,将给定风格迁移到该图中。
特征逆向工程(feature inversion) 这两类问题的基本思路。给定一个中间层特征,我们希望通过迭代优化,产生一个特征和给定特征接近的图像。此外,特征逆向工程也可以告诉我们中间层特征中蕴含了多少图像中信息。可以看出,低层的特征中几乎没有损失图像信息,而高层尤其是全连接特征会丢失大部分的细节信息。从另一方面讲,高层特征对图像的颜色和纹理变化更不敏感。
Gram矩阵 给定D×H×W的深度卷积特征,我们将其转换为D×(HW)的矩阵X,则该层特征对应的Gram矩阵定义为
通过外积,Gram矩阵捕获了不同特征之间的共现关系。
纹理生成基本思路 对给定纹理图案的Gram矩阵进行特征逆向工程。使生成图像的各层特征的Gram矩阵接近给定纹理图像的各层Gram。低层特征倾向于捕获细节信息,而高层特征可以捕获更大面积的特征。
风格迁移基本思路 优化目标包括两项,使生成图像的内容接近原始图像内容,及使生成图像风格接近给定风格。风格通过Gram矩阵体现,而内容则直接通过神经元激活值体现。
直接生成风格迁移的图像 上述方法的缺点是需要多次迭代才能收敛。该工作提出的解决方案是训练一个神经网络来直接生成风格迁移的图像。一旦训练结束,进行风格迁移只需前馈网络一次,十分高效。在训练时,将生成图像、原始图像、风格图像三者前馈一固定网络以提取不同层特征用于计算损失函数。
示例归一化(instance normalization) 和批量归一化(batch normalization)作用于一个批量不同,示例归一化的均值和方差只由图像自身决定。实验中发现,在风格迁移网络中使用示例归一化可以从图像中去除和示例有关的对比度信息以简化生成过程。
条件示例归一化(conditional instance normalization) 上述方法的一个问题是对每种不同的风格,我们需要分别训练一个模型。由于不同风格之间存在共性,该工作旨在让对应于不同风格的风格迁移网络共享参数。具体来说,其修改了风格迁移网络中的示例归一化,使其具有N组缩放和平移参数,每组对应一个不同的风格。这样,我们可以通过一次前馈过程同时获得N张风格迁移图像。 |