Las redes neuronales o Skynet está aquí
El concepto de redes neuronales tiene muchísimas aplicaciones y su utilización viene en franco ascenso desde hace décadas.
Normalmente hablamos de «redes neuronales» en abstracto sin saber muy bien de qué estamos hablando o cual es su funcionalidad.
La noción, el concepto de lo que es una red neuronal deriva, obviamente dado su nombre, de hacer una abstracción de cómo están interconectadas nuestras neuronas.
La abstracción
Sabemos que por nuestro cerebro se propagan impulsos eléctricos y que hay diversas reacciones químicas que mantienen todo funcionando.
Es muy complejo para representarlo como es en la realidad.
En la simplificación y conceptualización que hacemos del cerebro, vemos diversas unidades interconectadas, cada una emulando la representación del funcionamiento de una neurona.
Cada una de estas unidades estimula a tantas como estén ligadas con ella organizadas, además, en un número variado de capas.
Si hacemos una abstracción de la abstracción, podemos pensarlo como una red de tuberías complejas y vasos comunicantes, con diversos grifos, a distintas alturas, que dejan o no pasar el líquido que vertemos en la entrada de la red.
Se trata de evaluar cuánto líquido sale por las tuberías en la salida de la red.
Así podemos comparar líquido entrante vs líquido saliente.
Al líquido entrante lo llamaremos estímulo, por lo que para un determinado estímulo tendremos una salida dada.
Voy a profundizar este concepto.
Una red donde todo fluye
Supongamos que montamos una intrincada red tridimensional de recipientes de diversas formas y tamaños con pequeños tubos que salen y entran de cada uno de los vasos.
Cada tubo termina en otro recipiente de la red y, simplificando, digamos que a cada vaso entran solo un par de tubos y salen, también, solo un par de tubos.
Además, tendremos grifos en las tuberías desperdigados por toda la red.
Ahora supongamos que nos proponemos optimizar el tiempo o el volumen de salida de agua.
Es decir, introducimos agua por un tubo de entrada, el recipiente se empieza a llenar y cuando llega al nivel de los tubos de salida el agua comienza a llenar los recipientes que siguen y así sucesivamente.
En resumen el proceso se limita a volcar el agua y a medir el tiempo que tarda en salir el agua en el otro extremo de la red.
Podemos también relacionar el volumen que salió en un determinado tiempo.
Ahora queremos «entrenar a nuestra red» para que sea cada vez más eficiente, esto es, que el agua aparezca en la salida lo más rápido posible, con el mayor volumen posible.
Esto solo sería posible si la altura a la que están los tubos de salida fuera un parámetro variable, algo así como una compuerta que podemos subir o bajar.
Después de evaluar los volúmenes de agua que hay en cada recipiente antes de que se alcance el nivel de salida de cada uno podríamos ajustar la altura de la compuerta para que el agua la alcance lo antes posible.
Quizás debamos elevar las compuertas de los vasos que tengan poco volumen y bajarla en los vasos que tengan mayor capacidad. O cerrar o abrir grifos en determinadas tuberías. Como sea, será un trabajo que repetiremos varias veces hasta encontrar una configuración de alturas de compuertas en cada uno de los vasos de la red que nos garantizará que el agua salga lo más deprisa posible y en la mayor cantidad que se pueda hacer en ese tiempo.
Intenten visualizarlo mentalmente. Eso ayuda.
Como vimos en este ejemplo, el entrenamiento solo se limita a subir o bajar la altura de las compuertas, podemos decir que se convierte en el único parámetro de aprendizaje.
También vemos que todo es experiencia que se realimenta. Quiero decir, que después de tomar la mediciones de la primera vez que echamos el agua y de revisar el circuito natural por donde esta circuló, vemos que podemos levantar el nivel de la compuerta allí donde percibimos que el agua se estanca, y así evitar fluya más agua innecesariamente.
Además podemos obrar en el sentido contrario, es decir, podremos bajar el nivel de las compuertas por donde el agua fluyó más rápido para hacer que lo haga más rápido aún.
El caso es que después de varias mediciones de prueba, de elevar y bajar el nivel de la compuerta en diversos sitios, obtendremos una configuración más o menos óptima: hemos entrenado el circuito de vasos para que cumpla el objetivo que perseguimos.
Formalicemos el concepto
El funcionamiento del ejemplo anterior es la forma en la que, básicamente, funciona una red neuronal. Solo que no es líquido lo que se transfiere entre una unidad y otra.
Cuando inicia la red, decimos que las neuronas están completamente vírgenes. Sin ningún tipo de entrenamiento.
Además, en un circuito de interconexión de neuronas sin entrenamiento, si realizamos un estímulo en las unidades de entrada, obtendremos «algo» en el extremo de las unidades de salida, pero no podemos asegurar nada sobre eso que obtuvimos.
Debemos entrenar a nuestro circuito.
En la unidad que representa la neurona existe lo que llamamos: «umbral», el valor límite que debe sobrepasar «el estímulo» para que la unidad lo transfiera a las que están conectadas con ellas.
De forma similar a lo que sucedía con las compuertas de los vasos comunicantes, si elevo el umbral de una unidad, estará cada vez más inhibida de transferir el impulso y sucede exactamente lo contrario cuando bajo el umbral.
En resumen, se trata de «premiar» a las unidades que se han comunicado con sus vecinas cuando la respuesta a un determinado estímulo es lo que esperamos a la salida.
Este mecanismo de estimular, premiar, estimular es un ciclo repetitivo que llamamos aprendizaje o entrenamiento de la red neuronal.
Solo por dar una idea de lo complejo que es este proceso, puedo comentar que se necesitan varios miles de ciclos de aprendizaje antes de poder obtener un comportamiento aceptable.
También es importante destacar que el éxito no está garantizado, ya que hay cierta imprevisibilidad en los entrenamientos. Es posible que nunca seamos capaces de entrenar al circuito con el objetivo que buscamos.
Pero es evidente que esta característica que denominamos «aprendizaje» es lo que más diferencia a las redes neuronales del resto de conceptos informáticos en inteligencia artificial.
Por supuesto, hasta ahora solo me he referido a una red neuronal de una forma muy coloquial, por supuesto, el aspecto matemático e informático es bastante más complejo de lo que he enunciado.
Si bien lo normal era construir intrincadas redes neuronales con lenguajes de programación estándar, cada vez es más común ver su producción en redes de hardware, en tecnología CMOS, por ejemplo.
Si algún día pudiéramos montar en un hardware miniaturizado, una red neuronal tan compleja como nuestro cerebro, que cupiera en tamaño de un cerebro humano, tendríamos lo que ideó el Dr. Asimov en sus relatos sobre Robots: un cerebro positrónico.
Volviendo a las redes neuronales, ¿Podemos definir de una forma más precisa este concepto, sin descender a la matemática pura? Voy a intentarlo.
El aprendizaje
El proceso de aprendizaje viene determinado por una función que involucra los factores que definen la tarea a resolver, conjunto de observaciones, resultado deseado, etc. Llamaremos a esto la «función de coste» ya que nos dará una idea de lo lejos que, para un determinado par de (entrada, salida), nos encontramos de la solución óptima.
El aprendizaje terminará cuando esta función de costes alcance los mínimos posibles, ya que esto indica que el patrón de mapeo de la red para un par dado de (entrada, salida) nos proveerá la solución óptima.
Existen tres tipos de paradigmas de entrenamiento para una red neuronal.
El aprendizaje supervisado, el no supervisado y el aprendizaje por refuerzo.
El aprendizaje supervisado.
Es el que consiste en forzar el patrón de mapeo en función de una serie de pares (entrada, salida) este tipo de aprendizaje es, si se quiere, el más típico, dado que implica un conocimiento previo sobre el problema a resolver, conociendo los pares (entrada, salida) durante el entrenamiento.
Se le enseña a la red repetidas veces, una y otra vez, los pares conocidos, esto es,
- se muestra una entrada,
- se ajustan los parámetros para garantizar que la salida sea la esperada.
Y se le muestran todos los pares conocidos, hasta que no se obtienen errores de salida para ninguna de las entradas conocidas.
Decimos que la red ya aprendió.
El aprendizaje no supervisado.
No conocemos el par (entrada, salida) lo que significa que, a priori, no tenemos totalmente definida la salida que obtendremos.
Recordemos que el objetivo es el mismo, es decir, conseguir que la función de coste del problema sea el mínimo posible. Así que podremos evaluar el coste de una respuesta determinada a una entrada dada.
Dado que no conocemos totalmente la respuesta perfecta, tendremos que ir construyendo un espacio de probabilidades que será sometido a diversas herramientas matemáticas para determinar si debemos continuar con el entrenamiento.
(En estos casos entra en juego, por ejemplo, la inferencia bayesiana entre otras herramientas, pero este tema no solo se aleja del propósito del artículo, sino de mi conocimiento para explicarlo)
El aprendizaje por refuerzo
Está basado en el modelo de la psicología conductista. Y funciona con el concepto de «recompensa» asociado al patrón elegido para resolver el problema.
En este caso, a diferencia de en el aprendizaje supervisado, aunque sea conocido el par (entrada, salida) no se le provee a la red durante el entrenamiento, sino que cuando la entrada produce algo similar a la salida esperada se procede a «recompensar», de alguna forma previamente definida, al patrón de configuración que dio la respuesta.
Solo con que la respuesta se parezca a lo que esperamos, recompensamos a la configuración del circuito.
Se conoce que después de varias interacciones, las respuestas cada vez se parecen más a los esperado.
Skynet está por despertar.
No hace mucho nos hemos enterado de las novedades que en este campo aparecen de la mano de Google.
En su departamento de «Investigación y Aprendizaje de Máquinas» han desarrollado una técnica llamada RGA (Redes Generativas Antagónicas, o GAN, en inglés) que permite a 2 redes neuronales entrenarse con muy poca intervención humana.
Cuenta Ian Goodfellow, miembro del mencionado departamento de Google, que la idea surgió alrededor de un problema conocido y estudiado:
- que los datos generados por máquinas presentan características estadísticas que son distintas a los datos generados por humanos.
Podemos graficar esto así: si un humano comienza a elegir datos al azar y una máquina hace lo mismo, a simple vista los dos conjuntos de datos parecerían ser estadísticamente iguales, pero aplicando métricas de dispersión estadística, por ejemplo, podría detectarse cuál de las dos es la muestra generada por la computadora.
La técnica RGA consiste en que dos redes neuronales compitan en un juego de entrenamiento que las 2 quieren ganar.
Una máquina tiene la misión de crear una imagen con ciertas características. Y la otra tiene la misión de determinar si la imagen que ve es real o generada por computadora.
Las máquinas parten con un entrenamiento mínimo e indispensable para la tarea encomendada.
La primera máquina, respondiendo a su entrenamiento inicial, intentará generar la imagen, pero la misma será imperfecta, tendrá ruido, distorsiones, etc.
Aquí entra el antagonismo entre redes, ya que en lugar de que un humano sea el que determina si la imagen generada es correcta, es la segunda red, que está entrenada mínimamente para reconocer imágenes, la que dirá si lo que percibe responde a lo que debe percibir.
De esta forma aplicarán mutuamente entre ellas el aprendizaje por refuerzo que vimos más arriba.
La red que genera las imágenes se está entrenando en función de la respuesta recibida por la segunda red. Y esta segunda red se está entrenando en distinguir cada vez mejor.
Este proceso de realimentación se constituye en un juego que hace que las dos redes se vayan perfeccionando a medida que intercambian sus respectivas respuestas.
El ejemplo que más me llamó la atención fue el de «Generación de rostros humanos».
Se encomendó a una computadora (con red neuronal, claro) que generara rostros humanos de personas inexistentes.
Con el entrenamiento básico, la computadora generaba rostros que eran detectables fácilmente como «artificiales».
Entonces entró en juego la técnica RGA, y se entrenó otra red para que detectara rostros humanos.
Cuando las dos computadoras fueron puestas a «dialogar» para que se autoentrenaran mutuamente, obtuvimos una red que se perfeccionó generando rostros humanos para engañar a su rival y otra red que se perfeccionó para no dejarse engañar y así detectar verdaderos rostros.
Pero lo mejor es que veamos un ejemplo.
Recuerde, son rostros inexistentes generados por una computadora.
Vale sentir escalofríos.
¿Qué opinan?
¿Qué pasará cuando una máquina enseñe a programar a otra? ¿Qué tipos de programas generará?
Como sea, Skynet ya está entre nosotros. Quizás sea hora de comenzar a temblar.
O también pueden leer mi cuento «Skynet está aquí» (en el que escribí sobre este tipo de inteligencia artificial), de mi libro «Te lo hago cuento«.
Saludos
Soy escritor de ficción especulativa y bloguero renacido de sus propias cenizas.
Informático por formación , Coach y Consultor Psicológico por vocación.
Creo en la importancia de la forma en que nos contamos qué somos.
Escritor de Wattpad y ganador de un «#Wattys2020 en Ciencia Ficción»
Dejar un comentario
¿Quieres unirte a la conversación?Siéntete libre de contribuir!