¿Cómo se desarrolla el entrenamiento de una red neuronal en Python?
Empezamos el entrenamiento de la red neuronal en Python con la arquitectura de la red ya definida y los parámetros inicializados. Lo fundamental es replicar los pasos previamente cometidos en un entorno como Google Colab. Allí, almacenamos los errores de pérdida y realizamos la iteración por épocas para ajustar los pesos adecuadamente.
¿Qué se debe configurar antes de iniciar el entrenamiento?
Iteraciones: Por ejemplo, se puede establecer un número elevado como 30,000 para observar los resultados a lo largo del tiempo.
Tasa de aprendizaje (learning rate): Inicialmente configurada a un valor bajo, como 0.001, para permitir que la red ajuste los pesos sin grandes oscilaciones.
Almacenamiento de errores: Guardar los errores en una lista para su posterior visualización y análisis.
for i inrange(30000): output = train(x, learning_rate=0.001, params=params)if i %50==0: error = mean_squared_error(y, output) errores.append(error)
¿Cómo se evalúa el desempeño de la red durante el entrenamiento?
Durante el entrenamiento, la clave está en monitorear el error a lo largo de las iteraciones. Idealmente, el error debería disminuir, lo cual indica que la red está aprendiendo. Se pueden utilizar bibliotecas como matplotlib para graficar estos errores y observar cómo evoluciona el desempeño de la red.
import matplotlib.pyplot as plt
plt.plot(errores)plt.title("Error de pérdida a lo largo del entrenamiento")plt.xlabel("Iteraciones")plt.ylabel("Error")plt.show()
¿Cuándo y por qué ajustar la tasa de aprendizaje?
Es común encontrar que, al aumentar o disminuir la tasa de aprendizaje, cambian la convergencia y estabilidad de la red:
Con una tasa alta, se observa una convergencia más rápida, pero puede llevar a la divergencia.
Con una tasa baja, el proceso se vuelve más lento, pero suele ser más estable.
Es esencial ajustar la tasa de aprendizaje según los resultados obtenidos y revalorizarla conforme al comportamiento del error en las iteraciones.
learning_rate =0.0001# Ajustar según sea necesario
¿Cómo se prepara y utiliza la data de prueba?
La data de prueba es crucial para evaluar la generalización de la red. Se genera de manera aleatoria y se pasa por la red para obtener predicciones que luego se comparan con las etiquetas esperadas.
# Generar data de pruebadata_test = np.random.rand(1000,2)*2-1# Obtener prediccionesy_pred = train(data_test, learning_rate=0.001, params=params, training=False)# Clasificar las prediccionesy_pred = np.where(y_pred >=0.5,1,0)
¿Cómo afectan las iteraciones a la precisión del modelo?
Incrementar el número de iteraciones puede mejorar la precisión del modelo, siempre que se ajuste correctamente la tasa de aprendizaje. Es un equilibrio delicado; demasiadas iteraciones con tasas mal configuradas pueden llevar al sobreajuste o divergencia.
for i inrange(60000):# Por ejemplo, probar con 60,000 iteraciones output = train(x, learning_rate=0.0001, params=params) error = mean_squared_error(y, output) errores.append(error)
Al seguir estos pasos, es posible lograr que la red neuronal aprenda de manera significativa, mostrando una capacidad para clasificar correctamente diferentes clases de datos.
Adentrarse en este fascinante campo te dota de herramientas y conocimientos valiosos. Conocer los fundamentos de las redes neuronales y su implementación manual ofrece una sólida base para avanzar hacia el uso de frameworks como Keras y TensorFlow, donde la optimización y escalabilidad toman un papel principal en el desarrollo de modelos complejos. ¡Continúa explorando el mundo del aprendizaje profundo con entusiasmo y determinación!
Este módulo ha sido excelente, enseñó paso a paso a como construir una red neuronal.
La verdad sí me emocioné. Este curso vale oro solo con esto que acabamos de hacer. Incluso si en la industria no se hace manualmente, haberlo hecho así te permite saber realmente como funciona, lo cual es más valioso.
Les comparto mi resultado:
me encanta que le encuentres lo maravilloso a crear tu propia red neuronal desde cero :)
Paso a paso, nos queda cada vez más claro cómo funciona realmente el cerebro humano para procesar todo tipo de datos y adaptarse a su medio
Esto nos lleva a una de las preguntas más importantes de la historia de la filosofía:
¿Los seres humanos tenemos libre albedrío y un alma o esencia en alguna parte?
¿O simplemente nuestros cerebros son máquinas que responden de manera increíblemente eficiente a su medio (tanto interno como externo), pero no son capaces de generar acciones espontáneas (generar acciones sin que estas sean reacciones)?.
¡Un saludo a todos los que llegaron hasta aquí! :D
!Cerebro
Solo puedo decir que el propósito que tu decidas darle para comprender mejor todo esto ese es el que tu decidas.
Si algo es seguro, es que nos hace falta mucho más por comprender y lo que hacemos con estos cursos es una aproximación a toda la complejidad que apuntas.
Es filosóficamente cuestionable afirmar lo que dices, pues si bien en un inicio del curso se dijo que las redes neuronales se inspiran en el cerebro humano y el comportamiento conocido de las neuronas, eso no significa que de hecho el cerebro funcione así.
Desde la cibernética las analogías entre el cómputo y la fisiología son muchas, y por supuesto que echan luz a investigaciones académicas derivadas de ello, como la inteligencia artificial (un subconjunto de la cibernética), pero es epistémicamente cuestionable que eso sea demostrable. Hay muchas premisas metafísicas detrás.
Lo digo porque antes de estudiar ing. en computación estudié filosofía y este tipo de problemas se dan por doquier.
Es celebrable que te hagas este tipo de cuestionamientos, eso sí :D
Que tal:
Noté que se tiene un desempeño superior si se añaden más neuronas a la segunda capa oculta en el Layers_dims, ejemplo:
layer_dims=[2,8,8,1]
genial!!!
Al alterar los valores de learning rate y epoch hay que considerar que afectan
el epoch es cuantas iteraciones realiza la red para llegar a una conclusion y es posible que no tenga suficientes épocas para llegar a una conclusion optima como también es posible que tenga demasiadas y luego de llegar a una conclusion optima solo aumenta el error en las siguientes iteraciones
el learning rate es que tan amplios son los pasos que da la función tras cada iteración, si es muy pequeño es posible que tarde demasiado en alcanzar el punto mínimo de la función, pero si es muy grande es posible que pase sobre el punto óptimo y no logre llegar a un punto cercano
Entiendo que es solo un ejercicio para entender más o menos como funcionan las redes neuronales sin librerías. Sin embargo, cabe destacar que esta red neuronal resuelve un problema de clasificación, pero estamos usando una función de pérdida que no corresponde (MSE se aplica en regresiones). En este caso, se debería hacer con cross entropy.
Pienso lo mismo ,muchos no se han dado cuenta que se ha usado una incorrecta funcion de perdida y solo se han dejado llevar por el resultado
Creo que con solo dos clases de clasificación no es tan malo usar MSE con fines de simplificación. Pero es bueno el apunte de usar cross-entropy en lugar de MSE
Yo no logre que mi red neuronal aprenda con los parámetros que uso el profe, tendrá
algo que ver que use Visual studio code?
aunque si que encontro un patron, podrias probar con mas epocas o un LR menor.
Les recomiendo ampliamente que vean mis notas de github en la siguiente liga:
notas
Ahí encontrarn el código completo adaptado para correr con n cantidad de layers, y explicado paso a paso :D
Excelente curso, para los compañeros que tengan dificultades, revisen el código en la sección de recursos ya que un mínimo error al momento de definir las funciones o en el proceso ** Forward / Gradient Descent / Backpropagation ** hace que el modelo no funcione*
Este modulo es una joya de la escuela de Inteligencia Artificial! estas cosas son las que marcan la diferencia entre ser un ingeniero más a ser un "experto" en los temas que manejas.
Entender como funcionan las cosas por debajo es un gran bono a la hora de realizar tus productos
Inicialización:
layer_dims
Define la arquitectura de la red neuronal con 2 neuronas en la capa de entrada, 4 en la primera capa oculta, 8 en la segunda capa oculta y 1 en la capa de salida.
params: Inicializa los parámetros de la red neuronal utilizando la función initialize_parameters_deep.
Bucle de entrenamiento
for _ in range(70000)
Itera 70,000 veces. Este número de iteraciones es un hiperparámetro y puede ser ajustado según sea necesario.
Entrenamiento:
output = train(X, 0.00001, params)
Llama a la función de entrenamiento (train) con la tasa de aprendizaje de 0.00001. Esta función realiza la propagación hacia adelante, retropropagación y actualización de parámetros.
Registro de errores
if _ % 25 == 0:: Cada 25 iteraciones, imprime y guarda el error (loss) actual.
current_loss = mse(Y, output): Calcula el error (loss) actual utilizando la función de pérdida (en este caso, mse).
Almacenamiento de errores
errors.append(current_loss)
Agrega el error actual a la lista de errores.
Este bucle de entrenamiento está diseñado para mostrar y registrar el error en intervalos regulares de 25 iteraciones. La lista errors te proporcionará una idea de cómo cambia el error durante el entrenamiento, lo que puede ser útil para evaluar el rendimiento de tu modelo.
No se muy bien por que, pero en mi caso la divergencia fue muy poca.... el codigo sirvio muy bien desde las primeras condiciones. La grafica que he estado obteniendo ha sido muy parecida a esta:
¿En que difiere el número de iteraciones específicamente?
depende de el learning rate y otras variables, pero si el modelo converge mas iteraciones son mejores resultados en el entrenamiento, de no converger es mejor parar antes el entrenamiento.
Hola buenas noches, como están? tengo este error, me pueden ayudar a resolverlo? saludos
ValueError Traceback (most recent call last)
<ipython-input-67-9d5253d8e6ee> in <cell line: 4>()
3 errors=[]
4 for _ in range(30000):
----> 5 output = train(X,0.001,params)
6 if _ % 50 == 0:
7 print(mse(Y,output))
ValueError: operands could not be broadcast together with shapes (1000,8) (1000,2)
El problema es que muy probablemente en algúna parte de la función que escribiste, se te olvido cambiar una "W" por una "b", o algo así. Entonces da inconcistencias con el tamaño de las matrices.
Te recomendaría que revisaras line a linea el codigo de la función que tienes, con el codigo que publico el profe (tiene unas pequeñas diferencias con el código que hace en clase)
Me encanto la clase,
me quedo la duda de cómo se haría para poder distribuir una red neuronal, no sé cómo se hace en la industria así que hice mi propia solución manual
ya que entrenar la misma red multiples veces con los mismos learning rate y epoch da diferentes resultados de esta forma se pueden guardar los parámetros de los mejores resultados en un archivo para poder reutilizarlos, ya que los params son los pesos y bias de la red neuronal en ese momento
Creo que esta mal el parametro b a la hora de modificarlo en el gradient descent, corregi la manera en la que se mueve el parametro b y tuve mucho mejores resultados, el learning rate es exageradamente bajo en el ejemplo de la clase ya que los numeros que se le estan dando a b cuando hacemos np.mean(params['dW3']) no son los correctos y estos son muy grandes para corregirlo de la manera correcta, por lo que se necesitan pasos muchos mas chicos y muchas mas iteraciones para llegar a un resultado optimo, definiendo los diferentes valores de b de esta manera:
params['b3'] = params['b3'] - np.mean(params['dZ3'], axis=0, keepdims=True) * lr
params['b2'] = params['b2'] - np.mean(params['dZ2'], axis=0, keepdims=True) * lr
params['b1'] = params['b1'] - np.mean(params['dZ1'], axis=0, keepdims=True) * lr
Es decir, al bias actual, simplemente le resto el promedio de la derivada de la funcion de costo mutiplicada por la derivada de la funcion de activacion en la ultima capa, multiplicado por el learning rate.
Con un learning rate de 0.001, en 40000 iteraciones llegue aproximadamente a un 0.015 de error y al algoritmo le toma menos de 5000 iteraciones estar por debajo del 0.05, si me estoy equivocando corrijanme !
Hola, mi predicción todo el tiempo está en 15% y no baja casi nada, hago aproximadamente 60mil iteraciones y el lr es de 0.0001. No he conseguido bajar el error sino hasta que entrené como 500 mil veces:(
Te recomiendo revisar el código en la sección de recursos, a mi me paso algo similar, pero fue por un termino en el Gradient Descent