Более быстрый способ сделать несколько вложений в PyTorch? - PullRequest
1 голос
/ 24 июня 2019

Я работаю над библиотекой на основе факелов для создания автоэнкодеров с табличными наборами данных.

Одна большая особенность - изучение вложений для категориальных функций.

Однако на практике одновременное обучение многих слоев встраивания приводит к некоторым замедлениям. Я использую циклы for, чтобы сделать это, и выполнение цикла for на каждой итерации является (я думаю) причиной замедлений.

При построении модели я связываю слои встраивания с каждым категориальным элементом в наборе данных пользователя:

        for ft in self.categorical_fts:
            feature = self.categorical_fts[ft]
            n_cats = len(feature['cats']) + 1
            embed_dim = compute_embedding_size(n_cats)
            embed_layer = torch.nn.Embedding(n_cats, embed_dim)
            feature['embedding'] = embed_layer

Затем с вызовом .forward ():

        embeddings = []
        for i, ft in enumerate(self.categorical_fts):
            feature = self.categorical_fts[ft]
            emb = feature['embedding'](codes[i])
            embeddings.append(emb)

        #num and bin are numeric and binary features
        x = torch.cat(num + bin + embeddings, dim=1)

Тогда x уходит в плотные слои.

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

Кто-нибудь знает способ векторизации чего-то подобного? Спасибо!

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

diagram

Можем ли мы сделать это без перебора каждой матрицы встраивания?

1 Ответ

1 голос
/ 24 июня 2019

Если я не понял вашу проблему,

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

Я не использовал упомянутую вами библиотеку, но, например,

# vocab size is 10, OH vector size is 3
embedding = nn.Embedding(10, 3)
# mini batch input 2 samples of 4 indices each
mb_input = torch.LongTensor([[1,2,5,6],[5,6,8,9]])
embedding(input)

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

...