Backpropagation en Redes Neuronales XOR
Backpropagation en Redes Neuronales XOR
ALGORITMO BACKPROPAGATION
Multiperceptrón - Arquitectura
2
Redes multicapa
3
OR p1+p2-0.5=0
1 0 1 0 1
5
1 1 1 1 0
OR p1+p2-0.5=0 0 0 0 0 0
0 1 1 0 1
Función de
x0 k 1 transferencia
w0
x1k w1
n
yk f xik .wi
n
x2 k
w2 x ik .wi
i 0 i 0
wn
xnk n
netak xik .wi
i 0
Perceptrón 1 si x 0
f ( x)
0 si x 0
7
x0 k 1
w0
n
x1k w1
n 1 si x ik .wi 0
x2 k
w2 xik .wi yk i 0
n
i 0 0 si
x
i 0
ik .wi 0
wn
xnk
Actualiza el vector 𝑊 modificando el ángulo
que forma con cada ejemplo 𝑋𝑘
Combinador lineal
8
f ( x) x
x0 k 1
w0
x1k w1 n
yk xik .wi
n
x2 k
w2 x
i 0
ik .wi
i 0
wn
xnk
Utiliza descenso por gradiente para actualizar
el vector de pesos.
Neurona no lineal (logsig) f ( x)
1
1 ex
9
x0 k 1
w0
x1k w1
1
yk
n
x2 k
w2 x
i 0
ik .wi n
xik . wi
1 e i 0
wn
xnk
Utiliza descenso por gradiente para actualizar
el vector de pesos.
Neurona no lineal (tansig) f ( x)
2
1 e 2 x
1
10
x0 k 1
w0
x1k w1
2
yk 1
n
x2 k
w2 x
i 0
ik .wi n
2 xik . wi
1 e i 0
wn
xnk
Utiliza descenso por gradiente para actualizar
el vector de pesos.
Neurona no lineal (Relu) f ( x) max(0, x)
11
x0 k 1
w0
x1k w1
n n
x2 k
w2 x ik .wi yk max 0, xik .wi
i 0
i 0
wn
xnk
Utiliza descenso por gradiente para actualizar
el vector de pesos.
Problema no separable linealmente
12
X2 B
X1
Ejemplo de entrada
x p ( x p1 , x p 2 ,..., x pN ) t
o pk f ko (netaopk )
Actualización de pesos
20
pk ( y pk o pk )
donde
y es la salida deseada
o es la salida real.
Se busca minimizar
M
1
E p 2pk
2 k 1
1 M
E p ( y pk o pk ) 2
2 k 1
E p f o
(neta ) o
( y pk o pk ) k pk
wkj
o
(neta pk ) wkj
o o
L o
o kj pj
o
f ' (neta ) o w i hk i pj
o
k pk wkj j 1
Salida de la
E p neurona oculta j
( y pk o pk ) f k ' (neta pk )i pj
o o
wkj
o
o
pk ( y pk o pk ) f ' (neta )
k
o o
pk
w (t 1) w (t ) i
o
kj
o
kj
o
pk pj
Actualización de pesos
p w (t ) x pi
h
ji
h
pj
serán de la forma:
f ' (neta ) w
h
pj j
h h
pj
o
pk
o
kj
k
Backpropagation. Entrenamiento
25
i pj f jh (netahpj )
Propagar las salidas de la capa oculta hacia la capa de salida
27
L
neta w i
o
pk
o
kj pj
o
k
j 1
o pk f (neta )
k
o o
pk
Se obtienen los valores de salida
28
Se calcula la corrección que se realizará al vector de pesos que llega a
cada neurona de salida
29
o
pk ( y pk o pk ) f ' (neta )
k
o o
pk
Se calcula la corrección que se realizará al vector de pesos que llega a
cada neurona oculta
30
f ' (neta ) w
h
p1 1
h h
p1
o
pk
o
k1
k
Se actualizan ambas matrices de pesos
33
w (t 1) w (t ) i
o
kj
o
kj
o
pk pj
Backpropagation. Resumen
34
i pj f (neta )
j
h h
pj
Backpropagation. Resumen
35
o pk f (neta )
k
o o
pk
Backpropagation. Resumen
36
o
pk ( y pk o pk ) f ' (neta )
k
o o
pk
import numpy as np
from graficaMLP import dibuPtos_y_2Rectas
from Funciones import evaluar, evaluarDerivada
salidas = [Link][1]
MLP_XOR.ipynb
Pesos iniciales
40
W1 = [Link](-0.5,0.5,[ocultas, entradas])
b1 = [Link](-0.5,0.5, [ocultas,1])
W2 = [Link](-0.5,0.5,[salidas, ocultas])
b2 = [Link](-0.5,0.5, [salidas,1])
MLP_XOR.ipynb
Graficar W1 y b1
41
# Recalcular AVGError
ite = ite + 1
print(ite, AVGError)
# Graficar las rectas
Calcular la salida para el ejemplo p
# Recalcular AVGError
ite = ite + 1
print(ite, AVGError)
# Graficar las rectas
Términos de error
o
pk ( y pk o pk ) f ' (neta )
k
o o
pk
f ' (neta ) w
h
pj j
h h
pj
o
pk
o
kj
k
Funciones de Activación
Fun = 'sigmoid‘
1
f (neta)
1 e neta
netas = W1 @ X.T + b1
i = evaluar(FunH, netas)
f ' (neta) f (neta) * (1 f (neta)) derivH = evaluarDerivada(FunH,i)
2 Fun = 'tanh'
f (neta) 2*neta
1
1 e netas = W1 @ X.T + b1
i = evaluar(FunH, netas)
f ' (neta) 1 f (neta) 2 derivH = evaluarDerivada(FunH,i)
MLP_XOR.ipynb
Calcular errores de cada capa
# calcular los errores en ambas capas
ErrorSalida = Y[p:p+1,:].T - salidasO
deltaO = ErrorSalida * evaluarDerivada(FunO,salidasO)
deltaH = evaluarDerivada(FunH,salidasH)*(W2.T @ deltaO)
MLP_XOR.ipynb
Actualización de los pesos
[Link]
Ejemplo: Clasificación de flores de Iris
SepalLength
Iris-setosa
SepalWidth
Iris-versicolor
PetalLength
Iris-virginica
PetalWidth
MLP_IRIS.ipynb
Clasificación de flores de Iris
Capa de entrada Capa de
X Y Capa salida
sepallength oculta
[[-1.73,-0.05,-1.38,-1.31], [[1,0,0],
[-0.37,-1.62, 0.22, 0.18], [0,1,0], sepalwidth
Iris-Setosa
W1 b1
Clasificación de flores de Iris
Capa de entrada Capa de
X Y Capa salida
sepallength oculta
[[-1.73,-0.05,-1.38,-1.31], [[1,0,0],
[-0.37,-1.62, 0.22, 0.18], [0,1,0], sepalwidth
Iris-Setosa
W2 b2
Clasificación de flores de Iris
Capa de entrada Capa de
X Y Capa salida
sepallength oculta
[[-1.73,-0.05,-1.38,-1.31], [[1,0,0],
[-0.37,-1.62, 0.22, 0.18], [0,1,0], sepalwidth
Iris-Setosa
FunH='tanh' ; FunO='sigmoid'
[[-0.99999219]
salidasH = 2 / (1+[Link](-netasH))- 1 =
[-0.39144044]]
Calculando la salida de la red (capa de salida)
Capa de entrada Capa de
X Y Capa salida
sepallength oculta
[[-1.73,-0.05,-1.38,-1.31], [[1,0,0],
[-0.37,-1.62, 0.22, 0.18], [0,1,0], sepalwidth
Iris-Setosa
Salida de red
FunH='tanh' ; FunO='sigmoid'
netasO = W2 * salidasH + b2
salidasH
[[-4.79, -0.99], [[-0.99999219] [[ 1.39], [[ 6.56748865]
[ 0.3 , 0.9 ], * + = [-0.91229406]
[-0.39144044]] [-0.26],
[ 4.67, -0.91]] [-2.88]] [-7.19375274]]
W2
b2
Calculando la salida de la red (capa de salida)
Capa de entrada Capa de
X Y Capa salida
sepallength oculta
[[-1.73,-0.05,-1.38,-1.31], [[1,0,0],
[-0.37,-1.62, 0.22, 0.18], [0,1,0], sepalwidth
Iris-Setosa
Salida de red
FunH='tanh' ; FunO='sigmoid'
netasO = W2 * salidasH + b2
salidasH netasO
[[-4.79, -0.99], [[-0.99999219] [[ 1.39], [[ 6.56748865]
[ 0.3 , 0.9 ], * + = [-0.91229406]
[-0.39144044]] [-0.26],
[ 4.67, -0.91]] [-2.88]] [-7.19375274]]
W2 b2
[[9.98596651e-01]
salidasO = 1 / (1+[Link](-netasO)) = [2.81401722e-01]
[7.50700367e-04]]
Error de la capa de salida
Capa de entrada Capa de
X Y Capa salida
sepallength oculta
[[-1.73,-0.05,-1.38,-1.31], [[1,0,0],
[-0.37,-1.62, 0.22, 0.18], [0,1,0], sepalwidth
Iris-Setosa
salidasO
Factores de corrección de los pesos
Capa de entrada Capa de
X Y Capa salida
sepallength oculta
[[-1.73,-0.05,-1.38,-1.31], [[1,0,0],
[-0.37,-1.62, 0.22, 0.18], [0,1,0], sepalwidth
Iris-Setosa
[[-2.74548968e-07]
deltaH = [-4.46415722e-02]]
Corrigiendo de los pesos
Capa de entrada Capa de
X Y Capa salida
sepallength oculta
[[-1.73,-0.05,-1.38,-1.31], [[1,0,0],
[-0.37,-1.62, 0.22, 0.18], [0,1,0], sepalwidth
Iris-Setosa
Modificación de W2 y b2
FunH='tanh' ; FunO='sigmoid'
W2 = W2 + alfa * deltaO @ salidasH.T
aciertos = metrics.accuracy_score(Y_train,Y_pred)
print("%% accuracy = %.3f" % aciertos)
sklearn_metrics.ipynb
[Link].accuracy_score
from sklearn import metrics Rtas esperadas
Y_train = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]
Y_pred = [0, 2, 1, 3, 0, 1, 2, 0, 0, 1, 2, 3]
Rtas obtenidas
aciertos = metrics.accuracy_score(Y_train,Y_pred)
print("%% accuracy = %.3f" % aciertos)
MM = metrics.confusion_matrix(Y_train,Y_pred)
print("Matriz de confusión:\n%s" % MM)
0
Esperaba obtener 1
1
TRUE
MM = metrics.confusion_matrix(Y_train,Y_pred)
print("Matriz de confusión:\n%s" % MM)
0
La respuesta correcta
1
TRUE
es 2 pero la red
2 respondió 1
3
0 1 2 3
PREDICE
sklearn_metrics.ipynb
[Link].confusion_matrix
Y_train = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]
Y_pred = [0, 2, 1, 3, 0, 1, 2, 0, 0, 1, 2, 3]
MM = metrics.confusion_matrix(Y_train,Y_pred)
print("Matriz de confusión:\n%s" % MM)
0
Esperaba un 3 pero la
1
TRUE
red respondió 0
2
3
0 1 2 3
PREDICE
sklearn_metrics.ipynb
[Link].confusion_matrix
Y_train = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]
Y_pred = [0, 2, 1, 3, 0, 1, 2, 0, 0, 1, 2, 3]
MM = metrics.confusion_matrix(Y_train,Y_pred)
print("Matriz de confusión:\n%s" % MM)
0
Los valores fuera de
1
TRUE
la diagonal principal
2 son errores
3
0 1 2 3
PREDICE
sklearn_metrics.ipynb
[Link].classification_report
Y_train = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]
Y_pred = [0, 2, 1, 3, 0, 1, 2, 0, 0, 1, 2, 3]
report = metrics.classification_report(Y_train,Y_pred)
print("Resultado de la clasificación:\n%s" % report)
sklearn_metrics.ipynb
[Link].classification_report
Y_train = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]
Y_pred = [0, 2, 1, 3, 0, 1, 2, 0, 0, 1, 2, 3]
report = metrics.classification_report(Y_train,Y_pred)
print("Resultado de la clasificación:\n%s" % report)
F1-score
𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 ∗ 𝑟𝑒𝑐𝑎𝑙𝑙
𝐹1 = 2 ∗
𝑝𝑟𝑒𝑐𝑖𝑠𝑖ó𝑛 + 𝑟𝑒𝑐𝑎𝑙𝑙
Ejemplo: Clasificación de flores de Iris
SepalLength
Iris-setosa
SepalWidth
Iris-versicolor
PetalLength
Iris-virginica
PetalWidth
Ver
MLP_IRIS_RN.ipynb
Reconocedor de dígitos escritos a mano
Se desea entrenar un multiperceptrón para reconocer dígitos escritos a
mano. Para ello se dispone de los mapas de bits correspondientes a
3823 dígitos escritos a mano por 30 personas diferentes en el archivo
“optdigits_train.csv”.
[Link]
“optdigits_train.csv” y “optdigits_test.csv”
Cada dígito está representado por una matriz numérica de 8x8
“optdigits_train.csv” y “optdigits_test.csv”
Cada dígito está representado por una matriz numérica de 8x8
0 1 13 13 9 8 0 0
0 13 10 0 0 0 0 0
3 15 0 3 3 0 0 0
4 12 10 15 13 15 6 0
2 16 13 1 0 4 14 0
0 14 6 0 0 1 16 0
0 10 11 3 0 6 13 0
0 1 11 14 16 15 5 0
im_32x32_a_8x8.ipynb
RN para reconocer dígitos manuscritos
im_32x32_a_8x8.ipynb Entrenamiento
muy lento
¿Se puede
acelerar?
MLP_MNIST_8x8.ipynb
Descenso de gradiente en mini-lotes
En lugar de ingresar los ejemplos de a uno, Total: 2000 ejemplos
200
ingresamos N a la red y buscaremos minimizar el
200
error cuadrático promedio del lote. 200
Tamaño de
Lote = 200
200
La función de costo será 200
𝑁 10 iteraciones
1 200
2
𝐶 = 𝑑𝑖 − 𝑓(𝑛𝑒𝑡𝑎𝑖 ) 200
𝑁 200
𝑖=1
200
N es la cantidad de ejemplos que conforman el lote. 200
MLP_MNIST_RN.ipynb 1 época
Descenso de gradiente
Ingresa TODOS los ejemplos y luego Ingresa un LOTE de N ejemplos y luego Ingresa UN ejemplo y luego
actualiza los pesos. actualiza los pesos actualiza los pesos
Bueno para pocos ejemplos Bueno p/funciones de error convexas Bueno para data sets grandes
1 𝑀 2 1 𝑁 2 2
𝐶= σ 𝑑𝑖 − 𝑓(𝑛𝑒𝑡𝑎𝑖 ) 𝐶= σ 𝑑𝑖 − 𝑓(𝑛𝑒𝑡𝑎𝑖 ) 𝑁≪𝑀 𝐶 = 𝑑 − 𝑓(𝑛𝑒𝑡𝑎)
𝑀 𝑖=1 𝑁 𝑖=1
MLP_MNIST_RN.ipynb
Multiperceptrón en Python
from sklearn.neural_network import MLPClassifier
clf = MLPClassifier(solver='sgd', learning_rate_init=0.05,
hidden_layer_sizes=(15,), random_state=1,
max_iter=2000,
verbose=False, tol=1.0e-05,
batch_size=200,
activation='logistic')
history = [Link](X_train,Y_train)
Usa
y_pred= [Link](X_train) Entropía cruzada
como función de costo
Problemas
Datos de
Error
testeo
Datos de
entrenamiento
𝜆
𝐶 = 𝐶𝑜 + 𝑤𝑘2
2
𝑘
𝜕𝐶0
𝑤𝑘 = 1 − 𝜆 𝑤𝑘 − α
𝜕𝑤𝑘
Sobreajuste - Regularización L1
𝐶 = 𝐶𝑜 + 𝜆 𝑤𝑘 𝜕𝐶 𝜕𝐶0
= + 𝜆 𝑠𝑖𝑔𝑛(𝑤𝑘 )
𝑘 𝜕𝑤𝑘 𝜕𝑤𝑘
𝑣 = 𝜇 𝑣 − 𝛼 𝛻𝐶
𝑤 = 𝑤+𝑣