为什么 1x1 卷积层适用于神经网络回归中的特征缩减?

Why does a 1x1 convolution layer work for feature reduction in a Neural Network Regression?

我希望对这个问题有所了解 - 我试图在文献中找到解释,但我被难住了。所以我正在构建一个神经网络(使用 Keras)来解决回归问题。我有大约 500,000 个样本,每个样本有 20,000 个特征,并且正在尝试预测数值输出。考虑根据房屋、院子等的一系列数值测量来预测房价。这些特征按字母顺序排列,因此它们的相邻特征毫无意义。

当我第一次尝试创建一个神经网络时,如果我提供了所有 20,000 个特征,它就会严重过度拟合 - 手动将其减少到 1,000 个特征会大大提高性能。

我读到有关 1x1 卷积神经网络用于特征缩减的信息,但它全部用于图像和 2D 输入。

所以我构建了一个 3 层的基本神经网络:

model = Sequential()
model.add(Conv1D(128, kernel_size=1, activation="relu", input_shape=(n_features,1)))
model.add(Flatten())
model.add(Dense(100, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(1, activation='linear'))

我还重塑了我的训练集作为输入 n_samples, n_features 到: reshaped= X_train.reshape(n_samples, n_features, 1) 以符合 Conv1D 的预期输入。

与普通的密集神经网络相反,这就像我手动选择了性能最好的特征一样。我的问题是 - 为什么这有效?用密集层替换卷积层会完全破坏性能。这甚至与功能减少有什么关系还是完全是其他事情?

我认为 2d 图像使用 1x1 卷积来减少图像的通道尺寸 - 但我只有 1 个通道具有 1x1 卷积,所以减少了什么?将我的一维卷积层过滤器设置为 128 是否意味着我选择了 128 个特征,这些特征随后被馈送到下一层?是否根据损失反向传播选择特征?

我在可视化特征信息的变化时遇到了很多困难。

最后,如果我再添加一个卷积层会怎么样?有没有办法概念化如果我添加另一个 1x1 层会发生什么?是否进一步对特征进行子采样?

谢谢!

让我们用一个包含 128 个单元的密集层来增强您的模型,并观察两个模型的摘要。

转化模型

from tensorflow.keras.layers import *
from tensorflow.keras.models import Model, Sequential
n_features = 1000 # your sequence length
model = Sequential()
model.add(Conv1D(128, kernel_size=1, activation="relu", input_shape=(n_features,1)))
model.add(Flatten())
model.add(Dense(100, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(1, activation='linear'))

model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_1 (Conv1D)            (None, 1000, 128)         256       
_________________________________________________________________
flatten_1 (Flatten)          (None, 128000)            0         
_________________________________________________________________
dense_8 (Dense)              (None, 100)               12800100  
_________________________________________________________________
dense_9 (Dense)              (None, 1)                 101       
=================================================================
Total params: 12,800,457
Trainable params: 12,800,457
Non-trainable params: 0

FC 型号

from tensorflow.keras.layers import *
from tensorflow.keras.models import Model, Sequential
n_features = 1000 # your sequence length
model = Sequential()
model.add(Dense(128, activation="relu", input_shape=(n_features,1)))
model.add(Flatten())
model.add(Dense(100, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(1, activation='linear'))

model.summary()
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_10 (Dense)             (None, 1000, 128)         256       
_________________________________________________________________
flatten_2 (Flatten)          (None, 128000)            0         
_________________________________________________________________
dense_11 (Dense)             (None, 100)               12800100  
_________________________________________________________________
dense_12 (Dense)             (None, 1)                 101       
=================================================================
Total params: 12,800,457
Trainable params: 12,800,457
Non-trainable params: 0
_____________________________

如您所见,两个模型在每一层中的参数数量相同。但本质上它们是完全不同的。

假设我们只有长度为 4 的输入。具有 3 个过滤器的 1 卷积将在这 4 个输入上使用 3 个单独的内核,每个内核将一次对单个输入元素进行操作,因为我们选择了 kernel_size = 1。因此,每个内核只是一个标量将与输入数组一次乘以一个元素的值(将添加偏差)。这里的事情是 1 卷积除了当前输入之外不会看任何地方,这意味着 它没有任何空间自由度,它一次只看当前输入点。(这将对后面的解释有用)

现在,有了 dense/fc 层,每个神经元都连接到每个输入,这意味着 fc 层具有完全的空间自由度,它看起来无处不在。等效的 Conv 层将是 kernel_size = 1000(实际输入长度)的东西。

那么,为什么 Conv1D 1 卷积可能表现更好?

  • 好吧,如果不实际查看数据属性就很难判断。但一种猜测是您正在使用没有任何空间依赖性的特征。

您已经随机选择了特征并且可能混合了它们(一次查看许多输入特征无济于事,但会学到一些额外的噪音)。这可能就是为什么使用一次只查看一个功能的 Conv 层而不是查看所有功能并将它们混合的 FC 层获得更好性能的原因。