何恺明组《Designing Network Design Spaces》的整体解读(一篇更比六篇强)

2023-11-20

本文原载自知乎,已获原作者授权转载,请勿二次转载。

https://zhuanlan.zhihu.com/p/122557226

statistics 大法好,DL不是statistics,因为DL不如statistics。基本全文从统计学的角度解释了怎么设计网络搜索空间好,哪些要素是有用的,其s全面以及宽度广度都令人瞠目结舌,绝对的2020年巅峰大作!

首先放结论,下面每个结论随便都能发一篇论文。

1.实验中发现的几个关于性能的打脸结论:

  • 无论模型多大,20个block的深度是最合适的。大网络越深越好是不对的。

  • bottleneck ratio设置成1是最好的。

  • width multiplier设置成2.5是最优质的。

  • 剩下的初始网络宽度,group数量,宽度的增长斜率,这些随着模型增大而增加会是最佳选择。(大碗宽面2.0,你看我这面,就这么长,但是那么那么那么宽。)

2.然后是几个关于复杂度(速度)的打脸结论,首先这里定义了一个所有卷积层输出tensor的大小叫做activations(这玩意你不管用啥卷积,出来tensor一样大这个值就不变):

  • flpos跟速度之间的关系明显没activations好,啪啪啪。具体见图:

  • 以后不要只用flops建模速度了,这玩意最好用根号flops以及线性的activations一起来建模。

3.再是几个关于非常常见的一些设计比如inverted bottleneck以及depthwise conv的结论。首先前者稍微降低了点EDF(评价指标),后者就还不如group conv。但是scaling the input image resolution是依然有用的。再说SE module,这玩意也有用.

00

引言

一句话概括就是,传统NAS方法这种基于个体估计(individual network instance)的方式(每次评估的时候采样一个网络)存在以下缺陷:

1). 非常不灵活。(各种调参大法) 

2).泛化能力差。

3).可解释性差。(搜出来的效果虽好,但是很多都是大力出奇迹,运气成分+1)。

因此,作者顺理成章地提出了对网络设计空间进行整体估计(population estimation,意思就是所有的深度宽度之类的最佳设计空间关系给它估计出来)。

非常直观地,如果我们能得到深度(depth),宽度(width)等等一系列网络设计要素关于网络设计目标的函数关系,那么我们就很轻松地知道大概多深的网络,多宽的网络是最佳选择。

这句话也直接解决了1),2),3)三个问题,并且这个方式实际上能反应出更优质的网络设计准则,从而达到Designing Network Design Spaces的目的。

读到这里,牛逼就完事了!

01

Tools for Design Space Design

首先咋估计总体呢,其实非常简单,采样,疯狂采样。具体而言就是从任意的搜索空间采样一堆模型。

为了方便快捷,这些模型都是小模型并且只训了10个epoch,这样一来代价也不至于很大。

完事了以后得有个评价标准来评价模型的好坏,其实也比较简单:

图1. The error empirical distribution function.

这样一来就有500多个模型,并且有了评价标准。那么网络深度或者宽度等等信息与评价标准之间的关系就可以画出来了,这样的采样结果可以用来估计总体。

这就是Tools,充满了data science和statistics的味道。

接着,有了这个工具怎么进行统计学分析呢,首先得有个采样的空间是吧,它叫AnyNet Design Space。

02

AnyNet Design Space

AnyNet的设计空间几乎包含了所有网络设计要素,比如depth,width,group之类的。

一般来说,正常的神经网络都只包含4个stage,对于anynet中的4个stage的网络设计要素的选择几乎是任意的,因此叫AnyNet。

并且由于network stem和head在网络设计中不太重要,AnyNet主要面向network body的设计。即便是如此,搜索空间仍高达10的18次,这么大的搜索空间现有NAS方法都要吃灰了。

因此更进一步地,加了一些控制变量,比如说每个stage共享某个参数之类的,于是提出了A,B,C,D,E五种不同的设计空间。

这五个设计空间充满了控制变量法的statistics,A:就是任意的空间,B:在A的观察基础上固定每个stage的bottleneck ratio,C:在B的观察基础上固定每个stage的group数量,D:在C的观察基础上逐stage增宽网络(width),E:在D的观察基础上逐stage加深网络(depth)。

这边Po了N个Fig说明了在控制变量下的statistics,由此观察一波,可以得出这个变量之间暗藏玄机,根据这些观察,来进一步建模统计意义下的最佳搜索空间,它叫RegNet Design Space。

03

The RegNet Design Space

这边有个小插曲,从AnyNet的Fig可以看出,每个individual models结果的偏差很大,再次降维打击NAS。

但是,整体来说,还是能发现一些关系和规律的,通过获得的几个变量和每个block的index之间,可以拟合出函数关系,就此建模好了大概每层的block多宽多深之类的关系,建模方法叫做quantized linear parameterization。(实际上就是函数拟合,一朝回到解放前.)首先,每个block 第j个stage的宽度  用线性关系建模:

 表示初始化的宽度,  是斜率,d表示深度,反正就是很简单的线性关系了。

为了量化  (简单地说就是算出来的宽度可能是126.123之类的奇葩数字,得给它四舍五入到128这种科学的数字,同时每个stage i有很多层,得把宽度统一到某个数字),这里再引入了两组公式和新的超参  用于计算量化因子  :

完事之后,就可以计算出每个stage的宽度是:  ,其中:

对于一共有四个stage的网络,三个超参  grid search最小化对数EDF就完事了(反正就是回归嘛。。)。

到这里位置,search space就被这组包含三个超参的公式表达出来了,有理有据,收下我的膝盖。

接下去就为了说明这个search space强无敌做了坚如磐石的实验比较,最后搜出了吊炸天的网络,这里不再赘述。

论文地址:

https://arxiv.xilesou.top/pdf/2003.13678.pdf

代码地址:(尚未开源,但有部分实验分析)

https://github.com/facebookresearch/pycls

END

备注:NAS

AutoML&NAS交流群

自动机器学习、神经架构搜索等技术,

若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号:aicvml

QQ群:805388940

微博知乎:@我爱计算机视觉

投稿:amos@52cv.net

网站:www.52cv.net

在看,让更多人看到  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何恺明组《Designing Network Design Spaces》的整体解读(一篇更比六篇强) 的相关文章

  • 如何在 Ubuntu 20.04 上安装 Ruby

    Ruby 是当今最流行的编程语言之一 它具有优雅的语法 注重简单性和生产力 Ruby 是强大的 Ruby on Rails 框架背后的语言 在本教程中 我们将向您展示在 Ubuntu 20 04 上安装 Ruby 的三种不同方法 来自标准
  • 如何在 CentOS 7 上安装 Node.js 和 npm

    Node js 是一个跨平台的 JavaScript 运行时环境 允许服务器端执行 JavaScript 代码 Node js 主要用于后端 但作为全栈和前端解决方案也很受欢迎 npm 是 Node Package Manager 的缩写
  • 如何在 CentOS 8 上安装 Tomcat 9

    Apache Tomcat 是 Java Servlet JavaServer Pages Java 表达式语言和 Java WebSocket 技术的开源实现 它是当今世界上采用最广泛的应用程序和 Web 服务器之一 Tomcat 使用简
  • 如何在 Debian 9 上安装 Asterisk

    Asterisk 是最流行且广泛采用的用于构建通信应用程序的开源框架 它被世界各地的个人 小型企业 大型企业和政府使用 Asterisk 功能包括电话会议 语音邮件 等待音乐 呼叫转接 呼叫排队 呼叫录音 数据库存储 检索等等 在本教程中
  • 如何在 CentOS 7 上安装 Minecraft 服务器

    我的世界 是有史以来最受欢迎的游戏之一 这是一款关于放置方块并进行冒险的沙盒视频游戏 在本教程中 我们将完成在 CentOS 7 上安装和配置 Minecraft 服务器所需的步骤 我们将使用 Systemd 来运行 Minecraft 服
  • 如何在 CentOS 7 上安装 Elasticsearch

    Elasticsearch 是一个开源分布式全文搜索和分析引擎 它支持 RESTful 操作 允许您实时存储 搜索和分析大量数据 Elasticsearch 是最流行的搜索引擎之一 为具有复杂搜索要求的应用程序 例如大型电子商务商店和分析应
  • Linux 中的 Tar 命令(创建和提取档案)

    The tar命令通过将一组文件转换为存档来创建 tar 文件 它还可以提取 tar 存档 显示存档中包含的文件列表 向现有存档添加其他文件以及各种其他类型的操作 Tar 最初设计用于创建档案以将文件存储在磁带上 这就是它得名 的原因 Ta
  • 如何在 Ubuntu 18.04 上启用 SSH

    Secure Shell SSH 是一种加密网络协议 用于客户端和服务器之间的安全连接 在本教程中 我们将向您展示如何在 Ubuntu 桌面计算机上启用 SSH 启用 SSH 将允许您远程连接到 Ubuntu 计算机并安全地传输文件或执行管
  • Spring Boot @SpringBootApplication,SpringApplication 类

    春季启动 SpringBootApplication注解 春季启动 SpringBootApplication注解用于标记一个配置类 该类声明了一个或多个 Bean方法和触发器auto configuration和组件扫描 这与声明一个类相
  • 如何在 Ruby 中使用字符串

    介绍 A string是一个或多个字符的序列 可以由字母 数字或符号组成 Ruby 中的字符串是对象 与其他语言不同 字符串是mutable 这意味着可以就地更改它们 而不用创建新字符串 您几乎会在编写的每个程序中使用字符串 字符串允许您使
  • 有用的 Bash 别名和函数简介

    介绍 在命令行上操作的越多 您就越会发现您使用的大多数命令只是可用命令的很小的子集 大多数任务都是习惯性的 您可能每天都以相同的方式运行这些任务 虽然许多最常见的命令实用程序的制造商试图通过使用缩写名称来消除无关的输入 想想通过输入 ls
  • 在 Ubuntu 14.04 上使用 Consul(服务发现系统)简介

    介绍 Consul是一个分布式 高可用 数据中心感知的服务发现和配置系统 它可用于在灵活而强大的界面中呈现服务和节点 使客户端始终能够了解其所属基础设施的最新视图 Consul 提供了许多不同的功能 用于提供有关您的基础设施的一致且可用的信
  • 如何在 Ubuntu 22.04 上使用 uWSGI 和 Nginx 为 Flask 应用程序提供服务

    介绍 在本指南中 您将使用FlaskUbuntu 22 04 上的微框架 本文的大部分内容将讨论如何设置uWSGI应用服务器以及如何启动应用程序和配置Nginx充当前端反向代理 先决条件 在开始本指南之前 您应该 安装了 Ubuntu 22
  • 如何使用 Nginx、Let's Encrypt 和 Docker Compose 保护容器化 Node.js 应用程序

    介绍 有多种方法可以增强您的灵活性和安全性Node js应用 用一个反向代理 like Nginx为您提供负载平衡请求 缓存静态内容和实施传输层安全 TLS 在服务器上启用加密 HTTPS 可确保与应用程序之间的通信保持安全 在容器上使用
  • Python 中的 numpy.append()

    Python numpyappend 函数用于合并两个数组 该函数返回一个新数组 原数组保持不变 NumPy append 语法 函数语法为 numpy append arr values axis None The arr可以是类似数组的
  • 如何使用 Apache 和 Nginx 创建临时和永久重定向

    介绍 HTTP 重定向或 URL 重定向是一种将一个域或地址指向另一个域或地址的技术 重定向有很多用途 并且需要考虑几种不同类型的重定向 每当站点需要将请求一个地址的人定向到另一个地址时 就会使用重定向 当您创建内容和管理服务器时 您经常会
  • eclipse.ini vm 参数 - eclipse.ini 文件位置 Mac、Windows

    eclipse ini是用于控制Eclipse启动的配置文件 我们可以使用 Xms Xmx 参数配置 Eclipse VM 参数 例如要使用的 JDK eclipse ini vm permgen 空间 最大和最小堆大小 eclipse i
  • 如何在 Java 中将字符串转换为数组

    有时我们不得不分开字符串到数组基于分隔符或某些正则表达式 例如 读取 CSV 文件行并解析它们以将所有数据获取到字符串数组 在本教程中 我们将学习如何在 Java 程序中将字符串转换为数组 Java 中的字符串到数组 字符串类split S
  • Java优先级队列

    我们时不时地需要以特定的顺序处理队列中的项目 优先级队列是一种完成这项工作的数据结构 Java优先级队列与 普通 不同queue 它不是 先进先出 而是按优先级顺序检索项目 Java优先级队列 The java util PriorityQ
  • Java 中的 CallableStatement 示例

    java中的CallableStatement用于从java程序中调用存储过程 存储过程是我们在数据库中为某些任务编译的一组语句 当我们处理复杂场景的多个表时 存储过程很有用 我们可以将所需的数据发送到存储过程 并在数据库服务器本身中执行逻

随机推荐

  • Docker 详解:如何容器化并使用 Nginx 作为代理

    Status 已弃用 本文已弃用 不再维护 Reason 本文中的技术已经过时 可能不再反映 Docker 最佳实践 请参阅 Docker 生态系统 常用组件简介 如何在 Ubuntu 14 04 上的 Docker 容器中运行 Nginx
  • 如何在 Ruby 中使用字符串方法

    介绍 Ruby strings有许多内置方法可以轻松修改和操作文本 这是许多程序中的常见任务 在本教程中 您将使用字符串方法来确定字符串的长度 索引和拆分字符串以提取子字符串 添加和删除空格和其他字符 更改字符串中字符的大小写以及查找和替换
  • Python 字符串包含

    Python String 类有 contains 我们可以使用它来检查它是否包含另一个字符串的函数 Python 字符串包含 Python字符串 contains 是一个实例方法 根据字符串对象是否包含指定的字符串对象 返回布尔值 Tru
  • 如何在 Ubuntu 14.04 上使用 Docker 和 Docker Compose 配置持续集成测试环境

    文章来自Docker 介绍 持续集成 CI 是指开发人员的实践整合尽可能频繁地编写代码 并且每次提交在合并到共享存储库之前和之后都会经过测试自动构建 CI speeds up your development process and min
  • Android BroadcastReceiver 示例教程

    今天我们将讨论并实现Android BroadcastReceiver 它是Android Framework中非常重要的组件 Android 广播接收器 Android BroadcastReceiver是android的一个休眠组件 用
  • 蟒蛇集

    In this tutorial we are going to learn Python Set In our previous article we learnt about Python String You can learn it
  • 如何在 Ubuntu 12.10 上使用 Python 创建 Nagios 插件

    介绍 Python 是 Linux 上默认提供的流行命令处理器 我们之前已经介绍过如何在Ubuntu 12 10 x64上安装Nagios监控服务器 这次 我们将扩展这个想法并使用 Python 创建 Nagios 插件 这些插件将在客户端
  • 如何编辑 Sudoers 文件

    介绍 权限分离是 Linux 和类 Unix 操作系统中实现的基本安全范例之一 普通用户以有限的权限进行操作 以减少对自己环境 而不是更广泛的操作系统 的影响范围 一个特殊的用户 称为root has 超级用户特权 这是一个管理帐户 没有普
  • JSTL 教程、JSTL 标签示例

    JSTL 代表JSP 标准标签库 JSTL 是标准标记库 它提供标记来控制 JSP 页面行为 JSTL 标签可用于迭代和控制语句 国际化 SQL 等 我们将在本 JSTL 教程中详细研究 JSTL 标签 之前我们看到了如何使用JSP EL
  • 了解 Python 3 中的类继承

    介绍 面向对象编程创建可重用的代码模式 以减少开发项目中的冗余 面向对象编程实现可回收代码的一种方法是通过继承 此时一个子类可以利用另一个基类的代码 本教程将介绍 Python 中继承的一些主要方面 包括父类和子类如何工作 如何重写方法和属
  • 电商java 面试题_JAVA电商项目面试题(一)

    需要按照功能点把系统拆分 拆分成独立的功能 单独为某一个节点添加服务器 需要系统之间配合才能完成整个业务逻辑 叫做分布式 集群 同一个工程部署到多台服务器上 优点 1 把模块拆分 使用接口通信 降低模块之间的耦合度 2 把项目拆分成若干个子
  • Rabbitmq消息的有序性、消息不丢失、不被重复消费

    如何保证消息的顺序性 如图所示 RabbitMQ保证消息的顺序性 就是拆分多个 queue 每个 queue 对应一个 consumer 消费者 就是多一些 queue 而已 确实是麻烦点 或者就一个 queue 但是对应一个 consum
  • 查经 民数记3章 利未人

    3章 利未人 1 4节 亚伦的儿子们 5 13节 利未人的职责 14 39 利未人男丁的统计 40 51节 利未人代替长子的地位 本章记载了利未人被神呼召 代替以色列各家长子成为事奉神的人 利未人的宗族 人数 及各族负责的事务 这件事灵意上
  • 程序的调试技巧。

    什么是调试 调试又叫Debug 又称除错 是发现和减少计算机程序或电子仪器设备中程序错误的一个过程 生活中所有发生的事情都一定有迹可循 如果问心无愧 就不需要掩盖也就没有迹象了 如果问心有愧疚 必然需要掩盖 那就一定会有迹象 迹象越多就容易
  • 如何控制asp.net控件TextBox输入内容的长度--(多种方法)

    2009 10 22 17 36 件代码如下
  • 在 CentOS 上安装 Docker Engine

    文章目录 在 CentOS 上安装 Docker Engine 先决条件 操作系统要求 卸载旧版本 安装方法 使用 rpm 存储库安装 设置存储库 安装 Docker Engine 安装最新版本 安装指定版本 以非 root 用户身份管理
  • js获取时间戳的四种方法

  • vscode使用手册

    VS Code Visual Studio Code 是一款轻量级 跨平台的源代码编辑器 支持语法高亮 自动补全 调试 Git 版本控制等功能 下面是一些使用 VS Code 的基本操作 安装和启动 在官网上下载并安装 VS Code 打开
  • react里面的接口调用方法

    react接口调用 我们通过npm create react app my app创建react项目 在项目里都是要进行接口调用来获取数据 进行增删改查各种操作的 所以掌握接口调用方式是非常必要的 话不多说进入正题 想要掌握接口调用的内里逻
  • 何恺明组《Designing Network Design Spaces》的整体解读(一篇更比六篇强)

    本文原载自知乎 已获原作者授权转载 请勿二次转载 https zhuanlan zhihu com p 122557226 statistics 大法好 DL不是statistics 因为DL不如statistics 基本全文从统计学的角度