本篇文章沿用知乎上一位前辈给的线索做出拓展学习如何看待神经框架搜索的发展
Neural Architecture search with Reinforcement learning
这篇文章是最初的一篇文章,如前辈所述,总体特点就是大力出奇迹。下面详细的介绍一下这篇文章:(因为用ppt更加直接,所以我喜欢在学习的过程中做成ppt以免之后忘记得很快,谢谢理解)
原文链接:Neural Architecture search with Reinforcement learning
RNN 控制器
人工设计的网络总是没有那么如意,所以有人就尝试用机器搜索来甄选最合适的网络结构,这也是这篇文章的初衷,但是具体是怎么做的呢,首先我们需要了解的是强化学习的概念,简单来理解,强化学习就是一种评价学习,做出一个行为后,得到反馈,然后根据得到的反馈来调整自己的行为。前面说的,要用机器自己来搜索网络结构,也就是需要机器自己设计Number of Filters、filter height 、filter width 、stride height、stride width ,作者选用了一个 RNN 的控制器来生成神经网络结构的超参数,为什么要用 RNN 呢?个人认为是目前的神经网络的结构和内部连接是一个可变长度string来指定,所以可以试用 RNN 去产生可变长度的网络结构。
控制器(RNN)的设计借鉴了sequence to sequence的思想,构建训练网络,并用网络的accuracy作为reward返回给控制器来更新控制器的参数,达到更优的策略。RNN控制器产生一个简单的CNN网络,对于CNN网络的每一层,控制器都会产生一组超参数,当层数达到一个阈值,就会停止。RNN的参数会通过增强学习算法更新,以得到更好的模型结构。当完成一个体系结构,网络就会被构建和训练,当网络收敛时,就会在留存数据(训练集和数据集互斥)上进行测试,得到一个准确度,用于更新 RNN 控制器中的 θ t \theta_{t} θt 。
下面就要介绍如何更新 θ t \theta_{t} θt 了,上面说到控制器 (RNN) 借用到了sequence to sequence的思想 ,但是又有些不一样,因为它优化的是一个不可微的目标,也就是 网络的 accuracy。在生成网络收敛时,我们在一个留存数据中得到一个精度,把这个精度当做奖励信号,用强化学习来训练控制器,为了找到最佳网络,我们将其回报期望值最大化,由 J ( θ c ) J(\theta_{c}) J(θc)表示, J ( θ c ) = E p ( a 1 : T : θ c ) [ R ] J(\theta_{c})=E_{p(a_{1}:T: \theta _{c})} [R] J(θc)=Ep(a1:T:θc)[R]由于 R (精确度)不可微分,寻常的 BP 等就不能用在这个上面,文章采用了 REINFORCE rule from Williams (1992): ∇ θ c J ( θ c ) = ∑ t = 1 T E P ( a 1 : T ; θ c ) [ ∇ θ c log P ( a t ∣ a ( t − ∣ 1 ) : 1 ; θ c ) R ] \nabla_{\theta_{c}} J\left(\theta_{c}\right)=\sum_{t=1}^{T} E_{P\left(a_{1: T} ; \theta_{c}\right)}\left[\nabla_{\theta_{c}} \log P\left(a_{t} | a_{(t-| 1): 1} ; \theta_{c}\right) R\right] ∇θcJ(θc)=t=1∑TEP(a1:T;θc)[∇θclogP(at∣a(t−∣1):1;θc)R]经验近似值为: 1 m ∑ k = 1 m ∑ t = 1 T ∇ θ c log P ( a t ∣ a ( t − 1 ) : 1 ; θ c ) R k \frac{1}{m} \sum_{k=1}^{m} \sum_{t=1}^{T} \nabla_{\theta_{c}} \log P\left(a_{t} | a_{(t-1): 1} ; \theta_{c}\right) R_{k} m1k=1∑mt=1∑T∇θclogP(at∣a(t−1):1;θc)Rk由于该式子方差过大,为了减小方差,又采用了一个 baseline function: 1 m ∑ k = 1 m ∑ t = 1 T ∇ θ c log P ( a t ∣ a ( t − 1 ) : 1 ; θ c ) ( R k − b ) \frac{1}{m} \sum_{k=1}^{m} \sum_{t=1}^{T} \nabla_{\theta_{c}} \log P\left(a_{t} | a_{(t-1): 1} ; \theta_{c}\right)\left(R_{k}-b\right) m1k=1∑mt=1∑T∇θclogP(at∣a(t−1):1;θc)(Rk−b) 其中b不依赖于当前的行为,这就是一个无偏的梯度估计,式中, m m m是模型的个数, T T T是超参的个数, b b b是之前构架精度的指数移动平均值。
分布式训练加速与 skip connection and other layer types
在神经架构搜索中,控制器参数
θ
c
\theta_{c}
θc 每个梯度更新对应于一个训练子网络收敛,由于训练子网络很慢,所以采用分布式训练与异步参数更新来加快控制器学习进程。
思路:parameter server 共同保存了控制器里的参数,server将参数分发给controller,每个controller使用得到的参数进行模型构建,由于得到的参数可能不同,构建模型的策略是随机的,导致每次构建网络结构也不同,每个controller会构建一个batch,也就是m个网络,然后并行的训练,得到它们的accuracy,也就是说,最后得到m个网络和它们的accuracy,然后根据之前计算的公式计算参数的梯度,计算完梯度的controller 将梯度发给server。这些server得到梯度之后,分别对自己负责的参数进行更新,更新后当controller再次训练时,会得到更新后的参数,这里如果每个controller各自发送自己的梯度,之间不进行同步,也就是异步更新。
类似于 Resnet,作者通过跳过连接层和分支层来扩大搜索空间。在第 n n n 层,作者加入 anchor , anchor 中具有之前 n − 1 n-1 n−1 层 sigmoid ,用来指示需要连接的前几层,每个sigmoid 都是控制器的当前隐藏状态和前 n − 1 n-1 n−1 个Anchor point 隐藏状态的函数, P ( Layer j is an input to layer i ) = sigmoid ( v T tanh ( W p r e v ∗ h j + W c u r r ∗ h i ) ) \mathrm{P}(\text { Layer } \mathrm{j} \text { is an input to layer } \mathrm{i})=\operatorname{sigmoid}\left(v^{\mathrm{T}} \tanh \left(W_{p r e v} * h_{j}+W_{c u r r} * h_{i}\right)\right) P( Layer j is an input to layer i)=sigmoid(vTtanh(Wprev∗hj+Wcurr∗hi)) 其中 1 ≤ j ≤ n − 1 1 \leq j \leq n-1 1≤j≤n−1,其中 v v v、 W p r e v W_{prev} Wprev、 W c u r r W_{curr} Wcurr 都是可训练参数。
为了避免层与层的不兼容和层没有输入和输出等问题,提出了三个措施:1.如果一个层没有输入,那么就把图片作为输入;2.最后一层,把所有没有被链接的层的输出都concatenate起来,然后输出分类器;3,如果两个contcatenate层大小不一,则用0填充小层。
生成循环单元架构
类似于LSTM,在RNN计算中作者也采用了树的结构,一个有两个叶子节点和一个内部节点的树结构,叶节点由0和1索引,内部结构由2索引,控制器 RNN 需要首先预测3个块,每个块为每个树索引制定一个组合方法和一个激活函数。之后他需要预测最后两个块,这两个块指定了如何将
c
t
和
c
t
−
1
c_{t} 和c_{t-1}
ct和ct−1连接到树中的临时变量。在索引0中计算采用相加
A
d
d
Add
Add 与
t
a
n
h
tanh
tanh
a
0
=
tanh
(
W
1
∗
x
t
+
W
2
∗
h
t
−
1
)
a_{0}=\tanh (W_{1} * x_{t}+W_{2}* h_{t-1})
a0=tanh(W1∗xt+W2∗ht−1)
索引1:
a
1
=
R
e
L
U
(
(
W
3
∗
x
t
)
⊙
(
W
4
∗
h
t
−
1
)
)
a_{1}=ReLU((W_{3}*x_{t}) \odot (W_{4}*h_{t-1}))
a1=ReLU((W3∗xt)⊙(W4∗ht−1))
计算新的
a
0
n
e
w
:
a_{0}^{new}:
a0new::
a
0
n
e
w
=
R
e
L
U
(
a
0
+
c
t
−
1
)
a_{0}^{new}=ReLU(a_{0}+c_{t-1})
a0new=ReLU(a0+ct−1)
索引2:
a
2
=
s
i
g
m
o
i
d
(
a
0
n
e
w
⊙
a
1
)
a_{2}=sigmoid(a_{0}^{new} \odot a_{1})
a2=sigmoid(a0new⊙a1)
h
t
=
a
2
h_{t}=a_{2}
ht=a2
计算
c
t
c_{t}
ct :
c
t
=
(
W
3
∗
x
t
)
⊙
(
W
4
∗
h
t
−
1
)
c_{t}=(W_{3}*x_{t}) \odot (W_{4}*h_{t-1})
ct=(W3∗xt)⊙(W4∗ht−1)
实验效果
这次实验在 CIFAR-10 数据集上取得了比较好的效果,但是计算消耗巨大,具体的效果不再细说,大家可以自己去看原文哦。下一篇讲如何进阶 :Learning Transferable Architectures for Scalable Image Recognition。
Learning Transferable Architectures for Scalable Image Recognition
简单的介绍了一下NAS,但是由于计算量巨大,这篇文章是针对前NAS的一个改进。简单总结一下,就是通过一个 RNN 控制器生成不同的子网络,待子网络收敛时,在数据集上得到一个精度,以这个精度作为reward来调节控制器参数,过得更好的效果。但是NAS的问题就在于速度太慢,直接将他用在ImageNet这么大的数据集合上不可行,作者就希望重新设计搜索空间,从而学到一个较为通用的结构,在小数据集上学到的网络,再迁移到大的数据集上。
那么现在问题转变为怎么设计一个合理的搜索空间,其中一个关键的灵感就在于发现很多成功的 CNN 网络结构都是包含了一些重复的基元,那么可不可以让RNN 只预测出一些小点的 convolutional cell 的结构,然后重复的堆跌这样的结构来构建深的网络呢?在文中,作者假定只需要两种convolutional cell:Normal Cell和Reduction Cell,区别就是有没有改变输入数据的纬度。Normal Cell 不改变输入feature map的大小的卷积,也就是下图中的Normal Cell;Reduction Cell将输入feature map的长宽各减少为原来的一半的卷积。为了获得更好的效果,将两种细胞独立训练。
什么是convolution cell 呢,由上图可以看到,一个cell中包含
B
B
B 个 block,而每个block包含
5
5
5 个预测步骤,分别是:
Step 1. Select a hidden state from h or from the set of hidden states created in previous blocks.
Step 2. Select a second hidden state from the same options as in Step 1.
Step 3. Select an operation to apply to the hidden state selected in Step 1.
Step 4. Select an operation to apply to the hidden state selected in Step 2.
Step 5. Select a method to combine the outputs of Step 3 and 4 to create a new hidden state.
(1、从之前hidden block中或者是前两个state中选取一个hidden state
2、重复第一步操作得到第二个hiiden state
3、对于第一步得到的hidden state选取一个operation
4、对于第二步得到的hidden state选取一个operation
5)、将第三步和第四步得到的结果选取一个operation将他们combine;
在第 3 - 4 步中采用的operation包含下面这些剪辑神经网络中的常规操作:
在第5步中有两种个方法:1.element-wise addtion; 2.concatenation;
结合前面所说的,每个controller有 2 ∗ 5 B 2 *5B 2∗5B 个 prediction,其中前 5 B 5B 5B 个 prediction事用于预测 normal cell,后 5 B 5B 5B 个prediction用来预测 Reduction cell 。最后得到最佳模型是在 B = 5 B=5 B=5 的时候在CIFAR-10中得到的最优cell如下图所示。在两种 cell中都有5此 add 操作,(下图展示的是NASNet-A 的cell 结构,)其他两种基于不同的search spaces得到的NASNet-B和NASNet-C的Cell结构可以看论文中最后的附录部分。可以看出虽然作者没有设计类似ResNet那样的residual connection结构(或者叫skip connection),但是这些Cell在训练过程中自己学会了这种skip connection(最优细胞结构图中的虚线连接),这个学习的过程就是上图中前面两个灰色矩形框的select过程(可以和ICLR2017的NAS中设计的skip connection结构对比,在那篇文章中采用的sigmoid结构表达层与层之间的连接关系)。而且作者发现当手动插入residual connection时并没能提高模型的效果。
参考链接1:[Paper Share - 1]Neural Architecture Search With Reinforcement Learning
参考链接2:NEURAL ARCHITECTURE SEARCH WITH REINFORCEMENT LEARNING 笔记
参考链接3:自学网络结构(二):Learning Transferable Architectures for Scalable Image Recognition