Keras - Проблемы с использованием предварительно обученных вложений слов - PullRequest
1 голос
/ 07 марта 2019

Я следую инструкциям Keras по встраиванию слов и копирую код (с несколькими изменениями) из этого конкретного:

Использование предварительно обученных вложений слов в модель Keras

Это проблема классификации тем, в которой они загружают предварительно обученные векторы слов и используют их через фиксированный слой внедрения.

При использовании предварительно обученных векторов встраивания я могу достичь точности 95%. Это код:

embedding_layer = Embedding(len(embed_matrix), len(embed_matrix.columns), weights=[embed_matrix],
                           input_length=data.shape[1:], trainable=False)

sequence_input = Input(shape=(MAXLEN,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)

x = Conv1D(128, 5, activation='relu')(embedded_sequences)
x = MaxPooling1D(5)(x)
x = Conv1D(128, 5, activation='relu')(x)
x = MaxPooling1D(5)(x)
x = Dropout(0.2)(x)
x = Conv1D(128, 5, activation='relu')(x)
x = MaxPooling1D(35)(x)  # global max pooling
x = Flatten()(x)
x = Dense(128, activation='relu')(x)
output = Dense(target.shape[1], activation='softmax')(x)

model = Model(sequence_input, output)
model.compile(loss='categorical_crossentropy', optimizer='adam', 
metrics=['acc'])
model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=2, 
batch_size=128)

Проблема возникает, когда я удаляю векторы встраивания и использую совершенно случайные векторы, неожиданно достигая точности выше : 96,5%.

Код такой же, с одной модификацией: весит = [ random_matrix ]. Это матрица с такой же формой embed_matrix , но с использованием случайных значений. Теперь это слой для встраивания:

embedding_layer = Embedding(len(embed_matrix), 
len(embed_matrix.columns), weights=[random_matrix],
                        input_length=data.shape[1:], trainable=False)

Я много раз экспериментировал со случайными весами, и результат всегда был похожим. Обратите внимание, что даже если эти веса являются случайными, параметр trainable по-прежнему False , поэтому NN не обновляет их.

После этого я полностью удалил слой внедрения и использовал в качестве входных данных последовательности слов, ожидая, что эти веса не повлияют на точность модели. При этом я получил только 16% точности.

Итак, что происходит? Как могут случайные вложения достигать такой же или лучшей производительности, чем предварительно обученные?

И почему использование индексов слов (нормализованных, конечно) в качестве входных данных приводит к такой низкой точности?

...