自动化机器学习(AutoML)最近变得越来越火,是机器学习下个发展方向之一。其中的神经网络结构搜索(NAS)是其中重要的技术之一。人工设计网络需要丰富的经验和专业知识,神经网络有众多的超参数,导致其搜索空间巨大。NAS即是在此巨大的搜索空间里自动地找到最优的网络结构,实现深度学习的自动化。自2017年谷歌与MIT各自在ICLR上各自发表基于强化学习的NAS以来,已产出200多篇论文,仅2019年上半年就有100多篇论文。此系列文章将解读AutoDL领域的经典论文与方法,笔者也是刚接触这个领域,有理解错误的地方还请批评指正!
本文解读两篇基于强化学习的开创性论文:谷歌的《Neural Architecture Search with Reinforcement Learning》和MIT的《Designing Neural Network Architectures Using Reinforcement Learning》。用到的强化学习方法分别为策略梯度(Policy Gradient)和Q-learning。
一、强化学习相关背景知识
强化学习任务包括量大主体:智能体(Agent)和环境(Environment),智能体通过与环境交互获得奖励,来学习相应的策略。强化学习有三种基本方法:动图规划、蒙特卡洛方法和时序差分方法,如下框图所示:
第一篇论文用到的方法是基于策略的策略梯度法,第二篇用到的方法是Q-learning。关于强化学习笔者会在另一篇文章中详细介绍。
二、Neural Architecture Search with Reinforcement Learning
1、总览
这篇论文的大体框架和思路如下图所示。在这篇论文中作者使用一个RNN作为智能体。作者考虑到神经网络的结构和连接可以用一个可变长度的字符串表示,这样可以用RNN生成这样的字符串。RNN采样生成了这样的字符串,一个网络,即子网络(child network)就被确定了。训练这个子网络,得到验证集在这个网络上的准确率,作为奖励信号。然后根据奖励计算策略梯度,更新RNN。在下一轮迭代,RNN会给出可能在验证集上准确率高的一个网络结构。也就是说,RNN会随着时间提升它的搜索质量。
2、控制器RNN的实现
首先作者假设要生成一个前向的只包含卷积的网络(没有跨连接)。使用RNN可以生成卷积层的超参数,超参数表示为一个标记序列:
3、策略梯度
RNN生成一个子网络后,其生成的标记序列可以被看作一系列动作$a{1:T}$。验证集在其上取得的准确率作为奖励$R$,然后训练RNN。为了找到最优的结构,我们网RNN取最大化期望奖励$J(theta {c})$:
$$ J(theta {c})=E{P(a{1:T};theta{c})}[R] $$
但奖励信号是不可微分的,我们使用策略梯度算法去迭代地更新$J(theta {c})$: $$ nabla {theta{c}} Jleft(theta{c}right)=sum{t=1}^{T} E{Pleft(a{1 : T} ; theta{c}right)}left[nabla theta{c} log Pleft(a{t} | a{(t-1) : 1} ; theta{c}right) Rright] $$ 上式的经验估计如下:
$$ frac{1}{m} sum{k=1}^{m} sum{t=1}^{T} nabla{theta{c}} log Pleft(a{t} | a{(t-1) : 1} ; theta{c}right) R{k} $$ 这里$m$是控制器在训练过程中一个batch生成的子网络数量,$T$是生成的每个子网络的超参数数量,$R_{k}$是第k个子网络在验证集上的准确率。上述的估计是无偏的,还会有很高的方差,为了降低方差,作者使用了baseline function:
$$ frac{1}{m} sum{k=1}^{m} sum{t=1}^{T} nabla{theta{c}} log Pleft(a{t} | a{(t-1) : 1 ; theta{c}}right)left(R{k}-bright) $$
这里$b$是之前子网络准确率的指数移动平均值。
4、增加网络复杂度:跨连接和其他类型的层
现代网基本都会有跨连接层,比如残差网络和谷歌网络。为了能生成类似这样的网络结构,作者用了基于注意力机制的set-selection。
$h{j}$是RNN在第$j$层锚点的隐藏状态,$j$从0到N-1。然后从这些sigmoid中参与决定当前层和前几层中的哪些连接。矩阵$W{prev}, W_{curr}, v$是可训练的参数。
上面的做法可能会导致“compilation failures”。第一,如果一个层有很多个输入,那么这些输入会在特征图的深度这个维度上被连接,这可能导致各个输入特征图的尺寸不兼容。第二,有些层可能没有输入或输出。作者使用了三个技巧:(1)如果一个层没有输入,那么最一开始的图片作为输入;(2)在最后一层,我们将所有没有被连接的输出都连接起来,然后送入分类器;(3)如果输入特征图的尺寸不一致,,那就填充他们使其有相同的尺寸。
5、生成循环神经网络的cell
作者在这部分给出了生成训练神经网络的方法。对的,NAS不仅可以生成CNN,还可以生成RNN。在每个时间步t,控制器需要找到$h{t}$关于$h{t-1}, x{t}$的函数类型。例如最基本的RNN的cell是$h{t}=tanh left(W{1} ast x{t}+W{2} ast h{t-1}right)$
RNN和LSTM的cell可以看做以$h{t-1}, x{t}$为输入去生成$h{t}$的一系列步骤的树状结构。控制器需要标记树种每个节点的连接方式(加、对应元素相乘等)和激活函数(tanh,sigmoid等),然后融合两个输入作为输出。然后两个输出再作为下个节点的输入。 对于LSTM,还需要处理记忆状态$c{t}$和$c_{t-1}$,我们需要控制器预测树中的哪两个节点和这两个记忆状态相连。 以两个节点的树为例,下图展示了其搜索过程:
- 对于节点0,控制器预测了Add和Tanh,即:$a{0}={rm tanh} (W{1} ast x{t}+W{2} ast h_{t-1})$
- 对于节点1,控制器预测了ElemMult和ReLu,即:$a{1}={rm ReLU}((W{3} ast x{t}) odot (W{4} ast h_{t-1}))$
- 在cell index这个block里,第二个元素预测了0,表示$c{t-1}$会连接节点0;cell inject这个block里,预测了Add和ReLu,即节点0的输出会和$c{t-1}$重新连接:$a{0}^{new}={rm ReLu}(a{0}+c_{t-1})$
- 对于节点2,控制器预测了ElemMult和sigmoid,即$h{t}=a{2}={rm sigmoid}(a{0}^{new}bigodot a_{1})$
- 在cell index这个block里,第一个元素预测了1,表示将节点1未经激活函数的输出作为$c{t}$,即:$c{t}=(W{3} ast x{t}) odot(W{4} ast h{t-1})$
上述例子中,树有两个叶子节点,作者在实际的实验中,使用了8个叶子节点。
以上就是此篇论文最核心的方法,有关更多的实验细节和结果可以参看原文。此方法使用强化学习去搜索网络结构,由于每生成一种结构都要训练一遍并评估,而且强化学习需要采样很多很多次,整个搜索会非常耗时。在CIRAR-10数据及上搜索网络,作者用了800块GPU同时训练,可见其有多耗时耗力。NAS的方法如果都这么耗时的话是非常不划算的,如何快速有效地搜索是AutoDL努力的方向之一。
三、Designing Neural Network Architectures Using Reinforcement Learning
在传统的强化学习设置中,过度的探索(exploration)可能会导致收敛变慢,而过度的利用(exploitation)会导致收敛到局部最优。最这篇论文中,作者组合了两种解决方法:带$epsilon$贪婪决策和经验回收(experience replay)的Q-learning。
1、Q-learning相关
假定在一个有限状态的环境里,我们教智能体以马尔科夫决策过程(Markov Decision Process, MDP)寻找最优路径。环境是有限状态的这样保证智能体可以在有限步里确切地终止搜索。我们同时限制环境的状态空间$mathcal S$和动作空间$mathcal U$是离散的和有限的。对于任一状态$s{i} in mathcal S$,都有有限的动作集合$mathcal U(s{i}) subseteq mathcal U$可以选择。智能体以$p{s^{prime}|s,u}(s{j}|s{i},u)$的概率,从状态$s{i}$采取某一动作$u in mathcal U(s{i})$转移到状态$s{j}$。在每一个时间步t,智能体将得到奖励$r{t}$。智能体的目标是在所有可能的轨迹上最大化总体期望奖励:${rm max}{mathcal T{i} in mathcal T}R{mathcal T_{i}}$。对于一条轨迹它的总体期望奖励为:
$$ R{mathcal{T}{i}}=sum{left(s, u, s^{prime}right) in mathcal{T}{i}} mathbb{E}_{r | s, u, s^{prime}}left[r | s, u, s^{prime}right] $$
对于任一状态$s{i} in mathcal S$和动作$u in mathcal U(s{i})$,我们定义最大化的期望奖励为$Q^{ast}(s{i}, u)$。$Q^{ast}(cdot)$称为动作值函数,$Q^{ast}(s{i}, u)$的值称为Q-值。用贝尔曼方差递归地最大化这个值: $$ Q^{ast}left(s{i}, uright)=mathbb{E}{s{j} | s{i}, u}left[mathbb{E}{r | s{i}, u, s{j}}left[r | s{i}, u, s{j}right]+gamma max {u^{prime} in mathcal{U}left(s{j}right)} Q^{ast}left(s{j}, u^{prime}right)right] $$
在很多情况下,得到这个方差的解析解是不可能的,我们可以迭代地求解:
$$ Q{t+1}left(s{i}, uright)=(1-alpha) Q{t}left(s{i}, uright)+alphaleft[r{t}+gamma max {u^{prime} in mathcal{U}left(s{j}right)} Q{t}left(s_{j}, u^{prime}right)right] $$
此方差包括两个参数:(1)$alpha$是Q-learning rate,决定了新信息相对于旧信息的权重;(2)$gamma$是折扣因子(discount factor),决定了短期奖励相对于长期奖励的权重。Q-learning是免模型的算法,即不需要明确地构建环境的估计。此外Q-learning是off policy的,这意味着它可以通过非最优行为分布来探索最优策略。
我们通过$epsilon$贪婪策略选择动作,以$epsilon$的概率选择随机动作,以$1-epsilon$的概率选择贪婪动作${rm max}{u in {mathcal u(s{i})}}Q(s_{i}, u)$。我们慢慢地将$epsilon$从1降为0,智能体从探索阶段慢慢变为利用阶段。当探索的代价比较大时,可以使用经验回放来加速收敛。在经验回放里,之前被探索过的路径和奖励被存储下来,智能体在探索的过程中可以利用之前的信息更新Q-值。
2、搜索方法总览
下图展示了一个例子:
3、状态空间
每个状态被定义为相关层的所有参数组成的元组,。这里采用五种不同的层:卷积层(C),池化层(P),全连接层(FC),全局平均池化(GAP),和softmax(SM)。下图展示了相关层的参数:
4、动作空间
首先,我们允许智能体在路径上的任一点终止。此外我们只允许从layer depth为$i$的状态转移到layer depth为$i-1$的状态,这样保证是有向无环图。任何达到最大layer depth的层都会转移到终止状态。 接下来,作者将FC层的数量限制为最多两个,因为大量的FC层可能导致太多可学习的参数。当且仅当连续FC状态的数量小于允许的最大值时,位于FC状态的才可以转换到另一个FC类型状态。并且,有$d$个节点的FC只能转移到$d^{prime}<d$的FC。 然后是一些其他的限制。卷积层可以转移到其他任何类型的层,池化层可以转移到除池化层以外的其他任何层,因为连续的池化相当于一个不在可选状态空间里的大尺寸池化层。只有R-size为(8, 4]和(4, 1]的状态才能转移到FC层,这样保证权重参数不会特别巨大。
5、Q-learning训练过程
在训练部分,作者设置Q-learning rate($alpha$)为0.01,折扣因子$gamma$为1。$epsilon$以一定的步长从1.0逐渐降为0.1,步长由训练的唯一模型的数量决定,如下表所示:
6、伪代码
上述所有就是此论文的核心方法,此方法也是非常耗时,对于每个数据集,作者使用10块GPU训练了8-10天。(这篇论文在写作上感觉要比上篇的好,细节清楚)
参考文献
- https://www.automl.org/best-practices-for-scientific-research-on-neural-architecture-search/
- Zoph B , Le Q V . Neural Architecture Search with Reinforcement Learning[J]. 2016.
- Designing Neural Network Architectures using Reinforcement Learning
- https://blog.csdn.net/u014380165/article/details/78525500
- https://blog.csdn.net/xjz18298268521/article/details/79078835/
- 《深入理解AutoML和AutoDL》