【BML全功能AI开发平台初体验】轻松实现高精度模型调优——模型超参搜索

最近在体验全功能AI开发平台BML(Baidu Machine Learning),一上手就停不下来那种,真的越用越喜欢!

我的研究方向是自动机器学习,在深度学习建模过程中,除了大规模的数据集,超参数调节也显著影响模型效果。即使对于有经验的算法工程师,有时候也很难把握调节超参数的规律,而对于初学者来说,要花更多的时间和精力。

BML平台有自动超参搜索的功能,对于我这种热爱学习(又懒又菜)的开发者来说,当然要试一试啦!

一、超参搜索基本概念

可能有些开发者还不清楚什么是超参数,下面我来给大家科普一下~(大佬请自觉跳到第二章节【手动狗头】)

参数

参数是机器学习算法的关键,是从训练数据中学习到的,属于模型的一部分。

不知道大家还记得权重吗?
适合新手入门且最简单的ANN人工神经网络模型(Python)

看看这篇文章里讲到的只有一个神经元的神经网络的权重:
在这里插入图片描述
输入一个值(x),乘以权重,结果就是网络的输出值。权重可以随着网络的训练进行更新,从而找到最佳的值,这样网络就能尝试匹配输出值与目标值。

下面再来看一下更复杂的网络:
在这里插入图片描述
为了得到预期的输出结果,将权重初始化后,权重可以随着网络的训练进行更新,从而找到最佳的值,这样网络就能尝试匹配输出值与目标值,从而得到预期的结果。

这里的权重其实就是一种参数。

超参数

模型的超参数指的是模型外部的配置变量,是不能通过训练的进行来估计其取值不同的,且不同的训练任务往往需要不同的超参数。

超参数不同,最终得到的模型也是不同的。

一般来说,超参数有:学习率迭代次数网络的层数每层神经元的个数等等。

常见的超参数有以下三类:

  1. 网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函数的类型等 .
  2. 优化参数,包括优化方法、学习率、小批量的样本数量等 .
  3. 正则化系数

实践中,当你使⽤神经⽹络解决问题时,寻找好的超参数其实是一件非常困难的事情,对于刚刚接触的同学来说,都是"佛系调优",这也是一开始就"入土"的原因,没有依据的盲目瞎调肯定是不行的。

手动调整超参数的四大方法

我们在使用某一网络时,般是比较好的论文中出现过的,是证明过的,当然也可以直接套用,然后在这个基础上,调参。

可是如果识别的领域不同,比如同样是LeNet网络,在解决手写数字识别时使用的超参数能得到很好的效果,但是在做眼疾识别时,因为数据集的不同,虽然使用同样的超参数,但是效果可能并不理想。

在<< Neural Network and Deep Learning >>这本书中,作者给出⼀些⽤于设定超参数的启发式想法。⽬的是帮读者发展出⼀套工作流来确保很好地设置超参数。这里我把书上的内容总结一下,再结合自己的思考,与大家共同探讨调整超参数的方法论。

不过呢,目前不存在⼀种通用的关于正确策略的共同认知,这也是超参数调节的"玄学"之处。

1.使用提前停止来确定训练的迭代次数

这个策略是我的老师最早教我的,个人认为这也是防止过拟合最直接的方式。

做法其实很简单,做一个判断,满足条件时退出循环,终止训练:

for epoch in range(MAX_EPOCH):
	// 训练代码
	print('{}[TRAIN]epoch {}, iter {}, output loss: {}'.format(timestring, epoch, i, loss.numpy()))
	if ():
		break
	model.train()

那么这个if条件判断就十分重要了,这里有两种方案:

  1. 分类准确率不再提升时
  2. loss降到一个想要的范围时
分类准确率不再提升时

我们需要再明确⼀下什么叫做分类准确率不再提升,这样方可实现提前停止。

我们知道,分类准确率在整体趋势下降的时候仍旧会抖动或者震荡。如果我们在准确度刚开始下降的时候就停止,那么肯定会错过更好的选择。⼀种不错的解决方案是如果分类准确率在⼀段时间内不再提升的时候终止。

当然这块用loss也是可以的,loss也是一个评判标准。

loss降到一个想要的范围时

这是我经常使用的、更直接的方法。

比如在前几轮的训练中,我知道loss一直在2.6-2.7的附近徘徊:
在这里插入图片描述
在下一次训练中,可以把条件设置为当loss小于2.0时终止训练。

因为网络有时候会在很长时间内于⼀个特定的分类准确率附近形成平缓的局面,然后才会有提升。如果你想获得相当好的性能,第一种方案(分类准确率不再提升时)的规则可能就会太过激进了 —— 停止得太草率。

而本方案(loss降到一个想要的范围时)能很好地解决这一问题,但随之而来的问题就是不知不觉地又多了一个超参数,实际应用上,这个用于条件判断的loss值的选择也很困难。

2.让学习率从高逐渐降低

我们⼀直都将学习速率设置为常量。但是,通常采用可变的学习速率更加有效。

如果学习率设置的过低,在训练的前期,训练速度会非常慢;而学习率设置地过高,在训练的后期,又会产生震荡,降低模型的精度:
在这里插入图片描述

所以最好是在前期使用一个较大的学习速率让权重变化得更快。越往后,我们可以降低学习速率,这样可以作出更加精良的调整。

⼀种自然的观点是使用提前终止的想法。就是保持学习速率为⼀个常量直到验证准确率开始变差,然后按照某个量下降学习速率。我们重复此过程若干次,直到学习速率是初始值的 1/1024(或者1/1000),然后终止训练。

3.宽泛策略

在使用神经网络来解决新的问题时,⼀个挑战就是获得任何⼀种非寻常的学习,也就是说,达到比随机的情况更好的结果。

也许下面的方法能给你带来某些不一样的启发:

  1. 通过简化网络来加速实验进行更有意义的学习
  2. 通过更加频繁的监控验证准确率来获得反馈
通过简化网络来加速实验进行更有意义的学习

假设,我们第⼀次遇到 MNIST 分类问题。刚开始,你很有激情,但是当模型完全失效时,你会就得有些沮丧。

此时就可以将问题简化,将十分类问题转化成二分类问题。丢开训练和验证集中的那些除了 0 和 1的那些图像,即我们只识别0和1。然后试着训练⼀个网络来区分 0 和 1。

这样一来,不仅仅问题比 10 个分类的情况简化了,同样也会减少 80% 的训练数据,这样就多出了 5 倍的加速。同时也可以保证更快的实验,也能给予你关于如何构建好的网络更快的洞察。

通过更加频繁的监控验证准确率来获得反馈

这个方法调的其实是输出:

if i % 200 == 0:
	timestring = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
	print('{}[VALID]epoch {}, iter {}, output loss: {}'.format(timestring, epoch, i, loss.numpy()))

对模型本身并没有任何关系,但是,你能得到更多并且更快地得到反馈,从而快速地实验其他的超参数,或者甚至近同步地进行不同参数的组合的评比。

这一点看似不重要,但对于超参数的调整来说,是很重要的一步

因为在实际的应用中,很容易会遇到神经网络学习不到任何知识的情况。你可能要花费若干天在调整参数上,仍然没有进展。所以在前期的时候,就应该从实验中尽可能早的获得快速反馈。直觉上看,这看起来简化问题和架构仅仅会降低你的效率。而实际上,这样能够将进度加快,因为你能够更快地找到传达出有意义的信号的网络。⼀旦你获得这些信号,你可以尝试通过微调超参数获得快速的性能提升。

这和人生中很多情况⼀样 —— 万事开头难。

4.小批量数据(mini-batch)大小不必最优

假设我们使用大小为 1 的小批量数据。而一般来说,使用只有⼀个样本的小批量数据会带来关于梯度的错误估计。

而实际上,误差并不会真的产⽣这个问题。原因在于单⼀的梯度估计不需要绝对精确。我们需要的是确保代价函数保持下降足够精确的估计。

这就好像你现在要去北极点,但是只有⼀个不太精确的指南针。如果你不再频繁地检查指南针,指南针会在平均状况下给出正确的⽅向,所以最后你也能抵达北极点。

不过使用更大的小批量数据看起来还是显著地能够进行训练加速的。

所以,选择最好的小批量数据大小是⼀种折中。小批量数据太小会加长训练时间;而小批量数据太大是不能够足够频繁地更新权重的。你所需要的是选择⼀个折中的值,可以最大化学习的速度。

幸运的是,小批量数据大小的选择其实是相对独立的⼀个超参数(网络整体架构外的参数),所以你不需要优化那些参数来寻找好的小批量数据大小。

因此,可以选择的方式就是使用某些可以接受的值(不需要是最优的)作为其他参数的选择,然后进行不同小批量数据大小的尝试,就像上面调整学习率那样,画出验证准确率的值随时间(非回合)变化的图,选择得到最快性能提升的小批量数据大小。

二、导入数据集

首先进入BML平台:https://ai.baidu.com/bml/

在这里插入图片描述
点击“立即使用”,进入BML操作平台:
在这里插入图片描述
点击“数据集”,进入“我的数据总览”,点击“创建数据集”:
在这里插入图片描述

点击“完成”后,会在下方显示刚刚新建的数据集,这里创建了三个数据集,分别是训练集、验证集和测试集:
在这里插入图片描述

本项目中使用的数据集源自AI Studio上的开源数据集:MOT20-COCO格式

MOT20数据集从3个场景中提取了8份全新的稠密人群序列。这份数据集面向非常稠密的人群场景,达到了平均每帧246个行人。这些序列包含了室内/室外,白天/晚上场景。下图显示了这三个场景下训练集与测试集的划分。在这里插入图片描述

将数据集下载下来以后,点击“导入”,将图像导入BML平台:
在这里插入图片描述

导入完成后点击“查看与标注”,可查看数据集的详细信息:
在这里插入图片描述

点击“质检报告”还可以看到原图维度标注维度上的信息:
在这里插入图片描述
在这里插入图片描述

三、新建项目

在左侧“总览”中找到“预置模型调参”,点击“计算机视觉模型”:
在这里插入图片描述
找到适合自己应用场景的任务后,点击“立即创建”,这里我选择的是“物体检测”:
在这里插入图片描述

创建完成后,会在下方显示刚刚新建的项目:
在这里插入图片描述

四、自动超参搜索对比实验

这里将通过1个实验对比一下使用自动超参搜索和未使用自动超参搜索的结果;以及3个实验对比平台提供的3种超参搜索算法。

注意!本章在使用自动超参搜索时,使用的“超参范围”是默认配置,即:

  • 最大搜索次数』:是指最多组合出多少组超参并跑试验,当然有可能会因为提前达到目标而停止,节约费用。
  • 数据采样比例』:使用超参搜索时,会对原始数据集进行采样后再训练,加快搜索速度。当数据集并不大时,不推荐采样哟,可能会影响最终效果,只有大数据量时才有使用采样的必要。
  • 最高mAP/最高准确率』:是指大家期望模型效果可以达到的mAP(物体检测)或准确率(图像分类)的值,当试验中达到这个值了搜索就会停止,避免后续浪费搜索时间。

1.不使用自动超参搜索

点击“新建任务”,将前面导入的数据集配置到任务中:
在这里插入图片描述

网络配置中,预训练模型使用通用检测预训练模型,网络使用预测速度和模型精度上折中的YOLOv3-DarkNet
在这里插入图片描述

在“配置超参数”时,选择超参来源为“脚本编辑”:
在这里插入图片描述
接着配置资源:
在这里插入图片描述

因为本项目的数据量较大,所以这里使用“TeslaGPU_V100_16G显存单卡_12核CPU_56G内存”,使用4个计算节点。

配置完成后,点击“提交训练任务”,此时可以看项目中看到任务的训练状态:
在这里插入图片描述

不使用超参搜索时,mAP为62.9%:
在这里插入图片描述

2.随机超参搜索

重新新建一个任务,为了保证实验的效果,数据集和模型组网的部分都保持一致,只在配置超参数时将超参来源选择为“自动超参搜索
在这里插入图片描述
随机搜索作为基线标准,不需要更多额外的设置,就能高效地进行超参数搜索。

第一次搜索的时候,我设置的最长训练时间是3小时,3小时结束以后还没搜完,显示失败:
在这里插入图片描述
因此,第二次我降低数据采样比例:
在这里插入图片描述
将训练节点数拉满,并把训练时长提高:
在这里插入图片描述
2.7元/分钟,运行1小时就需要162元,24小时就是3888元。不过还好我领了优惠券,随便用哈哈哈:
在这里插入图片描述
飞桨企业版2021年万有引力计划:https://ai.baidu.com/easydl/universal-gravitation?ref=baidudanao

在这里插入图片描述
进去就能领优惠券。

3.贝叶斯搜索

贝叶斯搜索的配置方法与随机搜索的配置方法类似:
在这里插入图片描述

不同的是,贝叶斯搜索中,需要设置初始点数量和最大并发量:

  • 初始点数量」:代表贝叶斯搜索中,初始化时参数点的数量,该算法基于这些参数信息推测最优点 ,填写范围1-20;
  • 最大并发量」:贝叶斯搜索中,同时进行试验的数量,并发量越大,搜索效率越高,填写范围1-20。

4.进化算法

最后是进化算法:
在这里插入图片描述

进化算法是一种效果较好的算法,应用此算法时也需要进行较多的选项设置:

  • 迭代轮数」:进化算法运行中迭代的轮数,范围5-50;
  • 扰动间隔」:进化算法每隔几个epoch就会进行随机扰动,利用随机因素防止算法结果收敛于局部最优解;
  • 扰动比例」:类似于染色体交叉的形式,迭代中一个种群内最好与最坏的个体依据扰动比例进行交叉;
  • 随机初始化概率」:在扰动中,有一定概率对个体的超参数进行初始化;
  • 种群个体数量」:一个个体代表一种超参数设置,一个种群中包含多个个体。

因为进化算法消耗的资源更多,所以这里适当降低了数据的采样比例:
在这里插入图片描述

5.实验对比结果

耗时对比

从耗时来看,使用了自动超参搜索算法的任务要比不使用超参搜索的任务慢,提高精度必然要在搜索上多花点时间:
在这里插入图片描述

效果对比

不使用自动超参搜索VS随机搜索

从评估报告上看,使用随机搜索来搜索超参数时,效果要好很多!
在这里插入图片描述

随机搜索VS贝叶斯搜索

在本项目中,使用贝叶斯搜索得到的超参数看起来要比随机搜索搜到的超参数要好:
在这里插入图片描述

贝叶斯搜索VS进化算法

从结果上看,进化算法的效果要比贝叶斯搜索的效果好一些:

在这里插入图片描述

五、总结与升华

在这里插入图片描述

我用一个表格记录了一下自动超参搜索得到的超参数。可以看出一些关系(但不一定是客观的):

  1. 随着mAP的提高,学习率是逐渐降低的,即要想mAP高,那么学习率就要低一些
  2. 随着mAP的提高,正则化系数也是是逐渐降低的,即要想mAP高,那么正则化系数就要低一些
  3. 从结果上看,感觉anchor_scale小一些会更好
  4. batch_size对结果的影响好像并不大
  5. anchor_ratio对结果好像没有明显的关系

最后,总的来说,BML平台的模型超参搜索功能还是很好用的,特别是当你的模型效果不好时强烈推荐你试一下这个自动超参搜索的功能!!!说不定就能给你的模型效果提升好几个点噢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.郑先生_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值