神经网络架构搜索——可微分搜索 (Noisy-DARTS)

神经网络架构搜索——可微分搜索 (Noisy-DARTS)

      • 动机
        • FairDARTS: Sigmoid函数替换Softmax函数
        • NoisyDARTS:skip-connection注入噪声
      • 方法实现
        • 如何加噪声?
        • 加入怎样的噪声?
      • 实验结果
        • 架构参数可视化
        • CIFAR-10实验结果
        • ImageNet实验结果
        • 消融实验
          • 有噪声 vs. 无噪声
          • 无偏噪声 vs. 有偏噪声
          • 高斯噪声 vs. 均匀噪声
          • 加性噪声 vs. 乘法噪声

小米实验室 AutoML 团队的NAS工作,针对现有DARTS框架在搜索阶段训练过程中存在 skip-connection 富集现象,导致最终模型出现大幅度的性能损失的问题,提出了通过向 skip-connection 注入噪声的方法,来抵消由于不公平竞争而导致的富集和性能损失问题,并且在 CIFAR-10 和 ImageNet 上分别取得了 97.61%和77.9% 的 SOTA 结果。

  • 论文链接:http://arxiv.org/abs/2005.03566
  • 源码链接:https://github.com/xiaomi-automl/NoisyDARTS

动机

目前 NAS 方法已经存在非常多,其中谷歌提出的 DARTS 方法,即可微分结构搜(Differentiable Architecture Search),引起了广大研究从业人员的关注与研究。但是DARTS 的可复现性不高,主要原因包括:

  • 搜索过程中存在 skip-connection 富集现象,导致最终模型出现大幅度的性能损失问题。
  • softmax离散化存在很大gap,结构参数最佳的操作和其他算子之间的区分度并不明显,这样选择的操作很难达到最优。

FairDARTS: Sigmoid函数替换Softmax函数

Softmax操作使不同操作之间的关系变为竞争关系由于 skip connection 和其他算子的加和操作形成残差结构,这就导致了 skip connection 比其他算子有很大的优势,这种优势在竞争环境下表现为不公平优势并持续放大,而其他有潜力的操作受到排挤,因此任意两个节点之间通常最终会以 skip connection 占据主导,导致最终搜索出的网络性能严重不足。

FairDARTS 通过 sigmoid 使每种操作有自己的权重,这样鼓励不同的操作之间相互合作,最终选择算子的时候选择大于某个阈值的一个或多个算子,在这种情形下,所有算子的结构权重都能够如实体现其对超网性能的贡献,而且残差结构也得以保留,因此最终生成的网络不会出现性能崩塌,从而避免了原生 DARTS 的 skip-connection 富集而导致的性能损失问题。

a = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
b = sigmod(a)
c = softmax(a)
b = array([0.52497919, 0.549834  , 0.57444252, 0.59868766, 0.62245933, 0.64565631, 0.66818777, 0.68997448, 0.7109495 ])
c = array([0.07205446, 0.0796325 , 0.08800752, 0.09726335, 0.10749263, 0.11879773, 0.13129179, 0.14509987, 0.16036016])

NoisyDARTS:skip-connection注入噪声

NoisyDARTS 是在 FairDARTS 基础上的推论,既然 skip connection 存在不公平优势,那么采用通过向 skip-connection 注入噪声的方法,来抵消由于不公平竞争而导致的富集和性能损失问题,并且在 CIFAR-10 和 ImageNet 上分别取得了 97.61% 和77.9% 的 SOTA 结果。

方法实现

如何加噪声?

NoisyDARTS 选择仅在前向传递的 skip-connection 的输入中加入噪声

L=g(y),y=f(αskip)(x+x~) \mathcal{L}=g(y), \quad y=f\left(\alpha^{s k i p}\right) \cdot(x+\tilde{x})

其中g(y)g(y)是损失函数,f(αskip)f\left(\alpha^{s k i p}\right)是 DATRS 中的 softmax 函数,x~\tilde{x}是加注的噪声。在向前传递加入噪声的时候,后向对αskip\alpha^{s k i p}梯度更新的时候,就要将噪声一起计算在内:

Lαskip=Lyyαskip=Lyf(αskip)αskip(x+x~) \frac{\partial \mathcal{L}}{\partial \alpha^{s k i p}}=\frac{\partial \mathcal{L}}{\partial y} \frac{\partial y}{\partial \alpha^{s k i p}}=\frac{\partial \mathcal{L}}{\partial y} \frac{\partial f\left(\alpha^{s k i p}\right)}{\partial \alpha^{s k i p}}(x+\tilde{x})

加入怎样的噪声?

加入噪声会为梯度更新带来不确定性,因此选择噪声的原则首先要保持梯度的更新是有效的。NoisyDARTS 提出,应该加注一种无偏的并且方差较小的噪声,比如本文实验中使用均值为0,方差很小的高斯分布作为噪声。因为噪声相对输入很小,所以可以做如下估计:

yf(α)x when x~x y^{\star} \approx f(\alpha) \cdot x \quad \text { when } \quad \tilde{x} \ll x

这样做的近似好处在于,我们可以近似认为梯度的期望也是无偏的:

E[skip]=E[Lyf(αskip)αskip(x+x~)]Lyf(αskip)αskip(x+E[x~]) \mathbb{E}\left[\nabla_{s k i p}\right]=\mathbb{E}\left[\frac{\partial \mathcal{L}}{\partial y} \frac{\partial f\left(\alpha^{s k i p}\right)}{\partial \alpha^{s k i p}}(x+\tilde{x})\right] \approx \frac{\partial \mathcal{L}}{\partial y^{\star}} \frac{\partial f\left(\alpha^{s k i p}\right)}{\partial \alpha^{s k i p}}(x+\mathbb{E}[\tilde{x}])
其中噪声是均值为0的高斯分布,所以E[x~]=0E[\tilde{x}]=0

class Identity(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, x):
        return x + (0.1**0.5)*torch.randn_like(x) # add (0,0.1) Gaussian Noisy

实验结果

架构参数可视化

架构参数可视化

上图展示的是在 supernet 训练过程中,不同的操作在 softmax 下的权重变化,其中深绿色的线是 skip-connection 被 softmax 分配的权重。这张图中可以看到,normal cell中 的 skip-connection 数量被极大的消减了,同时保留了 reduction-cell 中的 skip-connection。

CIFAR-10实验结果

下图展示的是在 CIFAR-10 上,NoisyDARTS 与其他主流 NAS 方法相比的结果,其中 NoisyDARTS-A-t 是在 ImageNet上 训练得到的模型,迁移到 CIFAR-10 上训练得到的结果:

CIFAR-10实验结果

CIFAR-10 DARTS搜索结果

ImageNet实验结果

ImageNet实验结果

搜索结果

消融实验

有噪声 vs. 无噪声

有噪声 vs. 无噪声

无偏噪声 vs. 有偏噪声

无偏噪声 vs. 有偏噪声

高斯噪声 vs. 均匀噪声

高斯噪声 vs. 均匀噪声

加性噪声 vs. 乘法噪声

加性噪声 vs.  乘法噪声


更多内容关注微信公众号【AI异构】

热门文章

暂无图片
编程学习 ·

Linux centos7 乱码设置中文字符集

1.locale 查看现在使用的字符集locale -a 查看有哪些字符集utf8的就可以显示中文yum -y install kde-l10n-Chinese 安装后选个uft8的 ,设置一下全局变量vi /etc/profileexport LANG=en_CA.utf8=号后面是字符集,这个大家随意最后让这个配置文件生效就可以了. /etc/profile 可能…
暂无图片
编程学习 ·

Unity2D教程:菜单界面、文字设置、常用界面功能

菜单界面创建一个UI-Image,会自动生成Canvas。 设置Canvas的设置模式为随屏幕改变 设置Image的伸展模式,在这个界面按下Alt键会变成这样,选择右下角那个就是填充整个Canvas了在当前Image下创建Button,将Button下面的Text和Button自身都弄成预置物Text可以加一个Outline组件…
暂无图片
编程学习 ·

聚焦Java性能优化 打造亿级流量秒杀系统【学习笔记】06_交易性能优化技术之缓存库存

文章目录本章目标7-1 交易性能瓶颈7-2 交易验证优化7-3 活动缓存库存方案一(重点)库存行锁优化扣减库存缓存化(方案一)异步同步数据库(方案二)异步消息队列rocketmq库存数据库最终一致性保证7-5 活动缓存库存方案二分布式事务7-7 rocketmq安装7-8 缓存库存接入异步化 本章…
暂无图片
编程学习 ·

RFID标签与我们的生活息息相关

在我们的生活中,很多领域都在使用RFID标签,下面,小编就来给大家介绍一下。1、ETC智能收费把RFID标签安装在车子汽车挡风玻璃上,在高速收费站ETC行车道上的频射无线天线中间的专用型短程通信,利用软件连接网络技术性与金融机构开展后台管理清算解决,进而做到车子根据路桥区…
暂无图片
编程学习 ·

无线传输技术有哪些?

什么是ZigBee? ZigBee,也称紫蜂,是一种低速短距离传输的无线网上协议,底层是采用IEEE802.15.4标准规范的媒体访问层与物理层。主要特色有低速、低耗电、低成本、支持大量网上节点、支持多种网上拓扑、低复杂度、快速、可靠、安全。 三大特征、八大优势 特征一 ZigBee能源消…
暂无图片
编程学习 ·

还是别看学位论文

最近我实验室的一个组在做疫情预测的工作。效果还行,论文也写的差不多了。不过上面的老师说引的文章都太老了,让再加点新的。于是今天下午我就和大家一起看文献。之所以之前引的都比较老,主要是因为传染病预测这块分两派,一派是理论建模派,主要工具就是微分动力模型,一般…
暂无图片
编程学习 ·

redis知识点(一)

redis知识点(一) 问题Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存…
暂无图片
编程学习 ·

文创调研案例02-瑞士达沃斯小镇

摘要:达沃斯小镇作为世界特色小镇的典范,以其特色生态为基础,不断创新,形成了会议、疗养、体育、旅游多条产业互相作用的综合产业,其宝贵经验具有借鉴价值。中国自2016年起,特色小镇遍地开花,但同质化现象严重,如何打造特色小镇的“特”成了关键。本文以达沃斯小镇为例…
暂无图片
编程学习 ·

训练数据转换为PASCAL VOC2007

数据 我们已有标注数据个数为json保存的,现在训练代码使用的标注格式为PASCAL VOC2007,为了不修改代码,将数据转换到PASCAL VOC2007的xml格式。 转换代码 import os import json from lxml.etree import Element, SubElement, tostring, ElementTree from xml.dom import mi…
暂无图片
编程学习 ·

springboot 整合xcf 发布 webservice

Spring Boot集成webService在pom添加依赖<!--WerbService CXF依赖 start--> <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId> </dependency> <dependency><groupId>org.…
暂无图片
编程学习 ·

centos7 64位使用心得

一、安装宝塔面板 1、安装宝塔面板,安装方法去官网查询 2、修改默认路径,面板设置 - 默认建站目录和默认备份目录修改为: /home /home/backup二、安装云锁 1、安装最新版、提示Install Complete(安装完成),下面是安装运行代码。 wget https://download.yunsuo.com.cn/v3/…
暂无图片
编程学习 ·

Vue父组件调用子组件的方法

1.子组件使用ref,父组件直接调用(推荐)<child ref="mychild"></child>this.$refs.mychild.childMethod("嘿嘿嘿");2.子组件注册监听事件,父组件调用$emit触发this.$refs.mychild.$emit(childMethod,嘿嘿嘿) // 方法1:触发监听事件//子组件注册…
暂无图片
编程学习 ·

【Linux】——I/O复用之poll

1、poll的概述 在上一篇文章中,我们详细的介绍了I/O复用技术中的select使用。这篇文章我们来主要介绍一下poll. poll系统调用和select类似,也是在指定事件内轮询一定数量的文件描述符,以测试其中是否有就绪的 本质都是统一监听,如果任意一个文件描述符上有关注的事件发生。…
暂无图片
编程学习 ·

Oacle-获取CLOB类型xml数据中指定节点数据

语法 select extractvalue(xmltype(colomnName),TraceNodePath) from tableName;本地小实验一下: 一、建表 create table panda(id number,xmlParam clob);二、插入数据: insert into panda values(1,to_clob( <xml> <head> <TransCode>dms03004</Trans…
暂无图片
编程学习 ·

Docker 安装 kafka

1.下载镜像 a) 下载 zookeeper docker pull wurstmeister/zookeeperb) 下载 kafka docker pull wurstmeister/kafka:2.11-0.11.0.32.启动镜像 a) 启动zookeeper docker run -d --name zookeeper --publish 2181:2181 --volume /etc/localtime:/etc/localtime wurstmeister/zook…
暂无图片
编程学习 ·

Java Spring Shiro 安全框架:(八)加密算法

加密算法1.手动处理数据时,自行使用MD5加密2.使用Shiro的MD5方式进行加密在身份认证的过程中往往都会涉及到加密,如果不加密,这个时候信息就会非常的不安全,shiro 中提供的算法比较多 如 MD5 SHA 等1.手动处理数据时,自行使用MD5加密 package com.shiro3;import org.apache.s…
暂无图片
编程学习 ·

网上书城前端界面设计

网上书城界面设计前言界面设计首页登录注册书籍搜索购物车代码实现总结 前言 接着我的上一篇博客来,今天为大家分享的内容是网上书城项目的界面设计以及代码分析 网上书城项目需求分析、功能划分、数据库表设计、工具类介绍 界面设计 首页首页的话,主要涉及到了BootStrap的相…
暂无图片
编程学习 ·

中国互联网热衷造轮子!去哪儿网开源消息中间件QMQ,京东也搞JMQ

中国互联网热衷于“造轮子“!在Github上查看消息队列的时候,那个专栏就透露:京东已推出自己的消息队列产品 JMQ,并且将很快开源问世!之后,我很少留意过 JMQ 的消息。今天偶然之间,看到去哪儿网也搞了一个消息中间件 QMQ。根据去哪网的开发团队透露,QMQ 内部已经使用了 …
暂无图片
编程学习 ·

【源码阅读技巧一】查看类关系图,接口实现关系图(idea版本)Diagrams关系图

我们在阅读源码的时候,往往需要理清楚各个类,各个接口之间的关系,然后再去理解他的设计思路,有个大概理解,然后去阅读源码,就容易很多,那么今天就来讲一下如何使用idea来查看关系图: 一、查看类的父类,以及实现的接口 1、打开想要查看的类,通过idea的定位找到类所在位…
暂无图片
编程学习 ·

想进大厂?字节跳动等独角兽公司都在重金招聘Python工程师!(Python就是第一语言!)

在本文章中,作者通过自身经历,力求客观的谈谈个人选择学习Python的动机,以及独角兽公司对Python工程师的要求及薪资。 从目前各种迹象(企业招聘,语言排名等)看来Python相对Java应该是暂时领先,这得力于Python的厚积薄发。 01选择Python不只是选择一门语言 你能收获并不仅…