Я следую инструкциям 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% точности.
Итак, что происходит? Как могут случайные вложения достигать такой же или лучшей производительности, чем предварительно обученные?
И почему использование индексов слов (нормализованных, конечно) в качестве входных данных приводит к такой низкой точности?