科研新手,论文笔记,如有错误,请各位指正。
1.摘要
首先介绍了目前一些流行的深度神经网络,说明它们的优点,但是缺点是这种静态网络一旦开始训练,计算图和参数都会被固定,这可能限制模型的能力。动态神经网络,可以在推理时调整它的结构结构与参数,这使动态网络在效率,表示能力,适应性,兼容性,普遍性和可解释性上更有优势。
动态网络的关键思想--自适应性推理很早之前就开始了研究,最经典的做法是建立多个模型的集合,这些模型平行或者级联建立,然后根据输入选择性地激活这些模型。SNN,通过在模型中传播脉冲信号来执行数据相关的推断。然而,SNN的训练策略与流行的卷积神经网络(CNN)有很大不同,并且它不常用于视觉任务。这篇文章中省略了与SNN相关的工作。
这篇文章的脉络如下,第二,三,四部分分别介绍实例自适应,空间自适应,时间自适应网络,第五部分介绍动态网络的决策策略和训练技术,第六部分总结动态网络的应用,第七部分提出一些开放性问题并讨论动态神经网络未来发展的方向。 这篇综述讲的东西很多,而且分了很多类,不过文中的总览图还是很清晰的表达了这篇文章的结构。
2.实例动态网络
实例动态网络,目前我的理解就是根据模型输入的不同,选择不同的模型深度/宽度/参数等。
目前有两个方向:1.根据输入调整模型的结构,这样做可以提高推理效率。2.根据输入调整网络参数,保持计算图不变,这样可以以最小的计算成本增加来提高表示能力。
方向一可分为:1,动态深度;2,动态宽度;3,动态路由
方向二可分为:1,参数调整;2,参数预测;3,动态特征
2.1 动态结构
2.1.1动态深度:
动态深度可以通过早停和跳层来实现。
早停:
早停的思想就是:一个模型处理的数据难度是不同的,如果难的数据用比较深的模型,简单的数据用比较浅的模型,那么就可以增强模型的推理效率。很多人已经研究了广泛的架构以赋予DNN这种早期退出行为,如下所述。
1.DNN的级联:如下图的(a),这是一个级联了两个DNN的动态模型,model1更小,model2更大。输入首先进入第一个模型,如果经过第一个DNN后得到的信息已经足够成功分类,那么router就将model1的输出直接给一个线性分类器进行分类,否则,就把输入给model2,由model2输出后再进行分类。
2.中间分类器:1中的方法,一旦决定使用一个模型就必须完整的执行完,这会导致前一个模型的结果出现浪费。第二种方法如上图(b),将一个模型拆成一个个block,每个block之后都接一个分类器,如果足够推理,就不需要执行下一个block,否则就将上一个block的输出输入下一个block,以此类推。是否足够推理基于置信度的标准或学习的决策函数。
3.具有早期退出的多规模架构:在链式结构的网络中,多个分类器可能会相互干扰,从而降低整体性能。合理解释是:一个深度模型,它的浅层可能是用来学习一些通用的信息的,深层用来学习和任务相关的信息,早退形式会导致模型的浅层被迫学习一些与任务相关的信息,导致一些重要的通用信息的缺失,使模型性能下降。为了解决这个问题,MSDNet使用了两种方式,1)多尺度结构--更快的学习通用信息;2)全连接--重复使用早期提取的特征来提高模型的准确性(如下图)。
除了结构设计之外,现有的策略和训练技术也是影响模型性能的重要因素。除了基于置信度的标准之外,还可以针对具有早期分类器的多尺度动态模型建立策略网络,如下图,策略网络将决定该实例是否需要进入更深层的神经网络。
上述结构都是从深度调整的方式来实现早退,从利用特征空间冗余的角度出发,分辨率自适应网络RANet同时实现分辨率自适应和深度自适应。具体来说,网络首先用低分辨率特征处理每个实例,而高分辨率表示则以早期分类器的预测置信度为条件来利用,如下图:
跳层:
在前面提到的早退模型中,一般的想法是跳过某个分类器之后的所有深层的执行。更灵活的是,网络深度也可以通过策略性地跳过中间层的计算来动态调整,而无需放置额外的分类器,Resnet就是一种实现。
停止分数:为每个样本在每一层 计算一个“停止分数”。如果该分数达到某个阈值,则认为当前层的信息已足够做出可靠预测,跳过后续所有层,直接在当前层输出结果。如果未达到阈值,则继续计算下一层。如下图,最后预测时,既可以像图中所示,使用加权聚合预测,也可以直接使用最后一层的结果进行预测。
选通功能(应该这么翻译吧): 模型被分为一个个block,在输入block前,首先会由选通模型产生一个二进制数字,来决定是否激活这个block。Gating Module可以由全连接层组成(SkipNet)或者由RNN组成(conv-AIG)。dynamic recursive network中block只有一个(共享参数),由选通模型决定要执行多深。
策略网络:不像上边的选通功能使用中间特征来决定激活哪些block,策略网络添加了一个额外的模型,在主模型执行之前就决定激活哪些block。
2.1.2动态宽度
动态宽度模型中,虽然所有的层都被执行,但是它的神经元,分支或者通道被选择性的激活,因此,这种方法可以被视为条件计算的更细粒度形式。
全连通动态宽度(神经元选择性激活):这块说了一下全连接层的计算消耗主要由输入输出的维度决定,然后就是说不同的神经元单元负责表示不同的特征,因此并非所有的神经元单元都需要针对每个实例被激活。最后列出了四篇论文,不过我还没读过。
混合专家(分支选择性激活):混合专家模型--许多专家模型被平行的训练,这些模型被选择性地执行然后它们的输出与数据相关的权重融和(这句没懂)。文章给出了两种专家模式, 一种是下面左边那种,叫soft MoE,使用实值权重动态的缩放从不同专家和得到表示,但这种方式并不能提高模型的效率;另一种叫hard MoE, 下图右边那种, 由另一个模型决定使用哪些专家来进行判断。
CNN中的动态通道修剪(通道选择性激活):现代CNN通常在大量特征通道中具有相当大的冗余度。基于相同通道对于不同实例可能具有不同重要性的共识,可以通过在运行时调整通道数量来实现CNN的动态宽度,相较于静态剪枝永久地去除某些滤波器,这样的动态修剪方法以数据相关的方式选择性地跳过通道的计算。CNN的容量不会降低,而整体效率可以提高。(直接翻译的,感觉写的很好),下面是三种分别实现的方法。
1.沿着通道维度的多级架构:与2.1.1中讨论的早退方法思路一致,可以沿着(通道)维 度沿着构建多级架构,并根据需要逐步执行这些阶段。
2.基于门控函数的动态剪枝:根据门控功能决定每一层通道的执行。目前,也有模型同 时实现了关于网络深度和宽度的动态推理:只有当确定要执行一个层时,它的通道才会被选 择性地激活。还有基于跳层中策略网络的思想,添加了一个额外的模型,在主模型执行之前 就决定激活哪些chanel。
3.基于特征激活的动态剪枝:在没有辅助分支和计算开销的情况下,可以直接基于特征激 活值(这个不知道是啥,不过后边标了一个参考文献,应该里面会说明这是啥)进行动态修 剪,并且在训练中引入正则化项以鼓励中间特征的稀疏性。
2.1.3.动态路由
为了实现动态路由,通常在网络中存在负责将特征/样本分配到不同路径的路由节点。
1.多分支结构中的路径选择:和混合专家模型的hard MoE实现很像,不过每一次选择只有一个模型可以被执行,没有任何融合操作。
2.神经树和树结构网络:这种方式同时享受自适应推理范式和DNN的表征能力。如图,不同节点的输出被路由到独立路径,而不是像MoE中那样融合在一起。
1.SDT的每个叶节点生成输出空间上的概率分布,仍然执行所有路径,最终预测是所有叶节点结果的期望。2.具有确定性路由策略的神经树 在推理时只会执行选中的路径。3.树结构DNN:HD-CNN首先对样本进行一个粗略分类,然后根据粗略分类的结果将样本放入不同模型执行。ANT采用CNN模块作为硬神经树中的特征变换器(见上图中的箭头线),并在训练阶段同时学习树结构和网络参数。(没懂)
3.其他方式:这块好乱,举了几个例子,光看这篇文章我没理解。
2.2 动态参数
保持模型结构不变,利用动态参数执行自适应推理--提高网络的表示能力,但计算成本略有增加。可以用三个方面来实现:1)根据输入调整训练参数;2)直接从输入中生成网络参数和;3)用软注意重标度特征。
2.2.1参数调整
权重注意力机制:设立多组卷积核,并基于输入特征学习一组权重,将这些卷积核进行加权求和后进行卷积,这样的操作与将输入与各组权重进行卷积的输出进行加权求和效果相同,但只需执行一次卷积操作,从而大大节约了计算开销。还可以对卷积权重的空间位置执行软关注,例如应用局部掩蔽卷积来聚合来自相似像素的具有较大权重的信息,这些像素更有可能属于同一对象,或基于从每层的输入特征生成的注意力掩码来调整卷积权重。
卷积核大小调整:如可变形卷积从特征图中的自适应位置采样像素。可变形核在核空间中对权重进行采样对网络的有效感受野进行自适应调节。
2.2.2.参数预测
它在测试时直接生成具有实例参数(或其子集)。可以根据输入应用于一般架构,也可以使用任务相关的特定信息(如边缘属性等)来预测参数。
2.2.3动态特征
使用输入相关的软注意力重新缩放特征,可以使用通道注意力,空间注意力和动态激活函数。根据下图,通道注意力(动态缩放不同特征通道)和空间注意力(特征中的空间位置动态地重新缩放)似乎可以同时使用,并联或者串联均可。动态激活函数应该就是根据输入x动态的改变激活函数。
3.空间动态网络
不是所有的位置对于预测结果都同样重要,因此,将更多的计算集中于更重要的位置可以减少计算花费。该论文将有关方法分为三个层次:1.像素,2.区域,3.分辨率。
3.1像素层次的动态网络
3.1.1动态架构:
具有动态体系结构的模型,在处理要素的每个像素时可调整其深度或宽度。现有的工作通常通过以下方式实现:1)稀疏卷积,其仅对采样像素的子集执行卷积; 2)额外的细化,其在某些空间位置上策略性地分配额外的计算(例如层或通道)。
动态稀疏卷积:现有的采样策略包括:1)利用输入的内在稀疏性; 2)预测输出上零元素的位置和3)估计像素的重要性---可以采用额外的分支模型来生成空间掩模,确定对哪些像素执行卷积。此外,文中也提到了使用2.1.1中提到的停止得分来决定每一个像素要执行的模型深度和SFSI解决了利用插值解决未被选中的像素可能影响模型准确率的问题。
动态附加精化:首先在整个特征图上进行相对粗略的计算,并自适应地激活某些像素上的额外模块以进一步细化。这些方法在像素级的深度或宽度方面调整其网络架构,实现计算的空间自适应分配。这种思想和早退思想类似,对于较高置信度的像素不再进行额外计算,但是对于较低置信度的像素要进行进一步的处理。
3.1.2动态参数
对不同像素应用数据相关权重,以提高表示能力或自适应接收域。
动态权重:可以根据像素之间的关系对权重进行重新调整,或者采用参数预测中的方式,生成特定于位置的卷积核。
动态接收域:这块使用的方法在2.2.1中已经介绍,基本就是使用那两种方法。然后介绍了一个模型,使用三个分支,最后结果由三个分支的结果加权得到。
动态特征:在特征上应用空间方向的软注意力可以有效地提高模型的表示能力。虽然相当于使用动态权重执行卷积,但直接重新缩放特征通常在实践中更容易实现。(直接翻译的,这块引用了几个论文,但我没读过)。
3.2区域层次的动态网络
和上面的像素层次的想法差不多,不过这个更大一些。有两种形式来完成:一种方法是对输入特征图中的区域执行参数化变换;另一种是在选定的区域上进行硬注意力。一般过程如下图,其中区域选择模块生成变换参数或关注区域的位置,并且后续网络对变换/裁剪的输入执行推断。
3.2.1动态变换
动态变换(例如仿射/投影/薄板样条变换)可以在图像上执行,以消除某些变化以获得更好的泛化能力,或者强调显著区域以获得有效的视觉注意力。此外,在模型性能对一小部分区域敏感的任务中,这些变换被学习以自适应地放大图像的显著区域,例如凝视跟踪和细粒度图像分类。
3.2.2选定区域的硬注意力
1.使用RNN的硬注意力:区域级硬注意最典型的方法是将分类任务制定为顺序决策过程。沿着这个方向,采用RNN每次关注一个区域,并迭代地进行预测。
2.其他:不是使用RNN来预测模型应该注意的区域位置,采用类激活映射(CAM)来迭代地选择突出的区域。每次迭代过程中,选择仅依赖于过去被裁剪完的输入导致了一个渐进的改进过程。
3.3分辨率层次的动态网络
低分辨率可能足够识别简单的样本,但传统的神经网络使用相同的分辨率处理全部的样本,这可能导致相当大的冗余。现有技术主要包括:1.具有自适应缩放比的下采样/上采样;2.在多尺度架构中选择性地激活具有不同分辨率的子网络。
3.3.1自适应缩放比
具有动态分辨率的特征可以通过使用自适应缩放比率执行下采样/上采样来产生。例如,首先执行一个小的子网络来预测面部检测任务[153]中面部的尺度分布。然后对输入图像进行自适应放大或缩小,使所有的人脸都落在一个适合识别的范围.随后的工作进一步利用插件模块来预测每个ResNet阶段中第一个卷积层的步幅,产生具有动态分辨率的特征。
3.3.2多尺度体系结构中的动态分辨率
以并行或者级联的方式构建多个自网络。这些具有不同特征分辨率的子网络在推理期间根据输入被选择性地激活。Elastic设立多个分支,每个分支都执行下采样-卷积-上采样过程,各分支使用不同的缩放比(如1x, 0.75x, 0.5x),处理不同分辨率的特征图。RANet串联多个网络,特征分辨率从低到高递增,每个阶段结束进行置信度评估,执行早退过程。
4.时序动态网络
自适应的计算可以应用于两方面来减少冗余计算,一方面是为输入的特定位置进行简单操作,另一方面是选择性地在某些时间位置上执行计算。
4.1 基于RNN的动态文本处理
传统的RNN大多遵循静态推理范式,即输入token被顺序读取以在每个时间步更新隐藏状态,最终的状态被用来解决任务,这导致大量的冗余计算。动态RNN可以每一步分配适当的计算成本。1.一些算法在读入所有token的同时,通过动态更新隐藏状态来学习“略读”不重要的标记;2。进行自适应阅读过程以避免在测试时阅读与任务无关的token(可以通过早退或以自适应步幅在文本中跳跃实现);
4.1.1隐藏状态的动态更新
由于并非所有的单词或句子都是捕捉序列中任务相关信息所必需的,因此可以构建动态RNN,以在每个时间步自适应地更新其隐藏状态,信息量较少的token将被粗略地浏览。读入一个token后,动态更新可以通过三种方式实现:
1.跳过更新:对于某些时间位置上的不重要输入,动态模型可以学习完全跳过隐藏状态的更新。
2.粗略更新:直接跳过一些更新可能过于粗暴了,于是可以更新状态的一部分,剩下的部分不更新。如图:
3.多尺度RNN中的选择性更新: 动态多尺度RNN 被构建用于捕获长序列中的层次结构。在推理过程中,处于较高层的RNN将以低层RNN的输出为条件选择性地更新其状态。
4.1.2 RNN的时序早停
上述模型实现了和数据相关的状态更新的计算花费,但是仍然需要读完所有的token,可能会导致模型的效率较低。模型应该在已经掌握了足够推理的信息后就自动停止,例如读完一篇文章的摘要后就已经可以大致了解这篇文章的内容。然后举了几个例子。
4.1.3 文本跳跃
保守派觉得激进派不够激进。认为虽然早停可以减少计算,但是不够,所有的token仍然要被喂给模型,动态RNN应该通过策略性地跳过某些toekn而不阅读它们,并以自适应步幅直接跳到时间位置,来学习决定“在哪里读”。后面是一些例子。
4.2 时域动态视频识别
视频可以被看作帧的顺序输入,时间方面的动态网络被设计为以输入为条件为不同帧分配自适应计算资源。可以在两方面实现,第一种是如4.1中那三种方法,利用RNN实现。第二种是对关键帧(或剪辑,即长视频的一小部分)采用动态预采样过程,并通过特定于任务的模型处理选定的帧或剪辑。
4.2.1 基于动态RNN的视频识别
这块没啥内容,用的方法4.1中都见过了,把视频的帧当作token就行,其余的就是一些例子。
4.2.2动态关键帧/片段采样
首先进行自适应预采样,预测一下视频里哪些帧/片段重要,然后只通过这些被认为是重要的帧/片段进行预测。这块可以使用注意力机制或者采样模块来实现。另外,除了帧/剪辑选择之外,自适应3D卷积(Ada 3D)在获得所选帧后在2D和3D卷积之间进行选择。通过简单地沿着其时间维度取3D滤波器的中心通道,3D卷积可以被转换为2D卷积。通过这样做,通过利用数据和网络结构中的冗余来提高推理效率,这是最近的研究趋势。
emmmmm,大致的模型都介绍完了,剩下的就是一些训练推理要注意的和一些讨论,因为我目前还没打算开始跑动态神经网络,所有后面的我就没有细读。哪天要跑了,我再补上,嘿嘿。