摘要:深度神经网络的本质是将神经网络堆叠在一起,但不同的网络架构和超参数选择会让性能差异天差地别。本节学习了从AlexNet到DenseNet的经典CNN架构,揭示每一项技术创新背后的直觉与数学洞察,建立对深度学习发展的直觉,帮助自己搭建网络架构。
尽管深度神经网络的概念非常简单,但不同的网络架构和超参数选择下,性能差异往往天差地别。本节学习的神经网络是将人类直觉和相关数学见解结合后,经过大量研究试错的结晶。
此外,还学习了:批量规范化(batch normalization)和残差网络(ResNet)等,它们为设计和训练深度神经网络提供了重要思想指导。
AlexNet:深度卷积网络的里程碑
从人工设计特征到网络学习特征的突破
1990-2012年间,传统机器学习方法在计算机视觉领域占主导。卷积神经网络只在小数据集上表现优异,原因是:没有足够计算资源支持更大更深的网络、没有掌握一定的训练技巧。
传统机器学习流程是:传感器收集数据 → 手工提取特征 → 送入分类器。
2012年之前,图像特征依靠人工设计。但Yann LeCun、Geoff Hinton、Yoshua Bengio等研究者认为:特征本身应该被学习,且应由多个共同学习的神经网络层组成。
AlexNet在2012年ImageNet挑战赛中取得了轰动一时的成绩。模型的底层学习了类似传统滤波器的特征抽取器,更高层表示更大特征如眼睛、鼻子、草叶等,更高层则可检测整个人、飞机、狗或飞盘。
突破的关键:数据与硬件
深度网络需要大量有标签数据才能展现显著优势。90年代预算有限难以实现大规模训练,但2009年ImageNet数据集发布,100万样本、1000个类别标注,极大促进了深度网络性能挖掘。
深度网络计算资源要求极高。CPU多核像资深大学教授,能力强但成本高,用来做海量矩阵运算太浪费。GPU小核心像普通流水线工人,单个能力弱但成本低、人海战术能并行处理海量计算。
为什么CPU靠多核硬堆矩阵运算成本极高?原因有三:CPU核心带超大缓存、分支预测等复杂逻辑,芯片面积和制造成本巨高;CPU主频高,功耗随频率平方暴涨;CPU内存带宽远低于GPU。
2012年,Alex Krizhevsky和Ilya Sutskever实现了可以在GPU上运行的深度卷积神经网络,使用两个3GB NVIDIA GTX580 GPU实现了快速卷积运算,cuda-convnet推动了深度学习热潮。
AlexNet网络结构
AlexNet证明了学习到的特征可以超越手工设计的特征。AlexNet比LeNet5深得多,由八层组成:五个卷积层、两个全连接隐藏层和一个全连接输出层。
第一个卷积核是11×11,通道96。越往后核越小、通道越多,第二层卷积核5×5,通道256,第三四五层3×3,通道384。第1、2、5层卷积后都有最大池化。
AlexNet使用ReLU而不是sigmoid作为激活函数。ReLU计算更简单,不需要复杂的求幂运算。更重要的是,当sigmoid输出接近0或1时,这些区域的梯度几乎为0,反向传播无法更新参数。ReLU在正区间的梯度总是1,训练更稳定。
针对过拟合,AlexNet采用Dropout以及数据增强(翻转、裁切、变色)增加训练样本数。
net = nn.Sequential( nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=3, stride=2), nn.Flatten(), nn.Linear(6400, 4096), nn.ReLU(), nn.Dropout(p=0.5), nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(p=0.5), nn.Linear(4096, 1000))
VGG:使用块的网络
AlexNet尽管有效,但未给模板。VGG中使用块的思想,将带填充的卷积、非线性激活、汇聚层下采样看作一个块,便于复用。
VGG块由n个3×3卷积核(通道数为out_channel、填充1)、n个ReLU、一个步幅为2的2×2汇聚层组成。只需给入卷积核数n、输入通道数、输出通道数,即可构造一个VGG块。
VGG的核心洞察:深层且窄的卷积(即3×3)比较浅层且宽的卷积更有效。在缩减到相同分辨率的条件下,深层且窄的卷积使用参数更少、且每个像素感受野更大。
NiN:1×1卷积构建像素内多层感知机
LeNet、AlexNet、VGG的设计模式都是:卷积层和汇聚层提取空间结构特征,然后展平特征用全连接层处理。
展平使用全连接层会丢失空间特征表示。NiN使用1×1卷积对每个像素的通道进行全连接映射,高和宽不变,不会丢失空间结构。
每个NiN块大致组成:自定义卷积窗口 + ReLU + 1×1卷积 + ReLU + 1×1卷积 + ReLU。
相比其他网络,NiN使用全局平均池化,以及让通道数等于类别个数的方式得到分类概率,显著节省参数。
GoogLeNet:并行组合不同卷积信息
2014年,GoogLeNet对使用什么大小的卷积核合适给出了答案:有时不同大小的卷积核组合起来是有利的。
Inception块相当于一个有4条路径的子网络。它通过不同窗口形状的卷积层和最大汇聚层来并行抽取信息,使用1×1卷积层减少通道维数从而降低模型复杂度。
GoogLeNet将多个设计精细的Inception块与其他层串联起来。它以较低的计算复杂度提供了类似的测试精度。
Batch Normalization:加速收敛的标准化
深层网络的训练难以在短时间收敛。
深层网络训练的挑战:
• 数据预处理对结果影响巨大
• 不同层变量或参数值变化莫测,阻碍收敛
• 深层网络复杂,易过拟合
批量规范化对选中的层的样本的每个特征维度分别进行标准化,即减去均值再除以方差。加上比例系数和比例偏移两个参数随模型更新。
注意事项:
• 批量大小的设置影响较大,一般50-100,不可为1
• 批量规范化是在卷积层或全连接层之后、相应的激活函数之前应用的
• 训练时计算小批量的均值和方差,测试时计算整个数据集的均值和方差
ResNet:破解网络退化,构建函数嵌套空间
直觉来看,网络越深,模型越复杂,效果应该更好。但现实是当网络很深时,效果反而更差。
发生网络退化,说明深层网络的学习倾向偏移到一个比浅层网络更偏离目标函数的空间中。
为什么堆叠无法保持浅层网络空间能力?从数学计算来看,设x₁=ReLU₁(BN₁(CNN₁(x))),x₂=ReLU₂(BN₂(CNN₂(x₁)))。要使x₂=x₁,需要满足苛刻的约束条件:x₁非负、CNN₂权重为1,这使得网络很难回到浅层模型空间。加上梯度累乘项随层数增加会接近0,网络参数倾向于陷入局部最优,因此更偏离目标空间,表现为网络退化-深层还不如浅层效果好。
ResNet的解决方案:构造残差块,直接将上一层的输入x加到这一层ReLU输出前,实现显式嵌套。深层模型参数更新时比较容易回到浅层模型的空间,模型至少不会退化到比浅层差。
此外,残差块使附加层的参数要拟合的目标变为y-x,深层参数更易学习,浅层参数的直接加入使梯度不会因累乘项趋于0而消失,使得深层更有效。
DenseNet:稠密连接的拓展
从函数的角度看,ResNet将最终要学习的f(x)拆分为了x和g(x)。是否可以拆分为多个部分,使每一层都作为一个部分被紧紧连接?
DenseNet定义稠密块连接块中每个卷积块的输入输出(使用通道维度拼接,而非加和)、过渡层减少通道数或降采样从而减小复杂度。
留言:本节了解了数字大脑的视觉皮层的发展过程:从传统机器学习,到适用大规模数据集的gpu加速的深度学习;从全连接到1×1卷积构建像素内多层感知机,保持空间结构信息不被破坏;从难以支持深层数量到破解网络退化的resnet;辅以加速收敛、维持数值和泛化稳态的Batch Normalization的技巧,共同造就了更强的视觉能力。
关注小鱼,一起游历AI世界