兴趣所致,关注了一些AutoML的知识,主要是AutoML中的网络结构搜索的部分,特记录下来希望能形成体系。以下是要写的文章列表。
现在,在网络结构搜索上,为了效果和速度,大家倾向于一次性的训练一个总模型,比如上面文章列表中的Darts和ENAS。然后再从总模型上采样得到符合条件的最优子模型。之后再重新训练、微调或者其他办法进行处理。
在得到总模型后,后续生成子模型后的处理比较耗时,给整个流程增加了额外的计算量和复杂度。BigNAS的出现则解决了这一问题,使得在大模型训练完成后,可以不用后续处理,直接生成各种尺寸的子模型就能达到最优的效果。
以下是三种从总模型到子模型的方法,其中,左图是得到总模型后,采样或者用某种策略得到子模型,然后再进行重新训练。中图则是得到总模型后,进行蒸馏,压缩得到各种各样的子模型。右图则是本文提出的方法,直接一步到位,训练得到总模型,然后总模型生成能够直接使用的子模型。
要做成这个事情,就需要在训练总模型的时候,能够同时将总模型中能够采样出来的大模型和小模型训练好,注意,此时大模型和小模型是有参数共享的。
这个问题很难,难在什么地方?比如:
BigNAS则针对这些问题提出了很多改进的手段。总体来说,生成子模型需要两步:
在训练总模型的时候,使用了如下技巧:
在训练的时候,从总模型中采样出最大模型,最小模型以及随机的N个模型(实验中N=2)。然后在几个模型上分别训练得到梯度,梯度进行聚合再更新总模型。
在这里,总模型大小是由输入图像大小、模型宽度、模型深度、核大小等参数决定的;每个参数都有自己的值集合,比如输入图像大小就是从[128, 196, 256, 384]中任选一个值。最小模型就是指最小的输入图像,最浅最窄的模型等等。通过这种方式,使得总模型中的大小模型都被训练了。
在训练的过程中,最大模型的损失是和ground truth去计算,其他小模型的损失则是和大模型预测的soft Label去计算,只用蒸馏的损失。此时注意,给大模型和小模型的输入,需要是图像中的同一个patch。用了原地蒸馏后,模型效果增加了0.3%。
在训练过程中,发现训练非常不稳定,将学习率降低到30%后,可以收敛,但是最后top-1的准确率低1%。
于是采用了如下手段,鉴于我们训练的模型都是残差网络,所以我们在这里会通过设置残差网络中每个block的最后的Batch Normalizaiton的系数γ=0,来确保经过残差网络的block后,方差不变。这个技巧在文献[2]中被提出,在它们那里只是有了提升,而在BigNAS里确实必需。
在实验中,发现大模型和小模型的收敛行为很不一致,大模型过拟合了小模型才刚刚收敛,如下图左。
为了解决这个问题,对学习率进行了改进,将其变为指数衰减+常量结尾,即最后的学习率是一个常量,常量值是最初值的5%。如上图右。有了更大的学习率后,大模型会在最优解上左右摇摆,但不会过拟合,小模型会加快收敛。从而解决这个问题。
一般来说,大模型容易过拟合而小模型不会,所以,我们需要将应对过拟合的手段加在大模型上而小模型不用,这样就增大了复杂度,因为大模型和小模型是共享参数的。
但是,BigNAS中采用了一种简单但有效的方法,即只对最大的子模型做正则化。采用的手段就是dropout和权重衰减。
批归一化的统计参数并没有被累积,因为训练阶段是多模型训练,所以这些统计值的定义有问题。在模型训练结束后,会重新对BN的统计量做校准,此时并不需要重新训练模型
给定计算资源的限制后,需要从总模型中找到最优的子模型。在这个选择过程中,首先定义一个受限的参数集合,然后评估这个首先参数中所有子模型得到benchmark,这是粗粒度选择。
在得到benchmark后,定义一个更加细粒度的参数集合,从上面粗粒度过程中得到的最好模型上做参数选择的更新。
最后,选定参数后,直接使用总模型里的参数初始化,得到网络结构。这个过程不需要重新训练。
实验使用的搜索空间如下,这个空间基于MobileNetV2。
得到的结果如下,可以看到,在每个参数量级上,BigNAS都能得到最好的结果。
初始化的不同带来的模型收敛的不同,结果如下,左侧为小模型,右侧为大模型。这张图是模型训练开始不久后的。
同样的,如果关注模型最后的结果,如下图,可见,使用新的初始化方法+原来的学习率,可以学的更快更好。
学习率加上恒定结尾后,曲线如下,可见,大模型和小模型的训练步调变的一致了。
正则化的影响如下:
勤思考,多提问是Engineer的良好品德。
在训练过程中需要从总模型中采样小模型,这个步骤需要对图做修改,但是TPU上的图在训练过程中是不允许修改的,那么如何实现呢?
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:
(1)点击页面最上方"AINLP",进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。
推荐阅读
征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)
完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
阅读至此了,分享、点赞、在看三选一吧🙏