Ir al contenido principal

Introducción al Aprendizaje Automático

Durante muchos años, desde la antigüedad, ha sido el anhelo y la fantasía del hombre el poder replicar las propias capacidades e inteligencias en sistemas automáticos ya sean mecánicos, informáticos o electrónicos, y hasta hace menos de la mitad del siglo pasado el matemático Alan Turing se preguntaba si estos artefactos podrían ser capaces de percibir, pensar, sentir; 

Dicha filosofía que se ha visto reflejada en grandes obras de ciencia ficción y ha mantenido viva la imaginación del ser humano pero también ha motivado a la ingeniería a desplegar todas sus capacidades desarrollando y fundando así una disciplina que condensara todos los conceptos relacionados, la Inteligencia Artificial.


¿Qué es la inteligencia artificial?

La inteligencia artificial (IA), es la inteligencia llevada a cabo por máquinas. En ciencias de la computación, una máquina «inteligente» ideal es un agente flexible que percibe su entorno y lleva a cabo acciones que maximicen sus posibilidades de éxito en algún objetivo o tarea.
Fuente wikipedia: https://es.wikipedia.org/wiki/Inteligencia_artificial

La inteligencia artificial es un concepto atractivo para muchas partes interesadas en el mundo empresarial, científico y gubernamental. Una solución de inteligencia artificial puede "pensar" más rápido y procesar más información más que cualquier cerebro humano, así como también ampliar el potencial de las capacidades humanas. Existen varios tipos de inteligencias artificiales, pero vamos a hacer énfasis principalmente en los Sistemas que tratan de imitar el pensamiento humano.
Estos sistemas tratan de emular el pensamiento humano; por ejemplo las redes neuronales artificiales. La automatización de actividades que vinculamos con procesos de pensamiento humano, actividades como la toma de decisionesresolución de problemas y aprendizaje.

El aprendizaje automático

El aprendizaje automático (machine learning en inglés) es una disciplina dentro de la inteligencia artificial que busca imitar algunos aspectos de la biología humana para enseñar a las máquinas a resolver determinados problemas específicos en base a un conjunto de muestras de datos y una experiencia, de esta manera siendo capaz de generalizar comportamientos e indiferencias para un conjunto más amplio de datos.

El aprendizaje automático tiene una amplia gama de aplicaciones, desde motores de búsqueda que aprendan del comportamiento del usuario para mejorar su experiencia, diagnósticos médicos precisos, detección de fraudes, análisis económicos, clasificación de secuencias de ADN, reconocimiento de voz, de lenguaje, traducción, sistemas de seguridad y cualquier otra cosa que pudiese ser automatizada.



Hay muchos modelos en los que el Aprendizaje automático se basa para llevar a cabo una actividad, Arboles de decisiones, Reglas de asociación, Algoritmos genéticos, de agrupamiento, Máquinas de vectores de soportes pero el principal y al que vamos a hacer hincapié es el de Redes Neuronales Artificiales.
Las redes neuronales artificiales (RNA) con un paradigma de aprendizaje automático inspirado en las neuronas del sistema nervioso de los animales. Se trata de un sistema de enlace de neuronas que colaboran entre sí para producir un estímulo de salida. Las conexiones tienen pesos numéricos que se adaptan según la experiencia. De esta manera las redes neuronales se adaptan a un impulso y son capaces de aprender.
En el presente articulo tengo como intención introducir un poco la Historia y algunos conceptos de los modelos computacionales neuronales, pasando por los primeros y más básicos con los que se topa un recién iniciado en el machine learning, explicando sus funcionamientos sin incluir el calculo que necesitaría una explicación formal con la intención de ser claro para las personas que quieran entenderlos de una forma parcial.
Luego voy a dar nociones sobre las redes neuronales, un poco de historia también y al final una definición de Aprendizaje Automático y Aprendizaje Profundo para sentar las principales diferencias una vez asimilado los conceptos previos.

Neurología y modelos computacionales, el cerebro mismo como guía





Siempre ha habido otra visión para la IA, una visión disidente, en que las computadoras aprenderían de principio a fin, desde los datos en lugar de hacerlo de arriba hacia abajo con simples instrucciones.
Esta noción se remonta de la década de los 40 cuando a los investigadores se les ocurrió que el mejor modelo para la inteligencia automatizada flexible era, el cerebro mismo.
Ahí es cuando al mismo tiempo en el emergente estudio biológico del cerebro, las teorías del aprendizaje y procesamiento neuronal, surge la informática con el afán de intentar cuantificar esas funcionalidades y trasladarlas a modelos matemáticos capaces de imitar sus capacidades en sistemas computacionales.

#El Conexionismo
El conexionismo es un conjunto de enfoques en los ámbitos de la Inteligencia artificial, psicología, ciencia cognitiva, neurociencia y filosofía de la mente que presentan los fenómenos de la mente y el comportamiento como procesos que emergen de redes formadas por unidades sencillas interconectadas, neuronas.
El estudio de las redes neuronales ha sido de gran interés para diversos grupos de estudio, en un principio desde el punto de vista biológico con la idea de poder explicar el funcionamiento del cerebro y de los procesos neuronales asociados, pero posteriormente también con el objetivo de desarrollar sistemas que fueran capaces de imitarlos.



Los principios de las ideas conexionistas se originaron a mitad del siglo XIX cuando el Nobel español "Santiago Ramón y Cajal" (ese es su nombre completo) estudiando el cerebro de algunas aves estableció las bases para el estudio neuronal con su "Doctrina de la neurona" donde afirma que la neurona son la forma básica y funcional del sistema nervioso, teorizando su morfología y funciones.


Representación artística de un sistema nervioso dibujada por el mismísimo Santiago Ramón y Cajal

Santiago Ramón y Cajal dio a la célula nerviosa el nombre de neurona, unidad elemental del sistema de señalización del sistema nervioso. Descubre que el axón de una neurona sólo se comunica con las dendritas de otra en regiones especializadas: las sinapsis. Además, una neurona determinada sólo se comunica con ciertas células, y no con otras. En el interior de la neurona, las señales fluyen en una dirección única. Este principio permite determinar el flujo de la información en los circuitos neurales.



Más tarde, el psicólogo Donald Hebb en 1940 hizo su contribución proponiendo un postulado de aprendizaje que definiría hasta hoy en día la manera en que operan estos elementos, la regla Hebb:
 Cuando el axón de una célula A está lo suficientemente cerca como para exitar a una célula B y estas se activan al mismo tiempo, ocurren procesos de crecimientos o cambios metabólicos en una o ambas células, de manera que la eficiencia de ambas se ve aumentada, fortaleciendo sus sinapsis.
La asociación física y funcional entre distintas neuronas daría lugar a engramas o asambleas celulares -hoy en día “redes neuronales”.
De este modo, cuanto más fuerte sea la contingencia entre la activación neuronal y un determinado tipo de estimulación, mayor será la probabilidad de que las redes neuronales relevantes disparen impulsos al volver a producirse el estímulo. Esto explica también por qué la práctica o el repaso dificultan que las sinapsis se debiliten (como sucede en el olvido).

Con esto estableció que las bases del aprendizaje rige en la plasticidad neuronal, la capacidad que tiene el sistema nervioso de modificar su naturaleza y la fortaleza de sus sinapsis, es decir la conexión entre neuronas que permiten la transmisión de impulsos electroquímicos.
Esta hipótesis explicaría cómo el cerebro sería capaz de almacenar información, la estructura del sistema nervioso y las relaciones entre sus elementos constituyen la información que procesamos, el recuerdo por su parte consiste en la activación contigua de estas redes.

Para ilustrar la idea básica del "Principio Hebbiano" vamos a hacer uso de la experiencia de Iván Pavlov, padre del condicionamiento clásico, acerca de la respuesta condicionada de un perro.

Supongamos que disponemos de 3 neuronas en el cerebro del perro, Las neurona A, C y B:
La neurona A recibe sonido desde una campanilla, la neurona C recibe la imagen de la comida ofrecida, mientras que la neurona B, al quedar excitada activa el proceso de salivación en el perro.




Supongamos que la excitación de la neurona C causada por la comida es suficiente para activar a la neurona B y así hacer salivar al perro; Pero la activación de solo la neurona A al escuchar la campana en ausencia de un estímulo adicional, no sea suficiente para activar a la neurona B.
Permitamos entonces que la neurona C de lugar a que la neurona B se dispare, y al mismo tiempo mientras esta se está disparando, estimulemos la neurona A haciendo sonar la campana.
Dado que la neurona B se sigue disparando, la neurona A participa ahora de su excitación, aún así cuando esta por si sola no sería capaz de activar a la neurona B.

El proceso en una imagen

En esta situación, la suposición de Hebb determina que se produce un cambio entre la neurona A y B, de tal modo que la influencia de A sobre B se ve incrementada.

Si sometemos a las neuronas reiteradamente a este proceso, puede que llegue a una situación en que la neurona A sea capaz de activar por sí sola a la neurona B, que el perro con solo escuchar la campana comience a salivar.

Cabe aclarar que a pesar de todo, esta ley sólo explica el fortalecimiento de las conexiones pero no su formación. Así, el aprendizaje se basa en la consolidación de sinapsis pre existentes, determinadas por variables de tipo biológicas y genéticas heredadas.




Toda esta materia dio pie a la hipótesis de que cualquier fenómeno mental como la cognición y la memoria puede derivar de estos elementos formando redes interactuando entre sí en un constante cambio ante estímulos interiores y exteriores.


La neurona biológica

Se estima que el cerebro humano cuenta con alrededor de cien mil millones de neuronas, organizadas mediante una red compleja en la que neuronas individuales pueden estar conectadas a varios de miles de neuronas distintas. Se calcula que una sola neurona del córtex cerebral recibe información de unas 10.000 neuronas y envía impulsos a varios cientos de ellas.

Se sabe que la neurona por sí sola es de alguna forma es un procesador de información, y como todo sistema de este tipo, posee un canal de entrada de información, las dendritas; un elemento de cómputo, el soma, y un canal de salida, el axón.



Neurona biológica
Tiene:
  • Un canal de entrada: las dendritas
  • Un procesador: el soma
  • Un canal de salida: el Axón
Las conexión entre neuronas se llaman 'sinapsis', no es una conexión física, las neuronas no alcanzan a tocarse, si no que lo hacen a través de impulsos eléctricos.
Las neuronas son todas son iguales, pueden variar en cantidad de dendritas, longitudes y otros detalles estructurales, pero siempre operando con el mismo principio básico.


Neurona humana vista al microscopio

Esta estructura, le ha brindado al cerebro una gran cantidad de ventajas adaptativas. El cerebro puede operar en circunstancias en que la información es pobre o falta; puede soportar daños significativos sin pérdida total del control; Puede almacenar una gran cantidad de conocimiento de una manera muy eficiente; puede aislar distintos patrones pero retener el desorden necesario para manejar la ambigüedad.

Curiosamente las neuronas son muchos más simples, lentas y menos fiables que una CPU, y a pesar de todo esto, existen problemas difícilmente abordables mediante una computadora convencional que el cerebro resuelve eficazmente , tareas como el reconocimiento de voz, de imágenes, respuestas ante estímulos, el habla, levantar objetos, caminar.


El primer modelo de neurona artificial

Warren McCulloch y Walter Pitts     

En 1943 el neurólogo Warren Sturgis McCulloch junto a su colega Walter Harry Pitts publicaron "A logical calculus of the ideas immanent in nervous activity", en este articulo trataban de entender como el cerebro era capaz de producir patrones altamente complejos usando células tan simples como neuronas conectadas entre sí. 

El modelo propuesto por ellos fue el primer modelo neuronal moderno, y aunque sus principales intenciones era descubrir el funcionamiento del cerebro, el trabajo ha sido tomado como punto de partida para el desarrollo de los modelos neuronales artificiales posteriores.

McCulloch y Pitts dieron un modelo altamente simplificado de una neurona en su articulo la cual denominaron "Linear Threshould Unit (Unidad de umbral lineal) o LTU".

Si bien en el articulo nunca especifican el modelo simbólico que se va a mostrar a continuación, esta es una manera simplificada de representar las ecuaciones algebraicas en un amigable gráfico asociativo con el dibujo de una neurona biológica. 
Representación simbólica y básica de una neurona artificial

Haciendo analogía a la neurona, el modelo contiene:
  • Entradas (Input): Un conjunto de entradas, que sería el equivalente a las dendritas de la neurona biológica.
  • Un procesador (f):  Una función activadora, una regla de propagación, el cuerpo celular
  • Un canal de salida (output)Una salida única, el axón

#Funcionamiento
La neurona McCulloch-Pitts es un dispositivo binario, es decir solo puede estar en uno de dos estados posibles: activa o inactiva. Considerando que una neurona responde a una sinapsis que se le es transferida por medio del conjunto de sus entradas sinápticas, si no hay sinapsis inhibitorias activas, la neurona suma sus entradas sinápticas y se vuelve activa obedeciendo un umbral pre-establecido. Si no, la neurona permanece inactiva.
Modelo detallado y su funcionamiento

El modelo consta de los siguientes elementos:
  • ParámetrosEl único parámetro, el umbral (t), denominado 'Thresholding Logic' decide si el resultado de la suma es lo suficientemente excitatorio como para lanzar 1 o inhibitorio como para lanzar un 0.
  • Entradas: Un conjunto x de entradas booleanas, es decir de solo 1 o 0, nunca siendo un número real.  El 1 equivaldría a Verdadero y el 0 a Falso. En este modelo se presentan entradas de dos tipos, las excitatorias y las inhibitorias.
  • SalidaUna salida (y) booleana, 1 o 0.

Algoritmo:
  1. Se introducen las entradas(x)
  2. Si la neurona detecta una entrada inhibitoria, esta devuelve automáticamente "0", lo que significa que la neurona no se dispara.
  3. Se realiza una suma de estas(g)
  4. Al resultado anterior se le aplica una función de 'activación'(f), el cual dependiendo si la suma realizada supera un umbral(b) lanzara 1 o 0.

Compuerta AND, el umbral decide si la neurona va a 'dispararse' o no.

Aclaraciones:
Entradas inhibitorias: Son entradas que si se detectan 'activadas', obligan a inmediatamente a la neurona a devolver 0 sin pasar por la suma ni la función de activación.
Función de agregación: Una función de agregación es una operación en la que se toman varios valores y se los reduce a uno, en este caso, se utiliza una función de agregación por suma, es decir se suman todos los valores y se devuelve el resultado.

#Capacidades y Limitaciones
Esta neurona neurona a pesar de ser muy simple, en materia computacional se considera un clasificador lineal, especializado en la resolución de problemas linealmente separables , más adelante analizaremos más a fondo la cuestión.
Otra limitación es solo poder admitir valores binarios, tomándose todos como iguales, imposibilita discriminar otro tipo de variable que simplemente el booleano.

Pueden ver una implementación del modelo en python junto a unos ejemplos prácticos para demostrar su funcionamiento, el de las compuertas lógicas y un caso de la vida real. Clic aquí para verlo

A pesar de su simplicidad y limitaciones este modelo neuronal fue un importantísimo primer paso que serviría para inspirar modelos posteriores como el que viene.



El Perceptrón 

      Frank Rosenblatt

Entre las décadas de 1950 y 1960 el científico Frank Rosenblatt, retomando el trabajo de Warren McCulloch y Walter Pitts creó el Perceptrón, este define un elemento de proceso (EP), o neurona artificial, como un dispositivo que a partir de un conjunto de entradas, Xi (i=1...n) o vector X, genera una única salida binaria si la suma de la multiplicación de los pesos por entrada es mayor a un determinado umbral, introduciendo así el concepto de peso sináptico, ahora cada entrada de la neurona tiene un valor de importancia, esta y la capacidad de a través de un proceso de aprendizaje aprender a identificar y predecir patrones lo harían una propuesta interesante.

Modelo simplificado del Perceptrón



Tiene:
  • Un conjunto de entradas: Son los valores de entradas que se les va a dar a la neurona (w).
  • Un conjunto de pesos sinápticos: Cada entrada tiene un valor de 'importancia' (w) que repercutirá en la función sumadora y la salida.
  • Una regla de propagación: Se compone de una función sumadora(Σ), una suma ponderada.
  • Una función de activación(f): Devuelve una salida binaria, relativa a su umbral.
Mas información en: https://es.wikipedia.org/wiki/Perceptr%C3%B3n

#Funcionamiento y mejoras frente al modelo McCulloch-Pitts


  1. Las entradas(x) recibe datos que pueden ser booleanos o reales, a diferencia del modelo McCulloch-Pitts que solo admitía valores binarios.
  2. Los pesos sinápticos (w): al igual que en una neurona biológica se establecen sinapsis entre las dendritas de una neurona y el axón de otra, en una neurona artificial a las entradas que vienen de otras neuronas se les asigna un peso, un factor de importancia. Este peso, es un número que se modifica durante el entrenamiento de la neurona, y es acá por tanto donde se almacena la información que va a hacer que la red sirva para un propósito u otro.
  3. Una regla de propagación(Σ):  la propagación se encarga de transformar las entradas en el potencial de la neurona realizando una suma ponderada entre las entradas y sus respectivos pesos sinápticos, el resultado de este lo llamaremos potencial postsináptico. La fórmula consiste en la suma de la multiplicación de cada entrada por su peso correspondiente.
  4. Una función de activación(f): El recién nombrado potencial postsináptico se filtra a través de una función conocida como función de activación y es la que nos da la salida de la neurona. Según para lo que se desee entrenar al perceptrón, se suele escoger una función de activación que definirá el tipo de umbral esperado, el perceptrón usa por defecto la función escalonada.
Si el potencial postsináptico es mayor a uno, la función devuelve 1, si es menor a 1, devuelve 0.
Está función se denomina función heaviside o función escalón.

En muchas ocasiones la razón para la aplicación de una función de activación, es para que la neurona produzca una salida acotada, una función que imita también a una neurona biológica, ya que las respuestas de las neuronas biológicas están acotadas en amplitud. 

Funciones de activación comunes

En resumen, una neurona recibe las entradas (Xn), realiza una suma ponderada de las mismas junto a los pesos asociadas a cada una (Wn) y la función de activación transforma ese resultado en una salida simple y tangible.


#Interpretación Geométrica
El perceptrón es un dispositivo binario, lo que lo hace un clasificador lineal.
Un clasificador lineal es un método que sirve para encontrar un patrón con una "Línea de mejor ajuste".
Para comprender más lo que significa esto, podemos interpretar geométricamente a la neurona como un "hiperplano", que no es más que un plano cortado por una línea recta.





En ambos lados se posiciona un grupo único de clases, por un lado los puntos verdes y por el otro los puntos grises.



El vector de pesos representado por la línea en el medio (frontera de decisión) es la síntesis de todos los pesos, y se encarga de separar ambas clases.
El clasificador lineal permite establecer una relación entre dos tipos de datos, y en base a esa relación previamente registrada, poder predecir una nueva clasificación en un futuro. Esto es, en esencia, una regresión lineal.
En ámbito neuronal, la neurona podrá darse cuenta entre una cosa y otra dependiendo lo que haya "aprendido" y así decidir si activarse o no. 


#El Aprendizaje
Como vimos, el vector de pesos es el parámetro vital que repercutirá en el resultado de la salida de la neurona. Ahora bien, podríamos ajustar estos pesos manualmente, pero supondría un enorme trabajo dependiendo el problema, es por eso que se crearon reglas de Aprendizaje, que no son más que un conjunto de técnicas que nos van a ayudar a hacer un reajuste de pesos de una manera automática y adaptativa a través de una fase de entrenamiento.

El aprendizaje automático(machine learning) es el proceso por medio del cual, los parámetros libres de una red neuronal (los pesos) son adaptados a través de un proceso de estimulación por el ambiente en el cual la neurona se encuentra inmersa. Hay dos vías para crear aprendizaje.
  • Aprendizaje no adaptativo: Se determina de antemano el valor de los pesos.
  • Aprendizaje adaptativo: No existe una forma para determinar de antemano los pesos, por lo que se necesita un proceso iterativo.
A su vez, el aprendizaje se puede clasificar en:

-Aprendizaje Supervisado:
Este consiste en un entrenamiento controlado por un agente externo, que determina la respuesta que debería generar el modelo a partir de una entrada determinada.
  • Aprendizaje por Corrección de error: Consiste en ajustar los pesos en función de la diferencia entre los valores deseados y los obtenidos en la salida, es decir, en función al error cometido en la salida.
-Aprendizaje No supervisado:
Las entradas son el único dato disponible para el aprendizaje, el algoritmo debe aprender a categorizar las entradas.
-Aprendizaje por Reforzamiento:
Se le ofrece al modelo un grado de desempeño de la misma, en simples palabras, una recompensa o un castigo.


#Entrenamiento, regla de aprendizaje del perceptrón
El objetivo del entrenamiento es básicamente establecer y ajustar el vector de pesos a través de un proceso de prueba y error.
Una vez entrenada, la neurona será operativa y estará lista para ser probada con otros patrones con los cuales no ha sido entrenada.
El tipo de entrenamiento básico del perceptrón, es el de aprendizaje supervisado por corrección de error.
Los pasos a seguir para entrenar al perceptrón son los siguientes:
  1. Se inicializan los pesos con valores aleatorios pequeños, entre 0 y 1.
    Se define un sesgo de aprendizaje (bias): el sesgo es un valor que se le suma a la suma ponderada entre las entradas y los pesos que sirve para mover hacia un lado o hacia otro la línea de separación de grupos y de esa manera mejorar la precisión de clasificación. 
    Se define una tasa de aprendizaje (learn rate):.Este valor, un número positivo que permitirá aumentar la velocidad de convergencia (la velocidad en que se aprende)  es recomendable que la tasa de aprendizaje sea un número pequeño (entre 0.1 a 0.2) para garantizar que los resultados sean correctos.
  2. Se le presenta un ejemplo
  3. Se calcula la salida para dicho ejemplo, con la función de propagación.
  4. Se verifica si tal salida coincide con la esperada, si lo es, saltar al paso 6.
  5. Si la salida no es la esperada, calcular el margen de error:
    (salida esperada - salida de la entrada actual) 
    Ahora que sabe parcialmente cuán equivocado estaba, hay que actualizar uno por uno de los pesos del perceptrón sumándole el resultado de la tasa de actualización:
    (tasa de aprendizaje * error * entrada actual de la muestra)
  6. Se vuelve al paso 2 hasta que hayan pasado el dataset completo.
Este procedimiento es iterativo, se va a tener que repetir varias veces, pasando el dataset entero una y otra vez hasta que el error haya desaparecido.
Dicho proceso es apoyado por el teorema de convergencia que dice que:
Si las clases son linealmente separables , el algoritmo del perceptrón converge a una solución correcta en un número finito de pasos para cualquier elección inicial de pesos.
Si se cumple el teorema, el perceptrón será funcional a su tarea, pero en caso contrario, de que el problema no sea linealmente separable, este nunca convergerá y por lo tanto el entrenamiento y objetivo de la neurona sea un fracaso.



# El Sesgo y la Tasa de aprendizaje
Como pudimos observar anteriormente, durante la inicialización del perceptrón, se tuvieron en cuenta dos nuevos parámetros muy importantes, el sesgo (bias) y la tasa de aprendizaje (learn rate).

#La tasa de aprendizaje
La tasa de aprendizaje es un valor constante que nos va a permitir decidir a qué velocidad y cantidad va a ajustarse los pesos de la neurona durante el aprendizaje. 
Mientras más grande sea la tasa de aprendizaje, menos preciso y estable será el aprendizaje, llevando al modelo a una solución ineficiente.
Pero mientras más pequeña sea, más preciso y estable será el aprendizaje, llevando al modelo a una solución óptima.




Podemos imaginar análogamente la tasa de aprendizaje con un sujeto estudiando un apunte para un examen. Si su método de estudio en ese momento consiste en una lectura rápida, más de la velocidad que pueda procesar, menos comprensión tendrá sobre el material (una tasa de aprendizaje de un número muy alto) y por lo tanto tendrá altas chances de desaprobar. Pero en cambio y se toma el tiempo de leer con toda la paciencia y atención en detalle (tasa de aprendizaje de número pequeño), tendrá más posibilidad de asimilar el conocimiento y por lo tanto aprobar (aprender, encontrar el ajuste de pesos óptimo).
El mismo principio se aplica a las neuronas artificiales. 
Generalmente los valores para la tasa de aprendizaje suelen ser un número entre el 0.0001 y el 1.0

#El sesgo
El sesgo en una neurona artificial es un parámetro que incide en la separación de los hiperplanos así permitiendo al modelo adaptarse mejor a los datos dados.

Supongamos una salida neuronal sin sesgo.
salida = suma(pesos*entradas)
Cada vez que se reajusten los pesos, la gradiente se irá inclinando en favor a la separación lineal de datos pero siempre saliendo del origen, lo que reduce la libertad para moverse por el plano.


Sin un sesgo, el vector de clasificación va a partir siempre desde el origen.
Ahora sumemos una constante a la función de salida.
salida = suma(pesos*entradas) + sesgo
Ahora la neurona tendrá la capacidad de modificar verticalmente la posición de la gradiente, mejorando enormemente la capacidad de clasificación.
Con un sesgo, el vector de pesos se va a poder ajustar partiendo desde cualquier posición.

Esto de alguna forma permitirá a la neurona "retrasar" la activación a cambio de un ajuste más preciso.

# Enseñándole al Perceptrón, dataset y un caso en la vida real
Recolectando datos:
Imaginemos que tenemos una huerta y en nuestra exquisita variedad tenemos tomates.
Para facilitarnos un poco el trabajo hemos decidido crear un programa que sea capaz de identificar cuando un tomate esté verde o cuando esté en el punto justo para cosechar en el momento indicado y como es un caso de clasificación binario, hemos decidido darle esa tarea a un perceptrón.

Así que vamos a hacer un análisis de los atributos en común que difieren de ambas clases de tomates y que consideramos según nuestra propia experiencia con tomates.


Luego de un tiempo de reflexionar la situación, llegamos a establecer las siguientes premisas:
  • Color: Cuando un tomate está maduro generalmente adquiere una pigmentación roja, mientras que el que no, conserva un amarillo producto a la combinación del verde con el rojo.
  • Consistencia: Un tomate en su punto justo tiende a ser un tanto más blando que un tomate inmaduro..
  • Suavidad: El tomate maduro es generalmente más suave que el que no.
Ahora que tenemos en claro cuáles son esas características que definen a un buen tomate, es hora de recolectar datos.
Para este paso, vamos a necesitar crear un conjunto de datos denominado ámbito de aprendizaje automático dataseteste no es más que un conjunto ordenado de "ejemplos" que el perceptrón tomará como verdad y usará de referencia a la hora de ajustar su aprendizaje.
Así que hemos decidido diseñar nuestro propio dataset, hemos salido a indagar en nuestra huerta y entre tomates y tomates, a partir de nuestras observaciones hemos construido una pequeña lista con sus respectivas variables.

El estilo de nuestro dataset luego del hipotético caso se veria algo así:

VerdorRojezConsistenciaSuavidadMaduro/Inmaduro
0.90.10.70.21
0.00.90.30.81
0.21.00.00.71
1.00.00.80.10
0.30.40.40.61
0.50.60.40.40

Como se observa, hemos decidido optar por usar números flotantes para cuantificar los atributos para darle más precisión al asunto (y hacerlo más interesante). 

Hay muchas maneras de crear datasets y organizar los datos(toda una ciencia detrás), este proceso se suele denominar comúnmente estandarización o modelado. Depende el tipo de dato que vayamos a manejar, con nuestro modelo estos tienen que ser puramente numéricos.

Ahora a entrenar!:
Una vez hecho el rejunte de información, podemos iniciar el proceso de entrenamiento.
  1. Primero que todo inicializamos los pesos en 0 y decidimos que la cantidad de entradas será de 4, una por cada atributo.
    Definiremos un bias de 1.0 y un learn rate de 0.1
  2. Comenzaremos por presentarle el primer ejemplo/muestra.
    Primera muestra, la de un tomate verde
  3. Como primera medida el perceptrón tendrá que procesar la entrada con su función de propagación y calcular la salida de la misma con su función de activación.
    Proceso de propagación según los parámetros dados, el resultado final de activación para esta muestra es 1

  4. Ahora tendrá que comparar ese resultado (1) con el esperado de la entrada del dataset y en base a eso, sabrá si se equivocó o no.
    La muestra tiene como valor esperado un 0, ya que es un tomate verde, pero durante la propagación resultó un 1 en la salida de la neurona, en efecto, no es el resultado esperado.
  5. Al no ser el resultado esperado, este tendrá que calcular el error y ajustar los pesos:
    -Error = (Salida esperada - Salida de la muestra actual) = (1 - 0) =  1
    -Regla de actualización = (Tasa de aprendizaje * Error * Entrada de la muestra actual)
    = 0.1 * 1 * 1.0
    Por cada peso sináptico de la neurona, se le suma el valor de la regla de actualización.
    Estado de la neurona luego del primer reajuste, la función dot es la suma empoderada y f() es la función de activación.
  6. Ahora que se ha reajustado los pesos y se redujo el margen de error, se salta al paso 2 pero siguiendo con la siguiente muestra y repitiendo el proceso hasta haber pasado el dataset entero las veces necesarias hasta conseguir un rendimiento óptimo.

Y listo, una vez entrenado el perceptrón, este ahora será de distinguir entre un tomate verde y uno al punto justo para una salsa! 



Resultados de muestras en una implementación del perceptrón hecha en Python

Si le introducimos un valor que no ha visto, será capaz de predecir un resultado acorde a lo aprendido, y todo con una simple neurona, fascinante ¿no?.

Obviamente si lo pensamos bien es una aplicación un tanto impráctica pero igual nos sirve como un buen ejemplo para comprender al Perceptrón y abrir posibilidades a otras soluciones.

Pueden ver la implementación en Python del Perceptrón, su regla de aprendizaje, el clasificador de tomates y algunos otros ejemplos haciendo click acá.



#Un dato curioso de por medio
El "Perceptrón Mark 1"

En realidad el Perceptrón fue pensado para ser una máquina, aunque la primera implementación del Perceptrón fue como software en un IBM 704, posteriormente se implementó en hardware personalizado llamado 'Perceptrón Mark 1', diseñada para el reconocimiento de imágenes a través de células fotovoltaicas conectadas a las neuronas. 




Los pesos se codificaban con potenciómetros y la actualización de pesos con motores eléctricos.
Los medios de la época como el New York Times informaba que según Rosenblatt, el perceptrón era "el embrión de una computadora electrónica que se espera que pueda caminar, hablar, ver, escribir, reproducirse y ser consciente de su existencia".




#Principales limitaciones
Como se mencionó anteriormente, el perceptrón es un dispositivo binario, he aquí una de las principales desventajas, al igual que el modelo de McCulloch-Pitts, se limita a solamente a manejar problemas linealmente separables como lo son por ejemplo las compuertas lógicas OR, AND o tareas de clasificación binarias cómo identificar si X pertenece a un grupo u otro pero no problemas que se compongan de más de dos clasificaciones como sería la compuerta lógica XOR.


La compuerta XOR no es linealmente separable, considerando que el vector de pesos tendría que separar los puntos  correspondientes como lo hace con AND o OR, la línea roja representa la solución ideal pero inaplicable por el modelo debido a su limitación lineal.



ADALINE 

ADALINE (Adaptive Lineal Neuron o Adaptive Lineal Neuron) es una neurona artificial desarrollada por el profesor Bernard Widrow y su estudiante graduado Ted Hoff en la universidad de Stanford en 1960. Se basa en la neurona de McCulloch-Pitts y es similar al Perceptrón, pero a diferencia de éste, en la fase de aprendizaje, los pesos se ajustan de acuerdo con la suma ponderada de las entradas en vez de una función de activación binaria, es decir, con el número real.


Diferencias entre ambos modelos

Mientras que el Perceptrón re-ajusta sus pesos sinápticos sabiendo si se equivocó o no por la función de activación binaria, Adaline reajusta los pesos sabiendo si se equivocó pero por cuanto, usando directamente la regla de propagación, la suma ponderada, lo que le da al modelo una mayor precisión a la hora de ajustar los pesos ya que usa la salida "cruda", dándole una mayor precisión a la hora del aprendizaje.


#El Error Cuadrático Medio
Para encontrar el ajuste óptimo de los pesos sinápticos, el modelo cuenta con una forma de estimar el promedio de error durante la fase de entrenamiento; una función de costo que es el Error cuadrático medio. Dicho valor es una manera global de saber lo equivocada que está la neurona en base a los datos que le presentamos a la neurona y las salidas que da la misma durante el proceso de propagación.
El error cuadrático medio (ECM) o Middle Square Error (MSE) se calcula de la siguiente forma:
EMC = (valores esperados - propagar(valores de entrada)) ^ 2 
El error disminuye en función al ajuste de los pesos, por lo tanto, el objetivo es ajustar los pesos para reducir el error lo máximo posible, para ello nos vamos a valer de La Gradiente descendente.

#La Gradiente descendente
El descenso de gradiente o gradiente descendente, es un algoritmo de optimización iterativo que sirve para encontrar el mínimo local de una función, en nuestro caso, esa función a minimizar es el previamente mencionado error cuadrático medio.
Vamos a recurrir al uso de una clásica analogía para darnos una idea de lo que consiste este proceso.

Podemos imaginar el descenso de gradiente como una pelota rodando hacia abajo en un valle, nosotros queremos que la pelotita asiente en el lugar más profundo.
La pelotita va a comenzar a rodar desde una determinada altura y va a ir bajando de a poco hasta llegar a la parte más honda del valle.

Desmenuzando la analogía; La altura de donde comienza a rodar la pelotita es el error cuadrático medio en función a los pesos inicializados; La pelotita descendiendo es la actualización de pesos; La velocidad con la que desciende la pelotita es la tasa de aprendizaje; La pelotita tocando fondo es, el mínimo local.

En la imagen anterior vimos que hay muchas pendientes, pero para no confundirnos vale aclarar que Adaline al ser un clasificador lineal va a constar de un solo "pozo" el cual descender.

El error cuadrático, es una función cuadrática (valga la redundancia), por lo tanto representable por medio de una parábola ( de ahí que comúnmente en el ejemplo se representa como la pendiente de un valle).
El costo disminuye en función a los pesos sinápticos, menor costo, mejor ajuste.

Este proceso en esencia aplicado a nuestra neurona lo que hará es ir actualizando los pesos en base a la derivada del error parcial (la diferencia de entrada esperada y la salida actual) , y así en función a este "descendiendo" el error y llegando al mínimo local, garantizando así la convergencia del vector de pesos.

La tasa de aprendizaje va a determinar con qué velocidad va a descender el error (la velocidad de la pelotita en la analogía) y se actualizan los pesos, si este valor es pequeño, irá descendiendo hasta encontrar el mínimo local permitiendo la convergencia con una mayor precisión al ser paulatino,  de lo contrario si el valor es muy grande, podrá acelerar la velocidad del descenso pero correrá riesgo de pasarse de largo y no converger nunca.

En pocas palabras, el algoritmo va a ir tanteando cual es el error mínimo posible.

#Entrenamiento de Adaline, Regla Widrow-Hoff
  1. Se inicializan los pesos con valores aleatorios pequeños, entre 0 y 1.
  2. Se le presenta un ejemplo.
  3. Se calcula la salida para dicho ejemplo, con la función de propagación.
  4. Se calcula el error:
                                  (salida esperada - salida actual)
  5. Se actualizan los pesos:
               peso actual + (tasa de aprendizaje * entrada actual del ejemplo  * error)
  6. Se actualiza el sesgo:
                                     sesgo actual + (tasa de aprendizaje * error)
  7. Se calcula el error cuadrático medio para enterarnos cómo va el aprendizaje:
            (los valores de entradas del dataset entero - los valores de salida esperados del dataset entero) ** 2
  8. Volver al paso 2 y repetir varias veces hasta disminuir el error cuadrático medio.
*En el anterior algoritmo se está aplicando el ECM y la gradiente descendiente.

Pueden ver una implementación de Adaline en Python con su algoritmo de entrenamiento y ejemplos desde acá.

Adaline fue una correspondiente e indirecta mejora del perceptrón en cuanto aprendizaje pero sigue siendo un dispositivo separador lineal, por lo tanto hereda todas las limitaciones previamente mencionadas.

Redes neuronales

Hasta ahí todo un hit la neurona artificial, aunque con una sola no se puede hacer mucho, entonces, por que no apilarlas y conectarlas para ver que sucede?


Las redes neuronales son un modelo computacional inspirado en el comportamiento biológico de las neuronas, este consiste en un conjunto de unidades, neuronas artificiales, conectadas entre sí para transmitirse señales, la información de entrada atraviesa la red neuronal donde se somete a diversas operaciones para finalmente producir una salida.


Redes neuronales Multicapa y Propagación hacia atrás

En 1969, Minsky y Papert, demuestran que el perceptrón simple y ADALINE no puede resolver problemas no lineales (por ejemplo, XOR). La combinación de varios perceptrones simples podría resolver ciertos problemas no lineales pero no existía un mecanismo automático para adaptar los pesos de la capa oculta. Paul John Werbos, David Rumelhart y otros autores, en 1986, presentan la "Regla Delta Generalizada" para adaptar los pesos propagando los errores hacia atrás, es decir, propagar los errores hacia las capas ocultas inferiores. De esta forma se consigue trabajar con múltiples capas y con funciones de activación no lineales. Se demuestra que el perceptrón multicapa es un aproximador universal. Un perceptrón multicapa puede aproximar relaciones no lineales entre los datos de entrada y salida. Esta red se ha convertido en una de las arquitecturas más utilizadas en el momento.
El perceptrón multicapa es una red neuronal artificial (RNA) formada por múltiples capas, de tal manera que tiene capacidad para resolver problemas que no son linealmente separables, lo cual es la principal limitación del perceptrón (también llamado perceptrón simple).El perceptrón multicapa puede estar totalmente o localmente conectado. En el primer caso cada salida de una neurona de la capa "i" es entrada de todas las neuronas de la capa "i+1", mientras que en el segundo cada neurona de la capa "i" es entrada de una serie de neuronas (región) de la capa "i+1".



Red neuronal perceptronica

Los perceptrones multicapa podían solucionar problemas no lineales, cuando se introducía un valor a la red, esta se procesaba ( propagación hacia adelante o forward), produciendo un resultado neto pero no se tenía la capacidad de ajustar los pesos automáticamente en toda la red en caso de que esta se equivocara, una tarea un tanto tediosa e imposible de llevar a cabo con la regla de aprendizaje simple. Hasta que surgió el algoritmo de propagación hacia atrás o backpropagation que permitiría volver hacia atrás en una salida re-ajustando automáticamente los pesos para reducir el margen de error entre la entrada y el resultado esperado.

El error se comunica capa en capa de atrás hacia adelante re-ajustando los pesos de las diferentes neuronas de la red mejorando el margen de salida.

Esto fue un gran paso para las redes neuronales ya que se volvían más prácticas y eficientes, sin contar que ahora en vez de solo soportar salidas binarias, podrían usar valores reales, aumentando la precisión de los resultados.


Pueden ver una implementación real y básica de una red neuronal de perceptrones hecha en Python haciendo click acá



Aplicaciones

Observa bien la siguiente imagen


Por las dudas de que no lo hayas visto, mira en la parte inferior derecha junto al tronco del árbol, ahora que has observado te has dado cuenta de lo que hay, tu cerebro ha sabido buscar entre las diversas formas, elementos, patrones de la imagen y recurriendo a la memoria, ha dado con que es un animal, un leopardo oculto al acecho para ser especifico y lo ha reconocido como tal, magnifico, no?.

# Evolución de redes neuronales, tipos y nuevas técnicas
Las redes neuronales se han perfeccionando a la largo de la historia y han surgido varios tipos de modelos de arquitecturas con sus reglas de aprendizaje, métodos de ajustes e implementación, cada uno con un variado nivel de complejidad y adaptado con el propósito de solventar las limitaciones de las redes tradicionales. Veremos algunas de las más concurridas.

# Redes convolusionales o CNN: reconocimiento de imágenes
Son redes multicapas inspiradas en el cortex visual de los animales lo que las hace útil específicamente para el procesamiento de imágenes.
Esta red es capaz de tomar una imagen, como una matriz de pixels, y a través de sus capas realizar convulsiones ma(convultion)para distinguir patrones característicos de la imagen  como ciertas formas de líneas, verticales, horizontales, bordes, etc y en el siguiente paso reducir los detalles para mantener la información más importante (pooling).
Se entrena la red con este proceso con imágenes que se quieran clasificar, dichas imágenes generan una salida específica asignada a un tipo previamente analizado.

Funcionamiento de una CNN, desmenuza una imagen, extrae lo más característico y genera una salida.



Funcionamiento de una red neuronal convulsional, cuando le mostremos la foto de un pájaro, si se la entrenó correctamente devolverá se activara la salida correspondiente asignada especialmente a imagenes de pajaros.




# Redes Long Short Term Memory o LSTM / Redes neuronales recurrentes o RNN
Estas redes se caracterizan por no tener una estructura de capas definidas, sino que permiten conexiones arbitrarias entre las neuronas, incluso pudiendo crear ciclos, con esto se consigue crear temporalidad, permitiendo que la red tenga la capacidad de recordar estados previos y utilizar esta información para decidir cuál será el siguiente.

Son muy potentes para lo que tenga que ver con el análisis de secuencias, como puede ser el análisis de textos, sonido, voz, lenguaje, reconocimiento de gestos o video, un ejemplo práctico sería en el escenario en que se entrene la red con datos cronológicos de la diferentes temperaturas de una computadora, una vez entrenada, esta va a ser capaz de realizar una predicción de la probabilidad de un aumento de temperatura mas alto en un periodo del futuro inmediato.


Como se puede apreciar, en una red neuronal común (NN), se va hacia adelante produciendo una salida inmediata, en cambio en la red neuronal recurrente, se realiza un movimiento de retroalimentación almacenando la salida para usarla posteriormente (memoria) apilandolas.

# Redes neuronales Generativas Adversarias o GANs
La idea de estas redes neuronales es tener dos modelos de redes neuronales 'compitiendo'. Uno llamado Generador, toma los 'datos basura' o 'ruido' como entrada y genera muestras. El otro modelo, llamado Discriminador, recibe a la vez muestras del Generador y del conjunto de entrenamiento (real) y deberá ser capaz de diferenciar entre las dos fuentes.
Es decir, se le da al Generador la capacidad de generar datos basura que va a darle al Generador, y este, a base de datos reales, va a identificar cuáles son reales o falsos, incitando al generador a mejorar en la tarea de discernir.

Un ejemplo práctico sería una GAN que comprenda rostros de personas.
  • La tarea del Discriminador será decir si una cara es auténtica o falsa
  • La tarea del Generador será la de crear fotos de caras que parezcan auténticas.
Para entrenar esta arquitectura necesitaremos disponer de un conjunto de fotos de personas reales. De esta forma, cuando le demos una foto real al discriminador, va a saber que la respuesta correcta es "real". Y cuando le demos una foto creada por el generador, la respuesta va a ser "falso".

Al principio va a ser fácil para el discriminador acertar cuando dice que las fotos son reales, esto es así por que al principio, las fotos creadas por la red neuronal generadora parecen aleatorias. Sin embargo, a medida que el generador mejora, la tarea de la red neuronal discriminadora se vuelve mas complicada. Así, tanto el generador como el discriminador van mejorando simultáneamente.

Una pagina que maneja este ejercicio es la presentada por nvidia , thispersondoesnotexist.com , un sitio que al visitarlo muestra un rostro aleatorio  generado por una GAN's, lo suficientemente válido como para que el discriminador lo deje pasar y a nuestro juicio y al de él se le considere el rostro de una persona, que obviamente no existe.
Rostro generado por la red neuronal de thispersondoesnotexist.com

Estos modelos neuronales permiten ajustar sus "hyper-parameters", parámetros que se ajustan para dar con una salida deseada (son como un conjunto de perillas que se pueden ir regulando) que en este caso sería un rostro distinto y ajustado a nuestras preferencias, pudiendo por ejemplo cambiar el color del pelo, forma del rostro, color de ojos, agregar o quitarle algún elemento y más. Saliendo del ámbito de rostros humanos, también es posible crear ambientes aleatorios, paisajes, habitaciones, música y muchas otras útiles aplicaciones que poco van tomando relevancia hoy en día. Aplicaciónes famosas que usan GANs son FaceApp, los filtros de instagram, snapchat entre otras.
Esquema de una GAN


Es importante remarcar que estas redes introducen la particularidad del 'Deep learning', en español, 'Aprendizaje profundo' ya que es tal la complejidad de las tareas que realizan que denotan una profundidad en el análisis para la obtención de una conclusión.

Machine Learning y el Deep Learning


Anteriormente vimos algunos modelos comunes de arquitecturas de RNA, digo algunos por que hay bastantes más que no alcanzaría a explicar, pero la idea queda clara, las redes neuronales son unas herramienta muy poderosa, una tecnología que ofrece muchas oportunidades dentro del extenso campo que es la Inteligencia Artificial, teniendo la capacidad de afrontar problemas con sistemas que pueden aprender por sí solos y es acá donde surgen las dos corrientes del aprendizaje automático, el Machine learning y el Deep Learning, ambas se basan en lo mismo pero la diferencia entre las dos estriba en el método de aprendizaje que emplean.


El Machine Learning en su uso más básico es la práctica de usar algoritmos para procesar datos, aprender de ellos y luego ser capaces de hacer una predicción o sugerencia sobre algo en base a los datos previamente analizados, adaptándose y mejorando su tasa de aciertos. 

Los programadores deben perfeccionar algoritmos que especifiquen un conjunto de variables para ser lo más precisos posibles en una tarea en concreto. La máquina es entrenada utilizando una gran cantidad de datos dando la oportunidad a los algoritmos a ser perfeccionados de una forma automática.





El Deep Learning en cambio es un subconjunto dentro del campo del machine learning, pero este en vez de entregarle al programa una cantidad de datos, le presentamos un problema y en base a un modelo, reglas de auto corrección, durante el aprendizaje logra extraer los patrones del mismo y es capaz de llegar a una solución y análisis mucho más 'profundo', siendo un método abierto a propósitos generales, como vimos en el caso de las redes adversarias generativas.
El aprendizaje de estas redes no llega a ser del todo 'automático' pero es más autónomo que el machine learning debido a que una vez programado el sistema la intervención humana es mínima, de ahí que necesite de esa "profundidad"(deep).










# Generative Pre-trained Transformer (GPT)
Tal vez la herramienta más potente de la Inteligencia Artificial en la actualidad, GPT-3, sucesorde GPT-2, un modelo creado y lanzado en 2020 por OpenAI, capaz de predecir la siguiente palabra en base a un contexto previo gracias a haber sido entrenado con la información de toda la web disponible hasta el 2019. 
En pocas palabras, le das un texto y el modelo genera una predicción en base a lo que hayas puesto.





En este caso es una conversación entre una persona y el modelo en contexto de un filósofo y  asesino serial, específicamente Theodore Kaczynski  más conocido como el Unabomber, en formato chat. Así como el contexto pudo haber sido una conversación ficticia con Albert Einstein o Socrates, o entre ambos. La creación de un resumen, una fake new o hasta un guión o un cuento.
Aunque no razona ni nada por el estilo, puede estar sesgada (fue entrenada por toda la información en la web y esta puede no ser exacta) sin dudas hace cosas bastante interesantes y es una de las herramientas mas potentes de la Inteligencia Artificial en la actualidad. Un video vale más que mil palabras.


GPT-3 Al día de la fecha es de pago pero tiene una prueba gratuita con todas las prestaciones.

Otra posibilidad de experimentarlo indirecta y gratuitamente es a través de proyectos que hacen uso del modelo, uno de los más interesantes, DungeonAI, un juego de rol de aventura conversacional donde te permite jugar historias generadas en tiempo real por la IA y altamente personalizadas por la interacción del usuario. 

Por supuesto, ofrece una versión delmodelo "castrada" recortando el potencial, pero muy buena y divertida de todas formas.

Por ahora está en ingles, aunque para el que no domina la lengua puede hacer uso de un traductor como https://www.deepl.com/translator o una extensión que he desarrollado en una ocasión hwpoison/aidungeon-browser-translator: real-time translation to many languages for aidungeon.io. (github.com) .

Un lugar recomendado para seguir las ultimas tendencias relacionadas al modelo es su comunidad en Reddit: https://www.reddit.com/r/GPT3/






# Conclusión
En este post pudimos ver sólo una pizca de uno de los más revolucionarios campos de la inteligencia artificial, las redes neuronales artificiales son la moda de la década y sin dudas un gran progreso tecnológico que nos acompaña en el día a día en su pleno auge.
Tal vez pase mucho tiempo hasta que algún día el ser humano logre llegar a una simbiosis con la inteligencia artificial, pero el progreso se forma de la suma de pequeños esfuerzos a lo largo de la historia.




Eso fue todo, hay algunos temas que podría haber explicado un poco más a fondo pero mi intención era hacer una síntesis de los conceptos más básicos para poder entender parcialmente sobre el tema, espero poder ampliar algunos conceptos en otras entradas pero hasta entonces hasta luego y gracias por leer! :D

Fuente: Puro google y experiencias propias.