Будет ли использование предварительно обученных вложений слов ускорять обучение модели в Pytorch?Кроме того, что делать, если некоторые слова набора данных отсутствуют во вложениях? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть модель классификации текста, которая пропускает вложения слов через GRU, а выходные данные этого GRU передаются в ANN, который дает один класс в качестве вывода.

Набор данных огромен (1,4 миллиона строк), и я обучаю его в Google Colab. Требуется 15 минут, чтобы пройти через 500 строк набора данных.

Итак, чтобы ускорить обучение, я решил использовать предварительно обученные векторы Glove вместо случайных вложений, которые предоставляет Pytorch. Как мне это реализовать?

И есть ли какие-либо идеи относительно того, что мне делать с пропущенными словами, которых нет в векторах Перчаток? Как они будут встроены?

Будут оценены любые другие идеи по ускорению.

EDIT: На основании запроса @scarecrow для кода. Код, который я использовал для преобразования вложений в тензор с плавающей точкой:

print(f'First embedding: {embeddings[0]}')
print(f'The dimensions of the embeddings are: {len(embeddings[0])}')
embed = torch.FloatTensor([embeddings[0], embeddings[1]])

Это только пример. Я думал, что будет лучше показать, какой блок кода выдает ошибку.

Я получаю ошибку:

First embedding: ['0.418', '0.24968', '-0.41242', '0.1217', '0.34527', '-0.044457', '-0.49688', '-0.17862', '-0.00066023', '-0.6566', '0.27843', '-0.14767', '-0.55677', '0.14658', '-0.0095095', '0.011658', '0.10204', '-0.12792', '-0.8443', '-0.12181', '-0.016801', '-0.33279', '-0.1552', '-0.23131', '-0.19181', '-1.8823', '-0.76746', '0.099051', '-0.42125', '-0.19526', '4.0071', '-0.18594', '-0.52287', '-0.31681', '0.00059213', '0.0074449', '0.17778', '-0.15897', '0.012041', '-0.054223', '-0.29871', '-0.15749', '-0.34758', '-0.045637', '-0.44251', '0.18785', '0.0027849', '-0.18411', '-0.11514', '-0.78581']
The dimensions of the embeddings are: 50
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-59-f8951bd3f739> in <module>()
      1 print(f'First embedding: {embeddings[0]}')
      2 print(f'The dimensions of the embeddings are: {len(embeddings[0])}')
----> 3 embed = torch.FloatTensor([embeddings[0], embeddings[1]])

ValueError: too many dimensions 'str'

1 Ответ

0 голосов
/ 12 апреля 2019

Создайте словарь из всех слов, которые вам нужны, чтобы каждое слово получило уникальный индекс в словаре. Загрузите вложения как факел Tensor и загрузите вложения, как показано ниже: документы

>>> embedding_weights = torch.FloatTensor([[0.3, 0.6, 0.1], [0.2, 0.5, 0.3]])
>>> embedding = torch.nn.Embedding.from_pretrained(embedding_weights)
>>> embedding(torch.tensor([1]))
tensor([[0.2000, 0.5000, 0.3000]])
>>> 

Скажем, если слово "привет" соответствует индексу 2 в вашем словаре, embedding_weights[2] должен содержать соответствующий вектор GloVe.

Если вы хотите разместить пропущенные слова в Glove, вы можете добавить эти слова в словарь из обучающего набора и добавить его в тензор embedding_weights, назначив им случайные тензоры. Слой Embedding должен быть обучаемым, чтобы эти произвольно инициализированные тензоры были изучены путем обновления параметров в процессе обучения.

РЕДАКТИРОВАТЬ: Добавлен пример

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