Introducción

XOR compara dos bits de entrada y genera un bit de salida. Si los bits son iguales, el resultado es 0. Si los bits son diferentes, el resultado es 1. Los resultados de esta operación pueden resumirse en la tabla de abajo:

##   x1 x2 y
## 1  0  0 0
## 2  0  1 1
## 3  1  1 0
## 4  1  0 1

Sea desea utilizar una red neuronal con dos inputs (basados en la tabla anterior), dos neuronas ocultas y una neurona de salida, en este caso será hará el ejercicio con todas las filas y se hará un total de 30 épocas (Esto por motivos educativos) . Además, tendremos en cuenta la función logística como función de activación. De esta forma, se aplicará el método de retropropagación, cuyo objetivo es optimizar los pesos para que la red neuronal pueda aprender a asignar correctamente entradas arbitrarias a salidas. Para empezar, debemos ver qué predice actualmente la red neuronal dados unos pesos, unos sesgos y algunos valores de las variables como entradas iniciales. Con estos valores, alimentaremos esas entradas a través de la red. En este sentido, calculamos la entrada neta total a cada neurona de la capa oculta, obtenemos la salida correspondiente de cada neurona transformando la entrada neta total con ayuda de una función de activación (aquí utilizamos la función logística) y, a continuación, repetimos el proceso con las neuronas de la capa de salida. Para este caso, se usarán los siguientes pesos y sesgos:
- W1=0.1
- W2=0.5
- W3=-0.7
- W4=0.3
- W5=0.2
- W6=0.4
- b1=0
- b2=0
- b3=0

En este sentido, la estructura básica para la red de cada fila en la primera época es la siguiente:

Entrada X1=0, X2=0 y y=0

Entrada X1=0, X2=1 y y=1

Entrada X1=1, X2=1 y y=0

Entrada X1=1, X2=0 y y=1

Desarrollo del algoritmo

El algoritmo que se plantea está pensado para el caso que tengamos las neuronas de la imagen. De esta forma, el usuario puede hacer el ejercicio con los pesos, sesgos, epocas y entradas que desee; para ello, se plantearán las siguientes funciones que serán llamadas para ejecutarse en una función principal:

Las funciones que se harán para automarizar estas tareas serán hechas en R para una mayor facilidad en el manejo de matrices y operaciones. De esta forma, para este problema se plantea la creación de las siguientes funciones.

Desarrollo de las epocas

Se desarrollará el ejercicio haciendo un total de 30 epocas para cada entrada y salida vista en la tabla XOR:

## 
## Resultado para la fila 1 con: x1= 0 ,x2= 0 y salida= 0 
##    Epoca Salida_epoca      Error  W1  W2   W3  W4           W5           W6 B1
## 1      1    0.5744425 0.09054959 0.1 0.5 -0.7 0.3  0.200000000  0.400000000  0
## 2      2    0.5701459 0.09238726 0.1 0.5 -0.7 0.3  0.182446594  0.382446594  0
## 3      3    0.5658601 0.09423871 0.1 0.5 -0.7 0.3  0.164980205  0.364980205  0
## 4      4    0.5615866 0.09610313 0.1 0.5 -0.7 0.3  0.147603883  0.347603883  0
## 5      5    0.5573269 0.09797972 0.1 0.5 -0.7 0.3  0.130320556  0.330320556  0
## 6      6    0.5530825 0.09986764 0.1 0.5 -0.7 0.3  0.113133038  0.313133038  0
## 7      7    0.5488546 0.10176607 0.1 0.5 -0.7 0.3  0.096044016  0.296044016  0
## 8      8    0.5446448 0.10367418 0.1 0.5 -0.7 0.3  0.079056058  0.279056058  0
## 9      9    0.5404543 0.10559113 0.1 0.5 -0.7 0.3  0.062171604  0.262171604  0
## 10    10    0.5362843 0.10751610 0.1 0.5 -0.7 0.3  0.045392967  0.245392967  0
## 11    11    0.5321362 0.10944826 0.1 0.5 -0.7 0.3  0.028722337  0.228722337  0
## 12    12    0.5280111 0.11138677 0.1 0.5 -0.7 0.3  0.012161775  0.212161775  0
## 13    13    0.5239101 0.11333082 0.1 0.5 -0.7 0.3 -0.004286785  0.195713215  0
## 14    14    0.5198342 0.11527960 0.1 0.5 -0.7 0.3 -0.020621535  0.179378465  0
## 15    15    0.5157846 0.11723230 0.1 0.5 -0.7 0.3 -0.036840791  0.163159209  0
## 16    16    0.5117621 0.11918813 0.1 0.5 -0.7 0.3 -0.052942995  0.147057005  0
## 17    17    0.5077677 0.12114632 0.1 0.5 -0.7 0.3 -0.068926710  0.131073290  0
## 18    18    0.5038023 0.12310609 0.1 0.5 -0.7 0.3 -0.084790621  0.115209379  0
## 19    19    0.4998666 0.12506670 0.1 0.5 -0.7 0.3 -0.100533532  0.099466468  0
## 20    20    0.4959615 0.12702741 0.1 0.5 -0.7 0.3 -0.116154362  0.083845638  0
## 21    21    0.4920876 0.12898749 0.1 0.5 -0.7 0.3 -0.131652148  0.068347852  0
## 22    22    0.4882457 0.13094625 0.1 0.5 -0.7 0.3 -0.147026035  0.052973965  0
## 23    23    0.4844362 0.13290301 0.1 0.5 -0.7 0.3 -0.162275280  0.037724720  0
## 24    24    0.4806598 0.13485710 0.1 0.5 -0.7 0.3 -0.177399243  0.022600757  0
## 25    25    0.4769171 0.13680787 0.1 0.5 -0.7 0.3 -0.192397390  0.007602610  0
## 26    26    0.4732084 0.13875471 0.1 0.5 -0.7 0.3 -0.207269284 -0.007269284  0
## 27    27    0.4695341 0.14069701 0.1 0.5 -0.7 0.3 -0.222014588 -0.022014588  0
## 28    28    0.4658948 0.14263419 0.1 0.5 -0.7 0.3 -0.236633054 -0.036633054  0
## 29    29    0.4622906 0.14456569 0.1 0.5 -0.7 0.3 -0.251124526 -0.051124526  0
## 30    30    0.4587219 0.14649098 0.1 0.5 -0.7 0.3 -0.265488936 -0.065488936  0
##    B2 B3
## 1   0  0
## 2   0  0
## 3   0  0
## 4   0  0
## 5   0  0
## 6   0  0
## 7   0  0
## 8   0  0
## 9   0  0
## 10  0  0
## 11  0  0
## 12  0  0
## 13  0  0
## 14  0  0
## 15  0  0
## 16  0  0
## 17  0  0
## 18  0  0
## 19  0  0
## 20  0  0
## 21  0  0
## 22  0  0
## 23  0  0
## 24  0  0
## 25  0  0
## 26  0  0
## 27  0  0
## 28  0  0
## 29  0  0
## 30  0  0
## 
## Resultado para la fila 2 con: x1= 0 ,x2= 1 y salida= 1 
##    Epoca Salida_epoca      Error  W1  W2         W3        W4        W5
## 1      1    0.5734985 0.09095176 0.1 0.5 -0.7000000 0.3000000 0.2000000
## 2      2    0.5763797 0.08972707 0.1 0.5 -0.6988435 0.3025502 0.2086538
## 3      3    0.5792426 0.08851839 0.1 0.5 -0.6976468 0.3051725 0.2172406
## 4      4    0.5820873 0.08732553 0.1 0.5 -0.6964110 0.3078643 0.2257605
## 5      5    0.5849137 0.08614832 0.1 0.5 -0.6951374 0.3106234 0.2342140
## 6      6    0.5877220 0.08498658 0.1 0.5 -0.6938269 0.3134475 0.2426010
## 7      7    0.5905121 0.08384016 0.1 0.5 -0.6924808 0.3163342 0.2509220
## 8      8    0.5932842 0.08270888 0.1 0.5 -0.6911002 0.3192812 0.2591771
## 9      9    0.5960381 0.08159259 0.1 0.5 -0.6896862 0.3222865 0.2673666
## 10    10    0.5987741 0.08049113 0.1 0.5 -0.6882398 0.3253477 0.2754907
## 11    11    0.6014919 0.07940435 0.1 0.5 -0.6867621 0.3284626 0.2835497
## 12    12    0.6041917 0.07833210 0.1 0.5 -0.6852541 0.3316293 0.2915438
## 13    13    0.6068735 0.07727423 0.1 0.5 -0.6837170 0.3348455 0.2994733
## 14    14    0.6095372 0.07623060 0.1 0.5 -0.6821517 0.3381091 0.3073384
## 15    15    0.6121829 0.07520106 0.1 0.5 -0.6805592 0.3414183 0.3151395
## 16    16    0.6148105 0.07418548 0.1 0.5 -0.6789404 0.3447709 0.3228769
## 17    17    0.6174201 0.07318370 0.1 0.5 -0.6772965 0.3481650 0.3305507
## 18    18    0.6200116 0.07219561 0.1 0.5 -0.6756282 0.3515986 0.3381613
## 19    19    0.6225850 0.07122105 0.1 0.5 -0.6739366 0.3550700 0.3457091
## 20    20    0.6251403 0.07025990 0.1 0.5 -0.6722226 0.3585772 0.3531942
## 21    21    0.6276775 0.06931202 0.1 0.5 -0.6704870 0.3621184 0.3606171
## 22    22    0.6301966 0.06837728 0.1 0.5 -0.6687308 0.3656919 0.3679779
## 23    23    0.6326975 0.06745555 0.1 0.5 -0.6669548 0.3692959 0.3752772
## 24    24    0.6351803 0.06654670 0.1 0.5 -0.6651598 0.3729286 0.3825151
## 25    25    0.6376450 0.06565059 0.1 0.5 -0.6633468 0.3765885 0.3896920
## 26    26    0.6400914 0.06476710 0.1 0.5 -0.6615165 0.3802739 0.3968082
## 27    27    0.6425196 0.06389610 0.1 0.5 -0.6596697 0.3839832 0.4038642
## 28    28    0.6449297 0.06303746 0.1 0.5 -0.6578072 0.3877148 0.4108601
## 29    29    0.6473215 0.06219106 0.1 0.5 -0.6559298 0.3914672 0.4177965
## 30    30    0.6496951 0.06135676 0.1 0.5 -0.6540383 0.3952389 0.4246736
##           W6 B1 B2 B3
## 1  0.4000000  0  0  0
## 2  0.4149817  0  0  0
## 3  0.4298520  0  0  0
## 4  0.4446112  0  0  0
## 5  0.4592598  0  0  0
## 6  0.4737981  0  0  0
## 7  0.4882264  0  0  0
## 8  0.5025450  0  0  0
## 9  0.5167544  0  0  0
## 10 0.5308549  0  0  0
## 11 0.5448469  0  0  0
## 12 0.5587306  0  0  0
## 13 0.5725067  0  0  0
## 14 0.5861753  0  0  0
## 15 0.5997369  0  0  0
## 16 0.6131920  0  0  0
## 17 0.6265409  0  0  0
## 18 0.6397840  0  0  0
## 19 0.6529218  0  0  0
## 20 0.6659547  0  0  0
## 21 0.6788832  0  0  0
## 22 0.6917076  0  0  0
## 23 0.7044285  0  0  0
## 24 0.7170463  0  0  0
## 25 0.7295614  0  0  0
## 26 0.7419745  0  0  0
## 27 0.7542859  0  0  0
## 28 0.7664962  0  0  0
## 29 0.7786059  0  0  0
## 30 0.7906155  0  0  0
## 
## Resultado para la fila 3 con: x1= 1 ,x2= 1 y salida= 0 
##    Epoca Salida_epoca      Error         W1        W2         W3        W4
## 1      1    0.5858556 0.08575780 0.10000000 0.5000000 -0.7000000 0.3000000
## 2      2    0.5805059 0.08798764 0.09837397 0.4969594 -0.7016260 0.2969594
## 3      3    0.5752052 0.09022529 0.09686013 0.4941143 -0.7031399 0.2941143
## 4      4    0.5699537 0.09246990 0.09545663 0.4914633 -0.7045434 0.2914633
## 5      5    0.5647514 0.09472067 0.09416158 0.4890047 -0.7058384 0.2890047
## 6      6    0.5595982 0.09697688 0.09297302 0.4867365 -0.7070270 0.2867365
## 7      7    0.5544939 0.09923784 0.09188895 0.4846566 -0.7081111 0.2846566
## 8      8    0.5494382 0.10150295 0.09090731 0.4827623 -0.7090927 0.2827623
## 9      9    0.5444308 0.10377164 0.09002604 0.4810512 -0.7099740 0.2810512
## 10    10    0.5394712 0.10604339 0.08924304 0.4795203 -0.7107570 0.2795203
## 11    11    0.5345589 0.10831771 0.08855618 0.4781666 -0.7114438 0.2781666
## 12    12    0.5296933 0.11059419 0.08796333 0.4769870 -0.7120367 0.2769870
## 13    13    0.5248739 0.11287240 0.08746233 0.4759780 -0.7125377 0.2759780
## 14    14    0.5201000 0.11515199 0.08705104 0.4751363 -0.7129490 0.2751363
## 15    15    0.5153711 0.11743261 0.08672730 0.4744583 -0.7132727 0.2744583
## 16    16    0.5106863 0.11971393 0.08648895 0.4739403 -0.7135111 0.2739403
## 17    17    0.5060452 0.12199565 0.08633383 0.4735785 -0.7136662 0.2735785
## 18    18    0.5014471 0.12427749 0.08625981 0.4733692 -0.7137402 0.2733692
## 19    19    0.4968913 0.12655917 0.08626475 0.4733084 -0.7137353 0.2733084
## 20    20    0.4923772 0.12884044 0.08634651 0.4733923 -0.7136535 0.2733923
## 21    21    0.4879043 0.13112102 0.08650300 0.4736167 -0.7134970 0.2736167
## 22    22    0.4834718 0.13340068 0.08673210 0.4739778 -0.7132679 0.2739778
## 23    23    0.4790793 0.13567917 0.08703174 0.4744714 -0.7129683 0.2744714
## 24    24    0.4747263 0.13795622 0.08739985 0.4750936 -0.7126001 0.2750936
## 25    25    0.4704122 0.14023160 0.08783440 0.4758401 -0.7121656 0.2758401
## 26    26    0.4661366 0.14250504 0.08833336 0.4767070 -0.7116666 0.2767070
## 27    27    0.4618991 0.14477630 0.08889472 0.4776903 -0.7111053 0.2776903
## 28    28    0.4576992 0.14704510 0.08951652 0.4787857 -0.7104835 0.2787857
## 29    29    0.4535365 0.14931118 0.09019679 0.4799894 -0.7098032 0.2799894
## 30    30    0.4494107 0.15157426 0.09093360 0.4812973 -0.7090664 0.2812973
##               W5           W6 B1 B2 B3
## 1   0.2000000000  0.400000000  0  0  0
## 2   0.1874079143  0.375480817  0  0  0
## 3   0.1749113266  0.351142437  0  0  0
## 4   0.1625111831  0.326987469  0  0  0
## 5   0.1502082961  0.303018186  0  0  0
## 6   0.1380033540  0.279236553  0  0  0
## 7   0.1258969319  0.255644253  0  0  0
## 8   0.1138895008  0.232242706  0  0  0
## 9   0.1019814375  0.209033096  0  0  0
## 10  0.0901730327  0.186016392  0  0  0
## 11  0.0784644996  0.163193369  0  0  0
## 12  0.0668559812  0.140564626  0  0  0
## 13  0.0553475574  0.118130603  0  0  0
## 14  0.0439392515  0.095891602  0  0  0
## 15  0.0326310365  0.073847799  0  0  0
## 16  0.0214228400  0.051999257  0  0  0
## 17  0.0103145495  0.030345943  0  0  0
## 18 -0.0006939835  0.008887736  0  0  0
## 19 -0.0116029392 -0.012375562  0  0  0
## 20 -0.0224125259 -0.033444216  0  0  0
## 21 -0.0331229774 -0.054318548  0  0  0
## 22 -0.0437345497 -0.074998933  0  0  0
## 23 -0.0542475191 -0.095485791  0  0  0
## 24 -0.0646621796 -0.115779583  0  0  0
## 25 -0.0749788420 -0.135880801  0  0  0
## 26 -0.0851978315 -0.155789974  0  0  0
## 27 -0.0953194872 -0.175507653  0  0  0
## 28 -0.1053441608 -0.195034418  0  0  0
## 29 -0.1152722159 -0.214370870  0  0  0
## 30 -0.1251040276 -0.233517633  0  0  0
## 
## Resultado para la fila 4 con: x1= 1 ,x2= 0 y salida= 1 
##    Epoca Salida_epoca      Error        W1        W2   W3  W4        W5
## 1      1    0.5875823 0.08504419 0.1000000 0.5000000 -0.7 0.3 0.2000000
## 2      2    0.5916624 0.08336981 0.1012461 0.5023486 -0.7 0.3 0.2131167
## 3      3    0.5956898 0.08173339 0.1025568 0.5047558 -0.7 0.3 0.2260722
## 4      4    0.5996648 0.08013414 0.1039291 0.5072182 -0.7 0.3 0.2388677
## 5      5    0.6035878 0.07857132 0.1053600 0.5097325 -0.7 0.3 0.2515048
## 6      6    0.6074591 0.07704417 0.1068468 0.5122958 -0.7 0.3 0.2639850
## 7      7    0.6112791 0.07555195 0.1083868 0.5149050 -0.7 0.3 0.2763098
## 8      8    0.6150483 0.07409392 0.1099772 0.5175571 -0.7 0.3 0.2884807
## 9      9    0.6187669 0.07266934 0.1116156 0.5202494 -0.7 0.3 0.3004994
## 10    10    0.6224354 0.07127751 0.1132993 0.5229792 -0.7 0.3 0.3123674
## 11    11    0.6260543 0.06991770 0.1150261 0.5257437 -0.7 0.3 0.3240865
## 12    12    0.6296239 0.06858922 0.1167935 0.5285406 -0.7 0.3 0.3356582
## 13    13    0.6331448 0.06729137 0.1185993 0.5313672 -0.7 0.3 0.3470843
## 14    14    0.6366174 0.06602347 0.1204412 0.5342213 -0.7 0.3 0.3583665
## 15    15    0.6400421 0.06478485 0.1223173 0.5371006 -0.7 0.3 0.3695065
## 16    16    0.6434195 0.06357484 0.1242253 0.5400028 -0.7 0.3 0.3805059
## 17    17    0.6467500 0.06239279 0.1261634 0.5429260 -0.7 0.3 0.3913666
## 18    18    0.6500341 0.06123806 0.1281297 0.5458680 -0.7 0.3 0.4020903
## 19    19    0.6532724 0.06011002 0.1301222 0.5488270 -0.7 0.3 0.4126787
## 20    20    0.6564653 0.05900804 0.1321393 0.5518011 -0.7 0.3 0.4231335
## 21    21    0.6596134 0.05793152 0.1341792 0.5547884 -0.7 0.3 0.4334566
## 22    22    0.6627171 0.05687986 0.1362404 0.5577874 -0.7 0.3 0.4436497
## 23    23    0.6657771 0.05585247 0.1383211 0.5607963 -0.7 0.3 0.4537145
## 24    24    0.6687938 0.05484878 0.1404200 0.5638137 -0.7 0.3 0.4636527
## 25    25    0.6717677 0.05386821 0.1425356 0.5668380 -0.7 0.3 0.4734661
## 26    26    0.6746995 0.05291021 0.1446664 0.5698677 -0.7 0.3 0.4831565
## 27    27    0.6775896 0.05197425 0.1468111 0.5729017 -0.7 0.3 0.4927256
## 28    28    0.6804385 0.05105978 0.1489685 0.5759384 -0.7 0.3 0.5021750
## 29    29    0.6832469 0.05016628 0.1511374 0.5789768 -0.7 0.3 0.5115065
## 30    30    0.6860151 0.04929324 0.1533165 0.5820157 -0.7 0.3 0.5207218
##           W6 B1 B2 B3
## 1  0.4000000  0  0  0
## 2  0.4155523  0  0  0
## 3  0.4309179  0  0  0
## 4  0.4460981  0  0  0
## 5  0.4610945  0  0  0
## 6  0.4759087  0  0  0
## 7  0.4905421  0  0  0
## 8  0.5049965  0  0  0
## 9  0.5192734  0  0  0
## 10 0.5333747  0  0  0
## 11 0.5473021  0  0  0
## 12 0.5610573  0  0  0
## 13 0.5746422  0  0  0
## 14 0.5880586  0  0  0
## 15 0.6013084  0  0  0
## 16 0.6143935  0  0  0
## 17 0.6273157  0  0  0
## 18 0.6400771  0  0  0
## 19 0.6526794  0  0  0
## 20 0.6651248  0  0  0
## 21 0.6774150  0  0  0
## 22 0.6895522  0  0  0
## 23 0.7015381  0  0  0
## 24 0.7133749  0  0  0
## 25 0.7250644  0  0  0
## 26 0.7366087  0  0  0
## 27 0.7480096  0  0  0
## 28 0.7592691  0  0  0
## 29 0.7703891  0  0  0
## 30 0.7813717  0  0  0

Interpretación

Nótese que para cada fila con la cual se hizo el ejercicio, a medida que pasan las épocas la salida por épocas se va acercando a la salida esperada en cada caso, por tanto, la estimación es efectiva, pero puede que sean necesarias más épocas para tener un mejor resultado. Sin embargo, el ejercicio no contempla una red o una estimación para cualquier fila que se ingrese, por tanto, se realizará el proceso usando el método de Batch Gradient Descent que ss un método de optimización usado para entrenar redes neuronales, donde en cada época se usan todos los datos del dataset para calcular el gradiente del error respecto a los pesos y luego se actualizan los pesos una sola vez por época, usando la suma (o promedio) de los gradientes de todos los ejemplos. Además, se modificarán las funciones que se usaron antes para usarlas con este nuevo método.

#Creación de funciones para el método bgd
operaciones_bgd <- function(X1, X2, pesos){
  x1 <- X1
  x2 <- X2
  z1 <- x1*pesos$W1 + x2*pesos$W3 + pesos$B1
  f1z1 <- sigmoid(z1)
  
  z2 <- x1*pesos$W2 + pesos$W4*x2 + pesos$B2
  f2z2 <- sigmoid(z2)
  
  z3 <- pesos$W5*f1z1 + pesos$W6*f2z2 + pesos$B3
  f3z3 <- sigmoid(z3)
  
  list(Z1 = z1, F1 = f1z1,
       Z2 = z2, F2 = f2z2,
       Z3 = z3, F3 = f3z3)
}
calcular_error_general_bgd <- function(f3, t){
  (1/2)*((t - f3)^2)
}
gradiente_manual_nombres_bgd <- function(x1, x2, pesos, t) {
  f <- operaciones_bgd(x1, x2, pesos)
  
  y <- f$F3
  dy_dz3 <- y * (1 - y)
  
  dE_dz3 <- -(t - y) * dy_dz3
  dE_dW5 <- dE_dz3 * f$F1
  dE_dW6 <- dE_dz3 * f$F2
  dE_dB3 <- dE_dz3
  
  df1_dz1 <- f$F1 * (1 - f$F1)
  df2_dz2 <- f$F2 * (1 - f$F2)
  
  dE_dz1 <- dE_dz3 * pesos$W5 * df1_dz1
  dE_dz2 <- dE_dz3 * pesos$W6 * df2_dz2
  
  dE_dW1 <- dE_dz1 * x1
  dE_dW3 <- dE_dz1 * x2
  dE_dB1 <- dE_dz1
  
  dE_dW2 <- dE_dz2 * x1
  dE_dW4 <- dE_dz2 * x2
  dE_dB2 <- dE_dz2
  
  list(
    gradientes = list(
      dE_dW1 = dE_dW1, dE_dW2 = dE_dW2,
      dE_dW3 = dE_dW3, dE_dW4 = dE_dW4,
      dE_dW5 = dE_dW5, dE_dW6 = dE_dW6,
      dE_dB1 = dE_dB1, dE_dB2 = dE_dB2, dE_dB3 = dE_dB3
    ),
    salida = y
  )
}

# --- Acumulación de gradientes (Batch) ---
calcular_gradiente_batch_bgd <- function(datos, pesos) {
  acumulado <- list(
    dE_dW1=0, dE_dW2=0, dE_dW3=0, dE_dW4=0,
    dE_dW5=0, dE_dW6=0,
    dE_dB1=0, dE_dB2=0, dE_dB3=0
  )
  
  errores <- c()
  
  for (i in 1:nrow(datos)) {
    x1 <- datos$x1[i]
    x2 <- datos$x2[i]
    t  <- datos$y[i]
    
    res <- gradiente_manual_nombres_bgd(x1, x2, pesos, t)
    for (n in names(acumulado)) {
      acumulado[[n]] <- acumulado[[n]] + res$gradientes[[n]]
    }
    errores[i] <- calcular_error_general_bgd(res$salida, t)
  }
  for (n in names(acumulado)) {
    acumulado[[n]] <- acumulado[[n]] / nrow(datos)
  }
  
  list(
    gradientes = acumulado,
    error = mean(errores)
  )
}
# Actualizar pesos
Actualizar_pesos_bgd <- function(pesos, gradientes, alpha){
  pesos$W1 <- pesos$W1 - alpha * gradientes$dE_dW1
  pesos$W2 <- pesos$W2 - alpha * gradientes$dE_dW2
  pesos$W3 <- pesos$W3 - alpha * gradientes$dE_dW3
  pesos$W4 <- pesos$W4 - alpha * gradientes$dE_dW4
  pesos$W5 <- pesos$W5 - alpha * gradientes$dE_dW5
  pesos$W6 <- pesos$W6 - alpha * gradientes$dE_dW6
  pesos$B1 <- pesos$B1 - alpha * gradientes$dE_dB1
  pesos$B2 <- pesos$B2 - alpha * gradientes$dE_dB2
  pesos$B3 <- pesos$B3 - alpha * gradientes$dE_dB3
  return(pesos)
}

Desarrollo de las epocas con BGD

pesos <- inicializar_pesos(0.1, 0.5, -0.7,
                           0.3, 0.2, 0.4,
                           0, 0, 0)

alpha <- 0.25
n_epocas <- 30

historial <- list()

for (epoca in 1:n_epocas) {
  # calcular gradiente batch
  resultado <- calcular_gradiente_batch_bgd(datos, pesos)
  
  # guardar historial
  historial <- guardar_epoca(historial, epoca, pesos, resultado$error, NA)
  
  # actualizar pesos
  pesos <- Actualizar_pesos_bgd(pesos, resultado$gradientes, alpha)
}

# convertir a data.frame
df_historial <- as.data.frame(do.call(rbind, historial))
print(df_historial)
##    Epoca Salida_epoca     Error         W1        W2         W3        W4
## 1      1           NA 0.1281504 0.10000000 0.5000000 -0.7000000 0.3000000
## 2      2           NA 0.1280042 0.09990503 0.4998270 -0.7001174 0.2998774
## 3      3           NA 0.1278643 0.09981372 0.4996601 -0.7002313 0.2997603
## 4      4           NA 0.1277306 0.09972594 0.4994990 -0.7003417 0.2996485
## 5      5           NA 0.1276028 0.09964158 0.4993436 -0.7004489 0.2995419
## 6      6           NA 0.1274807 0.09956051 0.4991938 -0.7005529 0.2994403
## 7      7           NA 0.1273639 0.09948263 0.4990493 -0.7006539 0.2993435
## 8      8           NA 0.1272524 0.09940783 0.4989100 -0.7007518 0.2992515
## 9      9           NA 0.1271458 0.09933599 0.4987758 -0.7008469 0.2991641
## 10    10           NA 0.1270440 0.09926703 0.4986465 -0.7009392 0.2990811
## 11    11           NA 0.1269468 0.09920082 0.4985220 -0.7010288 0.2990024
## 12    12           NA 0.1268539 0.09913729 0.4984021 -0.7011158 0.2989278
## 13    13           NA 0.1267653 0.09907634 0.4982866 -0.7012003 0.2988574
## 14    14           NA 0.1266806 0.09901788 0.4981755 -0.7012823 0.2987908
## 15    15           NA 0.1265998 0.09896182 0.4980687 -0.7013620 0.2987280
## 16    16           NA 0.1265227 0.09890808 0.4979659 -0.7014394 0.2986689
## 17    17           NA 0.1264491 0.09885657 0.4978671 -0.7015146 0.2986134
## 18    18           NA 0.1263789 0.09880722 0.4977721 -0.7015877 0.2985614
## 19    19           NA 0.1263119 0.09875996 0.4976808 -0.7016587 0.2985127
## 20    20           NA 0.1262479 0.09871471 0.4975932 -0.7017278 0.2984673
## 21    21           NA 0.1261869 0.09867140 0.4975091 -0.7017949 0.2984250
## 22    22           NA 0.1261287 0.09862996 0.4974284 -0.7018601 0.2983858
## 23    23           NA 0.1260732 0.09859033 0.4973509 -0.7019236 0.2983495
## 24    24           NA 0.1260203 0.09855245 0.4972767 -0.7019853 0.2983161
## 25    25           NA 0.1259698 0.09851625 0.4972056 -0.7020454 0.2982855
## 26    26           NA 0.1259216 0.09848167 0.4971375 -0.7021038 0.2982576
## 27    27           NA 0.1258757 0.09844867 0.4970723 -0.7021607 0.2982323
## 28    28           NA 0.1258319 0.09841718 0.4970099 -0.7022160 0.2982095
## 29    29           NA 0.1257901 0.09838715 0.4969503 -0.7022698 0.2981893
## 30    30           NA 0.1257503 0.09835854 0.4968934 -0.7023223 0.2981713
##           W5        W6            B1            B2           B3
## 1  0.2000000 0.4000000  0.0000000000  0.0000000000  0.000000000
## 2  0.1979063 0.3971153 -0.0002446898 -0.0004131095 -0.004894399
## 3  0.1958590 0.3942949 -0.0004817805 -0.0008132498 -0.009682060
## 4  0.1938574 0.3915375 -0.0007115205 -0.0012007998 -0.014364840
## 5  0.1919006 0.3888421 -0.0009341510 -0.0015761290 -0.018944596
## 6  0.1899878 0.3862074 -0.0011499062 -0.0019395979 -0.023423185
## 7  0.1881182 0.3836324 -0.0013590133 -0.0022915575 -0.027802457
## 8  0.1862910 0.3811158 -0.0015616924 -0.0026323498 -0.032084258
## 9  0.1845052 0.3786566 -0.0017581570 -0.0029623073 -0.036270425
## 10 0.1827602 0.3762537 -0.0019486141 -0.0032817540 -0.040362782
## 11 0.1810551 0.3739060 -0.0021332637 -0.0035910047 -0.044363142
## 12 0.1793891 0.3716123 -0.0023123000 -0.0038903655 -0.048273305
## 13 0.1777614 0.3693715 -0.0024859106 -0.0041801338 -0.052095054
## 14 0.1761713 0.3671826 -0.0026542770 -0.0044605985 -0.055830155
## 15 0.1746179 0.3650445 -0.0028175750 -0.0047320403 -0.059480357
## 16 0.1731005 0.3629562 -0.0029759743 -0.0049947316 -0.063047389
## 17 0.1716184 0.3609167 -0.0031296392 -0.0052489368 -0.066532958
## 18 0.1701709 0.3589248 -0.0032787283 -0.0054949126 -0.069938753
## 19 0.1687571 0.3569796 -0.0034233951 -0.0057329077 -0.073266439
## 20 0.1673763 0.3550802 -0.0035637877 -0.0059631637 -0.076517658
## 21 0.1660280 0.3532254 -0.0037000493 -0.0061859146 -0.079694031
## 22 0.1647112 0.3514144 -0.0038323181 -0.0064013875 -0.082797153
## 23 0.1634255 0.3496462 -0.0039607276 -0.0066098023 -0.085828595
## 24 0.1621700 0.3479199 -0.0040854067 -0.0068113724 -0.088789904
## 25 0.1609441 0.3462345 -0.0042064799 -0.0070063043 -0.091682603
## 26 0.1597473 0.3445891 -0.0043240674 -0.0071947984 -0.094508189
## 27 0.1585787 0.3429830 -0.0044382851 -0.0073770487 -0.097268133
## 28 0.1574379 0.3414151 -0.0045492449 -0.0075532432 -0.099963883
## 29 0.1563241 0.3398846 -0.0046570548 -0.0077235639 -0.102596857
## 30 0.1552367 0.3383908 -0.0047618193 -0.0078881873 -0.105168454

Ahora se usarán los pesos de la red neuronal que nos quedó al final para estimar los resultados de cada fila.

## Fila 1: (x1=0, x2=0) -> esperado=0, predicción=0.5609
## Fila 2: (x1=0, x2=1) -> esperado=1, predicción=0.5606
## Fila 3: (x1=1, x2=1) -> esperado=0, predicción=0.5710
## Fila 4: (x1=1, x2=0) -> esperado=1, predicción=0.5719

Gráfica de la red neuronal resultante

Interpretación

La red neuronal implementada tiene la capacidad de aprender la función XOR, pero en los primeros intentos no logra aproximar correctamente las salidas deseadas porque se entrenó con pocas épocas, una tasa de aprendizaje fija y una inicialización de pesos poco adecuada, por tanto, las predicciones se quedaron en un valor intermedio cercano a 0.56, lo que refleja que la red aún no ha ajustado sus parámetros de manera significativa.