在 Keras 中为 NLP 问题组织层

数据挖掘 深度学习 nlp 喀拉斯
2021-10-09 17:10:19

我一直在尝试一个 NLP 问题,我必须预测某些文本的多标签情绪。

我有 8 个标签和 17 万个训练示例,以及 14 万个测试集。我的最终字典大小约为 190k。

我正在使用 Keras 来尝试一种 NN 方法,尽管我不确定我的架构是否正确,下面是在测试集上给我 95% 的模型,我在训练时测试了 0.7 - 0.3 分割的准确度:

model = Sequential
model.add(Embedding(max_indexes + 1, 100, weights=[embeddings], 
                  input_length=100))

model.add(Bidirectional(LSTM(256, return_sequences=True)))

model.add(Convolution1D(256, 5, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())

model.add(Convolution1D(256, 5, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())

model.add(Convolution1D(256, 5, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPool1D())

model.add(Convolution1D(256, 4, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())

model.add(Convolution1D(256, 3, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())

model.add(Convolution1D(256, 3, padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPool1D())

model.add(Flatten())

model.add(Dense(64, activation='relu',
                kernel_regularizer=keras.regularizers.l2(0.02)))

model.add(Dense(target_classes_len, activation='sigmoid',
                kernel_regularizer=keras.regularizers.l2(0.02)))
model.add(Dropout(0.1))

adam_opt = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)

early_stopping = EarlyStopping(monitor='val_loss', patience=5, mode='min')

save_best = ModelCheckpoint('model_x.hdf', save_best_only=True, 
                               monitor='val_loss', mode='min')
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
                              patience=5, min_lr=0.0001)

model.compile(adam_opt, 'binary_crossentropy', metrics=['accuracy'])

通过互联网,在观看 CSE231N 和其他 StackOverflow 问题的视频时,我发现我应该遵循:

[(CONV-RELU)*n - POOL? ]*m - (FC-RELU)*K, Softmax
 N~5, M~very large, K>=0 and K<=2

虽然它是针对 ImageNet 分类问题的,但我手头有一个 NLP 问题。

另外,我发现应该在最终的完全连接和 BatchNormalization 之后使用 CONV-RELU 将 DropOut 放在一个序列中。

我只是想知道对于 NLP 问题,什么是好的层组织,或者评估不同架构的任何方式?

谢谢

1个回答

在这类问题中,需要确定他/她想要使用什么模型。如果最终的 softmax 层提供 8 个输出,卷积网络会很棒。您的网络架构中不需要双向层。尝试一个简单的 conv 网络并确保您的数据管道正常工作,然后您可以添加更多层并使其变得复杂。