Mostrando entradas con la etiqueta Inteligencia artificial. Mostrar todas las entradas
Mostrando entradas con la etiqueta Inteligencia artificial. Mostrar todas las entradas

26 feb 2021

Regresión Logística Multinomial

Algunas veces es necesario hacer clasificación para más de dos clases. Quizas se quiere clasificar tres formas de sentimientos (positivo, neutral o negativo). Esto se podría hacer analizando el contenido del habla y asignado un etiquetado semático a cada una de las palabras para poder valores el sentimiento del habla, sin embargo en esta publicación no vamos a hablar de esto por ahora. Vamos a dedicar la atención a la regresión logística multinomial o softmax.

En estas situaciones en donde es necesario hacer una clasificación para más de dos clases, se puede hacer uso de la regresión logística multinomial, o tambien regresión softmax. En este tipo de regresión la variable objetivo tiene un rango que varia sobre un conjunto de más de dos clases; el objetivo aquí será determinar cuá es la probabilidad de $y$ de pertenecer a cada una de las clases potenciales $c\in C$, $P(y=c\;|\;x)$.

La regresión logística multinomial clasifica usando una generalización de la función sigmoide, conocida como la función softmax, para calcular la probabilidad $P(y=c\;|\;x)$. La función softmax toma un vector $z=[z_1, z_2, \dots, z_k]^{\top}$ de $k$ valores arbitrarios y los mapea en una distribucción de probalicada, con cada valore en el rango $(0, 1)$, y todos los valores sumando uno. Como la función sigmoide. es una función exponencial.

Para un vector $z$ de dimensionalidad $k$, la función softmax es definida como:

$$s(z_i)=\frac{e^{z_i}}{\sum_{j=1}^{k}e^{z_{j}}},\; 1\leq i\leq k.$$

Así, la función softmax de un vector $z=[z_1, z_2, \dots, z_k]^{\top}$ es por lo tanto una función vectorial:

$$s(z)=\left[\frac{e^{z_1}}{\sum_{j=1}^{k}e^{z_{1}}}, \frac{e^{z_2}}{\sum_{j=1}^{k}e^{z_{2}}},\dots, \frac{e^{z_k}}{\sum_{j=1}^{k}e^{z_{k}}}\right]$$

El denominador $\frac{e^{z_i}}{\sum_{j=1}^{k}e^{z_{j}}}$ es usado para normalizar todos los valores en probabilidades. Por ejemplo:

In [1]:
import numpy as np
from scipy.special import softmax
In [2]:
z = np.array([0.6, 1.1, -1,5, 1.2, 3.2, -1.1])
In [3]:
softmax(z)
Out[3]:
array([0.01002305, 0.01652522, 0.00202362, 0.81638616, 0.01826319,
0.13494772, 0.00183105])

Otra vez como en la función sigmoide, la entrada de la función softmax puede ser el producto punto entre un vector de pesos $w=(w_0, \dots, w_n)$ y un vector $x=(1, x_1,\dots, x_n$. Pero ahora ese necesario separar el vector de pesos para cada una de las clases.

$$P(y=c\;| \;x)=\frac{e^{w_c^\top x}}{\sum_{j=1}^{k}e^{w_j^\top x}}$$

Como la función sigmoide, la función softmax tiene la propiedad de transformar los valores hacía $0$ o $1$. Pos lo tanto , si una de las entradas es más grande que los otros, tenderá a aumentar su probabilidad hacia $1$, y suprime las probabilidades de las entradas más pequeñas.

Aplicaciones de la regresión logística multinomial

Para la clasificación de los datos de entrada es necesario definir una función que depende de la observación $x$ y de la potencial clase $c$. Para esto se usará la notación $f_i(c, x)$, que indicará el atributo $i$ para una clases particular $c$ dado por la observación $x$.

En clasificación binaria, un peso positivo en una característica apunta hacia $y = 1$ y un peso negativo hacia $y = 0$, pero en la clasificación multiclase una característica podría ser evidencia a favor o en contra de una clase individual.

Veamos algunas características de muestra para algunas tareas de PNL para ayudar a comprender este uso quizás poco intuitivo de características que son funciones tanto de la observación $x$ como de la clase $c$.

Supongamos que estamos haciendo una clasificación de texto y, en lugar de una clasificación binaria, nuestra tarea es asignar una de las 3 clases A, B o C (neutral) a un documento. Ahora, una función relacionada con los signos de exclamación puede tener un peso negativo para C documentos y un peso positivo para documentos A o B:

$$f_1(C, x)=\begin{cases}1 & \mbox{ si } ! \notin doc \\ 0 & \mbox{ si } ! \in doc \end{cases},\;w_1 = -4.5$$
$$f_2(A, x)=\begin{cases}1 & \mbox{ si } ! \notin doc \\ 0 & \mbox{ si } ! \in doc \end{cases},\;w_1 = 2.6$$
$$f_3(B, x)=\begin{cases}1 & \mbox{ si } ! \notin doc \\ 0 & \mbox{ si } ! \in doc \end{cases},\;w_1 = 1.3$$

¿Cómo aprende las regresión multinomial logística?

La regresión logística multinomial tiene una función de pérdida ligeramente diferente a la regresión logística binaria porque utiliza el clasificador softmax en lugar del sigmoide. La función de pérdida para un solo ejemplo $x$ es la suma de los registros de las $k$ clases de salida:

$$L_{CE}(\hat{y}, y)=-\sum_{h=1}^{k}\mathbb{1}_{\{y=k\}}\log P(y=k\;|\;x)=-\sum_{k=1}^{k}\mathbb{1}_{\{y=k\}}\log \frac{e^{w_{k}\cdot x + b_{k}}}{\sum_{j=1}^{k}e^{w_j\cdot x + b_{j}}}$$

La expersión $\mathbb{1}_{\{y=k\}}$ toma el valor de uno cuando la condición en las llaves es verdadera y cero en cualquier otro caso.

El gradiente para una muestra es muy similar a el gradiente para la regresión logistica, aunque no se mostrará aquí la derivación. Es la diferencia entre el valor de la clase verdadera $k$ y la probabilidad que el clasificador genera para la clase $k$, ponderada por el valor de la entrada $x_{k}$:

$$\frac{\partial L_{CE}}{\partial w_{k}} = -(\mathbb{1}_{\{y=k\}}-P(y=k\;|\;x))x_{k}=-\left(\mathbb{1}_{\{y=k\}} - \frac{e^{w_{k}\cdot x + b_{k}}}{\sum_{j=1}^{k}e^{w_j\cdot x + b_{j}}}\right)x_k$$

Implementación con Tensorflow - MNIST

MNIST es un conjunto de datos de digitos escritos a mano que se en muchos ejemplos introductorios al machine learning. El conjunto de datos contiene 60000 ejemplos para entrenamiento y 10000 ejemplos para testeo. El tamaño de los digitos ha sido normalizado y la imagen centrada (28 x 28 pixeles) con valores de 0 a 1. Por simplicidad, cada imagen ha sido convertido es una matriz númerica 1-D de 784 características (28 x 28). Para más información http://yann.lecun.com/exdb/mnist/.

Para nuestro ejemplo de regresión logística multinomial usaremos TensorFlow V2 y se implementará a bajo nivel para entender los detalles que hay en el proceso de entrenamiento. Los detalles de este ejemplo se puede encontrar en TensorFlow Examples - GitHub

In [4]:
import tensorflow as tf
import numpy as np

A continuación se definen las características generales de los datos:

In [5]:
num_classes = 10
num_features = 784

También se definen los parámetros de entrenamiento:

In [6]:
learning_rate = 0.01
training_steps = 1000
batch_size = 256

Lectura de los datos

Se cargan los datos y se identifican el conjunto de entrenamiento y el de testeo:

In [7]:
from tensorflow.keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

Para visualizar algunos ejemplos hacemos uso de matplotlib de la siguiente forma:

In [8]:
import matplotlib.pyplot as plt
In [9]:
plt.imshow(x_train[5], cmap='gray')
plt.show
Out[9]:
<function matplotlib.pyplot.show(close=None, block=None)>

Preparación de los datos

Estadarización del tipo de dato:

In [10]:
x_train, x_test = np.array(x_train, np.float32), np.array(x_test, np.float32)

Transformación de los datos a vectores de 784 características:

In [11]:
x_train, x_test = x_train.reshape([-1, num_features]), x_test.reshape([-1, num_features])

Normalización de los datos de [0, 255] a [0, 1]:

In [12]:
x_train, x_test = x_train / 255., x_test / 255.

A continuación particionamos los datos por lotes y los mezclamos:

In [13]:
train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_data = train_data.repeat().shuffle(5000).batch(batch_size).prefetch(1)

Construcción del módelo:

In [14]:
W = tf.Variable(tf.ones([num_features, num_classes]), name="weight")
b = tf.Variable(tf.zeros([num_classes]), name="bias")

Regresión logistica de (Wx + b):

In [15]:
def logistic_regression(x):
return tf.nn.softmax(tf.matmul(x, W) + b)

La función de costo en este caso sería:

In [16]:
def cross_entropy(y_pred, y_true):
y_true = tf.one_hot(y_true, depth=num_classes)
y_pred = tf.clip_by_value(y_pred, 1e-9, 0.9)
return tf.reduce_mean(-tf.reduce_sum(y_true * tf.math.log(y_pred) + (1 - y_true) * tf.math.log(1 - y_pred),1))

La medida que se usará para determinar la calidad del modelo será:

In [17]:
def accuracy(y_pred, y_true):
correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.cast(y_true, tf.int64))
return tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

Para entrenar el modelo, se utilizará el optimizador definido para el gradiente estocástico:

In [18]:
optimizer = tf.optimizers.SGD(learning_rate)
In [19]:
def run_optimization(x, y):
with tf.GradientTape() as g:
pred = logistic_regression(x)
loss = cross_entropy(pred, y)
gradients = g.gradient(loss, [W, b])
optimizer.apply_gradients(zip(gradients, [W, b]))

A continuación, se ejecuta el proceso de entrenamiento:

In [20]:
display_step = 50
for step, (batch_x, batch_y) in enumerate(train_data.take(training_steps), 1):
run_optimization(batch_x, batch_y)
if step % display_step == 0:
pred = logistic_regression(batch_x)
loss = cross_entropy(pred, batch_y)
acc = accuracy(pred, batch_y)
print('step: %i, loss: %f, accuracy: %f' % (step, loss, acc))
step: 50, loss: 2.691798, accuracy: 0.707031
step: 100, loss: 2.201120, accuracy: 0.742188
step: 150, loss: 1.926627, accuracy: 0.789062
step: 250, loss: 1.502035, accuracy: 0.812500
step: 200, loss: 1.788280, accuracy: 0.773438 step: 300, loss: 1.421701, accuracy: 0.812500
step: 450, loss: 1.242893, accuracy: 0.847656
step: 350, loss: 1.371978, accuracy: 0.847656 step: 400, loss: 1.382541, accuracy: 0.789062 step: 500, loss: 1.199832, accuracy: 0.839844
step: 700, loss: 0.882333, accuracy: 0.914062
step: 550, loss: 1.111963, accuracy: 0.855469 step: 600, loss: 1.156131, accuracy: 0.828125 step: 650, loss: 1.010465, accuracy: 0.871094 step: 750, loss: 1.011202, accuracy: 0.863281
step: 1000, loss: 1.057235, accuracy: 0.820312
step: 800, loss: 0.971723, accuracy: 0.855469 step: 850, loss: 1.082722, accuracy: 0.832031 step: 900, loss: 0.912813, accuracy: 0.875000
step: 950, loss: 0.927843, accuracy: 0.863281

Finalmente se valida el modelo y se visualizan los resultados:

In [21]:
pred = logistic_regression(x_test)
print("Test Accuracy: %f" % accuracy(pred, y_test))
Test Accuracy: 0.877100
In [22]:
n_images = 2
test_images = x_test[:n_images]
predictions = logistic_regression(test_images)
for i in range(n_images):
plt.imshow(np.reshape(test_images[i], [28, 28]), cmap='gray')
plt.show()
print("Model prediction: %i" % np.argmax(predictions.numpy()[i]))
Model prediction: 7
Model prediction: 2

Conclusiones

En esta ocasión se introduccido los aspectos generales de la regresión logistica multinomial como un modelo de clasificación:

  • La regresión logística multinomial se puede utilizar con dos clases (por ejemplo determinar si un sentimiento es positivo o negativo) o con múltiples clases (por ejemplo la clasificación de libros de acuerdo con un genero literario).
  • Se usa la función softmax para calcular probabilidades.

Bibliografía

Contacto

  • Participa de la canal de Nerve a través de Discord.
  • Se quieres conocer más acerca de este tema me puedes contactar a través de Classgap.

31 oct 2020

Álgebra lineal y redes neuronales

Las redes neuronales son modelos cuantitativos que aprende como asociar una «entrada» y una «salida» con el uso de algoritmos de aprendizaje. El objetivo aquí, será exponer cuatro conceptos principales del álgebra lineal que son esenciales para el análisis de estos modelos: 1) la proyección de un vector, 2) la descomposición por valores propios y singulares, 3) el gradiente de una matriz Hessiana de una función vectorial, y 4) la expansión en Taylor de una función vectorial. Estos conceptos son ilustrados con el análisis de las reglas de Hebbian y Widrow-Hoff y algunas arquitecturas simples de las redes neuronales (es decir, el auto asociador lineal, el heteroasociador y el error de redes por propagación regresiva). Se muestra también que las redes neuronales son equivalente a versiones iterativas de la estadística estándar y modelos de optimización tales como el análisis de regresión multiple y el análisis por componentes principales.

El álgebra lineal es usada particularmente para analizar la clase de redes neuronales denominadas «asociadores». Estos modelos de aprendizaje cuantitativo asocian una «entrada» y una «salida» mediante patrones adaptativos que hacen uso de algoritmos de aprendizaje. Cuando el conjunto de patrones de entrada es diferente del conjunto de salida, los modelos se denominan heteroasociadores. Cuando los patrones de entrada y los de salida son iguales, el modelo se denomina autoasociador. Los asociadores consisten de capas de unidades elementales denominadas neuronas. La información fluye a través de todas las capas. Algunas arquitecturas puede incluir capas intermedias (capas ocultas). Típicamente las neuronas de una capa están conectadas con las neuronas de otra capa. El objetivo será entender como algunas operaciones del álgebra lineal describe las transformaciones de la información a través de cada una de las capas.

Como es usual, los vectores serán representados por letras minúsculas (p. ej., $x$), las matrices por letras mayúsculas (p. ej.., $X$). Además se supone que las siguientes nociones son conocidas: La operación de transposición (p. ej., $x^\top$), la norma de un vector (p. ej.,$||x||$), el producto escalar ( p. ej., $x^{\top}w$) y el producto de dos matrices ( p. ej., $AB)$. También se usará el producto de Hadamard (p. ej., $A\odot B$).

Proyección de un vector

Coseno entre dos vectores

El coseno entre dos vectores $x$ y $y$ es el coseno del ángulo formado por el origen del espacio y los puntos definidos por las coordenadas de los vectores. Por lo tanto,

\begin{equation}\nonumber \cos(x, y) = \frac{x^\top y}{||x||||y||}. \end{equation}

El coseno indica la similaridad entre los vectores. Cuando dos vectores tienen la misma dirección (p. ej. $v=\lambda w, \lambda >0$), su coseno es igual a uno; si tienen dirección opuesta (p. ej. $v=\lambda w, \lambda <0$), su coseno es igual a menos uno; y cuando ellos son ortogonales (p. ej. $v^{\top}w=0$), su coseno es igual a cero.

Distancia entre vectores

Entre una gran familia de distancias entre vectores, la más popular es la distancia euclidiana. Ésta está relacionada con el coseno entre vectores y se define como

\begin{equation}\nonumber d_{2}(x,y)=\sqrt{(x-y)^\top(x-y)}=||(x-y)|| \end{equation}

Proyección de un vector sobre otro vector

La proyección ortogonal de un vector $x$ sobre un vector $w$ se define como:

\begin{equation}\nonumber \operatorname{proy}_{\langle w\rangle} x = \frac{x^{\top} w}{w^{\top}w}w. \end{equation}

La norma de $\operatorname*{proy}_{\langle w\rangle} x$ es su distancia al origen del espacio. Esto es igual a:

\begin{equation}\nonumber ||\operatorname{proy}_{\langle w\rangle} x||=\frac{|x^{\top}w|}{||w||}=|\cos(x,y)|||x||. \end{equation}

Las reglas de aprendizaje de Hebbian y Widrow-Hoff

Una red neuronal consiste de células conectadas a otras células vía conexiones de peso denominadas sinapsis. Considere una red neuronal de $m$ entradas dada por una capa de células y solo una célula de salida. La información es transmitida vía la sinapsis, del conjunto de entrada de las células externas a las células de salida con la respuesta correspondiente al estado de activación. Si el patrón de entrada y el conjunto de pesos sinápticos son dados por un vector $m$ - dimensional denotado por $x$, y $w$, la activación de la célula de salida es dada por

\begin{equation}\nonumber a = x^{\top}w. \end{equation}

Así la activación es proporcional a la norma de la proyección del vector de entradas sobre el vector de pesos. La respuesta o salida de la célula es denotada por $r$. Para una célula lineal, esta es proporcional a la activación (por conveniencia, se asume que la constante de proporcionalidad es igual a uno). Los heteroasociadores lineales y los autoasociadores son construidos con células lineales. En general, la salida de una célula es una función (no necesariamente continua), denominada la función de transferencia, y su activación es:

\begin{equation}\nonumber \label{eqn:función} r = f(a). \end{equation}

Por ejemplo, en redes de retropropagación, la función de transferencia (no lineal) suele ser la función logística

\begin{equation}\nonumber r = f(a) = \operatorname{logit}(w^{\top}x) = \frac{1}{1 + \exp(-w^{\top}x)}. \end{equation}

A menudo,una red neuronal está diseñada para asociar, a una entrada dada, una respuesta específica llamada objetivo, denotada como $t$. El aprendizaje es equivalente a definir una regla que especifique cómo agregar una pequeña cantidad a cada peso sináptico en cada iteración del algoritmo. El algoritmo acerca la salida de la red al objetivo.

Las reglas de aprendizaje vienen en dos sabores principales: supervisadas (p. ej. Widrow-Hoff) que tienen en cuenta el error o la distancia entre la respuesta de la neurona y el objetivo, y sin supervisión (p ej. Hebbian) que no requieren tal «retroalimentación». La regla de aprendizaje hebbiana modifica el vector de peso en la iteración $k + 1$ como

\begin{equation}\nonumber w_{k+1} = w_{k} + \eta t x, \end{equation}

donde $\eta$ es una pequeña constante positiva llamada constante de aprendizaje. Entonces, en cada iteración de la relgla aprendizaje hebbiana se mueve el vector de peso en la dirección del vector de entrada en una cantidad proporcional al objetivo.

La regla de aprendizaje de Widrow-Hoff utiliza el error y la derivada de la función de transferencia $f$ para calcular la corrección como:

\begin{equation}\nonumber \label{eqn:corrección} w_{k+1} = w_{k} + \eta (t-r_{k})f'(a_k)x. \end{equation}

Entonces, una iteración de aprendizaje de Widrow-Hoff mueve el vector de peso en la dirección del vector de entrada en una cantidad proporcional al error.

Para redes con varias celulas (p. ej. $n$) en la capa de salida, el patrón de activación, salida y objetivo se convierten en vectores $n$ - dimensionales (denotados $a$, $r$ y $t$, respectivamente), y los pesos sinápticos se almacenan en una matriz $W$ de dimensión $m \times n$. Las ecuaciones de aprendizaje se reescriben de la siguiente forma:

\begin{equation}\nonumber W_{k+1} = W_{k}+\eta x t^{\top}\hbox{(Hebbian)} \end{equation}
\begin{equation}\nonumber W_{k+1} = W_{k}+\eta(f'(a_{k})\odot x)(t- r_{k})^{\top} \hbox{ (Widrow-Hoff)}, \end{equation}

en donde la derivada $f'$ aplica sobre $a$ por cada componente, es decir, $f'(a)=(f'(a_{1}),\dots,f'(a_{n}))$.

En general, se deben aprender varias ($l$) asociaciones de entrada / destino. Luego, el conjunto de patrones de entrada se almacena en una matriz $m \times l$ denotada como $X$, los patrones de activación y objetivo respectivamente se almacenan en matrices de dimensión $n \times l$ indicadas como $A$ y $T$, respectivamente. Las iteraciones de activación y aprendizaje se pueden calcular para todos los patrones a la vez (esto se llama aprendizaje por lotes). La matriz de salida se calcula como:

\begin{equation}\nonumber r = f(A) = f(WX^{T}), \end{equation}

en donde $f$ también aplica sobre cada componente de $WX^{\top}$, es decir $f(WX^{\top})=[f([WX^{\top}]_{ij})]$.

Las ecuaciones de aprendizaje se convierten

\begin{equation}\tag{1} W_{k+1} = W_{k} + \eta X T^{\top} \hbox{ (Hebbian)}, \end{equation}

\begin{equation}\tag{2} W_{k+1} = W_{k} + \eta (f'(A_{k}) \odot X)(T- R_{k})^{\top} \hbox{ (Widrow-Hoff).} \end{equation}

Valores propios, vectores propios y la descomposición en valores singulares

Los vectores propios de una matriz cuadrada $W$ dada (resultante de su descomposición propia) son vectores invariantes bajo multiplicación por $W$. La descomposición propia se define mejor para una subclase de matrices llamadas matrices semi-definidas positivas. Una matriz $X$ es positiva semi-definida si existe otra matriz $Y$ tal que $X = YY^{\top}$. Este es el caso de la mayoría de las matrices utilizadas en redes neuronales, por lo que se considera solo este caso aquí.

Formalmente, un vector (distinto de cero) $u$ es un vector propio de una matriz cuadrada $W$ si

\begin{equation}\nonumber Wu = \lambda u. \end{equation}

El escalar $\lambda$ es el valor propio asociado con $u$. Entonces $u$ es un vector propio de $W$ si su dirección es invariante bajo la multiplicación por $W$ (solo su longitud cambia si $\lambda \neq 1$). En general, hay varios vectores propios para una matriz dada (como máximo, la dimensión de $W$). En general, se ordenan por orden decreciente de su valor propio. Entonces, el primer vector propio, $u_{1}$ tiene el mayor valor propio $\lambda_{1}$. El número de vectores propios con un valor propio distinto de cero es el rango de la matriz.

Los valores propios de las matrices semidefinidas positivas son siempre positivos o cero (una matriz con valores propios estrictamente positivos, es definida positiva). Además, cualquier par de vectores propios $u_i$, $u_j$, con valores propios diferentes, son ortogonales, es decir:

\begin{equation}\nonumber u_i^{\top} u_{j} = 0 \,\, \forall\,\, i \neq j. \end{equation}

Además, el conjunto de vectores propios de una matriz constituye una base ortogonal para los espacios fila y columna. Esto se expresa definiendo dos matrices, la matriz de vectores propios $U$, y la matriz diagonal de los valores propios $\Lambda$. Así la descomposición propia de $W$ (con rango $n$) es:

\begin{equation}\nonumber W = U \Lambda U^{\top}. \end{equation}

La descomposición de valores singulares (SVD) generaliza la descomposición propia en matrices rectangulares. Si $X$ es una matriz $m \times l$, su SVD se define como:

\begin{equation}\nonumber X = U \Delta V^{\top} \end{equation}

con $U U^{\top} = V^{\top} V = I$ y $\Delta$ una matriz diagonal ($I$ siendo la matriz identidad).

Los elementos diagonales de $\Delta$ son números reales positivos llamados valores singulares de $X$. Las matrices $U$ y $V$ son las matrices izquierda y derecha de vectores singulares (que también son vectores propios, ver más abajo).

El SVD está estrechamente relacionado con la descomposición propia porque $U$, $V$ y $\Delta$ pueden obtenerse a partir de la descomposición propia de las matrices $X^{\top} X$ y $X X^{\top}$ como

\begin{equation}\nonumber X^{\top} X = U \Lambda U^{\top},\,\, X X^{\top} = V \Lambda V^{\top},\hbox{ y } \Delta = \Lambda^{1/2}. \end{equation}

Tenga en cuenta que $X^{\top} X$ y $X X^{\top}$ tienen los mismos valores propios.

Las descomposiciones de valores propios y singulares se utilizan en la mayoría de los campos de las matemáticas aplicadas, incluidas las estadística, el procesamiento de imágenes, la mecánica y los sistemas dinámicos. Para las redes neuronales, son esenciales para estudiar la dinámica de los autoasociadores y heteroasociadores lineales.

Procesos iterativos

Un heteroasociador lineal que usa la regla de Widrow-Hoff, el aprendizaje modifica solo los valores propios de la matriz de peso. Específicamente, si los patrones a aprender se almacenan en una matriz $X$ de orden $m \times l$, con una descomposición de valores singulares como $X = U \Delta V^{\top}$, entonces la Ecuación 2 de la regla aprendizaje de Widrow-Hoff se convierte en

\begin{equation}\tag{3} W_{k+1} = W_{k} + \eta X(T - R_{k})^{\top} = U\Delta^{-1}[I - (I - \eta\Delta^2)^{n+1}] V^{\top} T^{\top}, \end{equation}

porque para un heteroasociador lineal $A_{k}=R_{k}$ y $f'(R_{k}) = I$. (ver Abdi, 1994, p.54 ff.).

La matriz de peso de Widrow-Hoff corresponde a la primera iteración del algoritmo, es decir,

\begin{equation}\nonumber W_{1} = U\Delta^{-1}[I - (I - \eta \Delta^2)] V^{\top} T^{\top} = \eta U \Delta V^{\top} T^{\top} = \eta X T^{\top}. \end{equation}

La ecuación Ecuación 3 caracteriza los valores de $\eta$ que permiten que el proceso iterativo converja. Denotando por $\delta_{max}$ el mayor valor singular de $X$, si $\eta$ es tal que:

\begin{equation}\tag{4} 0 < \eta < 2 \delta^{-2}_{max} \end{equation}

entonces se puede demostrar que (ver Abdi, 1994)

\begin{equation}\nonumber \lim_{n \to \infty}(I - \eta \Delta^{2})^{n} = 0 \end{equation}

y por lo tanto

\begin{equation}\nonumber \lim_{n \to \infty} W_{n} = U \Delta^{-1} V^{\top} T^{\top} = X^{+} T. \end{equation}

La matriz $X^{+} = U \Delta^{-1} V^{\top} $ es el pseudoinverso de $X$. Da una solución óptima de mínimos cuadrados para la asociación entre la entrada y el objetivo. Por lo tanto, el heteroasociador lineal es equivalente a la regresión múltiple lineal. Si $\eta$ está fuera del intervalo definido por la Ecuación 4, tanto los valores singulares como los elementos de la matriz de peso crecerán en cada iteración. En la práctica, debido a que las redes neuronales son simuladas por computadoras digitales, la matriz de peso eventualmente alcanzará los límites de la precisión de la máquina.

Cuando los vectores objetivo son los mismos que los vectores de entrada (es decir, cuando cada entrada está asociada a sí misma), el heteroasociador lineal se convierte en un autoasociador lineal. El enfoque anterior muestra que, ahora, la matriz Hebbiana de peso es la matriz de productos cruzados:

\begin{equation}\nonumber W_{1} = X X^{\top} = U \Lambda U^{\top}. \end{equation}

Con el aprendizaje de Widrow-Hoff, cuando se alcanza la convergencia, todos los valores propios distintos de cero de la matriz de peso son iguales a 1. La matriz de peso se dice que es esférica; esto es igual a:

\begin{equation}\nonumber W_{\infty} = U U^{\top}. \end{equation}

Debido a que la técnica estadística del análisis de componentes principales (PCA) calcula la descomposición propia de una matriz de productos cruzados similar a $W$, el autoasociador lineal se considera como la red neuronal equivalente de PCA.

Optimización, Derivadas y Matrices

Las redes neuronales se utilizan a menudo para optimizar una función de los pesos sinápticos. La diferenciación de una función es el concepto principal para explorar problemas de optimización y, para redes neuronales, implica la diferenciación de vectores o funciones matriciales. En este contexto, debemos considerar la función de transferencia como una función del vector de peso. Esto es:

\begin{equation}\nonumber r = f(w). \end{equation}

La derivada de $f(w)$ con respecto al vector $w$ de $m$ - dimensional se denota por $\nabla f (w)$. También se llama el gradiente de $f$, es decir,

\begin{equation}\nonumber \nabla f(w) = \frac{\partial f}{\partial w} = \left[\frac{\partial f}{\partial w_{1}},..., \frac{\partial f}{\partial w_{i}},..., \frac{\partial f}{\partial w_{I}} \right]^{\top}. \end{equation}

Por ejemplo, la derivada de la salida de una neurona lineal es

\begin{equation}\nonumber \frac{\partial f}{\partial w} = \left[\frac{\partial w^{\top} x}{\partial w_{1}},\dots, \frac{\partial w^{\top} x}{\partial w_{m}} \right]^{\top} = [x_{1},\dots, x_{m}]^{\top} = x. \end{equation}

Cuando una función es dos veces diferenciable, las derivadas de segundo orden se almacenan en una matriz llamada matriz Hessiana de la función. A menudo se denota por $\nabla^{2}(f)$ (recuerde que $\nabla^{2}(f) = [\nabla\nabla^{\top}](f)$) y se define formalmente como

\begin{equation}\nonumber \nabla^{2}(f) = \left[\begin{array}{cccc} \frac{\partial^{2}_{f}}{\partial w^{2}_{1}} & \frac{\partial^{2}_{f}}{\partial w_{1} w_{2}} & \cdots & \frac{\partial^{2}_{f}}{\partial w_{1} w_{m}} \\ \frac{\partial^{2}_{f}}{\partial w_{2} w_{1}} & \frac{\partial^{2}_{f}}{\partial w^{2}_{2}} & \cdots & \frac{\partial^{2}_{f}}{\partial w_{2} w_{m}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^{2}_{f}}{\partial w_{I}w_{1}} & \frac{\partial^{2}_{f}}{\partial w_{I}w_{2}} & \cdots & \frac{\partial^{2}_{f}}{\partial w^{2}_{m}}. \end{array} \right]. \end{equation}

Condiciones para mínimo

Un problema estándar es mostrar que una regla de aprendizaje dada encuentra una solución óptima en el sentido de que una función del vector de peso (o matriz) llamada función de error alcanza su valor mínimo cuando el aprendizaje ha convergido. A menudo, la función de error se define como la suma del error al cuadrado sobre todos los patrones.

Cuando se puede evaluar el gradiente de la función de error, una condición necesaria para la optimización (es decir, mínimo o máximo) es encontrar un vector de peso $w^{*}$ tal que

\begin{equation}\nonumber \nabla f (w^{*}) = 0. \end{equation}

Esta condición también es suficiente siempre que $\nabla^{2}(f)$ sea definida positiva (cf. Haykin, 1999).

Expansión de Taylor

La expansión de Taylor es la técnica estándar utilizada para obtener una aproximación lineal o cuadrática de una función de una variable. Recuerde que la expansión de Taylor de una función continua $f(x)$ es

\begin{equation}\nonumber f(x) = \sum_{n=0}^{\infty}(x-a)^{n}\frac{f^{(n)}(a)}{n!} = f(a) +(x-a)\frac{f'(a)}{1!} + (x-a)^{2} \frac{f''(a)}{2!} + \mathcal{R}_{2}, \end{equation}

en donde $\mathcal{R}_{2}$ representa todos los términos de orden superior a 2, y $a$ es un valor «conveniente» para evaluar $f$.

Esta técnica puede extenderse a funciones de matrices y vectores. Implica la noción de gradiente y de Hessiano. Ahora para una función vectorial $f(x)$ se expresa como:

\begin{equation}\nonumber f(x) = f(a) + f(x - a)^{\top}\nabla f(a) + f(x - a)^{\top} \nabla^{2}f(a)f(x - a) + \mathcal{R}_{2}. \end{equation}

Minimización iterativa

Se puede demostrar que una regla de aprendizaje converge a un valor óptimo si disminuye el valor de la función de error en cada iteración. Cuando se puede evaluar el gradiente de la función de error, la técnica de gradiente (o descenso más pronunciado) ajusta el vector de peso moviéndolo en la dirección opuesta al gradiente de la función de error. Formalmente, la corrección para la iteración $(k + 1)$ es

\begin{equation}\nonumber w_{k+1} = w_{k} + \nabla = w_{k} - \eta \nabla f(w_k) \end{equation}

Como ejemplo, demostremos que para un heteroasociador lineal, la regla de aprendizaje de Widrow-Hoff minimiza iterativamente el error al cuadrado entre el objetivo y la salida. La función de error es

\begin{equation}\nonumber e^{2} = (t-r)^{2} = t^{2} + r^{2} - 2tr = t^{2} + x^{\top}w w^{\top} -2tw^{\top}x. \end{equation}

El gradiente de la función de error es:

\begin{equation}\nonumber \frac{\partial e}{\partial w} = 2(w^{\top} x)x - 2t x = -2(t - w^{\top} x) x. \end{equation}

El vector de peso se corrige moviéndose en la dirección opuesta del gradiente. Esto proporciona la siguiente corrección para la iteración $k + 1$:

\begin{equation}\nonumber w_{k+1} = w_{k} - \eta \frac{\partial e}{\partial w} = w_{k} + \eta (t-w^{\top}_{k}x)x = w_{k} + \eta(t-o_{k})x. \end{equation}

Esto da la regla de aprendizaje de Widrow-Hoff en su expresión más simple.

El método de gradiente funciona porque el gradiente de $w_{n}$ es una aproximación de Taylor de primer orden del gradiente del vector de peso óptimo $w^{*}$. Es una técnica favorita en las redes neuronales porque el error de propagación posterior popular es una técnica de gradiente.

El método de Newton es una aproximación de Taylor de segundo orden, utiliza el inverso del hessiano de $w$ (suponiendo que exista). Proporciona una mejor aproximación numérica pero requiere más cómputo. Aquí la corrección para la iteración $k + 1$ es

\begin{equation}\nonumber w_{k+1} = w_{k} - [\nabla^{2}f(w_{k})]^{-1} \nabla_{f(w_{k})}. \end{equation}

Referencias

  • Hervé Abdi. 2001. Linear Algebra for Neural Networks.
  • Hervé Abdi et al. 1999. Neural networks. Thousand Oak.

Contacto

  • Participa de la canal de Nerve a través de Discord.
  • Se quieres conocer más acerca de este tema me puedes contactar a través de Classgap.