本 blog 旨在对南京大学周老师团队近期的一篇paper进行解读;转载请注明出处
楔子
- 多层特征表示在神经网络中得到了充分地应用;然而,当模型不可微时 如针对离散型数据或表格型等结构化数据时,GBDTs通常是此类数据 的主流方法,这类方法通常很难学习到较好的特征表示能力。鉴于此 ,作者提出了通过stacking多层GBDTs来尽力一层一层的模块,通过此 种层次结构来获取数据特征的分层表示能力。
- 现今DL利用误差反向传播(back-prop)和梯度下降方法成为主流,然而,此类方法大行其道的基础是激活函数是可微的。其它方法包括使用目标传播(target propagation),实验证明:基于目标传播的方法表现弱于误差传播方法
- 针对离散型数据或表格型数据,基于树的集成学习算法RF或GBDTs是目前主流的方法;起很大程度源于能够获取到数据的分层分布式表示(hierarchical distributed representation),针对此类数据类型,无法使用误差的链式传播算法(chain-rule),是的后向传播也变得不可能。
- (1)针对3中的情形,是否能够构造一个 非可微的多层模型(multi-layered model with non-differentiable components) 用于特征的分布式表示形式;(2)如果可以,如何将层次之间连接起来(不使用后向传播)
- 中心论点:多棵树的分层分布式表示(hierarchical distributed representations) 具有很大程度地来刻画数据的特性能力;更具象地:利用GBDTs来作为每层的块结构(blocks)来建立多层树结构的模型能够很好地将feature表示出来,与此同时,在训练时通过目标传播(target propagation) 来进行优化。
相关工作
- 目前为止,尚未出现一种通用的理论来解释为什么深度模型比浅度模型表现得更好;很多模型的建立过程都是建立在此种假设之上: 深度模型的分层分布式表示方法能够学习到数据更多的特征,亦有学者假设更好的表示方法能够诱导快速混合马尔科夫链(faster-mixing Markov chains),从而在深层次的模型上表现得更好
- 对于一个可微的多层次的深度模型而言,误差后向传播方式是主流;与此同时,目标传播方式target propagation传递的是当前实例的真实的label(通过逆变换)而非误差,此类传播方式能够有效地解决深度学习中梯度扩散(vanishing gradient)问题;于此种种,这些方式都是依赖于目标函数(主要指的是累加激活函数的雅克比行列式,即:激活函数的二次可微)可微的
算法核心
针对一个含有M-1个中间层的前馈神经网络, oi o i 表示的是每层的输出,其中: i∈{0,1,2,...,M} i ∈ { 0 , 1 , 2 , . . . , M } ,针对每一个特定的样本x,其每层相应的输出维度为: Rdi R d i ,其中: i∈{0,1,2,...,M} i ∈ { 0 , 1 , 2 , . . . , M } ,然后,通过每一层来学习一种映射关系 Fi:Rdi−1→Rdi(i≥1) F i : R d i − 1 → R d i ( i ≥ 1 ) ,最后一层的输出则为 OM O M 。利用均方误差或者交叉熵作为损失函数 L, 针对非监督学习任务,期望输出Y可被当做是有一个自动编码器的输出,其损失函数则可表示为该自动编码器的输出和原始数据的重构误差,{注:此处译者认为和 RBM 的机制有异曲同工之妙}, 实际上,在下文中参数的更新过程中,也包含着 EM 的思想
当每个 Fi F i 是参数化的且是可微的,此类学习任务可利用后向传播算法来高效地实现,其基本途径是利用链式求导规则,累积损失函数在每层中参数的梯度,然后沿各自的梯度方向来更新参数,当训练完成时,中间层的输出则可被当做是新学习到的特征表示,这种分层次的稠密的表示方法可被解释为对原始输入数据的多层抽象。然而,当 Fi F i 是非参或不可微时,后向传播算法则变得不可用;鉴于此,利用GBDTs来截距此类问题.
算法流程
- 对于第 t 次迭代,假设 Ft−1i F i t − 1 表示的是 t - 1 次迭代所获取的映射,在此需要求得 Ft−1i F i t − 1 的逆映射 Gti G i t ,存在函数关系: Gti(Ft−1i(oi−1))≈oi−1 G i t ( F i t − 1 ( o i − 1 ) ) ≈ o i − 1 ,(注:此处的 Gti G i t 并不是 Ft−1i F i t − 1 的逆变换,此处仅是一个近似值); 通过最小化期望重构损失函数: Gti^=argminGtiEx[Linverse(oi−1,Gti(Ft−1i(oi−1))] G i t ^ = a r g m i n G i t E x [ L i n v e r s e ( o i − 1 , G i t ( F i t − 1 ( o i − 1 ) ) ] ,其中:损失函数 Linverse L i n v e r s e 表示的是重构误差;类似自动编码器(autoencoding),建议在做 mapping 和 inverse-mapping 时,增加噪声(noise)增强其泛化能力,因此,其实际上的重构误差表示为 Linverse=||Gi(Fi(oi−1+ϵ))−(oi−1+ϵ)||2 L i n v e r s e = | | G i ( F i ( o i − 1 + ϵ ) ) − ( o i − 1 + ϵ ) | | 2 ,其中, ϵ ϵ 服从正态分布,即: ϵ ˜N(0,diag(σ2)) ϵ ~ N ( 0 , d i a g ( σ 2 ) )
- 当算法更新完 Gti G i t 后,然后根据 Gti G i t 来更新前一层的映射函数 Fi−1 F i − 1 ;此步骤的关键之处在于给 Fi−1 F i − 1 指定一个伪标签(pseudo-labels) zti−1 z i − 1 t ,其中 i∈{2,3,...,M} i ∈ { 2 , 3 , . . . , M } ,每层的伪标签定义为: zti−1=Gi(zti) z i − 1 t = G i ( z i t ) ,即:在第 t 轮迭代,针对模型中所有的中间层,对伪标签进行自顶向底传播;一旦当前层的伪标签计算完之后,根据上一轮迭代计算的 Ft−1i F i t − 1 的梯度方向,计算伪标签的残差值: −∂L(Ft−1i(oi−1),zti)∂Ft−1i(oi−1) − ∂ L ( F i t − 1 ( o i − 1 ) , z i t ) ∂ F i t − 1 ( o i − 1 )
针对最后一层伪标签 ztM z M t 的设定,在第 M 层时,利用真实的标签来定义伪标签;例如:输出层的伪标签定义为: ztM=oM−α∂L(oM,y)∂oM z M t = o M − α ∂ L ( o M , y ) ∂ o M , FtM F M t 的更新方式为伪标签残差的方向,亦即: −∂L(Ft−1M(oM−1),ztM)∂Ft−1M(oM−1) − ∂ L ( F M t − 1 ( o M − 1 ) , z M t ) ∂ F M t − 1 ( o M − 1 ) ;换句话说,在第 t 次迭代的过程中,输出层 FM F M 计算伪标签 ztM z M t ,然后通过逆映射(inverse mapping)变换生成每一层的伪标签。一旦所有的 Fi F i 都被更新之后,下一次迭代则是对 Gi G i 进行更新。
算法中两个重要的参数更新如下所示
- 算法流程如下:
译者注:此处算法流程中,首先根据最后一层的输出结点,以及输出节点与该样本真实标签的梯度来获取到初始的伪标签 ztM z M t ,然后从后向前(M, M - 1, … 2)进行传播,用以更新逆映射 Gt G t ,当 Gt G t 更新完成之后,利用 Gtj G j t 和 ztj z j t 对伪标签进行更新,亦即:利用当前层的逆映射 Gtj G j t 和当前层的伪标签 ztj z j t ,亦即代码 ztj−1←Gtj(ztj) z j − 1 t ← G j t ( z j t ) ,此处传播时,输入数据为 ztj z j t ,反射函数为 Gtj G j t ,输出为 ztj−1 z j − 1 t 。当第 t 轮所有的伪标签更新完后,然后前向传播,用以计算正向反射函数 Ftj F j t ,然后使用上一轮的 Ft−1j F j t − 1 计算更新 Ftj F j t ,亦即: Ftj←Ftj F j t ← F j t ;当第 t 轮所有的 Ftj F j t 都更新完成之后,则更新输出函数: oj←Ftj(oj−1) o j ← F j t ( o j − 1 )
注:译者认为此处算法流程中采用了 EM 算法,在更新所有层次的逆反射函数 G 之后,再对反射函数 F 进行更新;此处暗合了 EM 思想
参考文献:
- Multi-Layered Gradient Boosting Decision Trees
建议可将周老师团队发表的下面两篇 paper 结合起来理解
- deep forest_towards an alternative to deep neural networks
- autoencoder by forest