Código de Python - Ejercicio_Aula_23_Momentum

Imágen de perfil

Ejercicio_Aula_23_Momentumgráfica de visualizaciones


Python

Publicado el 26 de Octubre del 2023 por Hilario (123 códigos)
270 visualizaciones desde el 26 de Octubre del 2023
python3 Ejercicio_Aula_23_Momentum.py

Sencillo ejercicio sobre un descenso de gradiente con momento, (Gradient Descent with Momentum en inglés).
Se trata de aplicar este algoritmo a una funcion parabolica del tipo: f(x) = x^2 / 6.
Cuya derivada es:x**2 / 6.
El descenso de gradiente con momento es una variante del algoritmo de descenso de gradiente utilizado en la optimización y entrenamiento de modelos de aprendizaje automático, particularmente en el contexto de redes neuronales y problemas de optimización no convexos. Su objetivo es acelerar la convergencia del descenso de gradiente y ayudar a evitar quedarse atrapado en óptimos locales.

La principal diferencia entre el descenso de gradiente con momento y el descenso de gradiente estándar es la adición de un término de "momentum" o impulso. En el descenso de gradiente estándar, en cada iteración, el gradiente actual se utiliza directamente para actualizar los parámetros del modelo. En cambio, en el descenso de gradiente con momento, se mantiene un promedio ponderado exponencial de los gradientes anteriores y se utiliza ese promedio para actualizar los parámetros.

El objetivo del término de momento es suavizar las actualizaciones de los parámetros y reducir las oscilaciones que pueden ocurrir cuando el gradiente varía significativamente en diferentes direcciones. Esto puede ayudar a acelerar la convergencia y a sortear barreras o mínimos locales en la función de costo

En este sencillo ejercicio que propongo, en vez de utilizar datos sintéticos de caráctear aleatorio de entrada, lo vamos a aplicar a una función parabólica.


descarga
descarga-1

Requerimientos

Este ejercicio fue realizado y ejecutado en una plataforma Linux, Ubuntu 20.04.6 LTS.
Editado co Sublime Text.
Para la importaciones se deberán tener cargadas los módulos:
import numpy as np
import matplotlib.pyplot as plt

***********************************************************************************************
Ejecutar en consola Linux con este comando:.
python3 Ejercicio_Aula_23_Momentum.py

Versión 1.0

Publicado el 26 de Octubre del 2023gráfica de visualizaciones de la versión: Versión 1.0
271 visualizaciones desde el 26 de Octubre del 2023
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
"""
Ejercicio_Aula_23_Momentum.py
*****************************
Ejecucion en consola Linux.
--------------------------
python3 Ejercicio_Aula_23_Momentum.py
"""
 
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(-10, 30, 100)
# Función f(x) = x^2 / 6
def f(x):
    return x**2 / 6
 
# Derivada de f(x)
def df(x):
    return x / 3
 
# Parámetros
alpha = 0.1  # Tasa de aprendizaje
beta = 0.9   # Tasa de momentum
x = 18       # Valor inicial de x
iterations = 100
 
# Listas para almacenar los valores de x y los costos
x_values = [x]
costs = [f(x)]
velocidad=[]
# Descenso de gradiente con momentum
v = 0  # Inicializamos la velocidad a cero
 
for _ in range(iterations):
    gradient = df(x)  # Utilizamos la derivada de f(x)
    v = beta * v + (1 - beta) * gradient
    x = x - alpha * v
    x_values.append(x)
    costs.append(f(x))
    velocidad.append(v)
# Graficar la parábola
x_range = np.linspace(-10, 30, 400)
y = f(x_range)
 
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(x_range, y, label='f(x) = x^2 / 6', color='b')
plt.scatter(x_values, [f(val) for val in x_values], c='r', label='Descenso de Gradiente')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Parábola y Descenso de Gradiente')
plt.legend()
 
# Graficar el costo (MSE)
iteration_numbers = range(iterations + 1)
 
plt.subplot(1, 2, 2)
plt.plot(iteration_numbers, costs, color='black',marker='o',markerfacecolor='red', linestyle='-')
plt.xlabel('Iteración')
plt.ylabel('Costo (MSE)')
plt.title('Descenso de Gradiente de Costos')
plt.grid(True)
 
print("*******************************")
print("Historial de Velocidades:")
for index, mivelocidad in enumerate(velocidad):
  print(f'Iteración {index}:{mivelocidad}')
print("*******************************")
 
 
plt.tight_layout()
plt.show()
plt.plot(range(iterations), velocidad, color='black', marker='o', markerfacecolor='red', linestyle='-')
plt.xlabel('Iteración')
plt.ylabel('Velocidad')
plt.title('Velocidad de descenso con momentum')
plt.grid(True)
plt.show()
 
"""
Esta salida, imprimida por consola,
muestra la progresión de los valores de
la velocidad de descenso.
*******************************
Historial de Velocidades:
Iteración 0:0.5999999999999999
Iteración 1:1.138
Iteración 2:1.6184066666666665
Iteración 3:2.0453779777777776
Iteración 4:2.4228342311851847
Iteración 5:2.754468745147901
Iteración 6:3.043758245230519
Iteración 7:3.29397293448744
Iteración 8:3.5081862450370442
Iteración 9:3.689284270381565
Iteración 10:3.8399748789570283
Iteración 11:3.9627965104117546
Iteración 12:4.060126657019636
Iteración 13:4.134190033443331
Iteración 14:4.187066438779845
Iteración 15:4.220698315453442
Iteración 16:4.2368980100748335
Iteración 17:4.23735474186717
Iteración 18:4.223641284674049
Iteración 19:4.197220368917994
Iteración 20:4.159450810174484
Iteración 21:4.11159337127141
Iteración 22:4.054816365021072
Iteración 23:3.9902010048456975
Iteración 24:3.918746510671708
Iteración 25:3.8413749775462116
Iteración 26:3.7589360144747777
Iteración 27:3.6722111609955714
Iteración 28:3.5819180889943008
Iteración 29:3.488714597229843
Iteración 30:3.3932024059843977
Iteración 31:3.2959307591768825
Iteración 32:3.1973998411861957
Iteración 33:3.0980640155239567
Iteración 34:2.998334892376195
Iteración 35:2.898584231901956
Iteración 36:2.7991466900354673
Iteración 37:2.700322413388843
Iteración 38:2.602379489695585
Iteración 39:2.5055562600726673
Iteración 40:2.410063499211799
Iteración 41:2.3160864694396452
Iteración 42:2.223786854413241
Iteración 43:2.1333045780414333
Iteración 44:2.044759514046668
Iteración 45:1.9582530914045568
Iteración 46:1.8738698007219752
Iteración 47:1.7916786064385786
Iteración 48:1.7117342695620597
Iteración 49:1.6340785854746522
Iteración 50:1.5587415411777368
Iteración 51:1.4857423961732537
Iteración 52:1.4150906910153083
Iteración 53:1.3467871874031063
Iteración 54:1.2808247435274474
Iteración 55:1.2171891282275964
Iteración 56:1.1558597773636383
Iteración 57:1.0968104956615308
Iteración 58:1.0400101071440955
Iteración 59:0.9854230571212568
Iteración 60:0.9330099685769644
Iteración 61:0.8827281556585113
Iteración 62:0.8345320968463751
Iteración 63:0.788373870259298
Iteración 64:0.7442035534300642
Iteración 65:0.7019695897723203
Iteración 66:0.6616191238477763
Iteración 67:0.6230983074361942
Iteración 68:0.5863525783076496
Iteración 69:0.5513269134976008
Iteración 70:0.5179660587902314
Iteración 71:0.4862147360242982
Iteración 72:0.4560178297482107
Iteración 73:0.4273205546672379
Iteración 74:0.40006860524547155
Iteración 75:0.3742082887483969
Iteración 76:0.34968664293853513
Iteración 77:0.32645153956653106
Iteración 78:0.3044517747331723
Iteración 79:0.28363714713403887
Iteración 80:0.2639585251377053
Iteración 81:0.24536790359054603
Iteración 82:0.2278184511861342
Iteración 83:0.21126454918487644
Iteración 84:0.1956618222197949
Iteración 85:0.1809671618771555
Iteración 86:0.16713874369585618
Iteración 87:0.15413603818703397
Iteración 88:0.1419198164351372
Iteración 89:0.1304521508036463
Iteración 90:0.11969641123262567
Iteración 91:0.10961725758126502
Iteración 92:0.10018062843643621
Iteración 93:0.09135372677796884
Iteración 94:0.08310500286275498
Iteración 95:0.0754041346628533
Iteración 96:0.06822200616739896
Iteración 97:0.06153068383426538
Iteración 98:0.05530339145499761
Iteración 99:0.04951448367547329
*******************************
"""



Comentarios sobre la versión: Versión 1.0 (0)


No hay comentarios
 

Comentar la versión: Versión 1.0

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s7452