保姆级带你深入阅读NAS-BERT
摘要:本文用权重共享的one-shot的NAS方式对BERT做NAS搜索。
本文分享自华为云社区《[NAS论文][Transformer][预训练模型]精读NAS-BERT》,作者:苏道 。
NAS-BERT: Task-Agnostic and Adaptive-Size BERT Compression with Neural Architecture Search
简介:
论文代码没有开源,但是论文写得挺清晰,应该可以手工实现。BERT参数量太多推理太慢(虽然已经支持用tensorRT8.X取得不错的推理效果,BERT-Large推理仅需1.2毫秒),但是精益求精一直是科研人员的追求,所以本文用权重共享的one-shot的NAS方式对BERT做NAS搜索。
涉及到的方法包括 block-wise search, progressive shrinking,and performance approximation
讲解:
1、搜索空间定义
搜索空间的ops包括深度可分离卷积的卷积核大小[3/5/7],Hidden size大小【128/192/256/384/512】MHA的head数[2/3/4/6/8],FNN[512/768/1021/1536/2048]、和identity 连接,也就是跳层了,一共26个op,具体可见下图:

注意这里的MHA和FNN是二选一的关系,但是可以比如说第一层选MHA第二层选FNN,这样构成一个基本的Transformer块,可以说这个方法打破的定式的Transformer块的搜索又包含了Transformer和BERT的结构,不同层间也是链式链接,每层只选择一个op,如下图

2、超网络的训练方式
【 Block-Wise Training + Knowledge Distillation、分块训练+KD蒸馏】
(1)首先把超网络等分成N个Blocks
(2)以原始的BERT作为Teacher模型,BERT也同样分为N个Blocks
(3)超网络(Student)中第n个块的输入是teacher模型第n-1个块的输出,来和teacher模型的第n个块的输出做均方差来作为loss,来预测teacher模型中这第n个block的输出
(4)超网络的训练是单架构随机采样训练
(5)由于student 块的隐藏大小可能与teacher块中的hidden size不同,能直接利用教师块隐藏的输入,和输出作为学生块的训练数据。为了解决这个问题,需要在学生块的输入和输出处使用一个可学习的线性变换层来转换每个hidden size,以匹配教师块的大小,如下图所示

【 Progressive Shrinking】
搜索空间太大,超网络需要有效的训练,可以借助Progressive Shrinking的方式来加速训练和提高搜索效率,以下简称为PS。但是不能简单粗暴的剔除架构,因为大架构再训练初期难收敛,效果不好,但是并不能代表其表征能力差,所以本文设置了一个PS规则:

其含义,a^t表示超网络中最大的架构,p()表示参数量大小,l()表示latency大小,B表示设置B个区间桶,b表示当前为第几个区间。如果一个架构a不满足p_b>p(a)>pb_1并且l_b>l(a)>l_b-1这个区间,就剔除。
PS的过程就是从每个B桶中抽E个架构,过验证集,剔除R个最大loss的架构,重复这个过程直到只有m个架构在每个桶中
3、Model Selection
建一个表,包括 latency 、loss、 参数量 和结构编码,其中loss和latency是预测评估的方法,评估方法具体可以看论文,对于给定的模型大小和推理延迟约束条件,从满足参数和延迟约束的表中选择最低loss的T个架构,然后把这个T个架构过验证集,选取最好的那个。
实验结果
1、和原始BERT相比在 GLUE Datasets上都有一定的提升:

2、和其他变种BERT相比效果也不错:

消融实验
1、PS是否有效?
如果不用PS方法,需要巨大的验证上的时间(5min vs 50hours),并且超网络训练更难收敛,影响架构排序:

2、是PS架构还是PS掉node
结论是PS掉node太过粗暴,效果不好:

3、二阶段蒸馏是否有必有?
本文蒸馏探究了预训练阶段和finetune阶段,也就是pre-train KD 和 finetune KD,结论是:
1、预训练蒸馏效果比finetune时候蒸馏好
2、两阶段一起蒸馏效果最好

保姆级带你深入阅读NAS-BERT的更多相关文章
- 自建本地服务器,自建Web服务器——保姆级教程!
搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...
- 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)
写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...
- 【保姆级】利用Github搭建自己的个人博客,看完就会
大家好,我是辰哥~ 作为一名喜欢技术的爱好者,平时喜欢把自己学习技术的心得或者一些踩坑.易错的过程记录下来,首选的是技术平台(博客),今天辰哥来教大家如何利用Github来搭建一个自己的个人博客平台. ...
- 强大博客搭建全过程(1)-hexo博客搭建保姆级教程
1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...
- RocketMQ保姆级教程
大家好,我是三友~~ 上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作 ...
- Swagger保姆级教学
Swagger保姆级教学 Swagger 简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样 ...
- 带你逐行阅读redux源码
带你逐行阅读redux源码 redux版本:2019-7-17最新版:v4.0.4 git 地址:https://github.com/reduxjs/redux/tree/v4.0.4 redux目 ...
- 重磅:保姆级Java技术图谱发布!够学到元宵节了,赶紧收藏!
最近因为参与社群交流的时间比较多,除了唠唠白酒的嗑之外,很大一部分时间都是看到群里问到一些关于Spring Boot和Spring Cloud应用过程中碰到的问题以及一些开发过程中的报错信息.在这些帮 ...
- 保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java、Golang两种客户端教学Case)
保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java.Golang两种客户端教学Case) 目录 什么是AMQP 和 JMS? 常见的MQ产品 安装RabbitM ...
- Mysql读写锁保姆级图文教程
摘要:读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞. 本文分享自华为云社区<Mysql保姆级读写锁图文教程丨[绽放吧!数据库]>,作者:Code皮皮虾 . 准备 创建mylock表 ...
随机推荐
- 如何恢复win10/11音量条为默认样式?
保存为reg: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Curre ...
- [Python急救站课程]五角星的绘制
五角星的绘制 from turtle import * # 从turtle库中导入所有函数 fillcolor("red") # 表示填充红色 begin_fill() # 表示开 ...
- 解决Pycharm运行成功,但无法生成:pytest-html报告
不生成报告的原因: 用户习惯:使用者习惯于单独执行测试文件.py,调试测试用例: 而编辑器为了方便用户执行测试用例,变调用python test来执行测试用例,这种情况下,执行的只是用例或者套件,不是 ...
- 开发现代化的.NetCore控制台程序:(3)将nuget包发布到GitHubPackages
前言 上一篇文章已经把项目模板的nuget包发布到了 nuget 的官方源了,其实还可以发布到其他源,比如 GitHub ,本文记录一下发布到 GitHub Packages 的过程. 注意:本文建立 ...
- 从混乱到优雅:基于DDD的六边形架构的代码翻新指南
前言 趁着双十一备战封板,终于又有一些时间可以梳理一下最近的心得. 最近这半年跟同事讨论比较多的是分层架构,然后就会遇到两个触及灵魂的问题,一个是如何做好分层架构,二是DDD在架构层面该如何落地. 为 ...
- 用友U8和旺店通·企业奇门单据接口对接
用友U8和旺店通·企业奇门单据接口对接 对接系统旺店通·企业奇门 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化 ...
- ThreadPoolExecutor线程池内部处理浅析
我们知道如果程序中并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束时,会因为频繁创建线程而大大降低系统的效率,因此出现了线程池的使用方式,它可以提前创建好线程来执行任务.本文主要通过j ...
- Linux笔记03: Linux常用命令_3.2目录操作命令
3.2 目录操作命令 3.2.1 ls命令 ●命令名称:ls. ●英文原意:list directory contents. ●所在路径:/usr/bin/ls. ●执行权限:所有用户. ●功能描述: ...
- vue-test -----ListDemo 列表渲染
<template> <h3>数组</h3> <button @click="addnums">添加数据</button> ...
- 数据库系列:业内主流MySQL数据中间件梳理
数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩容 数据库 ...