2010-05-22 10 views
12

Soy un novato en la programación funcional.Grandes estructuras de datos en la programación funcional

Tengo una gran red neuronal con miles de neuronas y cada conexión entre neuronas tiene su peso. Tengo que actualizar estos pesos muy a menudo, varios miles de veces por sesión de aprendizaje.

¿Sigue siendo aplicable FP aquí? Quiero decir en fp no podemos modificar variables y solo podemos devolver nuevas variables sin cambiar los valores previos. ¿Esto significa que tengo que recrear toda la red en cada actualización de peso?

Respuesta

18

¿Sigue siendo aplicable FP aquí?

que sin duda puede escribir esto en un estilo funcional con buena eficiencia algorítmica asintótica pero no es probable que obtenga con 10 × el rendimiento de una solución imprescindible decente porque la programación puramente funcional hace que sea difícil el uso de cachés de la CPU de manera efectiva.

Quiero decir en fp no podemos modificar las variables y solo podemos devolver nuevas variables que no cambian los valores anteriores. ¿Esto significa que tengo que recrear toda la red en cada actualización de peso?

No, por dos razones:

  1. estructuras de datos puramente funcional puede ser actualizado de manera eficiente, ya que se descomponen grandes estructuras (por ejemplo, una tabla hash) en muchas pequeñas estructuras definidas recursivamente-(por ejemplo, un binario equilibrado árbol). Cuando actualiza un único nodo dentro de un árbol inmutable, copia los datos de cada nodo en la ruta desde la raíz hasta el destino, pero vuelve a consultar las otras ramas por referencia, sabiendo que no se pueden cambiar porque son inmutables. . Por lo tanto, solo debe hacer O (log n) trabajar en lugar de O (n).

  2. Las estructuras de datos puramente funcionales suelen ofrecer funciones como map que permiten actualizar cada elemento de la misma manera y evitar el reequilibrio copiando la estructura del árbol fuente. Entonces el tiempo para n actualizaciones es O (n) en lugar de O (n log n).

lo que debería ser capaz de lograr la complejidad asintótica tiempo similar o incluso igual, pero, en términos absolutos, que va a utilizar varias veces más espacio y tiempo como una solución imprescindible. Describí estos conceptos básicos en detalle en mi libro Visual F# 2010 for Technical Computing y escribí el artículo Artificial Intelligence: Neural Networks (8th May 2010) para el OCaml Journal.

2

Mire en Haskell arrays que incluyen variantes mutables en una mónada.

1

No debería necesitar recrear toda la red cada vez que se produce una actualización de peso. Presumiblemente, sus neuronas se modelan como objetos individuales, esto significa que para "actualizar" una neurona individual, en realidad estaría creando una nueva neurona con el peso actualizado. Entonces, esta neurona se insertaría en la red en lugar de la antigua, que a su vez estaría libre para ser reclamada por el recolector de basura.

No estoy de acuerdo con la idea de utilizar el estado mutable. Los lenguajes funcionales saben que son funcionales, por lo que optimizan la programación funcional. Si un lenguaje funcional realmente es la mejor herramienta para el trabajo, aproveche sus ventajas.

+0

Digamos que tengo un árbol simple: Root | \ Node1 Node2 Entonces, si creo Node3 y reemplazo Node1 con Node3, ¿no significa eso que estoy cambiando todo el árbol? –

+0

Hay dos cosas mal con su ejemplo. En primer lugar, su publicación le pregunta si necesita recrear toda la red para cada actualización de peso, no si "cambia". Abordé este tema en mi respuesta. En segundo lugar, lo hizo lo suficientemente pequeño como para que haya algún cambio en cada nodo. Imagine en cambio que tiene una red de 1000 nodos, y solo uno de ellos debe ser reemplazado. ¿Todavía estás cambiando todo el árbol? – danben

+0

¿No significa que las redes neuronales realmente cambian? ¿Sus palabras "Entonces esta neurona se insertaría en la red en lugar de la anterior"? Me refiero a reemplazar parte de un todo, ¿no es un cambio de variable (red neuronal en este caso)? –

1

Si estructura sus datos de tal manera que puede utilizar una estructura de datos persistente para modelar su red neuronal, las actualizaciones funcionales de la red neuronal serán baratas (al menos en comparación con la copia completa).

Si aún no es lo suficientemente rápido, su lenguaje puede permitir otras técnicas (como el uso cuidadoso de la mutación) para acelerarlo; por ejemplo, si estuviera usando Clojure, podría usar transitorios a una velocidad adicional.

Cuestiones relacionadas