Skip to content

IA: Redes Neuronales (9)

Las neuronas artificiales clasifican conjuntos de valores encontrando fronteras de decisión sobre dichos conjuntos. Sabiendo que las fronteras de decisión son siempre ortogonales (perpendiculares) a los vectores de pesos, se puede afirmar que el problema de encontrar una frontera de decisión es el mismo que el de encontrar un vector de pesos. Dado uno se conoce el otro.

Aprendizaje Automático

Imaginemos que queremos clasificar un conjunto de valores en dos clases. Los valores representados como cruces rojas en una clase y los valores representados como guiones verdes en la otra clase.

Nube de PuntosEs evidente que el conjunto de datos es linealmente separable. Se puede trazar una línea recta que separe el conjunto en dos. Las cruces a un lado y los guiones al otro. Es decir, se puede trazar una frontera de decisión. O lo que es lo mismo, se puede encontrar un vector de pesos que determine dicha frontera. El propósito de un algoritmo de Aprendizaje Automático es precisamente encontrar dicho vector de manera automática.

Uno de los algoritmos más sencillos es el que propuso originalmente junto con el diseño del Perceptron. Dicho algoritmo puede resumirse en los siguientes pasos:

1. Generar una frontera de decisión de forma aleatoria

2. Por cada valor del conjunto de valores siendo clasificado:

a. Comprobar si el valor está correctamente clasificado respecto a la frontera

b. Si no está correctamente clasificado variar la frontera para clasificarlo correctamente

3. Repetir el paso 2 hasta que todos los valores estén correctamente clasificados

Algoritmo que puede reformularse utilizando las características conocidas del producto escalar aplicado al vector de pesos y todos los posibles vectores de entrada:

1. Generar un vector de pesos aleatorios W

2. Por cada vector de entrada X :

a. Calcular el producto escalar W \cdot X

b. Si el producto escalar es negativo, y el valor no está correctamente clasificado:

Sumar X a W

c. Si el producto escalar es positivo, y el valor no está correctamente clasificado:

Restar X de W

3. Repetir el paso 2 hasta que no se produzca ningún cambio en W

Estos pasos se pueden representar de forma gráfica. Siendo el primer paso el de generar un vector de pesos aleatorios, lo que permite trazar una primera frontera de decisión, perpendicular a dicho vector.

Algoritmo de Clasificación - Paso 1El segundo paso es iterar por todos los valores, comprobando el signo del producto escalar entre el vector de pesos y el vector definido por cada valor. Suponiendo que se quiere clasificar las cruces rojas en el lado de la frontera de decisión donde el producto escalar es positivo, y los guiones verdes en el otro lado, donde es negativo.

En este caso la mayoría de los valores están bien clasificados, sin embargo, una cruz roja está incorrectamente clasificada. Está en el lado equivocado de la frontera. El producto escalar es negativo cuando debería ser positivo.

Para corregir la frontera de decisión se suma el vector del valor incorrectamente clasificado al vector de pesos. Esto tiene sentido en la medida que se mueve el vector de pesos hacia la dirección a la que apunta el vector del valor, haciendo que sean más similares que antes. Es decir, reduciendo el ángulo entre ambos, aumentando el producto escalar.

Algoritmo de Clasificación - Paso 2La nueva frontera de decisión ahora clasifica correctamente la cruz roja, pero también clasifica incorrectamente otros valores, entre ellos un guión verde. El producto escalar es positivo cuando debería ser negativo.

Algoritmo de Clasificación - Paso 4Para corregir la frontera de decisión se resta el vector del valor incorrectamente clasificado del vector de pesos. Lo que tiene sentido en la medida que mueve el vector de pesos en dirección contraria a la que apunta el vector del valor, aumenta el ángulo entre ambos, reduciendo el producto escalar.

Algoritmo de Clasificación - Paso 4Finalmente todos los valores quedan correctamente clasificados.

Algoritmo de Clasificación - Paso 5 Notar que si en el paso anterior se hubiera corregido la frontera utilizando las cruces rojas incorrectamente clasificadas en vez del guión verde el resultado hubiera sido el mismo, aunque la frontera de decisión pudiera haber sido otra un poco distinta.

Puerta AND

Se puede comprobar la efectividad del algoritmo haciendo que encuentre el vector de pesos que modela una puerta lógica AND. O dicho de otra forma, entrenando de forma automática una neurona artificial para que encuentre por si misma los valores de configuración que modelan una puerta AND.

Para ello primero se debe decidir la topología de la red neuronal a utilizar, que en este caso estará compuesta por una única neurona, con dos entradas, una salida, y la función escalón unitario como función de activación:

X = [x_1, x_2, 1]

W = [w_1, w_2, b]

f(W \cdot X) = \begin{cases} 0 & \quad \text{if } W \cdot X < 0 \\ 1 & \quad \text{if } W \cdot X \geq 0 \end{cases}

Para aplicar el algoritmo se necesita también recopilar un conjunto de valores de entrada a utilizar para el entrenamiento, y el resultado deseado d , del inglés «desired», para cada una de dichas entradas. Lo que en este caso se corresponde básicamente con la tabla de la verdad de la puerta lógica AND:

  \begin{matrix} & \mathbf{x_1} & \mathbf{x_2} & & \mathbf{d} \\ X_1 = & [0, & 0, & 1] & 0 \\ X_2 = & [0, & 1, & 1] & 0 \\ X_3 = & [1, & 0, & 1] & 0 \\ X_4 = & [1, & 1, & 1] & 1 \end{matrix}

Información que habitualmente se representa de forma combinada de la siguiente forma:

[X_1, d_1] = [0, 0, 1, 0]

[X_2, d_2] = [0, 1, 1, 0]

[X_3, d_3] = [1, 0, 1, 0]

[X_4, d_4] = [1, 1, 1, 1]

En este punto ya se puede empezar a aplicar el algoritmo, cuyo primer paso es generar un vector de pesos aleatorio:

W = [0.8, -0.1, -2.5]

A continuación se comprueba la salida de la neurona contra la salida deseada, para cada uno de los valores de entrada, hasta que se encuentre una salida que no corresponda con la deseada:

f(W \cdot X_1) = f(0.8*0 -0.1*0 -2.5*1) = f(-2.5) = 0

f(W \cdot X_2) = f(0.8*0 -0.1*1 -2.5*1) = f(-2.6) = 0

f(W \cdot X_3) = f(0.8*1 -0.1*0 -2.5*1) = f(-1.7) = 0

f(W \cdot X_4) = f(0.8*1 -0.1*1 -2.5*1) = f(-1.8) = 0

La salida de la neurona para el vector de entrada X_4 no se corresponde con la salida deseada d_4 . El deseado es 1 y se obtiene un 0. En consecuencia se suma el vector X_4 al vector de pesos W :

W = W + X_4 = [0.8, -0.1, -2.5] + [1, 1, 1]  = [1.8, 0.9, -1.5]

Y se vuelve a realizar la comprobación de las salidas con los nuevos pesos:

f(W \cdot X_1) = f(1.8*0 + 0.9*0 -1.5*1) = f(-1.5) = 0

f(W \cdot X_2) = f(1.8*0 + 0.9*1 -1.5*1) = f(-0.6) = 0

f(W \cdot X_3) = f(1.8*1 + 0.9 *0 -1.5*1) = f(0.3) = 1

El valor deseado para X_3 es 0, pero se obtiene 1, por lo que se resta dicha entrada de los pesos y se vuelve a iterar:

W = W - X_3 = [1.8, 0.9, -1.5] - [1, 0, 1]  = [0.8, 0.9, -2.5]

f(W \cdot X_1) = f(0.8*0 + 0.9*0 -2.5*1) = f(-2.5) = 0

f(W \cdot X_2) = f(0.8*0 + 0.9*1 -2.5*1) = f(-1.6) = 0

f(W \cdot X_3) = f(0.8*1 + 0.9*0 -2.5*1) = f(-1.7) = 0

f(W \cdot X_4) = f(0.8*1 + 0.9*1 -2.5*1) = f(-0.8) = 0

El valor deseado para X_4 es 1, pero se obtiene 0, por lo que se suma dicha entrada a los pesos y se vuelve a iterar:

W = W + X_4 = [0.8, 0.9, -2.5] + [1, 1, 1] = [1.8, 1.9, -1.5]

f(W \cdot X_1) = f(1.8*0 + 1.9*0 -1.5*1)= f(-1.5) = 0

f(W \cdot X_2) = f(1.8*0 + 1.9*1 -1.5*1) = f(0.4) = 1

El valor deseado para X_2 es 0, pero se obtiene 1, por lo que se resta dicha entrada de los pesos y se vuelve a iterar:

W = W - X_2 = [1.8, 1.9, -1.5] - [0, 1, 1]  = [1.8, 0.9, -2.5]

f(W \cdot X_1) = f(1.8*0 + 0.9*0 -2.5*1)= f(-2.5) = 0

f(W \cdot X_2) = f(1.8*0 + 0.9*1 -2.5*1) = f(-1.6) = 0

f(W \cdot X_3) = f(1.8*1 + 0.9*0 -2.5*1) = f(-0.7) = 0

f(W \cdot X_4) = f(1.8*1 + 0.9*1 -2.5*1) = f(0.2) = 1

Finalmente la red retorna el valor deseado para cada entrada y el algoritmo termina.

Convergencia

Se puede demostrar matemáticamente que el algoritmo converge (encuentra una solución) en un número finito de pasos cuando se aplica sobre un conjunto de valores linealmente separables. Donde el número máximo de pasos dados será siempre igual o menor que:

\bigg(\cfrac{R}{\gamma}\bigg)^2

Siendo R la distancia al valor más alejado del centro de coordenadas, y \gamma (gamma) la distancia al valor más cercano a la frontera de decisión.

También se puede demostrar que el algoritmo tiene las mismas limitaciones que tiene el Perceptron. Es decir, que sólo puede clasificar conjuntos de valores linealmente separables. Siendo el ejemplo paradigmático de esta limitación el problema de tratar de implementar una puerta XOR con una única neurona artificial.

Frontera de Decisión Imposible - Puerta XOREl algoritmo no converge para este caso. No existe ningún vector de pesos que defina una frontera de decisión que separe los valores en dos clases. El algoritmo siempre estaría oscilando entre una clase y otra. Clasificaría un valor de una clase a un lado. A continuación detectaría que hay un valor de la otra clase mal clasificado, y vuelta a empezar.

También es importante notar que el algoritmo no resulta práctico de aplicar en redes neuronales con varias capas. Ya que ello implica que el error en cada neurona de cada capa debe corregirse de forma individual. Es decir, que es necesario disponer de antemano de la salida esperada en todas y cada una de las neuronas de la red. Información de la que habitualmente no se dispone, ya que lo habitual es tener un conjunto de entradas y el resultado esperado a la salida de la red, no la salida esperada en cada neurona de la red.

Función de Activación Revisitada

Las funciones de activación determinan la salidas de las neuronas, es decir, como varían en función de las entradas y los pesos. Las funciones de activación de tipo escalón, como la función escalón unitario, resultan útiles para implementar sistemas de clasificación, pero a costa de transicionar de forma muy brusca de un valor a otro. Lo que desde un punto de vista matemático quiere decir que no son continuas, y por tanto no derivables en todos sus puntos.

Función de Activación - Escalón Unitario

Este comportamiento de las funciones de tipo escalón tiene una gran influencia en los algoritmos de Aprendizaje Automático basados en proponer una configuración inicial de pesos, probar dicha configuración contra una serie de entradas cuya salida esperada se conoce de antemano, y corregir la configuración en función del error cometido.

Utilizando una función escalón es posible cambiar el valor de los pesos de una neurona de forma significativa y que su salida siga siendo la misma. Lo que quiere decir que la salida no es proporcional a la magnitud del error cometido que ha motivado el cambio de los pesos. Las neuronas de una capa no reciben ninguna información acerca del error cometido en la capa previa. El error no se propaga a través de la red.

Una mejor opción por tanto es utilizar funciones de activación continuas y derivables en todos sus puntos. La derivada de una función permite cuantificar el efecto que tiene en la salida la variación de la entrada. Al utilizar funciones de activación derivables se puede obtener su derivada, y consecuentemente, se puede cuantificar el efecto que tiene en la salida variaciones en las entradas o en los pesos.

Función Sigmoide

Un ejemplo de función activación derivable y continua en todos sus puntos es la función sigmoide, también conocida como función logística simple:

\sigma(x) = \cfrac{1}{1 + e^{-x}}

Esta función \sigma (sigma) convierte los valores negativos en 0 y los positivos en 1, de forma brusca en los extremos, y de forma más suave en las proximidades del centro del eje de coordenadas, siendo derivable en todo el intervalo.

Función de Activación - Sigmoide

La salida de esta función puede interpretarse como un cálculo de probabilidades. La probabilidad de que una entrada pertenezca a la clase 1. Los valores netos positivos tienen una mayor probabilidad de pertenecer a la clase 1, de activar la neurona, y los valores negativos una menor probabilidad de pertenecer a la clase 1, de inhibir la neurona. Característica por la que la función sigmoide se utiliza habitualmente para construir sistemas de regresión, que realizan predicciones en vez de clasificaciones.

La función escalón unitario condiciona la clasificación de las entradas en función única y exclusivamente del signo del producto escalar. Si es negativo la entrada se clasifica como perteneciente a la clase 0, en caso contrario como perteneciente a la clase 1. Es decir, una entrada tiene un cincuenta por ciento de probabilidad de pertenecer a una clase u otra.

La función sigmoide en cambio realiza una predicción en función del signo y la magnitud del producto escalar. Las entradas tienen una probabilidad de pertenecer a una clase u otra que varía en función del valor del producto escalar en las proximidades de cero.

Utilizar la función sigmoide no cambia el hecho de que el algoritmo de aprendizaje no converge si el conjunto de datos en estudio no es linealmente separable. Pero permite construir una red neuronal que retorne la probabilidad de que una entrada pertenezca a una clase u otra, frente a la función escalón que retorna siempre una clase sin ninguna otra información que permita cuantificar la exactitud de dicha clasificación.

En el siguiente diagrama está representada una frontera de decisión sobre un conjunto de valores que no es linealmente separable.

Frontera de Decisión - Sigmoide

Cuando se introduce una entrada en la neurona la función de activación sigmoide retorna la probabilidad de que dicha entrada esté correcta o incorrectamente clasificada en función de su posición con respecto a la frontera de decisión. De esta forma, la red informa de que los puntos A y B tienen una alta probabilidad de que estén correctamente clasificados en sus respectivas clases, mientras que los puntos C y D tienen una probabilidad de que no lo estén, pequeña para C y grande para D.

Existen otras funciones de activación más populares hoy en día que la función sigmoide, pero es importante en la medida que fue la función que se introdujo originalmente cuando se desarrollaron los algoritmos de Aprendizaje Automático.

Derivada

La derivada de la función sigmoide presenta la característica de que puede escribirse haciendo referencia a la propia función sin derivar de la siguiente forma:

\sigma'(x) = \sigma(x)(1 − \sigma(x))

Expresión que puede obtenerse partiendo de las siguientes reglas generales del cálculo de derivadas:

\big(u(x)^{-1}\big)' = -u(x)^{-2} u'(x)

\big(a u(x) + b v(x)\big)' = a u'(x) + b v'(x)

\big(e^{u(x)}\big)' = e^{u(x)} u'(x)

Desarrollando la expresión de la derivada:

\sigma'(x) = \cfrac{d}{dx} \left( \cfrac{1}{1 + e^{-x}} \right) = \cfrac{d}{dx} (1 + e^{-x})^{-1} = -(1 + e^{-x})^{-2} \cfrac{d}{dx} (1 + e^{-x})

= -(1 + e^{-x})^{-2} \left( \cfrac{d}{dx} (1) + \cfrac{d}{dx} (e^{-x}) \right) = -(1 + e^{-x})^{-2} \left( 0 + \cfrac{d}{dx} (e^{-x}) \right)

= -(1 + e^{-x})^{-2} \left( e^{-x} \cfrac{d}{dx} (-x) \right) = -(1 + e^{-x})^{-2} (-e^{-x}) = (1 + e^{-x})^{-2} e^{-x}

= \cfrac{e^{-x}}{(1 + e^{-x})^{2}}

Y simplificando la ecuación obtenida:

\sigma'(x) = \cfrac{e^{-x}}{(1 + e^{-x})(1 + e^{-x})} = \cfrac{1}{1 + e^{-x}} \cfrac{e^{-x}}{1 + e^{-x}} = \cfrac{1}{1 + e^{-x}} \cfrac{e^{-x} + 1 - 1}{1 + e^{-x}}

= \cfrac{1}{1 + e^{-x}} \left( \cfrac{1 + e^{-x}}{1 + e^{-x}} - \cfrac{1}{1 + e^{-x}} \right) = \cfrac{1}{1 + e^{-x}} \left( 1 - \cfrac{1}{1 + e^{-x}} \right)

=\sigma(x)(1 − \sigma(x))

Aprendizaje Automático Supervisado

Es importante entender en este punto que las técnicas de Aprendizaje Automático representan un cambio de paradigma. En el desarrollo tradicional de aplicaciones las reglas que resuelven un problema se escriben de manera explícita. Sin embargo, utilizando técnicas de Aprendizaje Automático, las reglas se infieren de forma automática. Una vez inferidas las reglas se puede introducir cualquier conjunto de datos de entrada en la red neuronal, incluso datos no utilizados originalmente para inferir las reglas, y obtener una respuesta como en cualquier aplicación tradicional.

Cuando el algoritmo utilizado para inferir las reglas necesita un conjunto de datos previamente clasificado se define como Aprendizaje Automático Supervisado, debido a que los datos de entrada deben ser supervisados manualmente antes de poder ser utilizados para entrenar la red neuronal.

La necesidad de dicho conjunto de datos es uno de los inconvenientes de estas técnicas. Ya que si se quiere entrenar una red neuronal para que distinga si una imagen contiene una mesa o una silla hay que proporcionar al algoritmo imágenes indicando para cada una de ellas si contiene una mesa o una silla.

Otro inconveniente es la necesidad de diseñar manualmente la topología de la red neuronal. Es decir, decidir el número de capas, el número de neurona por capa y la función de activación en cada capa. Esto es más importante de lo que pueda parecer a priori, ya que si la red no tiene la capacidad suficiente no podrá resolver el problema. Por ejemplo, no se puede modelar una puerta XOR con una única neurona.

IA: Redes Neuronales (8)

Todas las redes neuronales vistas hasta ahora han sido diseñadas manualmente, escogiendo una topología y parámetros de configuración adecuados para cada problema. Esto era factible en la medida que los problemas eran sencillos, se conocían todas las entradas y salidas, y se podían deducir las relaciones existentes entre las mismas. En la práctica, los tipos de problemas que se intentan resolver mediante redes neuronales son complejos y las relaciones nada evidentes. Es por ello que se aplican técnicas de Aprendizaje Automático, capaces de encontrar los parámetros de configuración adecuados para resolver un problema concreto.

Vector de Pesos Revisitado

Los pesos se han tratado hasta ahora como una forma de ponderar las entradas con el objetivo de dar mayor importancia a unas que otras. Pero en la práctica, el estudio de la relación entre el vector de pesos y los vectores de entrada representa el primer paso para la elaboración de un procedimiento de Aprendizaje Automático.

Los vectores de pesos y entradas se relacionan a través de la función de cálculo del valor neto, que puede escribirse como el producto escalar entre ambos vectores:

z = \displaystyle\sum_{i=1}^{n} w_i x_i = W \cdot X = |W||X|\cos{\theta}

El producto escalar representa una forma de calcular el ángulo \theta (theta) que forman dos vectores entre sí. Cuando los vectores apuntan en la misma dirección el coseno es 1 y el valor del producto escalar es positivo. Cuando los vectores son perpendiculares el coseno es 0 y el producto escalar es cero. Cuando los vectores apuntan en direcciones opuestas el coseno es -1 y el producto escalar es negativo. En posiciones intermedias el signo depende del ángulo concreto que forman los vectores.

Producto EscalarLo que se puede interpretar diciendo que el valor neto es una medida de la diferencia del vector de entradas con respecto al vector de pesos. Cuanto más semejantes sean las entradas de los pesos mayor será el neto. Y cuanto más distintas sean menor será el neto.

Recordando que la función de cálculo del valor neto define un hiperplano formado por todos los puntos que se encuentran sobre la superficie definida por la siguiente ecuación:

W \cdot X

Y que la frontera de decisión sobre dicho hiperplano está formada por los puntos que cumplen la siguiente expresión:

W \cdot X = 0

Debe ser claro que para que se cumpla dicha expresión debe ocurrir que el producto escalar sea cero, o lo que es lo mismo, que W y X sean perpendiculares. O dicho de otra forma, que la expresión de la frontera de decisión representa el conjunto de todos los vectores X perpendiculares a W .

Esta nueva interpretación de la relación entre el vector de pesos y los vectores de entrada permite obtener otra visión del funcionamiento interno de una neurona artificial. Por ejemplo, consideremos una neurona artificial que implementa una puerta lógica NOT.

Neurona Artificial - Puerta NOTEsta neurona tiene un vector de pesos de dos dimensiones:

W = [-1, 0.5]

Y dos posibles vectores de entrada, uno para el valor negativo y otro para el positivo, siguiendo el criterio habitual de que 0 es negativo y 1 positivo:

X_1 = [0, 1]

X_2 = [1, 1]

El vector de pesos es perpendicular a la frontera de decisión, por lo que conociendo dicho vector se puede determinar la frontera. Y examinando la orientación de los vectores de entrada con respecto al vector de pesos se puede determinar en qué lado de la frontera se encuentran.

Frontera de Decisión - Puerta NOTEl resultado se puede verificar examinando el signo del producto escalar entre el vector de pesos y cada uno de los posibles vectores de entrada:

W \cdot X_1 = (-1) * 0 + 0.5 * 1 = 0.5

W \cdot X_2 = (-1) * 1 + 0.5 * 1 = -0.5

Para el primer vector de entrada el producto es positivo, así que se encuentra en el mismo lado que el vector de pesos. Para el segundo vector es negativo, así que se encuentra al otro lado.

Este procedimiento es válido para cualquier número de dimensiones, por lo que de forma general se habla de vectores ortogonales, en vez de perpendiculares. A partir de tres dimensiones resulta difícil de representar, por lo que es mejor pensar en el vector de pesos como un patrón que identifica un conjunto de características determinadas que se quieren analizar, de forma que cada entrada introducida en la neurona se compara con dicho patrón con el objetivo de obtener un valor que indica su grado de similitud. Si son muy similares entonces el valor es alto y la neurona tiene una mayor probabilidad de activarse.

Para entender mejor esto se puede pensar en vectores que tengan algún tipo de interpretación semántica, en vez de considerarlos sólo como un conjunto de números cualesquiera. Por ejemplo, en un sistema de clasificación de imágenes, donde una neurona puede estar dedicada a detectar un determinado patrón de píxeles, con su vector de pesos W representando un patrón de 3 filas y 3 columnas de píxeles en forma de cruz. De forma que contra dicho patrón se pueden comparar imágenes de entrada cualesquiera, como X_1 X_2 .Vector de Pesos - PatrónLa primera imagen no se asemeja en absoluto al patrón, la segunda sólo se diferencia en un par de píxeles. Al calcular el producto escalar se obtiene un valor de la semejanza de cada imagen con el patrón definido por el vector de pesos. La imagen que más se parece al patrón obtiene un valor más alto y tiene mayor probabilidad de activar la neurona.

IA: Redes Neuronales (7)

Los valores de salida de una red neuronal están condicionados por la función de activación utilizada en la última capa. Las funciones de activación de tipo escalón sólo producen 0 ó 1, lo que resulta conveniente para implementar operaciones lógicas o sistemas de clasificación de dos clases, pero limita su uso en otros ámbitos. La solución para evitar esta limitación es utilizar otro tipo de función de activación que se adecue más a la naturaleza del problema que se está intentando resolver.

Aproximador Universal

Imaginemos una función continua en una variable de la que sólo dispone su representación gráfica.Función 2DY imaginemos ahora que queremos construir una red neuronal que retorne el valor sobre dicha curva para un valor de entrada dado. Es decir, no se quiere retornar una clase de un dominio acotado, como 0 ó 1, sino un valor cualquiera del dominio de los reales.

Como primera aproximación, en vez de intentar modelar toda la función de forma exacta, se puede simplemente tomar una serie de valores particulares sobre la gráfica a intervalos regulares, y modelar esos intervalos como fronteras de decisión de la red neuronal.

Fronteras de Decisión - Función 2DUna primera capa para las líneas verticales. Una segunda capa para las áreas delimitadas por cada par de líneas verticales. Y una tercera capa que retorne el valor adecuado para cada área.Red Neuronal - Función 2D

La primera capa clasificará las entradas en función de si están a un lado u otro de una línea vertical. Esta capa actúa como un sistema de clasificación de dos clases. Emite un 1 si el valor de entrada está un lado de la línea y un 0 si está al otro lado.

z^{(1)}_1 = w^{(1)}_{1, 1} x_1 + b^{(1)}_1 = 1 * x_1 + 0 = x_1

z^{(1)}_2 = w^{(1)}_{2, 1} x_1 + b^{(1)}_2 = 1 * x _1- 4 = x_1 - 4

z^{(1)}_3 = w^{(1)}_{3, 1} x_1 + b^{(1)}_3 = 1 * x_1 - 8 = x_1 - 8

z^{(1)}_4 = w^{(1)}_{4, 1} x_1 + b^{(1)}_4 = 1 * x_1 - 12 = x_1 - 12

y^{(1)}_1 = f^{(1)}_1(z^{(1)}_1) = \begin{cases} 1 & \quad \text{if } x_1 \geq 0 \\ 0 & \quad \text{if } x_1 < 0 \end{cases}

y^{(1)}_2 = f^{(1)}_2(z^{(1)}_2) = \begin{cases} 1 & \quad \text{if } x _1- 4 \geq 0 \\ 0 & \quad \text{if } x_1 - 4 < 0 \end{cases}

y^{(1)}_3 = f^{(1)}_3(z^{(1)}_3) = \begin{cases} 1 & \quad \text{if } x_1 - 8 \geq 0 \\ 0 & \quad \text{if } x_1 - 8 < 0 \end{cases}

y^{(1)}_4 = f^{(1)}_4(z^{(1)}_4) = \begin{cases} 1 & \quad \text{if } x_1 - 12 \geq 0 \\ 0 & \quad \text{if } x_1 - 12 < 0 \end{cases}

La segunda capa clasificará los valores de entrada en función de si están entre dos líneas verticales. Cada neurona examina un par de líneas concretas. Emite un 1 si el valor de entrada está entre las dos líneas y un 0 si no lo está. En la salida de esta capa sólo habrá un valor a 1, ya que un valor de entrada sólo puede estar entre un par de líneas concretas.

z^{(2)}_1 = w^{(2)}_{1, 1} y^{(1)}_1 + w^{(2)}_{1, 2} y^{(1)}_2 + b^{(2)}_1 = 1 * y^{(1)}_1 + (-1) * y^{(1)}_2 - 1 = y^{(1)}_1 - y^{(1)}_2 - 1

z^{(2)}_2 = w^{(2)}_{2, 2} y^{(1)}_2 + w^{(2)}_{2, 3} y^{(1)}_3 + b^{(2)}_2 = 1 * y^{(1)}_2 + (-1) * y^{(1)}_3 - 1 = y^{(1)}_2 - y^{(1)}_3 - 1

z^{(2)}_3 = w^{(2)}_{3, 3} y^{(1)}_3 + w^{(2)}_{3, 4} y^{(1)}_4 + b^{(2)}_3 = 1 * y^{(1)}_3 + (-1) * y^{(1)}_4 - 1 = y^{(1)}_3 - y^{(1)}_4 - 1

y^{(2)}_1 = f^{(2)}_1(z^{(2)}_1) = \begin{cases} 1 & \quad \text{if } y^{(1)}_1 - y^{(1)}_2 - 1 \geq 0 \\ 0 & \quad \text{if } y^{(1)}_1 - y^{(1)}_2 - 1 < 0 \end{cases}

y^{(2)}_2 = f^{(2)}_2(z^{(2)}_2) = \begin{cases} 1 & \quad \text{if } y^{(1)}_2 - y^{(1)}_3 - 1 \geq 0 \\ 0 & \quad \text{if } y^{(1)}_2 - y^{(1)}_3 - 1 < 0 \end{cases}

y^{(2)}_3 = f^{(2)}_3(z^{(2)}_3) = \begin{cases} 1 & \quad \text{if } y^{(1)}_3 - y^{(1)}_4 - 1 \geq 0 \\ 0 & \quad \text{if } y^{(1)}_3 - y^{(1)}_4 - 1 < 0 \end{cases}

La tercera capa emitirá el valor correspondiente al área en que se encuentra el valor de entrada. Pero como estos valores no están limitados a 0 ó 1, no se puede utilizar una función escalón como función de activación. Esta capa utiliza en cambio la función identidad:

f(x) = x

Es decir, la salida de esta tercera capa es directamente el valor neto. Siendo el valor neto la suma de todas las salidas de la capa anterior multiplicadas por los valores correspondientes a cada área. Y como sólo una de las salidas de la capa anterior es 1, el resto es 0, entonces el valor final de salida es igual al valor correspondiente al área en el que se encuentra el valor de entrada.

z^{(3)}_1 = w^{(3)}_{1, 1} y^{(2)}_1 + w^{(3)}_{1, 2} y^{(2)}_2 + w^{(3)}_{1, 3} y^{(2)}_3 + b^{(3)}_1 = 7 y^{(2)}_1 + 3 y^{(2)}_2 + y^{(2)}_3

y^{(3)}_1 = f^{(3)}_1(z^{(3)}_1) = z^{(3)}_1 = 7 y^{(2)}_1 + 3 y^{(2)}_2 + y^{(2)}_3

Probando con distintos valores de entrada se puede comprobar que se obtiene el resultado esperado:

  \begin{matrix} \mathbf{x_1} & \mathbf{y^{(1)}_1} & \mathbf{y^{(1)}_2} & \mathbf{y^{(1)}_3} & \mathbf{y^{(1)}_4} & \mathbf{y^{(2)}_1} & \mathbf{y^{(2)}_2} & \mathbf{y^{(2)}_3} & \mathbf{y_1} \\ -2 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 1 & 0 & 0 & 7 \\ 2 & 1 & 0 & 0 & 0 & 1 & 0 & 0 & 7 \\ 4 & 1 & 1 & 0 & 0 & 0 & 1 & 0 & 3 \\ 6 & 1 & 1 & 0 & 0 & 0 & 1 & 0 & 3 \\ 8 & 1 & 1 & 1 & 0 & 0 & 0 & 1 & 1 \\ 10 & 1 & 1 & 1 & 0 & 0 & 0 & 1 & 1 \\ 12 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 \\ 14 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 \end{matrix}

Para obtener un mayor grado de precisión se pueden tomar más valores sobre la función. Es decir, crear más fronteras de decisión.Fronteras de Decisión - Función 2DEn el límite, cuando la separación entre las fronteras tiende a cero, la salida de la red sigue perfectamente el contorno de la función original.

Para tres dimensiones las funciones representan planos, así que en vez de visualizar las áreas aproximadas mediantes rectángulos planos hay que visualizarlas como aproximadas con cilindros, ya que el comportamiento de la red en este caso es igual que el visto anteriormente como clasificador universal, donde un gran número de fronteras de decisión pueden delimitar un contorno que se ciña alrededor de un punto con cualquier grado de precisión.

Para un mayor número de dimensiones las funciones representan hiperplanos, pero el funcionamiento de la red sigue siendo el mismo. Lo que quiere decir que una red neuronal es un aproximador universal. Puede aproximar cualquier función con cualquier grado de precisión.

IA: Redes Neuronales (6)

El modelo de neurona artificial utilizado hasta ahora para modelar puertas lógicas y clasificar nubes de puntos es adecuado para trabajar con un rango de valores discretos conocidos. Pero en la práctica se puede trabajar con dicho modelo en cualquier rango de valores numéricos de una forma más genérica. Para facilitar la explotación de esta característica es conveniente revisar el propio diseño de neurona artificial.

Neurona Artificial Revisitada

En el diseño original de neurona artificial existe una dependencia entre la función de activación y el umbral de activación. Se presupone que todas las funciones de activación realizan una clasificación en base a dicho umbral.

Neurona ArtificialSin embargo, el umbral de activación es una característica de las neuronas que puede incorporarse al cálculo del valor neto de una forma natural, eliminando su dependencia con la función de activación.

El valor neto se calcula como la suma ponderada de las entradas por los pesos. Si a dicho neto se le resta el umbral de activación, y el resultado es negativo, se puede interpretar que no se ha alcanzado el umbral. Si es cero es que está justo en el umbral. Y si es positivo es que se ha superado el umbral. De esta forma es el propio signo del valor neto el que puede indicar si se ha superado o no el umbral, y se puede eliminar esa responsabilidad de decidir si se ha superado o no el umbral de la función de activación.

Neurona Artificial

En este diseño se introducen los siguientes cambios:

  • Al vector de valores de entradas se le añade un nuevo elemento con valor 1 :

X = \begin{bmatrix} x_1 \ldots x_n, 1 \end{bmatrix}

  • Al vector de pesos se le añade un nuevo elemento con valor b :

W = \begin{bmatrix} w_1 \ldots w_n,  b \end{bmatrix}

Siendo b el «sesgo», del inglés «bias», que sustituye al umbral de activación:

b = -T

  • El cálculo del valor neto de entrada incluye el sesgo:

z = \displaystyle\sum_{i=1}^{n-1} w_i x_i + b

Expresión que a veces se formula mediante el producto escalar:

z = W \cdot X

O como producto de matrices:

z = WX^T , siendo X^T la matriz traspuesta de X

  • La función de activación escalón se sustituye por la función escalón unitario, del inglés «unit step»:

f(x) = \begin{cases} 0 & \quad \text{if } x < 0 \\ 1 & \quad \text{if } x \geq 0 \end{cases}

Esta función activa la neurona cuando el neto es mayor o igual que cero.

Este diseño es totalmente equivalente al utilizado anteriormente, pero tiene la ventaja de que permite tratar todos los parámetros de manera homogénea con tan sólo dos vectores.

Interpretación Geométrica Revisitada

Añadir el sesgo al cálculo del valor neto de entrada implica añadir un término independiente a la combinación lineal de las entradas por los pesos.

En el caso más sencillo, con una única entrada x_1 , la función del cálculo del valor neto es la ecuación de una recta de la forma:

w_1 x_1 + b

Donde w_1 es la pendiente de la recta y b el punto de corte con el eje de ordenadas. Es decir, la superficie definida por la función del valor neto sigue siendo una recta, pero en vez de cortar siempre el eje de ordenadas en el origen ahora lo hace en el punto b .

Por su parte, la función de activación ahora define una frontera de decisión sobre dicha recta de la forma:

w_1 x_1 + b = 0

Lo que quiere decir que la frontera de decisión ahora es siempre el punto de corte de la recta con el eje de abscisas.Frontera de Decisión - 2DEsto no implica grandes cambios con respecto al diseño anterior en la medida que se puede seguir trazando cualquier recta. La única diferencia es que ahora la frontera de decisión siempre es el eje de abscisas. Lo que se corresponde con la idea antes planteada de que el signo del valor neto determina si se ha superado o no el umbral de activación.

Por su parte, para el caso de dos dimensiones, la superficie definida sigue siendo un plano. El término independiente b en la ecuación del plano tiene el mismo efecto que en la ecuación de la recta, haciendo que el plano ya no corte siempre el origen de coordenadas. 

w_1 x_1 + w_2 x_2 + b

Igualmente, la frontera de decisión sigue siendo una recta sobre el plano. 

w_1 x_1 + w_2 x_2 + b = 0

Sólo que ahora dicha recta se corresponde siempre a la intersección con el plano definido por los ejes sobre los que se representan x_1 y x_2 .

Frontera de Decisión - 3D

La vista cenital no se ve alterada. Ni tampoco el comportamiento para un número mayor de dimensiones, donde se trabaja con hiperplanos.

IA: Redes Neuronales (5)

El diseño de redes neuronales basado en capas evita la limitación de las neuronas artificiales individuales, que sólo pueden clasificar valores pertenecientes a clases linealmente separables, y permiten utilizarlas para clasificar cualquier conjunto de valores en distintas categorías o clases. 

Clasificador Universal

Imaginemos un conjunto de valores que se quiere clasificar en dos clases distintas. Cada valor de dicho conjunto representado por un vector de dos dimensiones [x_1, x_2] . Y cada valor perteneciente única y exclusivamente a una de las dos posibles clases, 0 ó 1.

En la siguiente imagen se representa la distribución de valores y la clase asociada a cada valor. La valores de la clase 0 se representan con un cuadrado verde, y los de la clase 1 con un punto rojo.Nube de PuntosDe forma intuitiva, es fácil observar que los puntos rojos se encuentran dentro de un círculo alrededor del eje de coordenadas. Es decir, la frontera de decisión es una circunferencia centrada en el origen.

Utilizando el modelo de red neuronal visto hasta ahora, se puede diseñar un sistema de clasificación aproximado utilizando varias fronteras de decisión que delimiten un área alrededor de los puntos rojos, de forma similar a como se resolvió el problema de la puerta lógica XOR.

Fronteras de Decisión - Nube de PuntosSistema de clasificación que puede implementarse con una red neuronal artificial de dos capas. La primera capa con una neurona por cada una de las fronteras de decisión. Y la segunda capa con un neurona que represente el área de intersección de todas las fronteras de decisión de la capa anterior.Red Neuronal - Nube de PuntosCada neurona de la primera capa clasificará los valores de entrada en base a una frontera de decisión que separará los valores en dos mitades. Pudiendo cada una de estas mitades contener tanto cuadrados verdes como círculos rojos, ya que las neuronas de esta capa no tratan de resolver el problema en su totalidad, sino detectar características concretas de los valores de entrada, como por ejemplo que se encuentran en una posición u otra respecto al eje de coordenadas.

La neurona de la última capa clasificará en base a las características detectadas por las cinco neuronas de la capa anterior. En cierto sentido actúa como una puerta AND de cinco entradas. Si se detectan las cinco características entonces clasificará el valor de entrada como perteneciente a la clase 1, es decir, como un punto rojo, y en caso contrario como perteneciente a la clase 0, es decir, como un cuadrado verde.

En la siguiente imagen se representa la intersección de las regiones determinadas por las fronteras de decisión. El número en cada área representa la cantidad de regiones que se solapan en dicha área. O dicho de otra forma, el número de características que cumplen los valores contenidos en dichas áreas.Fronteras de Decisión Numeradas

Sólo los valores que se encuentran dentro del pentágono central reúnen las cinco características que deben cumplirse para ser clasificados como puntos rojos. Y como cada una de las cinco neuronas de la primera capa emite un valor 1 cuando se cumple una característica, entonces la neurona de la segunda capa sólo deberá excitarse si la suma de sus entradas es igual a 5. Siendo 5 por tanto su umbral de activación.

En este punto es interesante notar que si al umbral de activación de la última neurona se le asigna el valor 4 entonces la frontera de decisión de la segunda capa tendrá forma de pentáculo (estrella de cinco puntas). Lo que quiere decir que una red neuronal puede definir fronteras cóncavas, no sólo convexas.

Obvia decir que los pesos y umbrales de activación de las neuronas de la primera capa deben escogerse de forma que modelen las fronteras de decisión en función del conjunto concreto de valores en estudio.

Cuanto más complejo sea el contorno definido por una frontera, mayor deberá ser el número de neuronas requerido para poder ajustarse a dicho contorno con precisión.Frontera de Decisión - Nube de PuntosUna red neuronal puede incluso clasificar correctamente conjuntos de valores que se encuentren aislados.Fronteras de Decisión - Puntos AisladosPor ejemplo, para clasificar los valores de la imagen, que se encuentran en dos regiones triangulares separadas, se puede utilizar una red neuronal de dos capas. La primera capa con seis neuronas, tres por cada región triangular. Y la segunda capa con dos neuronas, de forma que una de ellas se active para los valores pertenecientes a una de las regiones triangulares, y la otra se active para los de la otra región.

Si se quiere una red con una única salida basta con añadir otra capa al final, con una neurona que se active si al menos una de las dos neuronas de la capa anterior se activa.

Neurona Artificial - Puntos Aislados

Otra forma de interpretar esta red es diciendo que las neuronas de la segunda capa realizan un AND contra las tres fronteras que definen cada una de las regiones triangulares, y que la neurona de la última capa realiza un OR sobre el resultado de las neuronas de la capa anterior.

En este ejemplo se ha omitido de forma intencionada algunas de las conexiones entre las neuronas de la primera y segunda capa. En la práctica todas las neuronas de una capa están conectadas a todas las neuronas de la siguiente capa. Se pueden considerar que existen, pero con peso 0, por lo que no aportan nada al cálculo del valor neto.

Redes neuronales como las anteriores pueden utilizarse para modelar el contorno de cualquier frontera de decisión, con cualquier grado de precisión, y en un espacio con cualquier número de dimensiones. En el límite, cuando el número de neuronas tiende a infinito, las fronteras de decisión se pueden ceñir alrededor de puntos individuales, ajustándose de forma extremadamente precisa a los mismos, característica que convierte a una red neuronal en un clasificador universal.

En la práctica las redes neuronales artificiales no pretenden representar de forma exacta los contornos que separan las clases. Es habitual que sólo sean una aproximación, ya que en los problemas reales de cierta complejidad no se dispone de todos los valores posibles para todas las clases. Además de que es conveniente dejar cierto margen, ya que no se impone ninguna limitación en los valores que se pueden introducir en una red neuronal. Nada impide que se alimente con un valor de entrada de 0.25 a una neurona que implementa una puerta lógica NOT. La neurona simplemente se limitará a calcular el valor neto para dicha entrada y decidirá si se encuentra a un lado u otro de su frontera de decisión. 

Lo mismo ocurre con el ejemplo de la nube de puntos. Nada impide que se alimente a la red con un valor no utilizado para definir las fronteras de decisión.Punto DesconocidoEsto implica que una red neuronal puede procesar valores de entrada nunca antes vistos, valores no utilizados originalmente en el proceso de diseño de las fronteras de decisión, y generar un valor de salida para dichas entradas nunca antes vistas, estimaciones o predicciones calculadas por semejanza con otros valores conocidos.