论文地址:https://arxiv.org/abs/1907.12207
代码地址:GitHub - lasso-net/lassonet: Feature selection in neural networks
在机器学习的过程中,特征筛选能够过滤冗余信息,增加模型可解释性,提高计算速度减少内存,甚至提升模型的泛化能力。然而,尽管在线性回归中有着广泛的研究,如Lasso,Ridge,Elastic-Net;神经网络中的特征筛选依然是一项“公开的挑战”。
零、相关工作
一般的特征选择方法可以分为三类:过滤器,包装器和嵌入式。
使用过滤器筛选特征通常是独立于学习器(模型)方法的。如Fisher score,用各个数据点的距离来做特征筛选。这也限制了此类的特征筛选方法无法检测到交互特征。
而使用包装法来筛选特征主要依赖于学习器的算法本身在学习的过程中做特征筛选。
嵌入式则是融合了过滤器与包装器两个方法:在使用正式的学习器进行学习前,先使用1个模型专门用来做特征筛选或预处理。
论文中的LassoNet实际上就是提出的一种“包装法”特征筛选。
一、模型架构

LassoNet的核心思想,是使用一个“Skip层”(绿色)的结构来控制要进入后面隐层的特征数量,从而实现特征的稀疏化。它的目标函数是:
且对于神经网络中的每一个隐藏层,都有如下限制:
其中,表示skip层的权重,其范数也是正则项,同时也是损失函数中的L1正则项;
表示L1正则项的系数;而
代表第一层隐藏层中第j个特征的权重,当
时,j特征不会参与到后面隐藏层的计算;M代表层次系数,控制线性和非线性强度的一个系数。
其中,和
这2个参数可以被视作超参数。对于M在没有专家知识的情况下,我们可以使用朴素搜索等方式根据验证集验证这个超参。而对于
而言,尽管在论文中说是LassoNet的两大“超参数”之一,但实际上在LassoNet的训练过程中,是会更新这一值的,详细的过程笔者会在第四节说明。
二、算法大致流程
下图是LassoNet的算法流程:

从第6到第8行就是普通的隐藏层反向传播的过程,在此过程中已经加上了,之后还使用了一个“Hier-Prox”算法;这个算法的主要作用应该就是针对第一层隐藏层和skip层根据和M做二次更新;其具体原理以及实现笔者具体写在第三节。
具体在代码中如下实现:
n_train = len(X_train)
if batch_size is None:
batch_size = n_train
randperm = torch.arange
else:
randperm = torch.randperm
batch_size = min(batch_size, n_train)
for epoch in range(epochs):
indices = randperm(n_train)
model.train()
loss = 0
for i in range(n_train // batch_size):
# don't take batches that are not full
batch = indices[i * batch_size : (i + 1) * batch_size]
#closure的作用是在optimizer.step梯度下降时对loss做的函数;
#在做优化前就会运行;此处将loss的backward函数放在这个closure函数里面
#这样就相当于在计算梯度之前,先把loss加上了惩罚项
def closure():
nonlocal loss
optimizer.zero_grad()
ans = (
self.criterion(model(X_train[batch]), y_train[batch])
+ self.gamma * model.l2_regularization()
+ self.gamma_skip * model.l2_regularization_skip()
)

本文介绍了一种名为LassoNet的神经网络特征筛选方法,利用Skip层实现稀疏化,结合包装法和近端梯度优化的Hier-Prox算法。文章探讨了LassoNet的模型架构、算法流程和优化策略,以及与传统方法的对比和潜在应用价值。
最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



