Martha Teresa Hernández García 964384
Alfonso Arturo Martínez Covarrubias 965297
José Angel Daza Arévalo 965109
Descripción detallada de la actividad o acción que va a aprender el agente:
Nuestro agente aprenderá a determinar el lenguaje de programación en el que está escrito cierto código. Para fines prácticos se decidió usar 100 líneas como el tamaño estándar de un programa y se eligieron python, c, java, brainfuck , clojure, erlang y php como las diferentes categorías de clasificación.
Solución planteada al problema utilizando Redes Neuronales.
i. Patrones de aprendizaje a alimentar a la red.
El patrón de aprendizaje está formado de la siguiente manera:
{(), *, +, [], |, $, class, private, abstract, #, include, :, -, /, extends,tipo}
El tipo indica el lenguaje en el que está escrito el patrón y se encuentra representado por un número que le sirve como identificador:
| Lenguaje | Identificador |
| Brainfuck | 1 |
| C | 2 |
| Clojure | 3 |
| Erlang | 4 |
| Java | 5 |
| PHP | 6 |
| Python | 7 |
Se utilizaron 180 patrones de entrenamiento y 20 de prueba.
Ejemplos de patrones ya normalizados:
0.1,0.1,0.379894578,0.446452477,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.276560789,0.1,0.1,1
0.403100775,0.1,0.1,0.1,0.1,0.484662577,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.36627907,0.1,6
ii. Codificación de la salida de la red.
La salida esperada se da en función del lenguaje, cuando coincide es .9 y de otro modo es .1
Un ejemplo de corrida para un patrón de brainfuck con un learning rate 0.1 y 500 iteraciones arroja las siguientes salidas:
brainfuck: 0.9039309689853476
c: 0.4039195017870265
clojure: 0.00110839829907677
erlang: 0.1860098159262167
java: 0.24561579367216965
php: 0.00230609875927083
python: 0.14999452134826122
El mas alto fue: brainfuck con 0.9039309689853476
iii. Tipo de red neuronal a ser utilizada.
Se utilizó una red con backpropagation sin momento.
iv. Numero de capas (entrada, intermedias, salida) y número de neuronas en cada capa.
Se utilizaron tres capas:
- Entrada: tiene una neurona por cada elemento del patrón, en este caso 15.
- Intermedia: tres neuronas
- Salida: cuenta con una neurona por cada lenguaje a clasificar, en este caso siete.
v. Parámetros de la red (tasa de aprendizaje, momento, iteraciones).
Los parámetros utilizados durante las corridas fueron:
Tasa de aprendizaje: 0.1
Momento: 0
Número de iteraciones: 500
vi. Ejemplos de corridas:
1. Consultas antes de ser entrenada, sobre el mismo patrón:
brainfuck: 0.3857002119433452
c: 0.529471884215105
clojure: 0.5329316599809784
erlang: 0.37856010225680786
java: 0.424328560670766
php: 0.5580562945750396
python: 0.4654049231815472
El mas alto fue: php con 0.5580562945750396
brainfuck: 0.5414016717219081
c: 0.4451402281014731
clojure: 0.5352479454431825
erlang: 0.501268809173719
java: 0.4762154279639208
php: 0.5045365222069539
python: 0.34560503045313556
El mas alto fue: brainfuck con 0.5414016717219081
2. Consultas después de ser entrenada.
brainfuck: 0.9039309689853476
c: 0.4039195017870265
clojure: 0.00110839829907677
erlang: 0.1860098159262167
java: 0.24561579367216965
php: 0.00230609875927083
python: 0.14999452134826122
El mas alto fue: brainfuck con 0.9039309689853476
Conclusiones después de la programación.
En primer lugar notamos que las redes neuronales son fáciles de programar comparadas con otros algoritmos que hemos usado en la clase. Es importante fijarse bien en el diseño y en las conexiones entre neuronas, así como la actualización de los pesos, una vez logrado eso simplemente tenemos que entrenarla.
Sin embargo, el tiempo de entrenamiento si es algo tardado y hay que probar con diferentes iteraciones y constantes de aprendizajes para lograr el resultado más óptimo.
También nos dimos cuenta de que en este caso en particular probablemente los patrones tenían mucho ruido y tal vez convendría utilizar C4.5 para eliminar el ruido en los patrones, es decir, los elementos que no aportan nada y hacen que a nuestra red neuronal le cueste mucho aprender.
Paper de Apoyo:
http://www4.rgu.ac.uk/files/
No hay comentarios:
Publicar un comentario