Translate

martes, 29 de agosto de 2023

Redes Neuronales en Lisp

 En esta página se puede obtener la libreria "simple-neural-net", para usar redes neuronales en nuestro interprete lisp. 

Brevemente, porque supongo que si llegaste hasta aca, ya tenes una idea de esto. Las redes neuronales estan formadas por capas, y cada capa es un conjunto de nodos. Tenes una capa con las entradas, una capa con las salidas y una o varias capas que median entre ambas, (entradas y salidas) que son las capas ocultas. La red se entrena, definiendo que salidas obtener de acuerdo a las entradas suministradas. 

Se utilizan para detectar patrones en imagenes, sonidos tambien, para ajustar y obtener mejores valores para los coeficientes de variables en funciones de evaluacion para juegos, etc.

Esta libreria usa las librerias "cl-store" y "lparallel", que pueden instalarse usando quicklisp. Explicado en este mismo blog.

En la pagina del proyecto se explica muy bien las funciones, asi que solo me voy a limitar a comentar uno de los ejemplos mostrados alli, que entrena la red para que muestre en una salida los resultados de una funcion XOR, aplicado a dos entradas:


(asdf:load-system "simple-neural-network") ;; carga la libreria
(defun normalize (input)
  (map 'vector (lambda (x) (if (= x 1) 1.0d0 -1.0d0)) input))

(defun denormalize (output)
  (if (plusp (aref output 0)) 1 0))

(defvar inputs (mapcar #'normalize '(#(0 0) #(0 1) #(1 0) #(1 1)))) ;; define las entradas
(defvar targets (mapcar #'normalize '(#(0) #(1) #(1) #(0)))) ;; define cada resultado de salida que corresponde con cada entrada
(defvar nn (snn:create-neural-network 2 1 4)) ;; define una red neuronal con una capa de entrada de 2 nodos, una capa de salida de 1 nodo y una capa oculta de 4 nodos.
(dotimes (i 1000)
  (snn:train nn inputs targets 0.1)) ;; entrena la red 

(denormalize (snn:predict nn (normalize #(0 0))))
-> 0 ;; devuelve el valor de salida correspondiente, con la red ya entrenada

(denormalize (snn:predict nn (normalize #(1 0))))
-> 1

(denormalize (snn:predict nn (normalize #(0 1))))
-> 1

(denormalize (snn:predict nn (normalize #(1 1))))
-> 0