Я работаю над библиотекой на основе факелов для создания автоэнкодеров с табличными наборами данных.
Одна большая особенность - изучение вложений для категориальных функций.
Однако на практике одновременное обучение многих слоев встраивания приводит к некоторым замедлениям. Я использую циклы 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](https://i.stack.imgur.com/xxCPi.png)
Можем ли мы сделать это без перебора каждой матрицы встраивания?