摘要
本文提出了一种基于连续优化的自动神经网络设计的方法(nerual architecture optimization(NAO))。主要有以下三个步骤:(1)利用了一个编码器(Encoder)将神经网络节奏映射到了一个连续空间。(2)将一个网络的连续表示作为输入传入预测器(Predictor)并预测这个网络的准确率。(3)再通过一个解码器(Decoder)将一个网络的连续表示映射回网络的结果。性能预测器和编码器使得我们能够在连续空间上进行梯度优化,从而找到一个拥有更高准确率的新结构的编码。再将编码通过解码器解码成一个网络。本文在CIFAR-10和PTB上做了实验,分别得到了2.11%的测试错误率和56.0的测试集困惑度(test set perplexity),并通过发现的最好的结构进行迁移到CIFAR-100和WikiText-2。
内容
Encoder:NAO的核心是一个编码器模型,负责将一个神经网络结构映射成应该连续的表示(参考图1左侧蓝色箭头)。
Predictor:在连续表示的顶部,本文设计了一个回归模型来近似一个结构的最终表现(图1中间部分上面的黄色面)。本文的方法不同于先前方法在于如何利用性能去预测,本文直接用梯度下降法优化模块从而获得一个更好的网络连续表示(图1中的绿色箭头(grad ascent))。优化过的表示将被用来生成一个新的被预测表现更好的神经网络结构。
Decoder:解码器主要是将一个连续的表示恢复成一个离散的网络结构(图1中红色箭头表示的过程),是一个拥有注意力机制的LSTM模型。
三个组成部分(即、编码器、性能预测器和解码器)在多任务设置中联合训练,有利于连续表示:解码器的目标是恢复结构,进一步提高了结构嵌入的质量,使其更有效地预测性能。
与DARTS的异同: DARTS和NAO都是基于梯度实现连续优化的方法,而连续空间却是不一样的,在DARTS中连续空间是混合的权重,而在NAO中连续空间是网络结构的嵌入式表示。优化空间的不同导致了如何从连续空间中获得最佳架构的差异:DARTS简单地假设(在不同架构的选择中)最佳决策是混合权重的最大值,而NAO使用解码器精确地恢复离散架构。
方法
搜索空间
CNN: X表示神经网络结构的设计空间。本文假设CNN是由N个cell堆叠产生的,接下里就是设计cell的拓扑结构了。一个cell是一个包含B个节点(nodes)的卷积神经网络。每个节点(nodes)包含两个分支(branches),每个分支将之前节点的输出作为输入并加上一个运算(operation)传给节点,节点将两个分支的输出加起来作为该节点的输出。一个cell的输入是两个先前cell的输出,分别可以表示为节点-2和-1。最终,将之前未使用过的节点连接起来形成最终的输出。对于B个节点中的每一个:需要决定哪两个节点作为两个分支的输出;决定两个分支上的运算。一般设置B=5。
RNN: (略,日后补充)
本文用一个包含离散字符串的序列来表示CNN活RNN的结构。用CNN的cell举例,每个节点的分支可以由三个代号表示:作为输入的节点索引(node index),运算类型(operation type)和运算大小(operation size)。一个“node-2 conv 3x3 node1 max-pooling 3x3”的序列代表,一个节点的两个分支分别用node-2和node1的输出作为输入,并分别用3x3卷积和3x3最大池化运算。用 x = x 1 , . . . , x T x={x_1,...,x_T} x=x1,...,xT表示结构x的字符串序列, x t x_t xt 表示在第 t t t个位置。
神经结构优化的部分
Encoder:编码器将描述一个结构的字符串序列作为输入,并将其映射成一个连续空间 ε \varepsilon ε 。编码器表示为: E : X → ε E : X\rightarrow \varepsilon E:X→ε 。将结构x连续的表示(嵌入式表示): e x = E ( x ) e_{x} = E(x) ex=E(x) 。 本文用一层LSTM作为编码器的基本模型,用LSTM的隐藏状态(hidden state)作为结构x的连续表示,便得到了 e x = { h 1 , h 2 , ⋯   , h T } ∈ R T × d e_{x} = {h_{1},h_{2},\cdots,h_{T}}\in R^{T\times d} ex={h1,h2,⋯,hT}∈RT×d, h t ∈ R d h_{t}\in R^{d} ht∈Rd是LSTM第t次时间步长维度为d的隐藏状态。
Predictor:预测器 f : ε → R + f : \varepsilon\rightarrow R^{+} f:ε→R+,它将结构x的连续表示 e x e_{x} ex 映射到由dev set的准确率衡量的表现 s x s_{x} sx上。预测器 f f f在 e x = { h 1 , h 2 , ⋯   , h T } e_{x} = {h_{1},h_{2},\cdots,h_{T}} ex={h1,h2,⋯,hT}上进行mean pooling 来获得 e ‾ x = 1 T ∑ t T h t \overline{e}_{x} = \frac{1}{T} \sum^{T}_{t} h_{t} ex=T1∑tTht,然后将 e ‾ x \overline{e}_{x} ex通过前馈网络映射成一个标量值用作预测的performance。将一个网络 x x x和他的表现 s x s_{x} sx作为训练数据,预测器 f f f的优化就变成了最小化这个最小二乘回归损失 ( s x − f ( E ( x ) ) ) 2 (s_{x}-f(E(x)))^{2} (sx−f(E(x)))2。
有一个概念,为了性能预测,编码器的一个要求是需要保证结构嵌入的置换不变性,也就是说假设有两个结构 x 1 x_1 x1, x 2 x_2 x2,如果他们是对称的,那么他们的结构嵌入产生的性能预测分数应该相同。本文采用了数据增强的方法,对于每一个 ( x 1 , s x ) (x_1,s_x) (x1,sx)都会增加一个 ( x 2 , s x ) (x_2,s_x) (x2,sx),其中 x 1 x_1 x1, x 2 x_2 x2是对称的,并用这样一对对的数据训练编码器和预测器。
Decoder:解码器表示为 D : ε → x D : \varepsilon\rightarrow x D:ε→x,将字符串代号 x x x从连续表示中解码出来: x = D ( e x ) x=D(e_x) x=D(ex)。将 D D D设置为LSTM模型的初始隐藏状态: s 0 = h T ( x ) s_0 =h_{T} (x) s0=hT(x)。注意力机制可以使得解码更简单,在每个时间步长 r r r下输出一个结合了所以解码输出 { h t } t = 1 T {h_t}^{T}_{t=1} {ht}t=1T的向量 c t x r ctx_r ctxr。解码器 D D D就会服从一个因子分布(factorized distribution),在 x x x上服从 P D ( x ∣ e x ) = ∏ r = 1 T P D ( x r ∣ e x , x < r ) P_D(x|e_x)=\prod^{T}_{r=1}P_D(x_r|e_x,x_{<r}) PD(x∣ex)=∏r=1TPD(xr∣ex,x<r),在每一个代号 x r x_r xr上服从 P D ( x ∣ e x , x < r ) = e x p ( W x r [ s r , c t x r ] ) ∑ x ′ ∈ V r e x p ( W x ′ [ s r , c t x r ] ) ) P_D(x|e_x,x_{<r})=\frac{exp(W_{xr}[s_r,ctx_r])}{\sum_{x^{'}\in V_rexp(W_x^{'}[s_r,ctx_r])}}) PD(x∣ex,x<r)=∑x′∈Vrexp(Wx′[sr,ctxr])exp(Wxr[sr,ctxr]))。其中 W W W是所有代号的输出嵌入矩阵, x < r x_{<r} x<r代表在 r r r位置之前的所有代号, s r s_r sr是LSTM在第 r r r个时间步长下的隐藏状态,[,]表示为两个向量的级联。
解码器的训练主要是让结构 x x x从连续表示 e x = E ( x ) e_{x} = E(x) ex=E(x)中恢复过来,就是取 l o g P D ( x ∣ E ( x ) ) = ∑ r = 1 T l o g P D ( x r ∣ E ( x ) , x < r ) logP_D(x|E(x))=\sum^{T}_{r=1}logP_D(x_r|E(x),x_{<r}) logPD(x∣E(x))=∑r=1TlogPD(xr∣E(x),x<r)的最大值,本文中使用vanilla LSTM模型作为解码器效果很不错。
训练和推理
本文通过最小化表现预测损失
L
p
p
L_{pp}
Lpp和结构重构损失
L
r
e
c
L_{rec}
Lrec的联合损失,来联合优化编码器
E
E
E,表现预测器
f
f
f和解码器
D
D
D:
L
=
λ
L
p
p
+
(
1
−
λ
)
L
r
e
c
=
λ
∑
x
∈
X
(
s
x
−
f
(
E
(
x
)
)
)
2
−
(
1
−
λ
)
∑
x
∈
X
l
o
g
P
D
(
x
∣
E
(
x
)
)
,
L=\lambda L_{pp}+(1-\lambda)L_{rec}=\lambda \sum_{x\in X}(s_x-f(E(x)))^2-(1-\lambda)\sum_{x\in X}logP_D(x|E(x)),
L=λLpp+(1−λ)Lrec=λx∈X∑(sx−f(E(x)))2−(1−λ)x∈X∑logPD(x∣E(x)),
X
X
X代表所有候选结构
x
x
x以及他们的对称结构(被预测数字
s
x
s_x
sx预测过的),
λ
∈
[
0
,
1
]
\lambda \in[0,1]
λ∈[0,1]是一个trade-off参数。
当编码器与解码器都优化到收敛时,NAO就是在连续空间
ε
\varepsilon
ε上进行推理过程来产生更好的结构。具体来说,就是从一个还不错的结构
x
x
x出发,沿着预测器
f
f
f的梯度方向移动结构
x
x
x的嵌入代号
e
x
e_x
ex来产生
e
x
′
e_{x^{'}}
ex′:
h
t
′
=
h
t
+
η
∂
f
∂
h
t
,
e
x
′
=
h
1
′
,
⋯
 
,
h
T
′
,
h^{'}_t=h_t+\eta \frac{\partial f}{\partial h_t}, e_{x^{'}}={h^{'}_1,\cdots,h^{'}_T},
ht′=ht+η∂ht∂f,ex′=h1′,⋯,hT′,
η
\eta
η是步长,这个优化过程就是图1中绿色箭头,当
η
\eta
η足够小的时候,会有
e
x
′
e_{x^{'}}
ex′对应于一个新的结构
x
′
x^{'}
x′,
f
(
e
x
′
)
≥
f
(
e
x
)
f(e_{x^{'}})\geq f(e_x)
f(ex′)≥f(ex)。然后本文将
e
x
′
e_{x^{'}}
ex′输入到编码器中得到得到假定具有更好性能的新
x
′
x^{'}
x′,将原始结构
x
x
x成为种子结构,迭代几轮,每轮都包含好几个这样高性能的种子结构。
实验
(略,日后补充)
附录
##搜索空间
11个可能的运算(without weight sharing):
5个运算(using weight sharing):
对于recurrent cell,可能的激活函数:
paper: [1] : https://arxiv.org/abs/1808.07233v1
code: [2] :https://github.com/renqianluo/NAO