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

Posted

技术标签:

【中文标题】Keras 1d 卷积层如何处理词嵌入 - 文本分类问题? (过滤器、内核大小和所有超参数)【英文标题】:How does Keras 1d convolution layer work with word embeddings - text classification problem? (Filters, kernel size, and all hyperparameter) 【发布时间】:2019-02-20 11:31:10 【问题描述】:

我目前正在使用 Keras 开发文本分类工具。它工作正常(工作正常,我的验证准确度高达 98.7),但我不知道一维卷积层究竟是如何处理文本数据的。

我应该使用哪些超参数?

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

句子中的最大单词数:951(如果小于 - 添加填充) 词汇量:~32000 句子数量(用于训练):9800 embedding_vecor_length:32(每个词在词嵌入中的关系数) batch_size: 37(这个问题没关系) 标签数(类):4

这是一个非常简单的模型(我制作了更复杂的结构,但奇怪的是它效果更好——即使不使用 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'))

如果我有以下输入数据:

最大字数:951 词嵌入维度:32

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

图片示例:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

能否通过这个例子来解释一下参数共享的概念? @vampiretap 卷积层的参数共享从答案中的解释和数字中可以看出:每个过滤器(即相同的参数集)应用于所有给定数据的窗口,这意味着参数在数据之间共享。 @NuhilMehdy 这基本上就是卷积(或相关)运算的含义:两个向量或矩阵(或一般的)。由于我们将所有乘法结果加在一起,我们将得到一个标量值作为最终结果。 @today 谢谢!知道了。我对“点积”一词感到困惑,想知道它是如何提供定标器的。似乎卷积的工作方式不同(就像你提到的那样)。 @NuhilMehdy 是的,你是对的。我不应该使用“点积”这个词,因为它可能会使读者感到困惑。相反,使用“卷积”本身以及一个简短的定义(即“逐元素乘法,然后对所有结果求和”)是一个更好的选择。我刚刚编辑了我的答案以反映这一点。谢谢!

以上是关于Keras 1d 卷积层如何处理词嵌入 - 文本分类问题? (过滤器、内核大小和所有超参数)的主要内容,如果未能解决你的问题,请参考以下文章

[深度应用]·DC竞赛轴承故障检测开源Baseline(基于Keras1D卷积 val_acc:0.99780)

Keras网络层之卷积层

Keras Conv1d 参数及输入输出详解

Keras官方中文文档:卷积层Convolutional

在 Keras 的卷积层上使用 Dropout

keras中Convolution1D的使用