YOLO 系列检测模型自 2015 年推出以来,不断发展和演进,在计算机视觉领域取得了显著成就。
YOLOv1
YOLOv1 将目标检测问题视为回归问题,通过单个卷积神经网络实现端到端的训练。其网络结构借鉴了 GoogLeNet,使用 1x1 卷积层加 3x3 卷积层替代 inception module。网络将输入图像划分成 7x7 的网格,每个网格预测两个边界框及类别信息。在损失函数方面,未采用传统的平方和误差损失,而是①对边界框坐标预测损失和未包含物体的边界框概率损失施加不同权重,②同时为缓和大尺寸和小尺寸框在损失计算中的不平衡问题,将框的宽度和高度取平方根代替原本的尺寸(非线性压缩)。优点是检测速度快,基础网络可以跑到 45fps,小版本 FastYOLO 每秒处理速度达 155 帧,能基于整张图片信息进行预测,学到的图片特征更为通用。但也存在一些问题,比如定位不够准确,和基于 region proposal 类的方法相比找回率更低。
非线性压缩
在物体检测任务中,大尺寸和小尺寸框在损失计算中的不平衡问题主要来源于边界框的尺寸差异。当使用原始的宽度和高度计算损失时,较大框的损失值会远大于小框的损失值,导致模型在训练时更关注大框,从而忽略小框的学习,影响小物体的检测精度。
为了解决这个问题,将框的宽度和高度取平方根,主要有以下几个原理和优点:
-
缩小尺寸差异: 通过对宽度和高度取平方根,可以有效地减小大尺寸框与小尺寸框之间的差距。例如,宽度为100的框与宽度为1的框,损失的差异很大,而取平方根后,这个差异会减小,促进模型更平衡地关注不同尺寸的框。
-
非线性压缩: 平方根操作是一种非线性变换,它将大尺寸的数值压缩得更厉害,而对小尺寸的数值影响较小。这种处理方式可以使得损失计算对各种尺寸框的反应更加均匀,降低了大尺寸框对损失计算的主导影响。
-
改进梯度更新: 在损失计算中,较小的损失值意味着相应的框在训练中会受到更大的关注。通过平方根变换,较小框的损失值在总损失中占有相对重要的比例,从而使得模型在训练过程中能更有效地学习到小物体的特征。
-
增强模型的泛化能力: 通过均衡大尺寸和小尺寸框的损失计算,模型能更好地适应不同尺寸的物体,从而提升整体的检测性能,尤其是在复杂场景下的小物体检测。
总体来说,这种方法的核心思想是通过对尺寸的非线性处理,缓和了不同尺寸框在损失计算中造成的不平衡,使得模型能够更全面地学习各种尺寸物体的特征。
YOLOv2
YOLOv2 在第一个版本的基础上做了不少改进。①首先是引入了批量归一化(Batch Normalization),加上之后能防止过拟合并加速收敛,使模型的平均准确率提升了 2%。进行高分辨率训练,②将预训练分成两步,先用 224×224 的输入从头开始训练网络,再将输入调整到 448×448 继续训练,最后在检测数据集上 fine-tuning,这种方法提高了模型在高分辨率图像上的检测性能,使平均准确率提升了 4%。③采用新网络和跳跃结构,性能更好的网络加上 passthrough 层,将浅层特征与深层特征融合,提升了检测效果。多尺度训练也为模型带来了约 1 个点的提升。此外,④YOLOv2 还引入了 anchor 机制,每个网格对应 5 个 box,且类别可以不同,通过对数据集的聚类分析得到先验的宽高,提高了目标的定位准确率。
Batch Normalization
引入批量归一化(Batch Normalization, BN)在深度学习模型中具有多种优点,尤其是能够防止过拟合并加速收敛,其原因主要体现在以下几个方面:
-
稳定分布: BN通过在每个小批量上对激活值进行归一化,使得每层的输入分布在训练过程中保持相对稳定。这种稳定性减小了内部协变量偏移(internal covariate shift),使得后续层的训练更容易和更快。
-
加快收敛速度: 由于每层的输入被归一化,模型对学习率的选择变得更加宽容。可以使用更大的学习率,这样在训练初期,模型参数可以更快地更新,从而加速收敛。
-
正则化效果: BN在一定程度上引入了噪声,因为每次计算均值和方差时都依赖于一个小批量的数据。这种噪声类似于Dropout等正则化技术,能帮助模型在训练时更好地泛化,从而降低过拟合的风险。
-
减少对初始化的敏感性: BN的引入使得模型对权重初始化的敏感性降低。因为归一化操作可以使得不同的初始权重导致的激活分布差异减小,进而使得模型在训练初期更加稳定。
-
激活函数的有效性: 由于激活值的范围被限制在一个合理的范围内,BN能够避免激活函数(如ReLU)饱和问题的出现,保持激活值在一个有效的范围内,有助于更有效地进行反向传播。
综合来看,批量归一化不仅提高了训练速度,还增强了模型的鲁棒性,减少了过拟合的风险。这使得BN成为深度学习模型中一种非常常用且有效的技术。
分步训练
模型多步训练的原因和意义可以从以下几个方面进行分析:
原因
-
复杂性管理: 逐步训练允许模型从简单到复杂逐渐学习。在初期使用较小的数据集和简单特征,可以帮助模型建立基本的特征表示,而不被复杂的样本干扰。
-
资源优化: 在大规模数据集和高分辨率输入的情况下,训练资源(计算时间和内存)可能非常消耗。通过多步训练,可以先在较小的输入上训练,节省资源,待模型稳定后再进行高分辨率训练。
-
避免过拟合: 在初期阶段,模型仅关注简单特征,有助于降低过拟合的风险。随后再进行复杂的特征学习,可以提高模型的泛化能力。
-
渐进式学习: 多步训练允许模型逐渐适应不同的任务和数据分布,使得学习过程更加平滑,模型能够更好地捕捉不同层次的信息。
意义
-
提高模型性能: 通过逐步训练,模型在每个阶段都能获得针对性的优化,从而在最终任务上(如检测或分类)实现更好的性能。
-
增强鲁棒性: 逐步训练可以提高模型对不同输入条件的适应性,尤其是在复杂环境中,对多尺度和多样本类型的鲁棒性有显著提升。
-
促进特征迁移: 在初始阶段学习的特征可以为后续更复杂的任务提供良好的基础,使得迁移学习更加有效。
-
易于调试与调整: 逐步训练可以帮助研究人员更容易地调试和优化模型。在每一步进行验证和调整,有助于发现潜在的问题并及时解决。
-
提升训练效率: 多步训练使得模型在不同阶段关注不同的特征和任务,从而提升了整体训练效率,避免了在高维空间中直接训练的复杂性。
-
适应多样化任务: 对于需要在不同数据集和任务上进行训练的模型,分阶段训练能够更好地满足多样化需求,使得最终模型更具通用性。
综上所述,多步训练为模型提供了一个灵活且有效的学习框架,使得在不同的学习阶段都能充分利用已有信息,从而提升模型的整体性能和适应能力。即便现在起回看,在chatGPT等大模型训练中依然采用此类方案,可见分步骤训练的重要性。
Residual Connections
ResNet(Residual Network)采用跳跃结构(skip connections 或 residual connections)来连接层,