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/10/12 15:11] admin [Hardware entrenamiento] |
clase:iabd:pia:2eval:tema07.backpropagation_descenso_gradiente [2025/01/22 18:28] (actual) admin [Ejercicios] |
||
---|---|---|---|
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 1019: | 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 '' | ||
Línea 1111: | Línea 1199: | ||
* Función de activación de las capas ocultas: '' | * Función de activación de las capas ocultas: '' | ||
- | Prueba únicamente con **5 épocas** con todas las combinaciones de lo siguiente: | + | Prueba únicamente con **20 épocas** con todas las combinaciones de lo siguiente: |
* Optimizadores | * Optimizadores |