Las redes neuronales son como los algoritmos: una caja negra en la cual hay una serie de entradas, la caja y una serie de salidas.
Pero hay algo especial en esa caja que representa las redes neuronales: una serie de controles analógicos, algunos girando a la izquierda y otros girando a la derecha de tal modo que su giro afecta las salidas.
En el ejemplo, supongamos que tenemos las siguientes entradas y salidas deseadas:
Significa que si entran los números 4, 5, 7, 8, (ejemplo 1), debe salir 18 y 32. Luego hay que ajustar esos controles analógicos (moviéndoos en favor o en contra de las manecillas del reloj) hasta que se obtenga esa salida.
Una vez hecho eso, se prueba con las entradas 7, 2, 3, 6 y debe salir 21 y 54. En caso que no funcione con el segundo juego de entradas, se procede a girar de nuevo esos controles y volver a empezar (si, desde el inicio).
También te puede interesar:
Así hasta que ajuste con todos los ejemplos. En el caso de la tabla, con los tres conjuntos de entradas que deben dar con las salidas deseadas. En otras palabras, los 6 controles analógicos deben tener un giro tal, que hace cumplir toda la tabla (los tres ejemplos). El objetivo es dar con esos giros en particular.
¿Y cómo dar con esos giros? Al iniciar, esos controles están girados al azar y poco a poco se van ajustando. Hay un procedimiento matemático que colabora mucho en este caso para así no ajustar a ciegas. Hay que aclarar que la caja tiene 6 controles analógicos, pueden haber muchos más en otras implementaciones.
Para dar inicio con las redes neuronales se parte de lo más simple: una neurona. Se le conoce como perceptrón simple. Se presenta así:
Dos entradas, una salida y tres controles analógicos. ¿Para qué sirve? Es una demostración que un algoritmo puede aprender la tabla del AND y del OR. Esta es la tabla del AND Valor.
Vamos a hacer que un perceptrón aprenda esa tabla, es decir, que si se ingresa en las entradas Verdadero y Falso, el algoritmo aprenda que debe mostrar en la salida el valor de Falso y así con toda la tabla. El primer paso es volver cuantitativa esa tabla:
Los datos de entrada y salida deben ser cuantitativos porque en el interior de esa caja hay fórmulas y procedimientos matemáticos. Luego para este ejemplo, 1 representa verdadero y 0 representa falso. ¿Y ahora? Este es la caja por dentro.
Un control analógico por cada entrada y se le adiciona una entrada interna que se llama umbral y tiene el valor de 1 con su propio control analógico. Esos controles analógicos se llaman pesos. Ahora se le ponen nombres a cada parte.
E1 y E2 son las entradasP1, P2 son los pesos de las entradasU es el peso del umbralS es la salidaf( ) es la función que le da el valor a SLuego la salida se calcula así:
Entonces la salida sería:
Y ese es el valor esperado. Los pesos funcionan para esas entradas.
¿Y que es f()? una función que podría implementarse así:
Continuando con el ejemplo entonces
S = f ( 6.842 )
S = 1
Y ese es el valor esperado. Los pesos funcionan para esas entradas.
¿Funcionarán esos pesos para las otras entradas? ¡Probemos!
¿Y entonces? Habrá que utilizar otros valores para los pesos. Una forma es darle otros valores al azar. Ejecutar de nuevo el proceso, probar con todas las entradas hasta que finalmente de las salidas esperadas.
Primero necesitamos importar la libreria random, esto es para generar numeros aleatorios.Ademas añadimos en una variable de tipo array los valores de la tabla and, y almacenamos en otro array numeros los pesos aleatorios.
import random
datos =[[1,1,1],[1,0,0],[0,1,0],[0,0,0]]
pesos = [random.uniform(-1,1),random.uniform(-1,1),random.uniform(-1,1)]
aprendiendo = True
salidaEntera = 0
iteracion=0
tasaAprende = 0.3
iteraciones = 0
Añadiremos un ciclo while que se repetira siempre y cuando la red neural siga aprendiendo, en este ciclo se ejecutara la funcion de activacion, usando los valores de los pesos generados aleatoriamente y los datos de la tabla AND. Para acelerar el aprendizaje, calcularemos el error estimado en cada iteracion, con ello en cada nueva vuelta los pesos se iran ajustando hasta el valor correcto, si el porcentaje de error llega a cero no sera necesario realizar ajustes y de este modo saldremos del ciclo while con los pesos correctos para ejecutar la red neural.
while(aprendiendo==True): iteracion=iteracion + 1 aprendiendo=False for cont in range(0,4): salidaReal = (datos[cont][0] * pesos[0] + datos[cont][1] * pesos[1] + pesos[2]) #print("salida real: ", datos[cont][0], " * ", pesos[0], " + ", datos[cont][1], " * ", pesos[1], " + ", pesos[2]) #print("salida real: ",salidaReal) if salidaReal > 0: salidaEntera = 1 else: salidaEntera = 0 salidaEntera = int(salidaEntera) print(salidaEntera) error = int(datos[cont][2] - salidaEntera) if (error != 0): pesos[0] += tasaAprende * error * datos[cont][0] pesos[1] += tasaAprende * error * datos[cont][1] pesos[2] += tasaAprende * error *1 aprendiendo = True if aprendiendo == False: break
Una vez teniendo los pesos correctos, podemos imprimirlos en pantalla para visualizar su valor y almacenarlos, ademas de que también podemos mostrar la cantidad de iteraciones que le costo a la neurona aprender.
print("iteraciones: " , iteracion)
print("peso 1: ", pesos[0])
print("peso 2: ", pesos[1]) print("peso 3: ", pesos[2])
Ademas, podemos realizar una comprobación, ejecutando los valores en la red neuronal para verificar que realmente aprendió a resolver la tabla AND, el codigo es el siguiente:
for cont in range (0,4):
salidaReal= datos[cont][0] * pesos[0] +datos[cont][1] * pesos[1] + pesos[2]
#print("formula: ( datos[cont][0] * pesos[0] + datos[cont][1] * pesos[1] + pesos[2])") #print("formula: (", datos[cont][0] , " * ", pesos[0], " + ", datos[cont][1], " * ", pesos[1], " + ", pesos[2], " )") #print(salidaReal) if salidaReal > 0 : salidaEntera = 1 else: salidaEntera = 0 print("entradas: ", datos[cont][0] , " y " ,datos[cont][1] , " = " , datos[cont][2] , "perceptron: " , salidaEntera)
Ahora, verificaremos el resultado de nuestro código, ejecutando:
En esta prueba observamos que la neurona tardo 10 iteraciones en encontrar los pesos correctos, los cuales son visibles en pantalla, ademas de que realizamos una comprobacion de la tabla AND, donde mostramos los valores correctos contra los valores que la red neuronal obtuvo, sacando los valores correctos.
Como aviso, es normal que aveces tarde mas o menos iteraciones ya que estamos usando numeros aleatorios para calcular los pesos.
Bien, hemos aprendido como funciona una neurona, como aprende y como programar una red neuronal simple o perceptron para que aprendiera a resolver la tabla AND.Para aprender mas, puedes modificar los valores de la tabla AND por los valores de la tabla OR y verificar si tambien es capaz de aprender a como solucionarla, e incluso puedes modificar ciertas partes de codigo para aumentar la velocidad de aprendizaje.
Puedes descargar el codigo fuente de este tutorial en el repositorio de github.
Deja tus comentarios sobre esta practica y sugerencias para nuevos tutoriales.
#ai #machine-learning #python #data-science