为什么我的 LSTM 和预训练 word2vec 的准确率非常低?

数据挖掘 机器学习 神经网络 深度学习 喀拉斯 nlp
2022-02-20 18:35:29

我正在研究一个只有两个类别 0(负面)和 1(正面)的评论分类模型。我正在使用来自谷歌的预训练 word2vec 和 LSTM。问题是我得到了大约 50% 的准确度,根据这篇论文应该是 83% 左右我尝试了许多不同的超参数组合,但仍然获得了可怕的准确性。我还尝试更改数据预处理技术并尝试进行词干提取,但仍未解决问题

这是我的代码

X, y = read_data()
X = np.array(clean_text(X)) #apply data preprocessing  
tokenizer = Tokenizer()
tokenizer.fit_on_texts(X)

#converts text to sequence and add padding zeros
sequence = tokenizer.texts_to_sequences(X)
X_data = pad_sequences(sequence, maxlen = length, padding = 'post')

X_train, X_val, y_train, y_val = train_test_split(X_data, y, test_size = 0.2)

#Load the word2vec model
word2vec = KeyedVectors.load_word2vec_format(EMBEDDING_FILE, binary=True)

word_index = tokenizer.word_index
nb_words = min(MAX_NB_WORDS, len(word_index))+1

embedding_matrix = np.zeros((nb_words, EMBEDDING_DIM))
null_words = []
for word, i in word_index.items():
    if word in word2vec.wv.vocab:
        embedding_matrix[i] = word2vec.word_vec(word)
    else:
        null_words.append(word)

embedding_layer = Embedding(embedding_matrix.shape[0], # or len(word_index) + 1
                            embedding_matrix.shape[1], # or EMBEDDING_DIM,
                            weights=[embedding_matrix],
                            input_length=701,
                            trainable=False)

model = Sequential()
model.add(embedding_layer)
model.add(LSTM(100))
model.add(Dropout(0.4))
model.add(Dense(2, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

我还尝试了其他优化器,例如 AdaMax 和 MSLE 损失函数。如果问题不在于模型和预处理,我只是感到困惑,它可能在哪里?谢谢

1个回答

它的巨大差异,我怀疑是谎言。

虽然可以实现 +33%,但您说您尝试了非常不同的架构,但您甚至没有接近。不要指望一个调整,一层,一个 xyz 可以给你一个突然如此巨大的增长。如果您没有更接近使用论文中的建议,那么他们也有可能撒谎(不是说他们这样做了,但之前在 ML 论文中已经做过——谎报在不提供代码的情况下实现的准确性