1、什么是gpu?
gpu是显卡的核心部分,它具有强大的图片数据处理和缓存能力,帮助cpu分担数据的处理和缓存,同时具有cpu的部分能力,提高电脑硬件性能。
2、什么是梯度下降?
梯度下降:
常见的梯度下降法
批量梯度下降(Batch Gradient Descent BGD)
上面所介绍的算法其实就是批量梯度下降。需要首先计算所有数据上的损失值,然后再进行梯度下降,具体的操作步骤是:遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数,都要把数据集里的所有样本计算一遍,计算量大,计算速度慢,不支持在线学习。
随机梯度下降(Stochastic Gradient Descent SGD)
不使用全量的样本来计算梯度,而使用单一样本来近似估计梯度,可以极大地减少计算量,提高计算效率。具体的操作步骤是:每次从训练集中随机选择一个样本,计算其对应的损失和梯度,进行参数更新,反复迭代。
这种方式在数据规模比较大时可以减少计算复杂度,从概率意义上来说的单个样本的梯度是对整个数据集合梯度的无偏估计,但是它存在着一定的不确定性,因此收敛速率比批梯度下降得更慢。
小批量梯度下降(Mini-batch Gradient Descent)
为了克服上面两种方法的缺点,采用的一种折中手段:将数据分为若干批次,按批次更新参数,每一批次中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性,另一方面,因为批的样本数比整个数据集少了很多,计算量也不是很大。
每次使用多个样本来估计梯度,这样可以减少不确定性,提高收敛速率,其中每次迭代选取的样本数量称为批大小(batch size)。
3、关于学习率
决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。
学习率设置的过小时,收敛过程将变得十分缓慢。而当学习率设置的过大时,**梯度可能会在最小值附近来回震荡,甚至可能无法收敛。
好的学习率更快地达到loss的最小值,保证收敛的loss值是神经网络的全局最优解
4、什么是GD、SGD、mini-batch SGD?
GD(梯度下降):没有利用batchsize,基于整个数据库得到的梯度,梯度准确,但数据量大是,非常耗时,同时神经网络常是非凸的,网络最终可能收敛到初始点附近的局部变量。
SGD(随机梯度下降):就是batchsize = 1;每次计算一个样本,梯度不准确,所以,学习率要降低。
mini-batch SGD:就是选择合适的batchsize的SGD算法,mini-batch利用噪声梯度,一定程度上缓解了GD算法直接掉进初始点附近的局部最优值。同时梯度准确率,学习率要加大。
5、神经网络的中的超参数的理解:
学习率: 步长更大= 学习率更高
误差函数不断减小。
如果训练数据过多, 无法一次性将所有数据送入计算。
现将数据分成几个部分: batch
分多个 batch , 逐一送入计算训练
epoch:表示将输入的数据进行前向和后向传播的一个过程。
一般epoch取值都是非常大的;是因为我们数据的迭代次数是多次的;
epoch batch batchsize的关系;
epoch是对数据进行迭代传播(前向和反向),一边epoch的数量越大,则权重更新的迭代次数增多,曲线从 不拟合到拟合再到过拟合;
batch是传入的数据样本;
batchsize表示每个batch里面样本的大小,一般在gpu性能好的情况下,多个batchsize越大,准确率越高;
epoch 如何设置: 大小与数据集的多样化程度有关, 多样化程度越强, epoch 越大。
batchsize 大小的选择也很重要, 最优化网络模型的性能+速度。
当数据量较小, 计算机可以承载只有1个batch 的训练方式时, 收敛效果会好,前提数据量小和gpu性能高。
6、梯度下降和损失函数之间的关系:
梯度下降是指权重值w的每次更新,我们的目标是要找到最优的权重w的值。
方法是对损失函数L(w)进行偏导,找到最优梯度值下降,然后更新梯度值即w的值,同时L(w)的函数也跟随着更新,以便下一次梯度值的继续求导和更新。一般w1 = w0 - lr(学习率)*g(w)(L函数的偏导)。
梯度 grad 由 损失函数 Loss 确定,损失函数越大时,梯度也越大。待优化参数 ω 由梯度 grad 和 学习率 lr 共同确定,参数更新后,损失函数也将缩小,从而进一步缩小梯度,直到损失函数最小,梯度为 0,此时得到最优解。如果参数 ω 更新后,损失函数不但没有缩小,反而增大,此时将进一步增大梯度,最终造成梯度爆炸。
7、深度学习中backbone的意思
(1)、主干网络,用来做特征提取的网络,代表网络的一部分,一般用于前端提取图片信息,生成特征图feature map,供后面的网络使用。通常用VGG或者Resnet,因为这些backbone的特征提取能力是很强,并且可以加载官方在大型数据集(Pascal、Imagenet)上训练好的模型参数,然后接自己的网络,进行微调finetune就可以。
(2)、主干网络一般不是我们自己设计的网络,因为这些网络已经证明了在分类问题上的特征提取能力是很强的,在用这些网络作为backbone的时候,都是直接加载官方已经训练好的模型参数,后面接着我们自己的网络,让网络的这两个部分同时训练,加载的backbone模型已经具有特征提取能力了,在我们的训练过程中,会对他进行微调,使得其更适合于我们自己的任务。
8、冻结训练
冻结训练其实也是迁移学习的思想,在目标检测任务中用得十分广泛。因为目标检测模型里,主干特征提取部分所提取到的特征是通用的,把backbone冻结起来训练可以加快训练效率,也可以防止权值被破坏。
9、断电恢复的应用
1、收敛性应用,当模型文件训练结束时,模型依旧没有收敛性,也就是 loss的值还依旧在下降,那么我们就可以把,模型训练结束的权重文件当作重新开始训练的初始权重文件,这一过程可以称为断点恢复。
2、训练过程gpu显存不足,在解冻阶段,由于epoch设置的值过大,会出现报错,修改model_path重新加载,那么它会去找保存之前权重好的训练文件,然后,把epoch的值设置少一点,基于这个文件继续训练,避免重新开始训练。
五、预训练和微调
最后再来总结一下预训练和微调,这是两个非常重要的概念,其实也很好理解。举个栗子是最能直观理解的。
假如我们现在要搭建一个网络模型来完成一个图像分类的任务,首先我们需要把网络的参数进行初始化,然后在训练网络的过程中不断对参数进行调整,直到网络的损失越来越小。在训练过程中,一开始初始化的参数会不断变化,如果结果已经满意了,那我们就可以把训练好的模型参数保存下来,以便训练好的模型可以在下次执行类似任务的时候获得比较好的效果。这个过程就是预训练(Pre-Training)。
假如在完成上面的模型训练后,我们又接到另一个类似的图像分类任务,这时我们就可以直接使用之前保存下来的模型参数作为这一次任务的初始化参数,然后在训练过程中依据结果不断进行修改,这个过程就是微调(Fine-Tuning)。
我们使用的神经网络越深,就需要越多的样本来进行训练,否则就很容易出现过拟合现象。比如我们想训练一个识别猫的模型,但是自己标注数据精力有限只标了100张,这时就可以考虑ImageNet数据集,可以在ImageNet上训练一个模型,然后使用该模型作为类似任务的初始化或特征提取器,这样既节省了时间和计算资源,又能很快地达到较好的效果。当然,采用预训练+微调也不是绝对有效的,上面识别猫的例子可以这样做是因为ImageNet里有猫的图像。
冻结训练的作用:当我们已有部分预训练权重,这部分预训练权重所应用的那部分网络是通用的,如骨干网络,那么我们可以先冻结这部分权重的训练,将更多的资源放在训练后面部分的网络参数,这样使得时间和资源利用都能得到很大改善。然后后面的网络参数训练一段时间之后再解冻这些被冻结的部分,这时再全部一起训练。意思就是:先将这些通用的训练参数进行冻结,不然他们进行训练,目的是为了让出gpu更多的资源空间去做其他事情,最后,其他东西都做好的前提下,在解冻,一起全部训练,反正这块是通用的。