深度卷积网络
深度卷积网络
-
LeNet-5是一种开创性的神经网络结构,针对手写数字识别的灰度图像,网络架构如下图所示:
LeNet输入是 \(32 \times 32 \times 1\) 维的手写数字识别的灰度图像。
卷积层 1:6 个 \(5 \times 5\) 卷积核,步幅 1,无 Padding,输出 \(28 \times 28 \times 6\) 。
池化层 1:平均池化, \(2 \times 2\) 卷积核,步幅 2,输出 \(14 \times 14 \times 6\) 。
卷积层 2:16 个 \(5 \times 5\) 卷积核,无 Padding,输出 \(10 \times 10 \times 16\) 。
池化层 2:平均池化, \(2 \times 2\) 卷积核,步幅 2,输出 \(5 \times 5 \times 16\) 。
全连接层:400 个节点连接到 120 个神经元,之后再接一个 84 个节点的全连接层。
输出层:最终分类 10 个数字,使用 softmax(当时使用的是其他分类器)。
LeNet-5参数量约为6万,激活函数为Sigmoid和Tanh,图像尺寸逐渐缩小( \(32 \rightarrow 28 \rightarrow 14 \rightarrow 10 \rightarrow 5\) ),通道数逐渐增多( \(1 \rightarrow 6 \rightarrow 16\) )。
-
AlexNet是卷积神经网络首次在计算机视觉中大规模应用,是基于ImageNet的架构,网络架构如下图所示:
AlexNet输入尺寸为 \(224 \times 224 \times 3\),在这里暂且使用 \(227 \times 227 \times 3\) 。
卷积层 1:96 个 \(11 \times 11\) 卷积核,步幅 4,无 Padding,输出 \(55 \times 55 \times 96\) 。
池化层 1:最大池化, \(3 \times 3\) 卷积核,步幅 2,输出 \(27 \times 27 \times 96\) 。
卷积层 2:256 个 \(5 \times 5\) 卷积核,Same Padding,输出 \(27 \times 27 \times 256\) 。
池化层 2:最大池化, \(3 \times 3\) 卷积核,步幅 2,输出 \(13 \times 13 \times 256\) 。
卷积层 3:384 个 \(3 \times 3\) 卷积核,Same Padding,输出 \(13 \times 13 \times 384\) 。
卷积层 4:384 个 \(3 \times 3\) 卷积核,Same Padding,输出 \(13 \times 13 \times 384\) 。
卷积层 5:256 个 \(3 \times 3\) 卷积核,Same Padding,输出 \(13 \times 13 \times 256\) 。
池化层 3:最大池化, \(3 \times 3\) 卷积核,步幅 2,输出 \(6 \times 6 \times 256\) 。
全连接层:展开为 9216 个节点,经过两层 4096 节点的全连接层。
输出层:1000 个类别,用 softmax 分类。
AlexNet参数约为6000万,参数量显著增加,性能优于 LeNet。首次采用 ReLU 激活函数,提高训练速度。使用 GPU 加速,并分布到两个 GPU 进行训练。还引入局部响应归一化(LRN)层,但后续被证明效果有限。
-
VGG-16是深度与规则化设计的代表,追求更深、更规整的网络结构,网络架构如下图所示:
VGG-16输入尺寸为 \(224 \times 224 \times 3\) ,采用的卷积核和池化核都是一样的。
卷积层 1:2 个 \(3 \times 3\) 卷积核,步幅 1,Same Padding,64 个通道,输出 \(224 \times 224 \times 64\) 。
卷积层 2:2 个 \(3 \times 3\) 卷积核,步幅 1,Same Padding,128 个通道,输出 \(112 \times 112 \times 128\) 。
卷积层 3:3 个 \(3 \times 3\) 卷积核,步幅 1,Same Padding,256 个通道,输出 \(56 \times 56 \times 256\) 。
卷积层 4:3 个 \(3 \times 3\) 卷积核,步幅 1,Same Padding,512 个通道,输出 \(28 \times 28 \times 512\) 。
卷积层 5:3 个 \(3 \times 3\) 卷积核,步幅 1,Same Padding,512 个通道,输出 \(14 \times 14 \times 512\) 。
池化层:每组卷积后接一个 \(2 \times 2\) 最大池化层,步幅 2,尺寸减半。
全连接层:最后将 \(7 \times 7 \times 512\) 展开为 4096,接两个全连接层, softmax 输出 1000 类。
VGG-16参数约为1.38亿,卷积层卷积核固定为 \(3 \times 3\) ,最大池化固定为 \(2 \times 2\) ,结构简洁规整。每组卷积后通道数量倍增( \(64 \rightarrow 128 \rightarrow 256\rightarrow512\) )。16层的深度网络带来更高的表达能力,但训练代价较高。
-
在训练深度神经网络时,由于梯度消失和梯度爆炸问题,非常深的网络会导致训练难度增加,优化算法难以有效传播梯度。普通网络中,随着深度增加,训练误差可能先减少后增多。理论上,深度网络应具有更好的表现,但普通网络难以实现这一点。
何恺明提出了跳跃连接(Skip Connection),将某一层的激活值跳过中间的若干层,直接传递到更深层。在残差块中,激活值 \(a^{[l]}\) 跳过两层,直接与更深层的线性输出 \(z^{[l+2]}\) 相加。
\[z^{[l+1]} = W^{[l+1]}a^{[l]} + b^{[l+1]} \\ a^{[l+1]} = g(z^{[l+1]}) \\ z^{[l+2]} = W^{[l+2]}a^{[l+1]} + b^{[l+2]} \\ \red{a^{[l+2]} = g(z^{[l+2]} + a^{[l]})} \]跳跃连接提供了一条额外的信息传递路径,使深层网络的梯度能够有效回传,加速收敛并改善深度网络的训练效果。
基于跳跃连接,可以构建残差块(Residual Block)。在两层网络之间增加一条捷径,将输入直接加到输出。要注意,跳跃连接的时机是线性激活之后,ReLU激活之前。
ResNet使用残差块堆叠,构建深度网络,每两层网络增加一条跳跃连接,形成一个残差块。残差块之间可能包含多个卷积层或池化层。常见的 ResNet 深度为 18 层、34 层、50 层、101 层、152 层等。实验表明,即使是 1000 多层的 ResNet,也能有效训练。
ResNet训练误差随着深度增加仍然保持较低,在梯度消失和梯度爆炸问题上表现优异。
-
在ResNet中,残差块激活公式为 \(a^{\left[l+2\right]} = g(z^{\left[l+2\right]} + a^{\left[l\right]}) = g(W^{\left\lbrack l + 2 \right\rbrack}a^{\left\lbrack l + 1 \right\rbrack} + b^{\left\lbrack l + 2 \right\rbrack} + a^{\left\lbrack l\right\rbrack})\), \(z^{\left[l+2\right]}\) 是通过主路径计算得到的线性激活结果, \(a^{\left[l\right]}\) 通过跳跃连接直接传递给更深层。
在整个网络中使用 ReLU 激活函数,所以激活值都大于等于0。在网络中,如果使用L2正则化,会惩罚压缩 \(W^{\left\lbrack l + 2\right\rbrack}\) 和 \(b^{\left\lbrack l + 2 \right\rbrack}\) 的值。最极端的情况就是 \(W^{\left\lbrack l + 2\right\rbrack} = b^{\left\lbrack l + 2 \right\rbrack} = 0\) ,最后 \(a^{\left\lbrack l + 2 \right\rbrack} = \ g\left( a^{[l]} \right) = a^{\left\lbrack l\right\rbrack}\) ,即残差块学习到的是恒等函数。即使增加两层网络,也能保证网络性能不会下降。如果隐藏层学习到有用的特征,性能会优于恒等函数。
-
在残差块学习的时候,需要保证 \(z^{[l+2]}\) 和 \(a^{[l]}\) 的维度一致,才能相加。在ResNet中,大量使用 \(3 \times 3\) 的same卷积,因此能保证两者的维度一致。
当维度不一致的时候,会通过线性变换进行调整。可以通过 \(W_s\) 矩阵调整,假设 \(a^{[l]}\) 的维度为 \(C_{in}\), \(z^{[l+2]}\) 的维度为 \(C_{out}\),那么可以使用 \(W_S \in \mathbb{R}^{C_{out} \times C_{in}}\) 矩阵进行线性变换, \(a^{\left[l+2\right]} = g(z^{\left[l+2\right]} + W_sa^{\left[l\right]})\) ,从而将输入的特征映射到目标维度。矩阵 \(W_s\) 可以通过反向传播进行学习优化。
-
\(1 \times1\) 卷积使用大小为 \(1 \times 1\) 的卷积核对输入进行卷积操作,每个卷积核对应一个权重向量,作用于输入特征图的每个位置。在通道维度上对每个位置的所有通道值进行线性组合,并添加非线性激活函数(如 ReLU),使网络能够学习复杂的非线性关系。
另外,可以通过改变卷积核的数量调整输出通道数。压缩通道数可以降低计算复杂度。扩展通道数可以提高特征表达能力。
-
Inception模块可以自动选择适合的卷积核大小(如 \(1\times1\) 、 \(3\times3\) 、 \(5\times5\) )以及是否使用池化层,而无需人工设计,将所有可能的卷积和池化操作的输出堆叠在一起。
假设输入维度为 \(28 \times 28 \times 192\) ,使用多种卷积核并行计算,使用 \(1\times1\) 卷积输出 \(28\times28\times 64\) ,使用 \(3\times3\) 卷积输出 \(28\times28\times 128\) ,使用 \(5\times5\) 卷积输出 \(28\times28\times 32\) ,使用卷积层输出 \(28\times28\times32\) ,将各操作的结果沿通道维度堆叠起来,形成最终输出 \(28\times28\times256\) 。
然而直接使用较大的卷积核会导致极高的计算成本,例如 \(5\times5\) 卷积的总运算次数约为 1.2 亿次。可以通过瓶颈层降低计算成本,先使用 \(1\times1\) 卷积压缩通道数,再执行较大的卷积操作。对输入层 \(28 \times 28 \times 192\) ,使用 16 个 \(1\times1\times192\) 的卷积核,输出 \(28\times28\times16\) 。对该输出执行 \(5\times5\times16\) 的卷积,最终得到 \(28\times28\times32\) 。使用瓶颈层的总计算成本为约 1204 万次,相比直接执行 \(5\times5\) 卷积,计算量减少至原来的十分之一,并且保留关键特征,不影响网络性能。
-
Inception Network通过堆叠多个 Inception 模块构建网络,每个模块并行执行多种卷积和池化操作。在进行池化的时候,输出为 \(28\times28\times192\) ,这里的通道数过多,因此采用 32 个 \(1\times1\) 卷积,将通道数缩小为 \(28\times28\times32\) ,从而避免了最后输出时池化层占据大部分通道。
将9个Inception模块堆叠起来构建Inception Network,每个模块并行执行多种卷积和池化操作,支持多尺度特征提取。
同时,Inception Network在特定位置插入最大池化层或平均池化层,逐步降低特征图的空间分辨率。还在部分中间层加入分支结构,提前通过全连接层和 softmax 进行预测。有助于提高中间层的特征学习能力,防止网络过拟合。
-
传统卷积神经网络(如 ResNet、Inception)计算成本高,难以在低计算资源(如手机、嵌入式设备)上运行。MobileNets 提供了一种轻量级架构,能够在低计算环境中高效运行,同时保持较好的性能,主要采用的是深度可分离卷积技术。
深度可分离卷积通过深度卷积和逐点卷积替代传统卷积,大幅降低计算成本。
深度卷积对输入的每个通道独立应用一个小的二维卷积核,计算得到对应通道的输出,输出通道数与输入通道数通道数相同。
逐点卷积使用 \(1\times1\) 卷积将深度卷积的输出进行通道间的线性组合,从而调整输出的通道数。
可以证明,深度可分离卷积的计算成本约为普通卷积的31%,在实际网络中,成本可降低至1/9,性能得到了显著提升。
MobileNet v1 架构将深度可分离卷积模块堆叠13次,形成主要网络层,最后添加池化层和全连接层,通过 Softmax 输出分类结果。
MobileNet v2 架构对 MobileNet v1 进行了改进,深度可分离卷积依然是网络的基础,但引入了瓶颈块,增强特征学习能力并减少内存需求。还引入跳跃连接,将输入直接传递到输出,有效缓解梯度消失问题。
瓶颈块的结构为:
- 拓展层使用 \(1\times1\) 卷积,将通道数扩展为原来的 6 倍,即 \(n\times n \times n_c \rightarrow n\times n \times 6n_c\) 。
- 深度卷积对每个通道独立应用卷积,使用 Same padding,保持输出空间维度不变。
- 投影层(逐点卷积)使用 \(1\times1\) 卷积将通道数降维,投影回较小的通道数。
- 如果输入和输出通道数一致,通过残差连接直接将输入加入输出。
MobileNet v2 架构重复堆叠瓶颈块 17 次,使用池化层和全连接层通过 Softmax 输出分类结果。
拓展层增加了表示能力,使网络能够学习更丰富的特征。投影层减少计算资源占用,优化内存使用。残差连接改善梯度流动,减少深度网络的训练难度。
-
手动调整网络规模(图像分辨率、深度、宽度)耗时且不一定高效,EfficientNet提供一种高效且通用的网络扩展复合缩放方法,根据特定计算预算优化网络的性能。
神经网络的三大维度:图像分辨率 \(r\) 是输入图像的尺寸,提高分辨率可以捕获更多细节,但增加计算成本;网络深度 \(d\) 是网络层数,增加深度可以提取更高层次的特征;网络宽度 \(w\) 是每层网络的通道数,增加宽度可以捕获更多的特征。
如何同时调整 \(r\) 、 \(d\) 、 \(w\) 以在计算预算内获得最佳性能?
EfficientNet令 \(d=\alpha^{\phi}, w=\beta^{\phi},r=\gamma^{\phi}\) ,其中 \(\phi\) 表示扩展因子,用于控制整体规模的变化。而 \(\alpha,\beta,\gamma\) 分别表示深度、宽度和分辨率的比例因子,满足约束 \(\alpha \cdot \beta^2 \cdot \gamma^2 \approx 1\) ,这一约束确保网络扩展后的计算量接近恒定。
因此,EfficientNet可以根据设备资源自动扩展或缩小网络,适用于各种计算环境。
-
迁移学习使用其他研究者在大规模公开数据集(如 ImageNet、MS COCO 等)上预训练好的模型和权重,作为自己任务的起点,可以节省训练时间和计算资源。
对于小型数据集,如训练一个猫的检测器,识别三种类别,只有少量样本图片,可以下载预训练网络(如基于 ImageNet 的模型),冻结前面的层,仅训练最后的分类层(Softmax 层)。
对于中型数据集,拥有更多标注样本,但仍不足以从头训练整个网络,可以冻结较少的层,仅训练后面的几层,或者用预训练权重初始化后几层,并从这一层开始进行梯度下降。
对于大型数据集,样本数量足够大,可以下载预训练网络,将所有层的权重作为初始化,然后使用自己的数据训练整个网络,以优化所有层的权重。
总的来说,迁移学习的步骤就是首先下载公开的预训练网络模型,移除原始的输出层,替换为自己的分类层。然后冻结部分层的参数,使其不可更新。数据集越小,冻结的层越多,仅训练最后的分类器。数据集越大,解冻更多层或全部层进行训练。
加速训练的技巧:预计算固定层的输出激活值,存储在硬盘中,用这些固定激活值作为输入,仅训练最后的分类器。
但是迁移学习也存在一定的局限性。预训练网络可能对原始任务优化过度,迁移到其他任务时存在性能损失。如果目标任务与预训练任务差异较大(如医学图像与自然图像),迁移学习效果可能不佳。
-
数据扩充是一种通过对现有数据进行变换,生成更多样本的技术,用于缓解数据不足的问题。
常见的数据扩充方法:
- 镜面对称:将图像水平翻转或垂直翻转。
- 随机裁剪:从图像中随机裁剪不同的区域,模拟拍摄过程中不完整物体的场景。
- 旋转:随机旋转一定角度。
- 剪切:水平或垂直拉伸图像,使图像产生变形。
- 局部扭曲或弯曲:模拟图像局部变形。
- RGB通道调整:给红、绿、蓝通道分别加上或减去一定的偏差值。
- 颜色失真:根据概率分布对 RGB 通道进行偏移,模拟光照、环境颜色变化。
- PCA颜色增强:对颜色空间进行调整,保持图像颜色一致性但增强多样性。
实时扩充:使用线程实现实时扩充,在模型训练的同时动态生成扩充数据,提高数据加载和处理效率。
预处理扩充:预计算扩充后的数据并保存到硬盘,避免训练过程中反复计算扩充数据,适用于扩充计算成本较高的场景。
通过数据扩充,可以增强模型对变换的鲁棒性,降低过拟合,也可以通过变换模拟环境变化(如光照、视角差异等),并且无需收集额外数据,通过现有数据生成更多样本。但是也具有一些局限性:过度裁剪或变换可能导致标签与样本不匹配(标签失真风险),某些任务对扩充方法敏感(如医学图像分类),扩充过多可能增加训练复杂性。
-
图像识别和对象检测是复杂的任务,需要从像素中提取信息并理解内容,即使拥有超过百万张图片的大数据集,仍可能感到数据不足。图像识别任务需要分类标签,标注成本相对较低。而目标检测任务需要边框标注,数据获取成本更高。
当数据充足时,可以使用简单的神经网络架构,学习系统能够自动提取特征,减少手工工程的需求。数据不足时,手工工程变得重要,需要更多技巧(如特征工程、架构设计),也就是可以使用一些小tricks。
在竞赛中,可以采用集成方法,训练多个神经网络,然后对他们的预测结果取平均。也可以采用多裁剪方法,对测试图像进行多种裁剪(如中心裁剪、四角裁剪及其镜像),将所有裁剪图像通过模型进行预测取平均。但是这些方法会增加内存需求、计算开销和运行时间,不适用于实时生产环境。