AE
自编码器(下简记为AE)为一类特殊的神经网络,该网络输入维度等于输出维度,通过网络隐层的复杂神经元结构,尝试学习数据的内在特征(pattern),从而达到特征提取、数据降维、生成新数据等多种目的。
简单的AE和MLP类似,except输入维度等于输出维度。此时输入数据的标签即为自身,模型的损失函数cost=cost(output, input),用来评估输出是否很好地重新构建了输入。
AE训练完毕后,取某隐层输出h,该隐层含k个神经元。则h相当于由输入提取出的k维特征。若输入为3维,隐层为2维,则相当于将三维数据映射到了二维平面,效果相当于PCA!
通过增加隐层可以得到stacked AE,此时模型具有更强的表示能力,能对数据特征进行更强有力的挖掘。通常AE取对称结构,此时可取最中间层(图中Codings)作为提取的特征。对称结构带来的另一个好处是可以让相对应的两层共享权值,减少参数的数量同时减少了过拟合的风险(如图中hidden3-outputs的权值可等于inputs-hidden1的权值)。
当AE层数较多、表示能力过强时,可能导致AE在“复现”数据而不是挖掘数据特征。如上图所示,inputs-hidden1-hidden2可能以某种方式e.g.A->B->C变换了输入,而hidden2-hidden3-outputs可能以逆向的变换还原得到输出即C->B->A。这样AE相当于进行了两次截然相反的工作(也可称之为“过拟合”),对于特征发掘没有任何意义。
DAE(降噪自编码器)
为了解决上述问题,可以通过对输入添加噪声,让AE尽力恢复原始的、无噪声的输入,此时AE只有学习到数据内在特征的表示才能很好地完成任务。可以通过对输入添加Gaussian Noise或采取Dropout的方式添加噪声。如下图所示:
在近期参加的kaggle赛题kaggle-Porto Seguro’s Safe Driver Prediction中,赛后第一名公布的解法中就用到了DAE。该题目给出的数据中对feature进行了脱敏处理(类似于feature1、feature2),使得参赛选手无法知道feature的实际意义,从而使得EDA过程十分艰难。许多选手花了大力气来挖掘数据之间的关系,甚至对所有数据进行简单四则运算得到新的feature……都收效甚微,侥幸发掘一些新的feature对结果有提升,却也由于脱敏的属性无法进行解释。
这种类似于瞎蒙的方法不正和神经网络的黑盒哲学很相似吗?!在本学习算法课上,卜东波老师曾经说过:“我曾经很看不上神经网络,认为它是黑盒模型,解释性太差。可是后来发现,一些人力很难完成的dirty的work,交给神经网络去做,却能取得意想不到的效果。”
本题中,与其依靠人为的无方向性地构造特征,进行试错。不如将特征的挖掘交给神经网络,由网络自动学习出数据内在的特征,对数据进行重新组织表示。第一名的做法中只是简单地对数据进行了一些处理,便将其feed到了多层的DAEs中,通过DAEs提取到的特征,训练后续的NN模型,从而得到了近乎碾压性的成绩。
值得一提的是:
- 由于本次比赛的数据中有类别型数据、数值型数据、二值类数据,feature之间的scale是大不相同的,DAE中使用Gaussian Noise意义不大。第一名提出了“swap noise”的概念,即交换数据行之间的某些属性列,得到新的数据行作为噪声。
- 在选取特征时也采取了两种方法:1、取最中间隐层的输出作为新的特征。2、取所有隐层的输出作为新的特征。
- 作者的模型中,单层神经元数达到了数千,即使在有GPU的条件下训练时间也达到了数小时。不禁提醒我们,在实际运用中DAE要达到较好的拟合效果,数据集较大时,需要的计算资源是不菲的。
以后在比赛中,特征工程遇到瓶颈时,可以考虑使用AE。黑盒模型很可能具有人力难以企及的“观察力”。