Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:2eval:tema07.backpropagation_descenso_gradiente

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

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/14 14:45]
admin [Matemáticas en el descenso de gradiente]
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,y,parametros)=\frac{1}{N} \sum_{i=1}^{N}|y_i-\frac{1}{1 + e^{-(  w_{5,2}\frac{1}{1 + e^{-( w_{2}x_i+b_{2}  )}}+w_{5,3}\frac{1}{1 + e^{-( w_{3}x_i+b_{3}  )}}+w_{5,4}\frac{1}{1 + e^{-( w_{4}x_i+b_{4}  )}}+b_5 )}}|     \large loss(x,y,parametros)=\frac{1}{N} \sum_{i=1}^{N}|y_i-\frac{1}{1 + e^{-(  w_{5,2}\frac{1}{1 + e^{-( w_{2}x_i+b_{2}  )}}+w_{5,3}\frac{1}{1 + e^{-( w_{3}x_i+b_{3}  )}}+w_{5,4}\frac{1}{1 + e^{-( w_{4}x_i+b_{4}  )}}+b_5 )}}|    
 +$$
 +
 +$$
 +loss(x,y,parametros)=loss(x,y,w_{2} , w_{3} , w_{4} , w_{5,2} , w_{5,3} , w_{5,4} , b_{4} , b_{2} , b_{3} , b_5)
 $$ $$
  
Línea 156: 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> <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>
 +
 +Para entender la derivada podemos usar estos 2 recursos de Gecebra:
 +  * [[https://www.geogebra.org/classic/kspgbec4|Pendiente de una recta]]: La pendiente es el valor de las derivada.
 +  * [[https://www.geogebra.org/m/zfg8nxt6|Cálculo gráfico de derivadas]]: Se puede ver la derivada (pendiente) en cada punto de una curva
  
  
Línea 463: Línea 471:
 Que genera la siguiente gráfica Que genera la siguiente gráfica
  
-{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_1.png?direct&700 |}}+{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_1.png?direct&500 |}}
  
  
Línea 473: Línea 481:
 </note> </note>
  
 +==== Optimizadores de Keras ====
 + Podemos mejorar nuestro código en Python haciendo que podamos usar directamente los [[https://keras.io/api/optimizers/|Optimizers]] de Keras y de esa forma ver como funciona cada uno de ellos. Para poder usarlos directamente vamos a creas las nuevas funciones ''loss_tf'' y ''get_puntos_descenso_gradiente_optimizer'' adecuadas a TensorFlow y Keras.
  
 +
 +<sxh python>
 +def loss_tf(w_0,w_1):
 +    return  3*(1 - w_0)**2 * tf.exp(-w_0**2 - (w_1 + 1)**2)  - 10*(w_0/5 - w_0**3 - w_1**5)*tf.exp(-w_0**2 - w_1**2) - 1./3*tf.exp(-(w_0 + 1)**2 - w_1**2) 
 +
 +def get_puntos_descenso_gradiente_optimizer(epochs,optimizer_function,w_0_init,w_1_init):
 +
 +    puntos_descenso_gradiente=np.array([[w_0_init,w_1_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: loss_tf(var_w_0,w_1),  var_list=[var_w_0])
 +        optimizer_function.minimize(lambda: loss_tf(w_0,var_w_1),  var_list=[var_w_1])
 +
 +        w_0=var_w_0.numpy()
 +        w_1=var_w_1.numpy()      
 +
 +        puntos_descenso_gradiente=np.append(puntos_descenso_gradiente,[[w_0,w_1]], axis=0)           
 +
 +    return puntos_descenso_gradiente
 +</sxh>
 +
 +Lo que ha cambiado principalmente es la función ''get_puntos_descenso_gradiente_optimizer''  no hace cálculo  del gradiente (derivada) ni actualiza los parámetros, sino que llama a la función de Keras de optimización.
 +
 +
 +Si usamos ''get_puntos_descenso_gradiente_optimizer'' ahora con ''tf.keras.optimizers.SGD''
 +<sxh python>
 +get_puntos_descenso_gradiente_optimizer(5,tf.keras.optimizers.SGD(learning_rate=0.03),-0.35,-0.67)
 +</sxh>
 +<sxh base>
 +array([[-0.35      , -0.67      ],
 +       [-0.269319  , -0.72470832],
 +       [-0.13292952, -0.83883744],
 +       [ 0.06544246, -1.06462073],
 +       [ 0.24086528, -1.40752137],
 +       [ 0.26578248, -1.59573841]])
 +</sxh>
 +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,15))
 +axes = figure.add_subplot()
 +plot_loss_function(axes)
 +
 +plot_descenso_gradiente(axes,get_puntos_descenso_gradiente_optimizer(5,tf.keras.optimizers.SGD(learning_rate=0.03),-0.35,-0.67))
 +</sxh>
 +
 +
 +{{ :clase:iabd:pia:2eval:optimizer_sgd.png?direct&500 |}}
 +
 +Y obviamente el resultado es el mismo
  
 ==== Learning rate y epochs ==== ==== Learning rate y epochs ====
Línea 485: Línea 551:
  
  
-{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_2.png?direct&700 |}}+{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_2.png?direct&500 |}}
  
  
Línea 497: Línea 563:
  
  
-{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_4.png?direct&700 |}}+{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_4.png?direct&500 |}}
  
 El valor de ''learning_rate'' es mayor aun , siendo de ''0.1'' por lo que damos //pasos// tan grandes que nos salimos de mínimo de la función y eso que hemos pasado de 5 épocas a 11 épocas.  El valor de ''learning_rate'' es mayor aun , siendo de ''0.1'' por lo que damos //pasos// tan grandes que nos salimos de mínimo de la función y eso que hemos pasado de 5 épocas a 11 épocas. 
Línea 509: Línea 575:
 </sxh> </sxh>
  
-{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_5.png?direct&700 |}}+{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_5.png?direct&500 |}}
  
 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 519: Línea 585:
 </sxh> </sxh>
  
-{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_6.png?direct&700 |}}+{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_6.png?direct&500 |}}
  
 Y ahora ya ha llegado hasta el mínimo. Y ahora ya ha llegado hasta el mínimo.
Línea 539: Línea 605:
  
  
-{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_3.png?direct&700 |}}+{{ :clase:iabd:pia:2eval:descenso_gradiente_algoritmo_vanilla_3.png?direct&500 |}}
  
 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 556: 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.
 +
 +{{:clase:iabd:pia:2eval:punto_de_silla.png?500|}}
 +
 +No debe preocuparnos los puntos de silla ya que al actualizar los parámetros, la "forma" de la función de coste cambiará y lo fácil es que se salga del punto de silla.
  
 ===== Usando optimizadores en Keras  ===== ===== Usando optimizadores en Keras  =====
Línea 1028: Línea 1102:
  
 <sxh python> <sxh python>
-parametros=[(-0.3,0.1)]+parametros=[(-0.3,0),(0.1,-0.2),(0.4,-0.4),(0.8,-2)]
 plot_parametros(x,y_true,parametros) plot_parametros(x,y_true,parametros)
 </sxh> </sxh>
  
-Que muestra la siguiente gráfica:+Que muestra la siguiente figura:
  
 {{:clase:iabd:pia:2eval:tema_7_ejer_3_salida.png|}} {{:clase:iabd:pia:2eval:tema_7_ejer_3_salida.png|}}
  
-Esta gráfica muestra en rojo que con los valores de ''w=-0.3'' y ''b=0.1'' el valor de la pérdida de la red es 0.59. ''loss=0.59''.  +Cada par de valores del array ''parametros'' son los parámetros en cada una de las épocas. 
-Mientras que en verde se muestra los valores que harían mínima cada ua de las funciones ''w=0.55'' y ''b=-4''.+ 
 +En las 2 primeras gráficas se muestra en rojo que con los valores de ''w=-0.3'' y ''b=0'' el valor de la pérdida de la red es 0.58. ''loss=0.50''.  
 +Mientras que en verde se muestra los valores que harían mínima cada una de las funciones ''w=0.56'' y ''b=-5''.  
 +Y así sucesivamente con el resto de parámetros 
 + 
 +En las últimas gráficas se muestra a la izquierda cada uno de los "loss" que ha habido en cada "época" y a la derecha como han evolucionado los parámetros en cada "época".
  
 Modifica el array ''parametros'' añadiendo mas pares de valores de ''w'' y ''b'' para ver si consigues obtener un valor de ''loss'' lo más cercano a 0 que sea posible. Deberás ir modificando poco a poco los valores de ''w'' y ''b''. Modifica el array ''parametros'' añadiendo mas pares de valores de ''w'' y ''b'' para ver si consigues obtener un valor de ''loss'' lo más cercano a 0 que sea posible. Deberás ir modificando poco a poco los valores de ''w'' y ''b''.
Línea 1120: Línea 1199:
   * Función de activación de las capas ocultas: ''selu''   * Función de activación de las capas ocultas: ''selu''
  
-Prueba únicamente con **épocas** con todas las combinaciones de lo siguiente:+Prueba únicamente con **20 épocas** con todas las combinaciones de lo siguiente:
  
   * Optimizadores   * Optimizadores
clase/iabd/pia/2eval/tema07.backpropagation_descenso_gradiente.1728909954.txt.gz · Última modificación: 2024/10/14 14:45 por admin