Redes neuronales
https://commons.wikimedia.org/wiki/File:Colored_neural_network.svg
\(x_1, x_2, \cdots\) son las entradas
\(y_1, y_2, \cdots\) son las salidas
\(w_{11}, w_{12}, \cdots\) son los
Se calcula \(\displaystyle b_1 = w_{11} x_1 + w_{21} x_2 + w_{31} x_3 + \cdots\)
Y luego \(y_1 = f ( b_1 )\)
\(f\) es la llamada
Denotamos \(\mathbf x = (x_1, \cdots, x_p)\), \(\mathbf y = (y_1, \cdots, y_q)\), \(\mathbf W = (w_{11}, w_{12}, \cdots )\)
Se pueden hacer redes
de varias capas:
la salida de una
es la entrada de la otra.
Si tenemos muchos pares de entradas y sus respectivas salidas
\[ \widehat{\mathbf y_i} = F(\mathbf x_i, \mathbf W) \]
Buscar los mejores pesos \(\mathbf W\) se llama
entrenar la red
Hay muchas generalizaciones de esta idea: redes profundas (muchas capas), redes convolucionales, …
¿Cómo de potente es esto? Vídeo de Google DeepMind
Al algoritmo para, dados los pesos y la entrada calcular la salida se lo llama forward propagation.
Se separan los datos en un conjunto de entrenamiento y conjunto de pruebas
Para ajustar la red tenemos que elegir una función de pérdida \(d({\mathbf y}, \widehat{\mathbf y})\). Por ejemplo \(|{\mathbf y} - \widehat{\mathbf y}|^2\).
A partir de ella elegimos una función de coste, que tenga en cuenta todos las pérdidas. Por ejemplo el error cuadrático medio \[ J(W) = \frac{1}{N} \sum_{i=1}^N |{\mathbf y_i} - \widehat{\mathbf y_i}|^2 \]
Así:
Hay múltiples opciones para la elección de función de coste y hacer la optimización eficientemente es gran parte de la dificultad.
Para optimizar se utilizan múltiples procedimientos.
El ejemplo más sencillo es el descenso por gradiente \[ W_{n+1} = W_n - \gamma \Delta J (W_n). \]
Para calcular \(\nabla J\) se emplea la regla de cadena. A este proceso lo llama back-progation.
Flux es una de las mejores librerías de ML en Julia.