ProxylessNAS 论文笔记

 

用MarkDown写的 优快云支持好像不是特别友好。

原文地址

# 论文笔记 
[Paper ?](https://arxiv.org/abs/1812.00332)
## ProxylessNAS </br>
这篇文章主要解决NAS代理机制下无法搜索到全局最优的问题,改进搜索策略,一定程度上解决资源消耗的问题。</br>
### 前言
这篇文章是基于DARTs改的,谈谈DARTs的一些问题:

* 只搜索cell,然后不断的堆叠起来,实际上只要网络堆叠的够深,性能并不会太差
* 一些operation的结构参数非常接近,比如两个op的结构参数分别是20.2%,20.1%,似乎选择20.2%和20.1% 并没有太大的差别
* 一开始是在整个Net上进行训练,但是选取的时候只是选择一个子网络,中间可能会出现一些问题

** 以上是自己总结下来的,文章中的前言部分请移步[原论文](https://arxiv.org/abs/1812.00332)

那么ProxylessNAS做了什么?

* 直接搜索整个Net,并不需要堆叠cell来实现
* 并没有向Darts一样对整个Net上训练,而是利用采样来实现路径的选择

### 具体内容
- 如何直接搜索整个Net?
<br />论文引入了Gate的概念,门在op的后面,控制路线的通断,而门的选取概率和它的结构参数有关
$$ g = binarize(p_1,...,P_N) = \begin{cases} [1,0,...,0]\ with\ probability\ p_1\\
  \quad\ \  ... \\
  [0,0,...,1]\ with\ probability\ p_N\\
 \end{cases} $$
 其中 $p_i = \frac{exp(\alpha_i)}{\sum_{k}exp(\alpha_k)}$,这个操作和DARTs不同,DARTs的做法是直接把所有可能的OP用Softmax处理后全部加进来,然后综合考虑。</br>而ProxylessNAS则是按照$p_i$的概率对op进行一个选取。
 $$m_{darts} = \sum_{i=1}^{N}p_i\ o_i(x),\quad m_{proxyless} = \sum_{i=1}^{N}g_i\ o_i(x) = o_i(x)\ with\ probability\ p_i $$
 这种采样机制似乎是更合理的,选取的结构直接拿去训练,搜索。</br>
- 梯度回传?
 <br />由于这种采样机制不会显示的包含他的结构参数(而DARTs是包含的,所以他可以直接用求导进行梯度回传),所以他在这里门的选取概率才会与结构参数相关联,这样在求导的时候才可以隐式的回传回去。</br>在这里ProxylessNAS用之前的[BinaryConnect](https://arxiv.org/pdf/1511.00363.pdf)的梯度回传处理方法。其实在这里,你可以认为他们把binaryConnect之前在CNN内部的操作,放大到对Network PATH上,实际上一些操作也是从CNN的内部结构中借鉴过来的,比如,DropPATH 对应 DropOut。或许ReLU也可以借鉴在NAS上,或者其他的一些idea。 
 $$\frac{\partial L}{\partial \alpha_i} = \sum_{j=1}^{N}\frac{\partial L}{\partial p_j}\frac{\partial p_j}{\partial \alpha_i} \approx \sum_{j=1}^{N}\frac{\partial L}{\partial g_j}\frac{\partial p_j}{\partial \alpha_i} = \sum_{j=1}^{N}\frac{\partial L}{\partial g_j}\frac{\partial \frac{exp(\alpha_j)}{\sum_{k}exp(\alpha_k)}}{\partial \alpha_i} = \sum_{j=1}^{N}\frac{\partial L}{\partial g_j}p_j(\delta_{ij}-p_i) $$ 其中 $\delta_{ij} = 1$ if $i=j$ and $\delta_{ij} = 0$ if $i\neq j$
这样看起来就可以进行求导了,但是每次对一个操作进行求导仍然需要对剩余其他的操作求偏导。计算量还是不小,作者提出了一个想法来解决这个问题,选择一个网络一定是因为它比其他的网络更优秀。作者只采样两条路径,然后对两条路径进行梯度回传。我的理解,假设选取的路径是A与B,如果A比B在网络更重要相对应的梯度回传给他的就越大,与此同时他选取到的概率就越大。</br>在某种意义上,网络会偏向于采样结构参数大的网路,意味着这些网络也更容易得到训练。类比就是,穷人越来越穷,富人越来越富,然后最终的网络选取最富的那一条。如果只选取一条路径,这样没办法在比较中差异化网络,选取两条应该是在计算消耗以及精确度之间的一个Trade-off.</br>
- 详细的训练过程。</br>
step1: 初始化各项参数(网络参数指CNN的卷积参数,结构参数指各个op的选择系数)</br>
step2: 固定结构参数,与此同时对路径随机采样(选取gate),然后训练网络参数。</br>
step3: 固定网络参数,按照上述的方法来采样两条路径,对结构参数进行更新。</br>
循环2,3直到网络收敛或迭代固定次数,出现差异化大的网络,在每一步选取结构参数最大的op</br>
- 加入硬件化的指标</br>
对硬件Latency进行建模,对每个op的latency进行预测,乘上他们的相应的结构参数然后加入到loss中,做一个Trade-off。
- 方法对比</br>
对比强化学习的方式对网络的结构参数进行更新。前面都是不变的,只不过在如何让目标函数与结构参数的联系方式不同。</br>
我对reinforce机制下的更新不是特别熟悉,暂时没办法把这一块说的特别清楚。(留个坑更新吧)</br>
- 结果</br>
那肯定是好的。对比了Proxyless-G,以及Proxyless-R;而且在移动端,CPU,GPU都测试了延时。并且发现了一些网络设计的启发。原作者在知乎上回答这方面的内容。[移步?](https://www.zhihu.com/question/296404213/answer/547163236)
</br>
- 观点</br>
这种二值连接比较好玩,简化计算也比较有意思。
但是这种结构不会搜索多元的连接方式,不会出现像ResNet以及Inception的类似结构。


 
 


 

### 关于 Neural Architecture Search (NAS) 的研究论文 Neural Architecture Search (NAS) 是一种自动化的机器学习方法,旨在通过算法设计高效的神经网络结构。以下是关于 NAS 领域的一些重要研究工作及其贡献: #### 1. 经典综述文章 一篇重要的综述文章《A Survey on Neural Architecture Search》由 Martin Wistuba、Ambrish Rawat 和 Tejaswini Pedapati 编写[^1]。该文章全面概述了 NAS 方法的发展历程以及其在不同领域中的应用。 另一篇类似的综述文章名为《Neural Architecture Search: A survey》,它详细描述了 NAS 中的关键组成部分之一——搜索空间的设计原则[^2]。这些文章对于理解 NAS 技术的基础至关重要。 #### 2. 初始探索与开创性工作 - **Zoph et al., 2017**: 这项研究首次提出了利用强化学习来自动化寻找最优 CNN 架构的方法,并取得了超越人类专家设计的结果[^3]。 - **Real et al., 2019**: 提出了基于进化算法的 ENAS(Efficient Neural Architecture Search),显著降低了计算成本的同时保持性能优越性[^4]。 #### 3. 搜索效率改进的研究方向 为了减少传统 NAS 方法所需的大量资源消耗问题,一些后续工作中引入了新的技术手段: - DARTS (Differentiable Architecture Search): 使用连续松弛技巧使得架构参数可以被梯度下降法优化从而极大加速整个过程[^5]; - ProxylessNAS: 实现了一种无需代理模型即可完成高效硬件感知型网络构建的方式[^6]; 以上提到的各种技术和理论共同推动着 NAS 不断向前发展,在实际工业场景下也逐渐展现出巨大潜力价值。 ```python import numpy as np def nas_search_space_example(): """ This function demonstrates an example of defining a simple chain-like search space. In this case, we define layers with different operation types that can be selected during the search process. """ operations = ['conv_3x3', 'sep_conv_3x3', 'max_pool_3x3'] num_layers = 5 # Randomly select one operation per layer to simulate architecture sampling sampled_architecture = [np.random.choice(operations) for _ in range(num_layers)] return sampled_architecture print(nas_search_space_example()) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值