Реализация разреженных соединений в нейронной сети (Theano)
В некоторых случаях для нейронных сетей требуется, чтобы не все нейроны были связаны между двумя последовательными слоями. Для моей архитектуры нейронной сети мне нужно иметь слой, в котором каждый нейрон имеет только соединения с некоторыми предварительно определенными нейронами в предыдущем слое (в несколько произвольных местах, а не с таким шаблоном, как слой свертки). Это необходимо для моделирования данных на определенном графике. Мне нужно реализовать этот "разреженный" слой в Theano, но я не привык к способу программирования Theano.
Кажется, что наиболее эффективным способом программирования разреженных соединений в Theano было бы использовать theano.tensor.nnet.blocksparse.SparseBlockGemv. Альтернативой было бы сделать умножение матрицы, где много весов были установлены на 0 (= нет соединения), но это было бы очень неэффективно по сравнению с SparseBlockGemv
, поскольку каждый нейрон был связан только с 2-6 нейронами в предыдущем слое из ~ 100000 нейронов. Более того, весовая матрица 100000x100000 не поместилась бы в мой RAM/GPU. Может ли кто-нибудь представить пример того, как реализовать разреженные соединения с помощью метода SparseBlockGemv
или другого метода с эффективными вычислениями?
Прекрасным примером будет расширение MLP Theano Tutorial с дополнительным слоем после скрытого слоя (и до softmax), где каждый нейрон имеет только соединения с подмножество нейронов в предыдущем слое. Тем не менее, другие примеры также очень приветствуются!
Изменить: Обратите внимание, что слой должен быть реализован в Theano, так как он является лишь небольшой частью более крупной архитектуры.
Ответы
Ответ 1
Вывод полностью подключенного слоя задается точечным произведением ввода и весами этого слоя. В anano или numpy вы можете использовать метод dot
.
y = x.dot(w)
Если у вас есть только соединения с некоторыми нейронами предыдущего слоя, и эти соединения предопределены, вы можете сделать что-то вроде этого:
y = [x[edges[i]].dot(w[i])) for i in neurons]
Где edges[i]
содержит индексы для нейронов, подключенных к нейрону i
и w[i]
весам этого соединения.
Обратите внимание, что theano не знает о слоях или других деталях высокого уровня.