Встраивание и вставка векторов слов непосредственно во входной слой - PullRequest
0 голосов
/ 18 декабря 2018

Я использовал gensim для создания вложения в word2vec моего корпуса.В настоящее время я преобразовываю свои (дополненные) входные предложения в векторы слов, используя модель gensim.Эти векторы используются в качестве входных данных для модели.

model = Sequential()
model.add(Masking(mask_value=0.0, input_shape=(MAX_SEQUENCE_LENGTH, dim)))
model.add(Bidirectional(
    LSTM(num_lstm, dropout=0.5, recurrent_dropout=0.4, return_sequences=True))
)
...
model.fit(training_sentences_vectors, training_labels, validation_data=validation_data)

Есть ли какие-либо недостатки при использовании векторов слов непосредственно без слоя для встраивания keras?

Я также в настоящее время добавляю дополнительные (одно-теги) в горячем кодировании) к входным токенам путем объединения их с каждым вектором слов, имеет ли этот подход смысл?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Существует элегантный способ сделать то, что вам нужно.

Проблема с вашим решением состоит в том, что:

  1. размер ввода велик: (batch_size, MAX_SEQUENCE_LENGTH, dim) и может не подходитьв памяти.
  2. Вы не сможете обучать и обновлять векторы слов согласно своей задаче

Вместо этого вы можете просто сойти с рук: (batch_size, MAX_SEQUENCE_LENGTH).Слой встраивания keras позволяет передать индекс слова и получить вектор.Итак, 42 -> Embedding Layer -> [3, 5.2, ..., 33].

Для удобства модель w2v от gensim имеет функцию get_keras_embedding, которая создает необходимый вам слой встраивания для вас с обученными весами.

gensim_model = # train it or load it
embedding_layer = gensim_model.wv.get_keras_embedding(train_embeddings=True)
embedding_layer.mask_zero = True  # No need for a masking layer

model = Sequential()
model.add(embedding_layer) # your embedding layer
model.add(Bidirectional(
    LSTM(num_lstm, dropout=0.5, recurrent_dropout=0.4, return_sequences=True))
)

Но вы должны убедиться, что индекс дляСлово в данных совпадает с индексом для модели word2vec.

word2index = {}
for index, word in enumerate(model.wv.index2word):
    word2index[word] = index

Используйте приведенный выше словарь word2index, чтобы преобразовать ваши входные данные в тот же индекс, что и в модели gensim.

Например, ваши данные могут быть:

X_train = [["hello", "there"], ["General", "Kenobi"]]

new_X_train = [] 
for sent in X_train:
    temp_sent = []
    for word in sent:
        temp_sent.append(word2index[word])
    # Add the padding for each sentence. Here I am padding with 0
    temp_sent += [0] * (MAX_SEQUENCE_LENGTH - len(temp_sent))
    new_X_train.append(temp_sent)

X_train = numpy.as_array(new_X_train)

Теперь вы можете использовать X_train, и это будет выглядеть так: [[23, 34, 0, 0], [21, 63, 0, 0]] Слой встраивания автоматически сопоставит индекс с этим вектором и обучит его, еслиНужен.

Я думаю, что это лучший способ сделать это, но я выясню, как gensim хочет, чтобы это было сделано, и обновлю этот пост, если необходимо.

0 голосов
/ 18 декабря 2018

В вашей текущей настройке недостатком будет то, что вы не сможете настроить свои векторы слов для обучения.Вы не сможете точно настроить свою модель для своей задачи.

Под этим я подразумеваю, что Генсим изучил только «Языковую модель».Он понимает ваш корпус и его содержание.Тем не менее, он не знает, как оптимизировать для какой-либо последующей задачи, для которой вы используете keras.Веса вашей модели помогут точно настроить вашу модель, однако вы, вероятно, испытаете увеличение производительности, если вы извлечете вложения из gensim, будете использовать их для инициализации слоя встраивания keras, а затем передадите индексы вместо векторов слов для вашего входного слоя,

...