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
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.
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
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)
}
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
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.