深度学习知识点:反向传播、生成式对抗网络(GAN)、超参数调整

本文详细介绍了深度学习中的关键概念,包括反向传播的工作原理、GAN的生成器和判别器训练技巧,以及超参数调整的重要性,涵盖了网络参数、优化参数和正则化参数。此外,还讨论了微调和预训练网络在目标检测中的应用,以及自动化超参数搜索的不同方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

反向传播

什么是反向传播?‍

  • 通俗解释:
    类比几个人站成一排,第一个人看一幅画(输入数据),描述给第二个人(隐层)……依此类推,到最后一个人(输出)的时候,画出来的画肯定不能看了(误差较大)。
  • 反向传播就是:把画拿给最后一个人看(求取误差),然后最后一个人就会告诉前面的人下次描述时需要注意哪里(权值修正)
  • 一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。
    目的是更新神经元参数,而神经元参数正是 z=wx+b 中的 (w,b).对参数的更新,利用损失值loss对参数的导数, 并沿着负梯度方向进行更新。
    “正向传播”求损失,“反向传播”回传误差

反向传播是如何工作的?

1.输入层接收x
2.使用权重w对输入进行建模
3.每个隐藏层计算输出,数据在输出层准备就绪
4.实际输出和期望输出之间的差异称为误差
5.返回隐藏层并调整权重,以便在以后的运行中减少此错误
这个过程一直重复,直到我们得到所需的输出。训练阶段在监督下完成。一旦模型稳定下来,就可以用于生产。

为什么需要反向传播?

• 反向传播快速、简单且易于实现
• 没有要调整的参数
• 不需要网络的先验知识
• 模型不需要学习函数的特性

手推BP

推导:链式求导法则反复用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
伪代码:
在这里插入图片描述

生成式对抗网络(GAN)

生成式对抗网络,由一个生成器网络和一个判别器网络组成。判别器的训练目的是能够区分生成器的输出与来自训练集的真实图像,生成器的训练目的是欺骗判别器。值得注意的是,生成器从未直接见过训练集中的图像,它所知道的关于数据的信息都来自于判别器。
GAN 相关的技巧:
在这里插入图片描述

生成器

它将一个向量(来自潜在空间,训练过程中对其随机采样)转换为一张候选图像。GAN 常见的诸多问题之一,就是生成器“卡在”看似噪声的生成图像上。
一种可行的解决方案是在判别器和生成器中都使用 dropout。
在这里插入图片描述

判别器

接下来开发 discriminator 模型,它接收一张候选图像(真实的或合成的)作为输入,并将其划分到这两个类别之一:“生成图像”或“来自训练集的真实图像”。
在这里插入图片描述

训练技巧

① 输入规范化到(-1,1)之间,最后一层的激活函数使用tanh(BEGAN除外)
② 使用wassertein GAN的损失函数
③ 如果有标签数据的话,尽量使用标签,也有人提出使用反转标签效果很好,另外使用标签平滑,单边标签平滑或者双边标签平滑
④ 使用mini-batch norm, 如果不用batch norm 可以使用instance norm 或者weight norm
⑤ 避免使用RELU和pooling层,减少稀疏梯度的可能性,可以使用leakrelu激活函数
⑥ 优化器尽量选择ADAM,学习率不要设置太大,初始1e-4可以参考,另外可以随着训练进行不断缩小学习率
⑦ 给D的网络层增加高斯噪声,相当于是一种正则

超参数调整

神经网络中包含哪些超参数?

通常可以将超参数分为三类:网络参数、优化参数、正则化参数。

  • ​ 网络参数:可指网络层与层之间的交互方式(相加、相乘或者串接等)、卷积核数量和卷积核尺寸、网络层数(也称深度)和激活函数等。
  • ​ 优化参数:一般指学习率、批样本数量(batch size)、不同优化器的参数以及部分损失函数的可调参数。
  • ​ 正则化:权重衰减系数,丢弃比率(dropout)

为什么要进行超参数调优?

​ 本质上,这是模型优化寻找最优解和正则项之间的关系。网络模型优化调整的目的是为了寻找到全局最优解(或者相比更好的局部最优解),而正则项又希望模型尽量拟合到最优。两者通常情况下,存在一定的对立,但两者的目标是一致的,即最小化期望风险。模型优化希望最小化经验风险,而容易陷入过拟合,正则项用来约束模型复杂度。所以如何平衡两者之间的关系,得到最优或者较优的解就是超参数调整优化的目的。

超参数的重要性顺序

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

极端批样本数量下,如何训练网络?

​ 极端批样本情况一般是指batch size为1或者batch size在6000以上的情况。这两种情况,在使用不合理的情况下都会导致模型最终性能无法达到最优甚至是崩溃的情况。

​ 在目标检测、分割或者3D图像等输入图像尺寸较大的场景,通常batch size 会非常小。batch size过小通常对batch norm的影响是最大的,若网络模型中存在batch norm,batch size若只为1或者2时会对训练结果产生非常大的影响。这时通常有两种策略:

一、若模型使用了预训练网络,可冻结预训练网络中batch norm的模型参数,有效降低batch size引起的统计量变化的影响。

二、在网络不是过深或者过于复杂时可直接移除batch norm或者使用group norm代替batch norm,前者不多阐释,后者是有FAIR提出的一种用于减少batch对batch norm影响,其主要策略是先将特征在通道上进行分组,然后在组内进行归一化。即归一化操作上完全与batch size无关。
这种group norm的策略被证实在极小批量网络训练上能达到较优秀的性能。当然这里也引入里group这个超参数,一般情况下建议不宜取group为1或者各通道单独为组的group数量,可结合实际网络稍加调试。

​ 为了降低训练时间的成本,多机多卡的分布式系统通常会使用超大的batch size进行网络训练。可采用层自适应速率缩放(LARS)算法。从理论认知上将,batch size增大会减少反向传播的梯度更新次数,但为了达到相同的模型效果,需要增大学习率。但学习率一旦增大,又会引起模型的不收敛。

为了解决这一矛盾,LARS算法就在各层上自适应的计算一个本地学习率用于更新本层的参数,这样能有效的提升训练的稳定性。

合理使用预训练网络

什么是微调(fine-tune)

​ 指稍微调整参数即可得到优秀的性能,是迁移学习的一种实现方式。微调和从头训练的本质区别在于模型参数的初始化,

train from scratch通常指对网络各类参数进行随机初始化(当然随机初始化也存在一定技巧),随机初始化模型通常不具有任何预测能力,通常需要大量的数据或者特定域的数据进行从零开始的训练,这样需要训练到优秀的模型通常是稍困难的。

而微调的网络,网络各类参数已经在其他数据集(例如ImageNet数据集)完成较好调整的,具备了较优秀的表达能力。因此,我们只需要以较小的学习速率在自己所需的数据集领域进行学习即可得到较为优秀的模型。

微调通常情况下,无须再重新设计网络结构,预训练模型提供了优秀的结构,只需稍微修改部分层即可。在小数据集上,通常微调的效果比从头训练要好很多,原因在于数据量较小的前提下,训练更多参数容易导致过度拟合。

微调有哪些不同方法?

​ 以图像分类为例,通常情况下由于不同数据集需要的类别数不同,我们需要修改网络的输出顶层。这种情况下有两种微调方式:

  1. 不冻结网络模型的任何层,对最后的改动层使用较大的学习率,对未改动层以较小的学习率进行训练全模型训练,进行多轮训练即可。即一步完成训练。

  2. 冻结除了顶部改动层以外的所有层参数,即不对冻结部分的层进行参数训练更新,进行若干轮的微调训练后,放开顶部层以下的若干层或者全部放开所有层的参数,再次进行若干轮训练即可。即分多步训练。

以上两种都属于微调。目前由于存在大量优秀的预训练模型,如何确定哪个模型适合自己的任务并能得到最佳性能需要花大量的时间探索。此时,上述的前者是种不错训练方式,你无须进行过多分步的操作。

而当探索到一个比较适合的模型时,你不妨可以再次重新尝试下以第二种方式进行训练,或许能得到相比于前者稍高些的性能,因为小数据集上调整过多的参数过拟合的机率也会增大,当然这并不是绝对的。

微调先冻结底(深)层,训练顶(浅)层的原因?

首先冻结除了顶部改动层以外的所有层参数,对顶层进行训练,这个过程可以理解为顶层的域适应训练,主要用来训练适应模型的现有特征空间,防止顶层糟糕的初始化,对已经具备一定表达能力的层的干扰和破坏,影响最终的性能。

之后,在很多深度学习框架教程中会使用放开顶层往下一半的层数,继续进行微调。这样的好处在于越底层的特征通常是越通用的特征,越往上其整体的高层次语义越完备,这通过感受野很容易理解。

所以,若预训练模型的数据和微调训练的数据语义差异越大(例如ImageNet的预模型用于医学图像的训练),那越往顶层的特征语义差异就越大,因此通常也需要进行相应的调整。

不同的数据集特性下如何微调?

  1. 数据集数据量少,数据和原数据集类似。这是通常做法只需修改最后的输出层,训练即可,训练过多参数容易过拟合。
  2. 数据集数据量少,数据和原数据集差异较大。由于数据差异较大,可以在完成输出顶层的微调后,微调顶层往下一半的层数,进行微调。
  3. 数据集数据量大,数据与原数据集差异较大。这种情况下,通常已经不需要用预训练模型进行微调,通常直接重新训练即可。
  4. 数据集数据量大,数据与原数据类似。这时预训练模型的参数是个很好的初始化,可利用预训练模型放开所有层以较小的学习率微调即可。

目标检测中使用预训练模型的优劣?

​ 目标检测中无论是一阶段的YOLO、SSD或者RetinaNet 还是二阶段的Faster R-CNN、R-FCN 和 FPN都是基于ImageNet上预训练好的分类模型。
​ 优势在于:
​ 1、正如大部分微调的情况一样,使用预训练网络已拥有优秀的语义特征,能有效的加快训练速度;
​ 2、其次,对于大部分二阶段的模型来说,并未实现严格意义上的完全端对端的训练,所以使用预训练模型能直接提取到语义特征,能使两个阶段的网络更容易实现模型的优化。
​ 劣势在于,分类模型和检测模型之间仍然存在一定任务上的差异:
​ 1、分类模型大部分训练于单目标数据,对同时进行多目标的捕捉能力稍弱,且不关注目标的位置,在一定程度上让模型损失部分空间信息,这对检测模型通常是不利的;
​ 2、域适应问题,若预训练模型(ImageNet)和实际检测器的使用场景(医学图像,卫星图像)差异较大时,性能会受到影响;
​ 3、使用预训练模型就意味着难以自由改变网络结构和参数限制了应用场合。

目标检测中如何从零开始训练(train from scratch)?

​ 1、数据集不大时,同样需要进行数据集增强。
​ 2、预训练模型拥有更好的初始化,train from scratch需要更多的迭代次数以及时间训练和优化检测器。而二阶段模型由于并不是严格的端对端训练,此时可能需要更多的迭代次数以及时间,而一阶段检测模型训练会相对更容易些。
​ 3、目标检测中train from scratch最大的问题还是batch size过小。所以可采取的策略是增加GPU使用异步batchnorm增大batch size,若条件限制无法使用更多GPU时,可使用groupnorm代替batchnorm
​ 4、由于分类模型存在对多目标的捕捉能力弱以及对物体空间位置信息不敏感等问题,可借鉴DetNet训练一个专属于目标检测的模型网络,增强对多目标、尺度和位置拥有更强的适应性。

自动化超参数搜索方法有哪些?

​ 主要包含网格搜索,随机搜索,基于模型的超参优化

网格搜索:

​ 通常当超参数量较少的时候,可以使用网格搜索法。即列出每个超参数的大致候选集合。利用这些集合 进行逐项组合优化。在条件允许的情况下,重复进行网格搜索会当优秀,当然每次重复需要根据上一步得到的最优参数组合,进行进一步的细粒度的调整。网格搜索最大的问题就在于计算时间会随着超参数的数量指数级的增长。

随机搜索:

​ 随机搜索,是一种用来替代网格搜索的搜索方式。随机搜索有别于网格搜索的一点在于,不需要设定一个离散的超参数集合,而是对每个超参数定义一个分布函数来生成随机超参数。随机搜索相比于网格搜索在一些不敏感超参上拥有明显优势。例如网格搜索对于批样本数量(batch size),在[16,32,64]这些范围内进行逐项调试,这样的调试显然收益更低下。当然随机搜索也可以进行细粒度范围内的重复的搜索优化。

基于模型的超参优化:

调优问题转化为了优化问题。直觉上会考虑是否进行一个可导建模,然后利用梯度下降进行优化。但不幸的是我们的超参数通常情况下是离散的,而且其计算代价依旧很高。
基于模型的搜索算法,最常见的就是贝叶斯超参优化。有别于的网格搜索和随机搜索独立于前几次搜索结果的搜索,贝叶斯则是利用历史的搜索结果进行优化搜索。其主要有四部分组成,
1、目标函数,大部分情况下就是模型验证集上的损失。
2、搜索空间,即各类待搜索的超参数。
3、优化策略,建立的概率模型和选择超参数的方式。
4、历史的搜索结果。首先对搜索空间进行一个先验性的假设猜想,即假设一种选择超参的方式,然后不断的优化更新概率模型,最终的目标是找到验证集上误差最小的一组超参数。

目前尚未有官方发布的YOLOv9版本,最新的稳定版为YOLOv8[^1]。因此,在讨论YOLO与生成对抗网络GAN)的结合时,可以基于现有最先进版本YOLOv8来探讨可能的技术实现路径。 ### 将YOLOv8与GAN融合的方法 #### 数据增强阶段的应用 通过引入条件生成对抗网络(cGAN),可以在数据准备阶段利用cGAN生成更多样化的样本,从而提高YOLOv8模型对于不同场景下的泛化能力。这有助于解决实际应用场景中可能出现的数据不足问题[^3]。 ```python import torch from torchvision import transforms from PIL import Image from cgan_model import Generator, Discriminator # 假设这是自定义CGAN模块 def generate_images(generator, labels): generator.eval() with torch.no_grad(): noise = torch.randn(labels.size(0), 100).cuda() # 随机噪声向量 generated_imgs = generator(noise, labels) return generated_imgs.cpu().numpy() # 使用已训练好的cGAN生成器创建新图片 generator = Generator().load_state_dict(torch.load('cgan_generator.pth')).cuda() new_samples = generate_images(generator, target_labels) for i, img_array in enumerate(new_samples): img = Image.fromarray((img_array * 255).astype(np.uint8)) img.save(f'generated_{i}.jpg') ``` #### 后处理优化中的应用 另一种方式是在YOLOv8完成初步预测之后,借助CycleGAN或其他类型的风格迁移GAN调整输出结果的质量或样式特征。例如,在某些特定领域如医学影像分析里,这种做法可以帮助改善识别精度并减少误报率[^2]。 ```python from cycle_gan import CycleGANModel # 自定义CycleGAN类 class PostProcessor: def __init__(self): self.model = CycleGANModel(pretrained=True) def refine_predictions(self, images): refined_results = [] for image in images: transformed_image = self._apply_style_transfer(image) refined_results.append(transformed_image) return refined_results @staticmethod def _apply_style_transfer(image_tensor): processed_img = post_processor.model.transform(image_tensor.unsqueeze_(0)).squeeze_() return processed_img.numpy() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FriendshipT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值