Keras 1d 卷积层如何处理词嵌入 - 文本分类问题? (过滤器、内核大小和所有超参数)

How does Keras 1d convolution layer work with word embeddings - text classification problem? (Filters, kernel size, and all hyperparameter)

我目前正在使用 Keras 开发一个文本分类工具。它工作正常(工作正常,我达到了 98.7 的验证准确率)但我无法理解一维卷积层如何与文本数据一起工作。

我应该使用什么超参数?

我有以下句子(输入数据):

这是一个非常简单的模型(我制作了更复杂的结构,但奇怪的是它效果更好——即使不使用 LSTM):

model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(labels_count, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())

我的主要问题是:Conv1D 层应该使用哪些超参数?

model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))

如果我有以下输入数据:

这是否意味着 filters=32 将只扫描前 32 个单词而完全丢弃其余的(使用 kernel_size=2)?我应该将过滤器设置为 951(句子中的最大字数)?

图片示例:

例如这是一个输入数据:http://joxi.ru/krDGDBBiEByPJA

这是卷积层的第一步(步幅 2):http://joxi.ru/Y2LB099C9dWkOr

这是第二步(stride 2):http://joxi.ru/brRG699iJ3Ra1m

如果filters = 32,图层重复32次?我对么? 所以我不会在句子中说出第 156 个单词,因此这些信息会丢失吗?

我会尝试解释一维卷积如何应用于序列数据。我只是举了一个由单词组成的句子的例子,但显然它不是特定于文本数据的,它与其他序列数据和时间序列相同。

假设我们有一个由 m 个单词组成的句子,其中每个单词都使用单词嵌入表示:

现在我们想在这个数据上应用一个由 n 个不同的过滤器组成的一维卷积层,内核大小为 k。为此,从数据中提取长度 k 的滑动 windows,然后将每个过滤器应用于每个提取的 windows。这是发生的情况的说明(这里我假设 k=3 并为简单起见删除了每个过滤器的偏置参数):

如上图所示,每个滤波器的响应等同于其卷积(即逐元素相乘,然后将所有结果相加)与提取的window长度的结果k(即给定句子中的第 i(i+k-1) 个单词)。此外,请注意,每个过滤器的通道数与训练样本的特征数(即词嵌入维度)相同(因此可以执行卷积,即逐元素乘法)。本质上,每个过滤器都在检测 local window 训练数据中是否存在特定模式特征(例如,此 window 或不)。在将所有过滤器应用于长度 k 的所有 windows 之后,我们将得到这样的输出,这是卷积的结果:

如您所见,图中有 m-k+1 windows,因为我们假设 padding='valid'stride=1([=37= 的默认行为] 图层)。 stride 参数确定 window 应该滑动多少(即移动)以提取下一个 window (例如,在我们上面的示例中,步幅为 2 将提取 windows单词:(1,2,3), (3,4,5), (5,6,7), ... 代替)。 padding 参数决定 window 是否应该完全由训练样本中的单词组成,或者是否应该在开头和结尾进行填充;这样,卷积响应可能具有与训练样本相同的长度(即 m 而不是 m-k+1)(例如,在我们上面的示例中,padding='same' 将提取 windows单词:(PAD,1,2), (1,2,3), (2,3,4), ..., (m-2,m-1,m), (m-1,m, PAD)).

你可以使用 Keras 验证我提到的一些事情:

from keras import models
from keras import layers

n = 32  # number of filters
m = 20  # number of words in a sentence
k = 3   # kernel size of filters
emb_dim = 100  # embedding dimension

model = models.Sequential()
model.add(layers.Conv1D(n, k, input_shape=(m, emb_dim)))

model.summary()

模型摘要:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_2 (Conv1D)            (None, 18, 32)            9632      
=================================================================
Total params: 9,632
Trainable params: 9,632
Non-trainable params: 0
_________________________________________________________________

如您所见,卷积层的输出形状为 (m-k+1,n) = (18, 32),卷积层中的参数数量(即过滤器权重)等于:num_filters * (kernel_size * n_features) + one_bias_per_filter = n * (k * emb_dim) + n = 32 * (3 * 100) + 32 = 9632.