Seguramente habréis oído hablar alguna vez de las llamadas Redes Neuronales. Quizás también sabréis cuál es su filosofía, y si lo habéis encontrado lo suficientemente interesante, se os habrá ocurrido coger alguna vez algún libro de Inteligencia Artificial y lo habréis abierto por el tema de redes neuronales. Si ese es el caso, entonces habréis visto lo complicado que puede llegar a ser el tema (aunque verdaderamente, tampoco se esfuerzan mucho en explicarlo bien).
Pues bueno, yo soy uno de esos desaprensivos que quiso saber algo más de este mundo. He hecho un par de 'experimentos' con ellas y, realmente, todavía no tengo las cosas muy claras. Intentaré explicar aquí todo lo que más o menos he aprendido (y las nuevas dudas a que eso me ha llevado), con la intención de introducir un poco a quien le interese alguna aplicación práctica de las redes neuronales y para que si alguien sabe más que yo, eche una mano.
Las Redes Neuronales surgieron del movimiento conexionista, que nació junto con la IA simbólica o tradicional. Esto fue hacia los años 50, con algunos de los primeros ordenadores de la época y las posibilidades que ofrecían. La IA simbólica se basa en que todo conocimiento se puede representar mediante combinaciones de símbolos, derivadas de otras combinaciones que representan verdades incuestionables o axiomas. Así pues, la IA tradicional asume que el conocimiento es independiente de la estructura que maneje los símbolos, siempre y cuando la 'máquina' realice algunas operaciones básicas entre ellos. En contraposición, los 'conexionistas' intentan representar el conocimiento desde el estrato más básico de la inteligéncia: el estrato físico. Creen que el secreto para el aprendizaje y el conocimiento se halla directamente relacionado con la estructura del cerebro: concretamente con las neuronas y la interconexión entre ellas.
Así pues, trabajan con grupos de neuronas artificiales, llamadas Redes Neuronales. La estructura básica de una neurona natural es:
Neurona natural (no es un álien)
Éstas funcionan como sigue: Cada neurona puede tener infinitas entradas llamadas Dendritas que condicionan el estado de su única salida, el Axón. Este Axón puede ir conectado a una Dendrita de otra neurona mediante la Sinápsis correspondiente, de la siguiente manera:
Grupo de Neuronas
El Axón da un nivel eléctrico correspondiente a sus entradas y a la importancia que les da a cada una de ellas. Así pues, una neurona puede no reaccionar ante un nivel muy alto de una de sus entradas, o dar una salida muy favorable cuando otra de ellas está mínimamente activa.
En las primeras etapas de nuestra vida, cuando realizamos el aprendizaje de nuestros cerebros, entrenamos nuestras neuronas mediante el éxito o fracaso de una acción a unos estímulos
sensoriales. Cuando cierta acción realizada en respuesta a alguna entrada sensorial es exitosa (por ejemplo, al beber agua calmamos la sed), las conexiones sinápticas entre un grupo de neuronas se fortalecen, de manera que cuando tengamos una sensación sensorial parecida, la salida será la correcta. De esta forma se forman fuertes conexiones entre grupos de neuronas, que pueden servir para realizar otras acciones complejas.
El esquema de una neurona artificial es:
Neurona Artificial
Esta neurona funciona de la siguiente manera: cada entrada x tiene su peso asociado w, que le dará más o menos importancia en la activación de la neurona. Internamente se calcula la suma de cada entrada multiplicada por su peso:
Suma de entradas
Con este valor de suma ponderada calculamos una función de activación, que será la salida que nos dará la neurona. Las dos funciones de activación más usada son el Escalón y la Sigmoide:
Funciones de Activación
Más adelante ya se verá para que sirve cada una, pero principalmente se diferencian en que la Sigmoide (llamada así por su forma de S) es diferenciable en todos sus puntos y la Escalón no.
rando en materia: El Perceptrón unicapa.
Un Perceptrón unicapa no es más que un conjunto de neuronas no unidas entre sí, de manera que cada una de las entradas del sistema se conectan a cada neurona, produciendo cada una de ellas su salida individual:
Perceptrón Unicapa
Como ya hemos dicho, un conjunto de neuronas no sirve para nada si previamente no le enseñamos qué debe hacer. Existen tres métodos de aprendizaje para un Perceptrón: Supervisado, Por Refuerzo y No Supervisado.
En el Aprendizaje Supervisado se presentan al Perceptrón unas entradas con las correspondientes salidas que queremos que aprenda. De esta manera la red primeramente calcula la salida que da ella para esas entradas y luego, conociendo el error que está cometiendo, ajusta sus pesos proporcionalmente al error que ha cometido (si la diferencia entre salida calculada y salida deseada es nula, no se varían los pesos).
En el Aprendizaje No Supervisado, solo se presentan al Perceptrón las entradas y, para esas entradas, la red debe dar una salida parecida.
En el Aprendizaje Por Refuerzo se combinan los dos anteriores, y de cuando en cuando se presenta a la red una valoración global de como lo está haciendo.
Nosotros, de momento, solo nos centraremos en el Aprendizaje Supervisado. Existen dos maneras de realizarlo. Para entenderlo mejor lo haremos mediante un ejemplo. Imaginemos que queremos hacer aprender a un Perceptrón Unicapa la función AND, de manera que la salida del Perceptrón solo nos dará un 1 si todas sus entradas son 1. Como solo vamos a tener una salida y, suponiendo dos entradas, el Perceptrón estará compuesto simplemente por una neurona, siendo también la tabla a aprender:
Perceptrón Ejemplo
Vemos que existe una tercera entrada con un "1". Ésta se incluye siempre para disponer de un "lindero entrenable", o sea, para que el Perceptrón pueda empezar a aprender algo. No tiene más importancia que esa, pero no debemos olvidarla. Para entrenar a este Perceptrón realizaremos los siguientes pasos por orden: + Fijar unos pesos iniciales para todas las neuronas del Perceptrón
+ Presentar una combinación de entradas al Perceptrón + Hacer que calcule su salida para esas entradas con los pesos que actualmente tiene.
+ Conociendo la salida correcta que nos debería dar el Perceptrón, modificar sus pesos de cualquiera de las siguientes maneras:
Posibilidades de Modificación de Pesos
siendo C la salida esperada y P la salida calculada por el Perceptrón. Alfa es una variable de razón de aprendizaje cualquiera, preferiblemente entre 0 y 1.
+ Presentar la siguiente combinación al Perceptrón y repetir el proceso hasta obtener unos errores aceptables.
En este programa uso la función Escalón para aprender, y los pesos se modifican en proporción al error multiplicado por las entradas. De esta manera obtengo a la salida niveles digitales. Supongo que también funcionaría con la función Sigmoide, pero a la salida tendríamos niveles analógicos cercanos a 1 o a 0.
En principio, podría parecer que el Perceptrón tiene una poténcia ilimitada para aprender, pero si en el ejemplo anterior intentáis hacerle aprender una función EXOR, por muchas iteraciones que hagáis, ¡ el Perceptrón es incapaz de aprenderla !. Cuando a principios de 1969, Minsky y Paper (en aquella época, fervientes seguidores de la IA simbólica y padres de la moderna IA) pusieron al descubierto estas graves deficiéncias del Perceptrón en su libro Perceptrons, supuso la aletargación del movimiento conexionista durante casi 20 años. Según Misky y Paper el Perceptrón unicapa era incapaz de aprender las funciones que no fuesen linealmente separables, esto és, que para n variables de entrada se debe poder hacer pasar un 'plano' de (n-1) dimensiones que divida las dos clases totalmente. Si no es así, el Perceptrón no sirve para nada. Un ejemplo claro: fijaos como la función AND es linealmente separable y la EXOR no lo es:
Limitaciones del Perceptrón
¿ A qué no sois capaces de hacer pasar una línea que divida los puntos negros y blancos en dos partes separadas en la función EXOR ?. Todo esto nos lleva al Perceptrón Multicapa....
El Perceptrón multicapa.
Esta estructura nació con la intención de dar solución a las limitaciones del Perceptrón clásico o unicapa, y supuso el resurgimiento del movimiento conexionista. Como su nombre indica, se trata de un unos cuantos (dos o tres) perceptrones unicapa conectados en cascada, como en la siguiente figura:
Perceptrón Multicapa
El problema de este tipo de Perceptrón está en su entrenamiento, ya que es difícil modificar correctamente los pesos de la capa oculta (la capa 1 en el ejemplo anterior). Para poder hacer aprender cosas a un Perceptrón de este tipo, se implementó el algoritmo de BackPropagation, que tal como su nombre indica tiene la función de ir propagando los errores producidos en la capa de salida hacia atrás.El procedimiento que sigue este algoritmo es el siguiente:
+ Procediendo como en el algoritmo tradicional, encontrar el error de cada neurona de la segunda capa:
Error en la segunda capa.
siendo igualmente C la salida correcta y P la calculada por el Perceptrón. En este tipo de algoritmo utilizaremos la función Sigmoide, que es diferenciable en todos sus puntos, de manera que podemos propagar el error hacia atras. + Propagamos el error de la segunda a la primera capa: Error en la primera capa.
Vemos en esta última fórmula la derivada de la función sigmoide Saj * ( 1- Saj).
+ Recalculamos los pesos:
Variación
Nu es la razón de aprendizaje de la red, que debe estar entre 0 y 1 (un valor recomendado es de 0,35), y es lo rápido que aprende la red (la rapidez de ajuste de pesos). Un valor demasiado elevado puede llevar a errores.
Por cierto, recordad que en el Perceptrón Multicapa, cada neurona necesita un "1" para tener un lindero entrenable.
Un ejemplo práctico de un Perceptrón multicapa podría ser su uso en visión artificial. Dada su capacidad para generalizar, las redes neuronales ya han demostrado su importáncia en este campo. Se puede hacer que la red aprenda dos o tres formas básicas y que dada otra que no ha aprendido, la clasifique como la más cercana a las que conoce y además dé un porcentaje de lo segura que está que esa nueva forma se parezca a una que ha aprendido. A mí se me ocurrió la posibilidad de crear una rejilla de unos cuantos pixeles y enseñar a mi red una o dos formas de manera que me generalizase con otras y además que me detectase formas conocidas que estén en cualquier lugar de la rejilla. De esta manera hice una red de 64 neuronas en la 1era capa y 10 en la segunda capa con la intención que me detectase los dígitos numéricos ( de 0 a 9 ) en una rejilla 5x5 pixeles. Si me reconocía el 0, me activaría la salida 0, si me reconocía el dígito 1, me activaría la 1, etc.... Pues bueno, yo era muy feliz con esta idea, pero a la hora de hacerle aprender a la red los 10 dígitos, me tardaba ni más ni menos que 10 minutos, ya que necesitaba un mínimo de 1000 iteraciones (donde 1 iteración es un ciclo donde a la red se le presentan los diez dígitos). Entonces entendí el porqué del procesamiento paralelo.
El proceso de aprendizaje tiene un gran coste de tiempo. Debido a eso, todavía no se bien como funciona, ya que aún no la estudiado a fondo. Además, después de cualquier ajuste, hay que volver a esperar 10 minutos (y desear que todo resulte bien). Si os interesa, el listado podido hacer es enseñarle solo un par de formas (entrenamiento más rápido). Si se le presenta una figura exactamente igual a otra que ya ha aprendido la reconoce siempre, y si está un poco deformada normalmente tampoco tiene problemas (aunque claro, está menos segura). Ahora bien, mi idea principal de reconocer una forma ya aprendida en cualquier parte de la rejilla no me la cumple. También me gustaría estudiar si me reconoce formas genéricas (cuadrados más grandes o más pequeños). En fin, espero que me ayudéis en esta árdua tarea.
Las redes neuronales todavía se han de desarrollar mucho. Aún se debe estudiar para que sirven realmente, conocer en que tareas pueden resultar realmente útiles, ya que por ejemplo es difícil saber cuánto tiempo necesita una red para aprender cierta tarea, cuántas neuronas necesitamos como mínimo para realizar cierta tarea, etc... Las redes neuronales pueden llegar a ser algo realmente importante, pero todavía hace falta tiempo para estudiar como almacenan el conocimiento y para desarrollar el hardware paralelo específico que requieren.
En la robótica, las redes neuronales también parecen prometer mucho, sobre todo en su sensorización, para que el robot sea capaz de generalizar lo que siente como estímulos individuales a considerar.
La inteligencia Artificial es un tema demasiado complejo para querer ir deprisa. Solo tiene medio siglo de vida y está en pañales, y lo que ha demostrado hasta ahora (sistemas expertos, demostradores de teoremas) funcionan en un entorno muy restringido, siendo totalmente inútiles fuera de él. Además carecen de sentido común, que es quizás la parte más notable de la inteligencia humana. Se especula que este 'sentido común' solo se puede conseguir con el conocimiento masivo. Si esto es así se necesitará inculcar a la máquina términos muy sencillos y hacer que aprenda a partir de ellos nuevas cosas que le faciliten la comprensión para aceptar nuevo conocimiento. Todo parece indicar que los resultados más interesantes no se conseguirán ni con la IA simbólica ni con el conexionismo, sino con una mezcla de los dos.
Muchas grácias por vuestra atención.