En la Parte 1 de Introducción a las redes neuronales, aprendimos sobre una de las neuronas artificiales más simples llamada neurona de McCulloch-Pitts y la implementamos en Python.
El problema con la neurona MP es que en realidad no hay aprendizaje involucrado. Los pesos se ajustan manualmente.
En este artículo veremos Perceptron, que es una mejora de la neurona MP. A diferencia de la neurona MP, el perceptrón puede aprender los pesos con el tiempo.
También veremos cómo entrenar un Perceptron desde cero para clasificar operaciones lógicas como AND u OR.
Perceptrón:
Un perceptrón es básicamente un clasificador binario. Es un algoritmo para determinar un hiperplano que separa dos categorías de datos.
Un perceptrón típico tendrá
-
- Entradas
- Pesos y sesgo
- Función de activación
El perceptrón recibe datos de entrada multiplicados por pesos aleatorios y les agrega sesgo. Un sesgo funciona como un nodo de entrada que siempre produce un valor constante.
text =quad sum_^ mathrm_ mathrm_+mathrm
text =x_ w_+x_ w_+x_ w_+b
Luego se aplicará una función de activación a la suma ponderada. La suma ponderada no es más que la suma de todas las entradas multiplicada por sus pesos + sesgo.
Aquí vamos a utilizar el escalón unitario o la función de activación heaviside. Es una función de activación basada en un umbral.
f(x)=left{begin
0 & text x<0 \
1 & text x geq 0
endright.
Si el valor de entrada es mayor que 0, devuelve 1, de lo contrario, devuelve 0.
Aprendizaje de perceptrones:
Ahora veamos los pasos exactos involucrados en el entrenamiento de un perceptrón.
Entrenar un perceptrón es simple y directo. Necesitamos obtener un conjunto de pesos que clasifique cada instancia en nuestro conjunto de entrenamiento.
El primer paso es inicializar los pesos y el sesgo de forma aleatoria.
Luego tenemos que calcular la entrada neta multiplicando la entrada con los pesos junto con el sesgo.
y_=sum_^ x_ w_+b
Luego tenemos que aplicar la función de activación sobre la entrada neta. Aquí usamos la función de paso que aplasta la entrada entre 0 y 1.
y = Φ(yen)
Y en el paso final, si el valor predicho no es igual al valor objetivo, entonces tenemos que actualizar los pesos y el sesgo.
error = t – y
Aquí t es el valor objetivo e y es el valor predicho.
La actualización de pesos y sesgos es la siguiente:
wi(nuevo) = wi(antiguo) + alfa * error * xi
b(nuevo) = b(antiguo) + alfa * error
El alfa aquí es el tasa de aprendizaje.
Implementación:
Ahora entrenemos un perceptrón para predecir la salida de una puerta OR lógica.
import numpy as np #Activation Function def step(x): return 1 if x > 0 else 0 #Training Data data = [[0,0],
[0,1],
[1,0],
[1,1]]#Valores objetivo y = [0, 1, 1, 1] #Inicializando pesos y sesgos w = np.random.randn(2) b = np.random.randn() epochs = 30 alpha = 0.1 #recorre el número deseado de épocas para i en el rango (épocas): #recorre los datos individuales point for(x, target) in zip(data, y): #realizando el producto escalar entre los datos de entrada y los pesos z = sum(x * w) + b #pasando la entrada neta a través de la función de activación pred = step( z) #calcular el error error = objetivo – pred #actualizar los pesos y el sesgo para el índice,valor en enumerate(x): w[index] += alfa * error * valor b += alfa * error #Prueba prueba = [0, 1]tu = w[0] * prueba[0] + w[1] * prueba[1] + b pred = paso(u) print(pred)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 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 |
importar entumecido como notario público #Función de activación definitivamente paso(X): devolver 1 si X > 0 demás 0 #Datos de entrenamiento datos = [[0,0], [0,1], [1,0], [1,1]] #Valores objetivo y = [0, 1, 1, 1] #Inicializar pesos y sesgos w = notario público.aleatorio.rancio(2) b = notario público.aleatorio.rancio() épocas = 30 alfa = 0.1 #loop sobre el número deseado de épocas para i en rango(épocas): #loop sobre el punto de datos individual para(X, objetivo) en cremallera(datos, y): #realizando el producto escalar entre los datos de entrada y los pesos z = suma(X * w) + b #pasando la entrada neta a través de la función de activación presa = paso(z) #calculando el error error = objetivo – presa #actualización de los pesos y sesgos para índice,valor en enumerar(X): w[index] += alfa * error * valor b += alfa * error #Pruebas prueba = [0, 1] tu = w[0] * prueba[0] + w[1] * prueba[1] + b presa = paso(tu) imprimir(presa) |
Ahora probemos con el operador AND. Sólo tenemos que cambiar los valores objetivo.
y = [0, 0, 0, 1]
Ahora, si ejecutamos el programa, obtendremos la salida como 0. Dado que 0 Y 1 es 0
Puede intentar cambiar los valores de prueba como [0,0],[1,0] o [1,1].
Ahora, si intenta clasificar XOR con el perceptrón cambiando los valores objetivo (y), sin importar cuántas épocas entrene la red, nunca podrá clasificar, ya que no es clasificable linealmente.
Entonces, ¿cómo podemos clasificar funciones que no son linealmente separables? Para eso, necesitamos un perceptrón multicapa que tenga más capas que un perceptrón normal.
CONCLUSIÓN:
En este artículo hemos aprendido qué es un perceptrón y cómo implementarlo desde cero en python.
Un perceptrón es un clasificador binario que determina un hiperplano que separa dos categorías de datos. Sin embargo, el problema con el perceptrón es que es un clasificador lineal. No puede tratar con problemas no lineales.
En la siguiente parte, aprenderemos sobre el perceptrón multicapa que puede manejar problemas no lineales.