array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》 - 爱码网

核心思想

  本文提出一种基于参数优化的小样本学习算法(MetaNAS)。本文最重要的改进就是将神经架构搜索(neural architecture search,NAS)引入到小样本学习算法中,简单地理解就是MAML和Reptile等元学习算法,是在确定网络结构的基础上,通过元训练的方式获得较好的初始化参数,而本文引入NAS后,不仅要对初始化参数进行学习,而且要对网络结构参数进行学习。为了实现这一想法,作者将经典的NAS算法DARTS和小样本学习算法Reptile进行了结合,为了方便大家理解,我们首先介绍一下DARTS算法的过程,如下图所示
论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》
  图中带有数字的矩形块表示网络中的结点,或者就是许多组特征图,不同颜色的连线分别表示不同的操作(如3 * 3的卷积,5 * 5的卷积和最大值池化等),而连线的粗细表示不同操作所占的权重比例。经过NAS搜索得到的网络结构如最左侧的图所示,各个结点之间是稠密链接的,每两个结点之间都有三种不同的操作方式,只不过每种操作所占的比例不同,这一过程如下式
论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》
式中x(j)x^{(j)}表示第jj个节点处的特征图,O\mathcal{O}表示所有可能操作的集合,α^oi,j\hat{\alpha}_o^{i,j}表示从节点x(i)x^{(i)}到结点x(j)x^{(j)}之间操作oo所占的权重比例,woi,jw_o^{i,j}就表示操作oo所包含的常规参数,如卷积核的权重值等。而NAS搜索的过程最重要的就是学习权重参数α^oi,j\hat{\alpha}_o^{i,j}其计算方式如下
论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》
可以看到DARTS是通过加权求和的方式,将所有的操作混合起来,然后将所有x(j)x^{(j)}结点之前的输出都累加起来作为结点x(j)x^{(j)}的输入。通过这种混合操作,就将原本节点之间多种操作方式融合为一种,结点间的连接变得稀疏了一些,如中间的图所示。但是尽管如此,每个结点的输入都包含之前所有结点的输出,结点之间的连接还是过于稠密,为了得到最终的网络模型,DARTS算法采用一种硬剪枝(hard-pruning)的方式,对于每个结点仅保留1-2个输入,其他输入全部删去(如最右侧的图所示),但这种方式会导致模型性能下降,因此需要将剪枝后的模型进行重训练。
  关于本文的另一个基础算法MAML或Reptile可以参看我先前的笔记,这里不再赘述。本文则是在MAML或Reptile的基础上增加对于网络结构权重参数αoi,j\alpha_o^{i,j}的元学习部分,在任务学习阶段不仅要更新原本的权重参数ww还要更新结构参数α\alpha,计算过程如下
论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》
同理在元学习阶段也需要对两个参数进行更新,对于MAML算法,其计算过程如下
论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》
对于Reptile算法,其计算过程如下
论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》
  同DARTS算法一样,在得到网络结构权重参数α\alpha后需要进行剪枝操作,但原本的硬剪枝操作存在两个问题:1.剪枝后需要重训练,这对于需要分成多个任务进行训练的小样本学习算法而言,成本太高;2.对于小样本学习多个任务而言,训练得到的网络结构是相同的,不能根据不同的任务调整网络结构。针对上述两个问题,本文提出一种柔性剪枝(soft-pruning)的方法,具体的实现过程就是给α^oi,j\hat{\alpha}_o^{i,j}计算中增加一个退火温度参数τα\tau_{\alpha},如下式所示
论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》
随着温度参数τα\tau_{\alpha}逐渐衰退到0,网络结构权重参数α^oi,j\hat{\alpha}_o^{i,j}会收敛到0或1,这样就相当于获得了一个独热向量,两个结点间多种操作中只有一种操作的权重接近1,其他的都接近0(相当于被剪枝)。用这一方式取代了DARTS算法中加权求和的方式,实现了对不同操作的剪枝,而且作者认为温度参数衰减的过程,就是网络权重参数逐步适应任务需求的过程,根据每个任务的训练集不同,可以学习到不同的权重参数α^oi,j\hat{\alpha}_o^{i,j}以满足不同任务的需求,整个过程如下图所示
论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》
  最后对于每个结点的多个输入进行剪枝,处理过程与上文采用的方式类似。令两个节点之间的连接权重为βi,j\beta^{i,j},并引入退火温度参数τβ\tau_{\beta},然后按照下式进行计算
论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》

实现过程

网络结构

  通过NAS的方式进行学习

损失函数

论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》
式中Φk\Phi^k表示第kk个任务学习器

训练策略

  与Reptile算法相结合的训练过程如下图所示
论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》

创新点

  • 将NAS中的DARTS算法与小样本学习中的Reptile算法相结合,通过元学习的方式同时训练权重参数和结构参数
  • 引入退火温度参数,实现任务自适应的柔性剪枝方案

算法评价

  真是一个万物皆可AutoML的时代,连我认为与AutoML诉求最为矛盾的小样本学习问题都纳入了NAS的研究版图。因为对于普通的问题,采用NAS方法实际上是将搜索空间扩大,不仅寻找最好的权重或者偏置参数,而且还要寻找最好的模型结构,而这一过程无疑加剧了对于数据集的依赖,必须有充足的样本用于训练,才能够避免过拟合的问题,是其具备较好的泛化能力,而小样本学习问题所缺少的恰恰就是训练样本。本文是利用元学习的方式,将网络结构参数作为学习的对象,利用MAML或Reptile等方法进行训练,并且设计了一种新的柔性剪枝方案,使其更好的适应小样本学习任务。

如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。论文阅读笔记《Meta-Learning of Neural Architectures for Few-Shot Learning》

相关文章: