Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
clase:iabd:pia:2eval:tema07.backpropagation_descenso_gradiente [2024/02/22 12:13] admin [Ejercicios] |
clase:iabd:pia:2eval:tema07.backpropagation_descenso_gradiente [2025/01/22 18:28] (actual) admin [Ejercicios] |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ====== 7. Entrenamiento de redes neuronales | + | ====== 7.b Descenso de gradiente ====== |
El Descenso de gradiente es el algoritmo que usamos para entrenar la red neuronal. | El Descenso de gradiente es el algoritmo que usamos para entrenar la red neuronal. | ||
Línea 26: | Línea 26: | ||
$$ | $$ | ||
\large loss(x, | \large loss(x, | ||
+ | $$ | ||
+ | |||
+ | $$ | ||
+ | loss(x, | ||
$$ | $$ | ||
Línea 126: | Línea 130: | ||
La siguiente imagen ilustra la idea. | La siguiente imagen ilustra la idea. | ||
{{ : | {{ : | ||
+ | |||
+ | Y podemos jugar con un simulador de descenso de gradiente en [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | Y ver un video de como funciona en [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
¿Como hacemos eso matemáticamente? | ¿Como hacemos eso matemáticamente? | ||
Línea 147: | Línea 160: | ||
<note tip>En el contexto del descenso de gradiente no se suele hablar que el resultado de la fórmula es la derivada sino el gradiente. Ya que para eso estamos en el //descenso de gradente//</ | <note tip>En el contexto del descenso de gradiente no se suele hablar que el resultado de la fórmula es la derivada sino el gradiente. Ya que para eso estamos en el //descenso de gradente//</ | ||
+ | |||
+ | Para entender la derivada podemos usar estos 2 recursos de Gecebra: | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
Línea 454: | Línea 471: | ||
Que genera la siguiente gráfica | Que genera la siguiente gráfica | ||
- | {{ : | + | {{ : |
Línea 464: | Línea 481: | ||
</ | </ | ||
+ | ==== Optimizadores de Keras ==== | ||
+ | | ||
+ | |||
+ | <sxh python> | ||
+ | def loss_tf(w_0, | ||
+ | return | ||
+ | |||
+ | def get_puntos_descenso_gradiente_optimizer(epochs, | ||
+ | |||
+ | puntos_descenso_gradiente=np.array([[w_0_init, | ||
+ | |||
+ | w_0=w_0_init | ||
+ | w_1=w_1_init | ||
+ | for epoch in range(epochs): | ||
+ | var_w_0=tf.Variable(w_0) | ||
+ | var_w_1=tf.Variable(w_1) | ||
+ | |||
+ | optimizer_function.minimize(lambda: | ||
+ | optimizer_function.minimize(lambda: | ||
+ | |||
+ | w_0=var_w_0.numpy() | ||
+ | w_1=var_w_1.numpy() | ||
+ | |||
+ | puntos_descenso_gradiente=np.append(puntos_descenso_gradiente, | ||
+ | |||
+ | return puntos_descenso_gradiente | ||
+ | </ | ||
+ | |||
+ | Lo que ha cambiado principalmente es la función '' | ||
+ | |||
+ | |||
+ | Si usamos '' | ||
+ | <sxh python> | ||
+ | get_puntos_descenso_gradiente_optimizer(5, | ||
+ | </ | ||
+ | <sxh base> | ||
+ | array([[-0.35 | ||
+ | | ||
+ | | ||
+ | [ 0.06544246, -1.06462073], | ||
+ | [ 0.24086528, -1.40752137], | ||
+ | [ 0.26578248, -1.59573841]]) | ||
+ | </ | ||
+ | Vamos que el resultado es prácticamente el mismo que cuando lo hicimos manualmente. | ||
+ | |||
+ | Y podemos generar de la misma forma el gráfico: | ||
+ | <sxh python> | ||
+ | figure=plt.figure(figsize=(16, | ||
+ | axes = figure.add_subplot() | ||
+ | plot_loss_function(axes) | ||
+ | |||
+ | plot_descenso_gradiente(axes, | ||
+ | </ | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | Y obviamente el resultado es el mismo | ||
==== Learning rate y epochs ==== | ==== Learning rate y epochs ==== | ||
Línea 476: | Línea 551: | ||
- | {{ : | + | {{ : |
Línea 488: | Línea 563: | ||
- | {{ : | + | {{ : |
El valor de '' | El valor de '' | ||
Línea 500: | Línea 575: | ||
</ | </ | ||
- | {{ : | + | {{ : |
Vemos que al dar //pasos// tan pequeños nos quedamos a mitad de camino y eso que también hemos puesto 11 épocas. En este caso para solucionarlo solo habría que aumentar el número de épocas. | Vemos que al dar //pasos// tan pequeños nos quedamos a mitad de camino y eso que también hemos puesto 11 épocas. En este caso para solucionarlo solo habría que aumentar el número de épocas. | ||
Línea 510: | Línea 585: | ||
</ | </ | ||
- | {{ : | + | {{ : |
Y ahora ya ha llegado hasta el mínimo. | Y ahora ya ha llegado hasta el mínimo. | ||
Línea 530: | Línea 605: | ||
- | {{ : | + | {{ : |
Esta última gráfica es muy interesante. No hay que perder de vista que las **estrellas rojas** es el valor inicial de los pesos que tenemos en nuestra red neuronal. | Esta última gráfica es muy interesante. No hay que perder de vista que las **estrellas rojas** es el valor inicial de los pesos que tenemos en nuestra red neuronal. | ||
Línea 547: | Línea 622: | ||
Para intentar solventar los problemas del algoritmo del descenso de gradiente existen diversas variaciones del mismo que vamos a ver en el siguiente apartado. | Para intentar solventar los problemas del algoritmo del descenso de gradiente existen diversas variaciones del mismo que vamos a ver en el siguiente apartado. | ||
+ | ==== Punto de silla ==== | ||
+ | Al entrenar redes neuronales, existe el concepto de "Punto de silla" | ||
+ | Es un punto en el que para cada parámetro estaría en un mínimo o máximo local. | ||
+ | Su nombre viene de que parece una silla de montar a caballo. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | No debe preocuparnos los puntos de silla ya que al actualizar los parámetros, | ||
===== Usando optimizadores en Keras ===== | ===== Usando optimizadores en Keras ===== | ||
Línea 777: | Línea 860: | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
- | * [[https:// | + | * [[https:// |
+ | |||
+ | ===== Backpropagation ===== | ||
+ | El Backpropagation es el algoritmo que optimiza el entrenamiento de la red. Calcular el gradiente (o derivada) de toda la red es muy costoso. Se basa en la idea de que los parámetros de una capa no dependen de la capa anterior. | ||
+ | |||
+ | |||
+ | Si volvemos a ver nuestra red neuronal de ejemplo, podemos calcular los pesos de la neurona 5 sin que influya en como van a ser los pesos de las neuronas 2, 3 y 4. Es decir que empezamos con las neuronas de las capas más hacía la salida y una vez calculados sus pesos , calculamos los parámetros de las capa anterior (más hacia la entrada) , y eso significa ir hacia atrás o // | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Con backpropagation acabamos de ver el orden en el que se calculan los parámetros de cada neurona y a continuación vamos a ver con el descenso de gradiente como calculamos los parámetros de una neurona. | ||
+ | |||
+ | Junto con el backpropagation | ||
+ | |||
+ | En los siguientes videos está explicado perfectamente el backpropagation y la //chain rule//: | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
===== Hardware entrenamiento ===== | ===== Hardware entrenamiento ===== | ||
Línea 997: | Línea 1102: | ||
<sxh python> | <sxh python> | ||
- | parametros=[(-0.3, | + | parametros=[(-0.3, |
plot_parametros(x, | plot_parametros(x, | ||
</ | </ | ||
- | Que muestra la siguiente | + | Que muestra la siguiente |
{{: | {{: | ||
- | Esta gráfica | + | Cada par de valores del array '' |
- | Mientras que en verde se muestra los valores que harían mínima cada ua de las funciones '' | + | |
+ | En las 2 primeras gráficas se muestra en rojo que con los valores de '' | ||
+ | Mientras que en verde se muestra los valores que harían mínima cada una de las funciones '' | ||
+ | Y así sucesivamente con el resto de parámetros | ||
+ | |||
+ | En las últimas gráficas se muestra a la izquierda cada uno de los " | ||
Modifica el array '' | Modifica el array '' |