Cómo implementar conexiones dispersas personalizadas en una red neuronal

Los tensores de alta dimensión no son realmente aplicables en este caso, en realidad solo está almacenando una matriz de conectividad entre la población “de” a la población “a” en la red. Un buen orden sería organizar los pesos en la matriz A de modo que A_ij sea el peso de la neurona presináptica j a la neurona postsináptica i, entonces

[mates]
b = sigmoide (A * x)
[/mates]

donde b = activaciones de la población postsináptica, yx = activaciones de la población presináptica, y * es el producto externo.

Muchas bibliotecas de álgebra lineal / tensor proporcionan soporte para matrices / matrices dispersas. Si está utilizando cuda-convnet, consulte cuSparse, la biblioteca de matriz dispersa de nVidia.
http://docs.nvidia.com/cuda/cusp…

Desafortunadamente, necesitará una GPU bastante buena para almacenar matrices de conectividad, que tienden a crecer para redes grandes.

Es posible que pueda utilizar scipy.sparse desde Theano. Debo agregar que si usa matrices dispersas, será costoso desasignar ciertas entradas (por ejemplo, es posible que desee evolucionar la estructura de conectividad a través de la propagación hacia atrás, y con el tiempo la matriz se volverá densa a menos que redondee pequeños pesos epsilon para 0, es decir, entradas dispersas).

También puede intentar dividir sus capas completamente conectadas en múltiples subpoblaciones que están completamente conectadas pero no entre sí. Un ejemplo simple de dónde se hace esto es una capa de convolución en aplicaciones de visión.

Que yo sepa, todavía no existe una solución algorítmicamente “hermosa” para escalar las operaciones de matriz de conectividad, incluso utilizando matrices dispersas. Se pueden hacer compromisos si está dispuesto a dividir las capas de su red en poblaciones más pequeñas, es decir, para evitar la explosión cuadrática.