Используйте предварительно обученное встраивание на испанском языке с помощью Torchtext

Я использую Torchtext в проекте НЛП. У меня есть предварительно обученное встраивание в мою систему, которое я хотел бы использовать. Поэтому я попробовал:

my_field.vocab.load_vectors(my_path)

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

Got string input vector "my_path", but allowed pretrained vectors are ['charngram.100d', 'fasttext.en.300d', ..., 'glove.6B.300d']

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

Есть ли другой способ, которым я могу работать с моим предварительно обученным встраиванием? Допустимо решение, позволяющее использовать другое предварительно обученное встраивание испанского языка.

Некоторые люди, похоже, думают, что непонятно, чего я хочу. Итак, если заголовка и последнего вопроса недостаточно: «Мне нужна помощь с использованием предварительно обученного встраивания испанского слова в Torchtext».


person Pablo    schedule 07.09.2018    source источник


Ответы (1)


Оказывается, есть относительно простой способ сделать это без изменения исходного кода Torchtext. Вдохновение взято из этой ветки Github.

<сильный>1. Создать тензор слова-вектора numpy

Вам нужно загрузить встраивание, чтобы в итоге вы получили пустой массив с размерами (number_of_words, word_vector_length):

my_vecs_array[word_index] должен вернуть соответствующий вектор слов.

ВАЖНЫЙ. Индексы (word_index) для этого массива массивов ДОЛЖНЫ быть взяты из словаря Torchtext, преобразующего слово в индекс (field.vocab.stoi). В противном случае Torchtext будет указывать на неправильные векторы!

Не забудьте преобразовать в тензор:

my_vecs_tensor = torch.from_numpy(my_vecs_array)

<сильный>2. Загрузить массив в Torchtext

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

my_field.vocab.set_vectors(my_field.vocab.stoi, my_vecs_tensor, word_vectors_length)

<сильный>3. Передать веса модели

В вашей модели вы объявите вложение следующим образом:

my_embedding = toch.nn.Embedding(vocab_len, word_vect_len)

Затем вы можете загрузить свои веса, используя:

my_embedding.weight = torch.nn.Parameter(my_field.vocab.vectors, requires_grad=False)

Используйте require_grad=True, если вы хотите обучить встраивание, используйте False, если хотите его заморозить.

EDIT: похоже, что есть другой способ это выглядит немного проще! Улучшение заключается в том, что, по-видимому, вы можете передавать предварительно обученные векторы слов непосредственно на этапе создания словаря, так что здесь позаботятся о шагах 1-2.

person Pablo    schedule 11.09.2018
comment
Не уверен, что это было возможно, когда этот ответ был написан, но вы также можете использовать метод класса Embedding from_pretrained, чтобы сделать это. - person Ben; 07.06.2020
comment
Я тоже не уверен. Я думаю, что использование from_pretrained сделало бы последние два шага немного чище. Спасибо за вклад :) - person Pablo; 07.06.2020