Как использовать вложение слов Elmo с оригинальной предварительно обученной моделью (5.5B) в интерактивном режиме - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь научиться использовать вложения Elmo с помощью этого урока:

https://github.com/allenai/allennlp/blob/master/tutorials/how_to/elmo.md

Я специально пытаюсь использовать интерактивный режим, как описано ниже:

$ ipython
> from allennlp.commands.elmo import ElmoEmbedder
> elmo = ElmoEmbedder()
> tokens = ["I", "ate", "an", "apple", "for", "breakfast"]
> vectors = elmo.embed_sentence(tokens)

> assert(len(vectors) == 3) # one for each layer in the ELMo output
> assert(len(vectors[0]) == len(tokens)) # the vector elements 
correspond with the input tokens

> import scipy
> vectors2 = elmo.embed_sentence(["I", "ate", "a", "carrot", "for", 
"breakfast"])
> scipy.spatial.distance.cosine(vectors[2][3], vectors2[2][3]) # cosine 
distance between "apple" and "carrot" in the last layer
0.18020617961883545

Мой общий вопрос: как мне использовать предварительно обученную модель elmo на оригинальном наборе 5.5B (описано здесь: https://allennlp.org/elmo)?

Я не совсем понимаю, почему мы имеемназывать «утверждать» или почему мы используем индексирование [2] [3] для векторного вывода.

Моя конечная цель - усреднить все вложения слов, чтобы получить вложение предложения, поэтому я хочучтобы убедиться, что я все делаю правильно!

Спасибо за ваше терпение, поскольку я довольно новичок во всем этом.

1 Ответ

0 голосов
/ 04 января 2019

По умолчанию ElmoEmbedder использует исходные веса и параметры из предварительно обученных моделей в тесте 1 Bil Word.Около 800 миллионов токенов.Чтобы убедиться, что вы используете самую большую модель, посмотрите на аргументы класса ElmoEmbedder.Отсюда вы, вероятно, сможете выяснить, что вы можете установить параметры и вес модели:

elmo = ElmoEmbedder(
    options_file='https://s3-us-west-2.amazonaws.com/allennlp/models/elmo/2x4096_512_2048cnn_2xhighway_5.5B/elmo_2x4096_512_2048cnn_2xhighway_5.5B_options.json', 
    weight_file='https://s3-us-west-2.amazonaws.com/allennlp/models/elmo/2x4096_512_2048cnn_2xhighway_5.5B/elmo_2x4096_512_2048cnn_2xhighway_5.5B_weights.hdf5'
)

Я получил эти ссылки из таблицы предварительно обученных моделей, предоставленной AllenNLP.


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


Исходя из этого, мы индексируем с [i][j], потому что модель выводит 3-слойные матрицы (где мы выбираем i-th) и каждая матрица имеет n токенов (где мы выбираем j-ую) каждый длиной 1024. Обратите внимание, как код сравнивает сходство «яблока» и «моркови», оба из которых являются 4-м токеном по индексуJ = 3.Из примера документации i представляет один из следующих элементов:

Первый уровень соответствует нечувствительному к контексту представлению токена, за которым следуют два уровня LSTM.См. Документ ELMo или последующую работу в EMNLP 2018 для описания того, какие типы информации собираются в каждом слое.

В документе приводятся подробности об этих двух слоях LSTM.


Наконец, если у вас есть набор предложений, с ELMO вам не нужно усреднять векторы токенов.Модель представляет собой символьную LSTM, которая отлично работает на целых предложениях с токенами.Используйте один из методов, предназначенных для работы с наборами предложений: embed_sentences(), embed_batch() и т. Д. Подробнее в коде !

...