NEURAL ARCHITECTURE SEARCH WITH REINFORCEMENT LEARNING(NAS)
本文讨论的主要问题是
At the moment, neural networks hard to design ,so we propose a new idea.
这个问题重要吗?为什么
At the present, Designing a good neural network takes many steps ,including tuning, which can take a month or more.
针对此问题提出的解决思路
We use recurrent nerual network to generate the model descriptions of nerual networks and train this RNN with reforcement learning to maximize the excepted accuracy of the generated architectures on a validation.
摘要
- 神经网络很好,但是却很难设计。
- 在这篇文章中,我们用RNN产生神经网络的模型并且用强化学习来最小化产生架构验证集上的期望精确度。
- 用的数据集是CIFAR-10以及Penn Treebank,经过实验证明我们的方法比目前最先进的模型效果要好。
1. 介绍
-
近几年中,深度学习架构在许多方面取得了成功,包括语音识别,图像识别,机器翻译
-
人们的重点从特征设计转向架构设计(paradigm shift 范式转移 ,思考式转移)从SIFT, HOG到AlexNet, ResNet, VGGNet, 尽管他变得更容易了,但是设计架构仍然需要很多专家知识和许多时间。
-
我们的工作是基于架构和神经网络的连接能够被可变长字符串指定。因此可以用RNN-控制器产生这种字符串。在真实的数据中训练用字符串指定的网络-子网络-将在验证集中产生精确度。使用这种精确度作为奖励信号,我们可以计算出策略梯度来更新控制器。在下一次迭代中 ,控制器将给一个更高的概率p给接受了更高精度的架构,换句话说,控制器在一遍又一遍重学会提高他的搜索。
2. 相关工作
- 超参数优化,限制:只能从固定长度空间中搜索模型。很难要求它们生成指定网络结构和连接性的可变长度配置。在实践中,如果这些方法提供一个良好的初始模型,它们通常会工作得更好
- 贝叶斯方法:可以搜索不定长架构,但是没有很好的的泛化性和灵活性
- 模型神经进化算法在创造新模型的时候会更灵活,但是至今没有大范围应用,他的局限性在于它是基于搜索的网络,它通常很慢而且需要许多启发才能工作的很好。
- NAS和程序综合和归纳编程有相似之处,都是从例子中搜索编程。在机器学习中,概率程序归纳成功应用在很多方面,例如学会解决Q&A问题,整理一串数字,用很少的例子学习。
- NAS的控制器是自回归的,这意味着他每次只能预测一个超参数,以以前的预测为前提。这个主意是从译码器在端到端序列到序列的学习中借过来的,但是不像序列到序列的学习,我们的模型优化的是不可微度量,即子网络的精度,他因此有点类似于神经机器翻译的BLEU优化,不像这些方法,我们的方法不需要监督引导直接从reward信号中学习
- BLEU https://blog.csdn.net/qq_31584157/article/details/77709454
- 与我们的工作相关的还有“从学习中学习”或“元学习”的概念,这是一个使用在一项任务中学到的信息来改进未来任务的一般框架。更相关的主意是用神经网络来学习梯度下降法更新另一个网络 ,以及利用强化学习的想法为另一个网络找到更新策略。
3.方法
- 我们将首次描述使用循环神经网络来产生卷积架构。我们将展示循环神经网络如何用策略梯度的方法训练来最大化样本框架的期望精确度。
- 我们介绍一下几个核心方法的改进例如形成跨连接来增加模型复杂度或者使用参数服务器的方法加速训练。
3.1 用控制器循环神经网络生成模型描述器
-
在NAS中,我们使用控制器产生神经网络的架构超参数,为获得灵活性,控制器由RNN来实现。假设我们可能仅仅用卷积层来预测前向神经网络,使用控制器来将他们的超参数生成令牌序列。
-
在我们的实验中,如果层的数量超过一个确定的值,产生架构的过程就会停止,该值遵循随着训练过程而增加的时间表。一旦控制器RNN结束产生一个架构,这种架构的神经网络就会建立和训练。在收敛时,记录网络在held-out验证集上精确度。为了最大化提出架构的期望验证精度,优化控制器RNN的参数
θ c θ_c θc
3.2 强化训练
-
控制器预测的令牌序列看成设计子网络架构的一系列动作
a 1 : T a_{1:T} a1:T
。收敛时,子网络在留出验证集上得到精确度R。用R来做reward 信号并且使用强化学习来训练控制器。更精确地说,为了找到最优架构,我们要求控制器最大化它的期望奖励,由
J ( θ c ) J(θ_c) J(θc)
表示:
J ( θ c ) = E p ( a 1 : T ; θ c ) [ R ] J(θc) = Ep (a_{1:T} ;θ_c)[R] J(θc)=Ep(a1:T;θc)[R] -
因为奖励信号R不可微,使用策略梯度方法迭代更新θ**c。在这项工作中我们使用1992威廉的强化策略:
▽ θ c J ( θ c ) = ∑ t = 1 T E P ( a 1 : T ; θ c ) [ ▽ θ c log P ( a t ∣ a t − 1 : 1 ; θ c ) R ] \triangledownθ_c J(θ_c) =\sum_{t=1}^T{E_P (a_{1:T} ;θ_c)[\triangledownθ_c\log{P(a_t|a_{t-1:1}; θ_c)R]}} ▽θcJ(θc)=t=1∑TEP(a1:T;θc)[▽θclogP(at∣at−1:1;θc)R] -
上述量的经验近似为:
1 m ∑ k = 1 m ∑ t = 1 T ▽ θ c log P ( a t ∣ a ( t − 1 ) : 1 ; θ c R k \frac1m\sum_{k=1}^m\sum_{t=1}^T\triangledown\theta_c\log{P(a_t|a_{(t-1):1};\theta_c}R_k m1k=1∑mt=1∑T▽θclogP(at∣a(t−1):1;θcRk
m指在一个批中控制器样本不同架构的数量,T为控制器必须预测去设计一个网络架构的超参数的数量,在训练集上被训练以后,第K个神经网络架构验证精度是Rk.
- 对于我们的梯度而言,上述的更新是无偏估计,但是他又非常高的方差,为了降低估计的方差,我们使用了基线函数:
1 m ∑ k = 1 m ∑ t = 1 T ▽ θ c log P ( a t ∣ a ( t − 1 ) : 1 ; θ c ( R k − b ) \frac1m\sum_{k=1}^m\sum_{t=1}^T\triangledown\theta_c\log{P(a_t|a_{(t-1):1};\theta_c}(R_k-b) m1k=1∑mt=1∑T▽θclogP(at∣a(t−1):1;θc(Rk−b)
只要基线函数不依赖于目前的action,他仍然是一个无偏梯度估计。在这项工作中,我们的基线b是以前架构精度的指数移动平均值。
使用平行和异步更新加速训练
在NAS中,每个梯度更新控制器参数θc对应培训一个子网络收敛。因为训练子网络需要花费很长时间,所以我们为了加速控制器学习过程使用分布式训练和异步参数更新。我们有S个shards参数服务器,每一个参数服务器存储着K个控制器复制品,每一个控制器复印品取样m个不同的子架构平行训练。为了用所有的控制器复制品更新权重,控制器收集有关于M个架构收敛的小批量结果梯度并且将他们发送给参数服务器。在我们实现过程中,训练超过某一个确定的epochs,达到每一个子网络收敛。
分布式神经结构搜索训练。我们使用一组S参数服务器将参数存储并发送到K控制器副本。然后,每个控制器副本对m体系结构进行采样,并并行运行多个子模型。每个子模型的准确性被记录下来计算梯度θc,然后发送回服务器的参数
3.3 用跨连接和其他层类型增加架构复杂性
-
允许我们的控制器使用跨连接和分支层增大搜索空间
-
为了使控制器能够预测跨连接,我们使用依赖于注意力机制的set-selection注意力。在N层,添加一个有N-1基于内容sigmoids的定位点表示需要连接的当前层。sigmoid是控制器的当前隐藏状态和前N-1定位点的以前隐藏状态的一个函数。
P ( L a y e r    j    a n    i n p u t    t o    l a y e r    i ) = s i g m o i d ( v T t a n h ( W p r e v ∗ h j + W c u r r ∗ h i ) ) P(Layer\; j\;an\;input\;to\;layer\;i )=sigmoid(v^Ttanh(W_{prev}*h_j+W_{curr}*h_i)) P(Layerjaninputtolayeri)=sigmoid(vTtanh(Wprev∗hj+Wcurr∗hi))hj代表第j层在定位点的控制器的隐藏状态,j的取值范围是从0到N-1。我们接着从这些sigmoid中取样决定以前的哪一层作为当前层的输入。
W c u r r    W p r e v W_{curr}\;W_{prev} WcurrWprev
和v是需要训练的参数。同样这些连接也被定义为概率分布,REINEFORCE方法仍然被延续使用。图4展示了控制器如何使用跨连接来决定哪一层作为当前层的输入。
3. 在我们的结构中,如果一层有许多输入层然后所有的输入层被串联,跨连接可能造成编译失败,因为一层可能与其他层不匹配,或者一层可能没有任何的输入输出,为了解决下这些问题,我们使用了三种简单的技术:1. 如果某一层不连接任何输入层,那么这个图像被认为是输入层 2.在最后一层中,我们将取出所有没有被连接的层并且在这个最终隐藏状态发送给分类器之前串联他们。3. 如果被串联的输入层有不同的尺寸,我们用0填充small size,这样连接的层具有相同的大小。
4. 添加学习率作为一种预测,并且可能预测架构的池化,局部归一,和批处理规范,为了能够添加更多不同类型的层,我们需要在控制器RNN中添加一个额外的步骤来预测层类型,然后是与之相关的其他超参数。
3.4 生成重复的细胞结构
-
生成重复细胞。 在每一个t时间步,控制器需要找
h t h_t ht
的一种函数形式,将
x t    a n d    h t − 1 x_t\;and \;h_{t-1} xtandht−1
作为 输入。最简单的方式是
h t = t a n h ( W 1 ∗ x t + W 2 ∗ h t − 1 ) h_t=tanh(W_1*x_t+W_2*h_{t-1}) ht=tanh(W1∗xt+W2∗ht−1) -
基本RNN和LSTM细胞的计算能够归纳成三步,将 xt and ht-1作为 输入,ht作为最终输出。控制器RNN需要用组合的方法标志每一个节点,并且用激活函数结合两种输入,产生输出。在树中,两种输出作为下一个节点的输入。为了允许控制器RNN选择这些方法和函数,我们顺序标记这些节点,以致于控制器RNN能够一个一个的遍历和编辑所需要的超参数。
-
受LSTM的启发,我们同样需要变量
C t − 1 和 C t C_{t-1}和C_t Ct−1和Ct
来表示记忆状态。为了合并这些变量,我们需要用控制器RNN来预测在树中哪个节点连接这两个变量。控制器RNN的最后两个块做这些预测。 -
计算步骤:
控制器为index 0预测Add和Tanh,
a 0 = t a n h ( 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)
控制器为index 1预测ElemMult和ReLU
c o m p u t e    a 1 = R E L U ( ( W 3 ∗ x t ) ⨀ ( W 4 ∗ h t − 1 ) ) compute \;a_1=RELU((W_3*x_t)\bigodot(W_4*h_{t-1})) computea1=RELU((W3∗xt)⨀(W4∗ht−1))
控制器预测“细胞索引”的第二个元素为0,Add和ReLU元素
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)
控制器为index 2预测ElemMult和sigmoid
a
2
=
s
i
g
m
o
i
d
(
a
0
n
e
w
⨀
a
1
)
a_2=sigmoid(a_0^{new}\bigodot{a_1})
a2=sigmoid(a0new⨀a1)
ht被设置成a2因为在树中最大值为2
控制器预测"细胞索引"的第一个元素为1,这意味着我们应该在激活之前设Ct为index 1的输出
c
t
=
(
W
3
∗
x
t
)
⨀
(
W
4
∗
h
t
−
1
)
)
c_t=(W_3*x_t)\bigodot(W_4*h_{t-1}))
ct=(W3∗xt)⨀(W4∗ht−1))
5. 在上面的例子中,树有两个子节点,这个叫base 2架构,在我们实验中,为了确保细胞有表现力,我们使用的base树为8。
实验及结果
- 两种数据集:一种是图像识别:CIFAR-10,一种是语音建模任务:Penn Treebank,是深度学习的两个最基准数据集。在CIFAR-10,我们的目标是发现一种好的卷积网络架构,在Penn Treebank的目标是找到一种好的循环网络。在每个数据集上,我们用单独的留出验证集去计算奖励信号。测试集上报告的性能只计算一次,用于达到此目的的网络保留验证数据集上的最佳结果。更多关于我们实验程序的细节结果如下。
4.1 CIFAR-10 学习卷积架构
-
数据集 :在这个实验中我们用CIFAR-10数据集做数据预处理和数据增加与之前的其他结果一样。我们首先通过变白所有的图像预处理数据。紧接着,我们上采样每个图像然后选择上采样图像随机裁剪成32X32。最终,我们随机水平翻转这张32x32裁剪的图像。
-
搜索空间:在我们的搜索空间中包含卷积架构,非线性的修正线性单元,批归一和层之间的跨连接。对于每一个卷积层,控制器RNN必须在[1,3,5,7]中选择一个过滤器高度和宽度,以及在[24,36,48,64]中选择过滤器的数量。对于步数而言,我们有两种类型的实验,一种是我们将步数设为1,还有一种是我们允许控制器在[1,2,3]中预测步数。
-
训练细节:控制器RNN是一个每层有35个隐藏单元的两层LSTM。ADAM优化器优化,学习率0.0006。控制器的权重被初始化为-0.08到0.08,对于分布式学习,参数服务器S个数为:20,控制器副本K:100,子副本m为8,这意味着800个网络在800个GPU在任何时间同时被训练。
一旦RNN取样一个架构,建造一个子模型并且训练50周期,用于更新控制器的奖励是最后5epochs立方的最大验证精度。验证集随机从训练集中取5000个例子,剩下的45000个用作测试集。我们使用动量优化器,学习率为0.1,重量衰减为1e-4,动量为0.9,使用Nesterov动量。
在控制器训练过程中,随着训练过程的增加,子网络层的数量也在增加。在CIFAR-10中,我们要求控制器每1600样本从第六层开始,每个子模型按2增长。
-
结果:在控制器训练了12800架构后,我们发现完成最好验证精确度的架构。然后我们对学习速率、权值衰减、批处理范数和学习速率衰减的时间进行小网格搜索。这个小网格模型接着运行直到收敛并且计算模型的测试精度和在表一中总结结果。从表中可以看出,神经体系结构搜索可以设计一些有前途的体系结构,这些体系结构表现得和数据集上最好的模型一样的好。
[
- 不预测stride和pooling,15层架构。这个架构显著的特点是他有许多方形过滤器并且它喜欢在顶层设置更大的过滤器。像残差网络,这个网络同样有许多一步跨连接。这个网络在某种意义上是局部优化,如果我们扰乱他,它的性能将会变糟。例如,我们如果用跨连接紧密连接所有层,它的性能将会轻微的变差:5.56%,如果我们移除所有的跨连接,它的性能会降至7.97%。
- 我们要求控制其预测strides,如前所述,因为搜索空间变更大了,所以更具有挑战性。20层网络,6.01%错误率
- 允许控制器在13层和24层包含2个pooling,控制器能设计出39层网络,4.47%错误率,非常接近人类手工制造的架构3.74%。为了限制搜索空间的复杂性,我们的模型预测了13层,其中每层预测都是由3层组成的完全连通块。另外我们改变了过滤器的数量,从[24,36,48,64]到[6,12,24,36],我们的结果通过每层增加40多个过滤器提高了3.65%。此外,该模型添加了40个过滤器,和DenseNet模型的1.05倍的速度一样快,达到3.74%,同时具有更好的性能。达到3.46%错误率的DenseNet模型使用1x1卷积来减少它的参数总数,我们没有这样做,所以这不是一个精确的比较。
4.2 Penn Treebank 学习重复细胞
-
数据集:在这项任务中,LSTM趋于优秀并且提升他们是困难的。因为PTB是一个小数据集,归一化方法需要避免过拟合。首先,我们使用嵌入式dropout和重复dropout技术。我们还尝试将它们与共享输入和输出嵌入的方法结合起来,此方法的结果用“共享嵌入”标记。
-
搜索空间:在3.4节中,我们的控制器依次预测一个组合方法,然后为树中的每个节点预测一个激活函数。对于树中的每个节点,控制器RNN需要在[add,elem_mult]中选择一种组合方法和在[identity,tanh,sigmoid,relu]中选择激活函数。RNN单元格输入对的数目称为“base”并且在我们实验中设为8.当base数目是8的时候,搜索空间大约为
6 ∗ 1 0 16 6*10^{16} 6∗1016
架构,比15000还大,这是我们允许我们控制器去评估的架构数目。 -
训练细节:学习率:0.0005,S:20,K:400,m:1,意味着在任何时间400个网络同时在400个CPU上运行,在异步训练期间,我们只在从副本累积10个梯度时对参数服务器进行参数更新。
在我们实验中,每个子模型训练35epochs,每个子模型都有两个层,其中隐藏单元的数量进行了调整,使可学习参数的总数与“中等”基线大致匹配。在这些实验中,我们只让控制器预测RNN细胞结构,并固定所有其他超参数。奖励函数是
c / ( v a l i d a t i o n    p e r p l e x i t y ) 2 c/(validation\;perplexity)^2 c/(validationperplexity)2
c是一个常数,通常设为80.在控制器训练后,根据验证的困惑度最小,选取最优的RNN单元。然后我们对学习速率、权值衰减、批处理范数和学习速率衰减的时间进行小网格搜索。然后用三种不同的配置和大小运行所找到的最佳单元,以增加其容量。
-
结果:由NAS发现的模型比最新的模型表现更出色,并且我们最好的模型之一实现了3.6的困惑。我们的细胞不仅更好,达到64 perplexity的模型也快了两倍多,因为之前最好的网络需要每个时间步运行一个细胞10次。
5. 转换学习结果:为了了解细胞是否能够推广到其他任务上,我们将其应用于同一数据集上的字符语言建模任务。我们用与何相似的实验设置,用Gal相似的变量dropout。我们同样训练用我们的设置训练LSTM得到一个公平的LSTM基线。对模型进行80K步的训练,根据验证集perplexity最好的步骤,得到最佳的测试集perplexity。我们的方法和最先进的方法的测试集的结果如表3所示。在5-6M参数的小设置上的结果证实了新单元确实具有泛化性,并且优于LSTM单元。
另外我们做出了模型有16.28M参数的更大实验。这个模型的权重衰减率:le-4,我们训练600K步,根据验证集perplexity最高设置测试perplexity。和Gal一样的dropout:0.2和0.5,但是没有使用嵌入式dropout。我们用学习率为0.001和输入嵌入大小为128的ADAM优化器。我们的模型有800个隐藏单元的两层layers。我们用最小批度尺寸为32和BPTT的长度为100.在这些设置中,我们的模型实现了1.214的perplexity,他是这个任务中最新的研究成果。
最后,我们还将单元格放入之前针对LSTM单元进行调优的GNMT框架中(Wu et al., 2016),并训练一个 WMT14英语→德语翻译模型。GNMT在解码和编码中都有8层,解码的第一层有双相连接。注意模块是有一 层隐藏层的神经网络。当LSTM细胞被使用的时候,每层隐藏单元的数量是1024.该模型采用参数服务器和12 个工人的分布式设置进行训练。此外,每个worker使用8个gpu和128个小批处理。我们在前60K的训练步骤 中使用Adam,学习率为0.0002,在400K的训练步骤中使用SGD,学习率为0.5。然后每100K步除以2进行锻 炼,直到达到0.1。训练在800K步停止。更多细节可以在Wu等人的文章中找到。
在我们使用新单元格的实验中,除了插入新单元格并调整超参数以使新模型具有与基本模型相同的计算 复杂度外,对上述设置没有做任何更改。结果表明,在计算复杂度相同的情况下,我们的单元比默认的LSTM 单元提高了0.5个测试集BLEU。尽管这种改进并不大,但是可以在不调优现有GNMT框架的情况下使用新单 元,这一事实令人鼓舞。我们期望进一步的调优可以帮助我们的单元格执行得更好。
#### 在搜索空间中添加更多函数
为了测试NAS的健壮性,我们添加了max组合函数和sin的激活函数重新跑我们的实验。结果显示即使在更大的搜索空间上,模型能达到比较可观的性能。
与随机搜索比较
除了策略梯度以外,我们可以使用随机搜索找最好的网络。结果表明,采用政策梯度的最优模型不仅优于采用随机搜索的最优模型,而且最优模型的均值也较优。
5 结论
介绍了一种利用递归神经网络构造神经网络结构的思想——神经结构搜索。该方法以递归网络为控制器,具有较强的灵活性,可以搜索变长结构空间。该方法在极具挑战性的基准测试中具有较强的经验性能,为自动寻找良好的神经网络结构提供了一个新的研究方向。控制器在CIFAR-10和PTB上找到的运行模型的代码将在https://github.com/tensorflow/models上发布。此外,我们还将使用我们的方法在名称NASCell下找到的RNN单元添加到TensorFlow中,这样其他人就可以很容易地使用它。