Как концептуально подумать о связи между токенизированными словами и встраиваниями слов? - PullRequest
0 голосов
/ 05 мая 2018

Я использовал руководство JJ Allaire по использованию встраивания слов в модель нейронной сети для обработки текста (https://jjallaire.github.io/deep-learning-with-r-notebooks/notebooks/6.1-using-word-embeddings.nb.html).) Я не совсем понимаю, как модель связывает токенизированные последовательности слов (x_train) со встраиванием слов которые определяются с использованием всего набора данных (а не только обучающих данных). Есть ли способ осмысления того, как жетоны слова отображаются на вложения слов? В противном случае, как слово типа «король» отображается на вложение слова (полученное с использованием Перчатка, например). Я говорю об отношении между этими кусками кода:

#building model 
history <- model %>% fit(
 x_train, y_train,
 epochs = 20,
 batch_size = 32,
 validation_data = list(x_val, y_val)
)

#relating model to word embeddings
model <- keras_model_sequential() %>% 
layer_embedding(input_dim = max_words, output_dim = embedding_dim, 
              input_length = maxlen) %>% 
layer_flatten() %>% 
layer_dense(units = 32, activation = "relu") %>% 
layer_dense(units = 1, activation = "sigmoid")

get_layer(model, index = 1) %>% 
 set_weights(list(embedding_matrix)) %>% 
 freeze_weights()

Как токенизированное слово из x_train связано со словом в embedding_matrix (особенно, если слой встраивания обучается на всех данных)?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Короче

Концептуально, keras::layer_embedding() принимает двумерную матрицу [samples, word_sequences], где значения являются целочисленными идентификаторами слова (словесный индекс), и заменяет указанное значение их вектором слов, чтобы оно стало трехмерной матрицей [samples, word_sequences, embeddings] - другими словами, где значения - это векторы слов, а не идентификаторы слов. Склеенные векторы слов могут приходить откуда-то еще, как в вашем примере выше, или они могут быть случайным образом инициализированы и обновлены во время подготовка.


Меньше коротких

Вы передаете keras::layer_embedding() последовательности слов. train_x - это двумерная матрица, где строки - это образцы (документы), а столбцы - последовательности слов. Значения в train_x представляют собой целочисленные идентификаторы (индекс слов) для каждого слова, соответствующие их позиции в вашем отдельно сохраненном списке слов (словарь). Мы можем стилизовать train_x как:

enter image description here

Здесь значение 75 соответствует слову в 75-й позиции вашего словаря.

embedding_matrix, который вы передаете keras::set_weights(), - это двумерная матрица, в которой строки соответствуют словарному запасу. Например, значения в 75-й строке embedding_matrix - это векторы слов для слова в 75-й позиции вашего словаря.

Так что, если вы приклеиваете к предварительно обученным встраиваниям, как в приведенном выше примере, тогда keras::layer_embedding() просто заменяет индекс слова на векторы слов в этой строке embedding_matrix. Мы можем стилизовать операцию как

for (x in 1:nrow(train_x)) {
  for (y in 1:ncol(train_x)) {
    train_x[x, y] <- embedding_matrix[train_x[x, y], ]
  }
}

Поэтому мы заканчиваем трехмерной матрицей (кубом), которую мы можем стилизовать как:

enter image description here

0 голосов
/ 05 мая 2018

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

Вложение слов - это что-то вроде словаря, оно сопоставляет слово или индекс с вектором, скажем, мы хотим представить слово с вектором 128 дим. Его можно обучить на огромном наборе данных, вы можете использовать GloVe или Word2Vec (модель скип-граммы). В Keras вы можете легко добавлять слои «Встраивание», слои «Встраивание» узнают, как представлять индекс с помощью вектора.

Я думаю, что ваши обучающие данные и тестовые данные поступают из одного и того же распределения, поэтому либо индекс слова, либо векторы внедрения должны быть равны, поэтому мы обучаем встраивание всего набора данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...