Programación Específica > Inteligencia Artificial
Funcionamiento De Una Neurona. Rna
Nebire:
--- Citar ---¿Una neurona siempre se ativa?. Es decir, si tuviera una RNA con 1 capa de entrada (3 neuronas), 1 oculta (2 neuronas) y 1 salida. Para que esa neurona de salida bote un resultado es necesario que todas las anteriores (entrada y salida) hallan botado un resultado de 1, es decir si alguna boto resultado de 0 la salida sera 0
--- Fin de la cita ---
No, no... esto no es así.
La salida final siempre debe dar un valor.
Desde la capa de entrada a la capa oculta se puede acptar o rechazar entradas, pero igualmente deben dar un valor sea 0 , sea 1.
Desde la capa oculta a la salida nuevamente pueden ser aceptadas o rechazadas pero siguen dando un valor.
entonces ¿ qué ? te preguntarás. La cuestión es que se realiza el recuento de valores con el ponderamiento de pesos, si en los valores hay más '0' que '1' implica que en principio habrá menos posibilidades de que se active ya que aunque pondere, si un valor vale 0 * loquesea será 0. Así cada etapa vuelca su resultado en la siguiente etapa. La cuestión estriba en que el estado interno va cambiando no sólo por las entradas sino por la retroalimentación (que contiene información sobre el resultado anterior).
Una sencilla comprobación del resultado podría hacerse asi:
llamemos 'escolar' a la salida de la neurona que está aprendiendo (por referencia al niño que está examinándose en la escuela en su período de aprendizaje).
Explico esto mejor: imagina una escuela pero imagina que el maestro va a evaluar a toda la escuela de una vez, no alumno a alumno, entonces digamos que cada alumno 'crea' su respuesta y para entregarla al profesor acuerdan hallar la media de la respuesta entre todos (si hay 40 alumnos y 30 dicen que es 0 y 10 que es 1 digamos que 'escolar' la salida será 1 que es lo que el maestro va a escrutar). Esta salida por tanto no es la salida final, esta salida la evaluamos con la salida que llamaremos 'maestro' (en relación a que es el maestro quien evalúa la respuesta del niño después que ese la reporta, sin embargo acordamos que todos los nños cooperan en una única respuesta).
Entonces tenemos dos salidas que serán las entradas de la etapa de decisión de aprendizaje (en este ejemplo, solo se provee la parte que evalúa y la señal de retroalimentación, pero no como actúa la retroalimentación con las entradas originales de 'escolar'es). La salida 1ª es la que respuesta que da 'escolar' y la salida 2ª es la respuesta válida que ofrece el 'maestro'
digamos que la pregunta debiera dar por resultado '1' es decir maestro=1 y que la salida de escolar fuera=0 (es decir los alumnos han provisto que es 0).
Entonces la evaluación de aprendizaje, escrutando el resultado y si no es satisfactorio enviar la señal correspondiente de etroalimentación sería así:
--- Código: Text --- 'escrutar si es válido el resultadoresultadoError = escolar xor maestrosi resultadoError= 1 luego sumamos 1 fallo 'fff' aquí se prepara el valor de maestro para entregarse a los escolares, sería como decirles mirad es aquí donde os equivocasteisen otro caso sumamos 1 acierto 'ttt' aquí se anula respuesta del maestro , pero sigue existiendo retroalimentaciónfin si ' la señal de retroalimentación puede ser doble , es decir contiene 2 informaciones, la primera [B]señala que si hubo error[/B], la respuesta correcta se une individualmente a cada ponderación de la entrada (se entrega a cada escolar) y el escolar debe ser ponderado de acuerdo a su acierto o fallo. Esta respuesta la hemos gestionado y fabricado en los apartados etiquetados como 'fff' y 'ttt', digamos de modo simplificado que fff será la respuesta que sabe* a que escolares debe castigar y cuales premiar,. ttt puede ser idéntico a fff o puede ser distinto (es decir quizás queramos ponderar de una manera cuando el acierto fue bueno y de otra cuando el acierto fue malo o quizás queramos utlizar la misma ponderación sea cual sea el caso, más aún quizás queramos ponderar sólo cuando hubo fallo y dejarlo tal cual cuando hubo acierto (es deicr si fue bien no tocarlo), bien pués la 2ª señal de retroalimentación debe encargarse de esto, de decidir que se entrega. Con esto se obtiene un control mucho mayor pués podemos probar dieferentas ajustes de forma 'externa' sin retocar código. Está 2ª señal está en cualquier caso influenciada por 'resultadoError' recordemos que es la evaluación qie hizo el maestro. Para empezar y por simplicidad no incluyas esta posibilidad, valora por igual cuando hay error y cuando hay acierto, más adelante vuelvo a esto de una forma más ordenada. * no de forma cualitativa sino cuantitativa Es decir usamos un xor para identificar si el resultado es bueno o no, porque si la salida de escolar no coincide con la salida de maestro serán los casos 0-1 ó 1-0, como sea que no coincide implica que siempre hay un 1 y como sólo hay un 1 la operación xor arroja un 1, consecuentemente interpretamos como error. Por tanto 'resultadoError' será 1 siempre que 'escolar' y 'maestro' sean distintos.
sigamos.
Dijimos que 'resultadoError' no es la salida definitiva, la salida definitiva será opuesta al caso de error es decir si 'escolar'= 'maestro', como esto ya lo hemos comprobado con el xor basta con negarlo
--- Código: Text --- salidaProvisional= not('resultadoError' ) ' usamos salidaP para abreviar Esto es una operación NEXOR (not xor), esta operación dice que si escolar=0 y maestro= 0 salidaP=1 , ó si escolar=1 y maestro=1 salidaP=1
Esta salida provisional indica que la salida es aceptable, pero es una salida provisional porque no contiene datos, sólo control, el dato es la salida de 'escolar', por tanto ahora usamos el dato de escolar y la salida verificada, dicho de otro modo esta salida provisional proporcionará la activación final de salida.
Esto último quiere decir que si, la neurona debe dar datos debe hacerse finalmente esto:
--- Código: Text --- salida= salidaP or 'escolar' Pero si nuestra neurona no provee un dato sino que es una etapa de capa la salida debe ser su activación o no activación, por tanto aquí el dato se desprecia, y por tanto la salida es en vez de un dato final es una activación, por tanto:
--- Código: Text --- activado= salidaP
Bien, he explicado como verificar el resultado del dato con un xor y sólo parte de como tomar los datos que se usarán para retroalimentar, también he explicado la salida final sea de dato o de activación, fíjate que este mismo esquema de activación se puede usar para las entradas en la retroalimentación una vez que decidas 2 cosas, cómo (qué método) quieres ponderar las entradas y qué tipo de los que te señalé para ponderar quieres usar (esto último de momento podrías obviarlo y devolver siempre el mismo método de ponderación tras cada respuesta, cuando ya lo tengas `programado y veas que el código funciona (aunque la neurona no parezca responder bien, lo puedes añadir como una optimización).
puedes guiarte (o no) con un esquema similar a este, guiado por fases y pasos:
Fase: 1 ' lo llamarámos diseño físico
1º Representar x entradas. las entradas tienen 2 campos valor y peso. La entrada es un valor externo, el peso se coloca externamente el inicializar, luego se va actualizando internamente, opcionalmente para para el programa salir y en otra coasión no tener que empezar de 0 podrías salvar a disco el estado de los pesos).
2º Decide que función de ponderación vas a usar para unir pesos y valores unificados.
3º Decide el umbral en base al valor y la función final que se espera cumpla la neurona.
4º prueba todos estos pasos para garantizar que no hay errores de código.
Fase 2 ' añadimos evaluación y parte de la retoralimentación, de momento sólo enganchada tal cual sin funcionalidad de retroalimentación
1º La salida del paso 3 de la fase anterior ahora es paso oculto, la salida se evalúa con el maestro. generar si hubo fallo o acierto con xor
2º Generar si la salida final de acuerdo asi es de dato o de activación. Será de activación si esta neurona es la parte oculta de otra mayor.
3º generar retroalimentación usando valor del paso 1 ( de esta fase). lo enganchamos a cada entrada, ahora cada entrada hace un or simple, sólo porque necesitamos que el dato quede enganchado, a medida que vamos completando...
4º prueba todos estos pasos para garantizar que no hay errores de código.
fase 3 ' añadimos funciones completas retroalimentación.
1º En el paso 3º de la fase anterior pusimos las entradas como un or ente el valor de entrada y el resultado de error, esto queda ahora cambiado a una función más compleja, el or se cambia por un xor.
2º La entrada se une con or a la salida del xor (esto es un dato)
3º la salida del el xor (después de recoger el dato del paso 2), se niega (esto es una activación)
4º Ahora la función de ponderación solo se usa con los datos activados
5º prueba todos estos pasos para garantizar que no hay errores de código.
6º alternativamente desengancha la retroalimentación a la entrada y engánchala a los pesos en vez de al valor.
fase 3
1º añade un contador. El contador es una estructura que tiene 2 variables 'pulsos' totales y aciertos o errores, esto se tomaría desde la salida del paso 1º de la fase 2, para crear estadística
2º Esto (la salida final) es un bit de salida (ya habrás decidido si cambiar el tipo de neurona o no) si necesitas más bits de salida crea una matriz, si elegiste un modelo con algunas diferencias quizás debas ignorar ciertos pasos y seguir otras indicaciones.
3º pon a trabajar la neurona y obtén valores, no esperes resultados pronto, posiblemente y en función de la complejidad de lo que hayas hecho podrás obtener resultado a partir de 1000, 10.000 , 100.000 pulsos....
4º recrea las estadísticas para ver si tu neurona o red mejora.
fase optimización 1 ' estas optimizaciones deberían tener un control externo de modo que puedas cambiarlo libremente desde la interfaz de usuario.
1º Es posible que la ponderación la quieras hacer más o menos indirecta, puedes alterar la retroalimentación para que actúe en el peso en vez de en el valor o en ambos con las diferencias oportunas.
2º puedes añadir la señal doble de retoalimentación como te indiqué más arriba, te da más flexibilidad, básicamente lo que hará será discriminar por ejemplo con 4 resultados distintos (2 bits para decidir cual de los 4 se usa) 00= se aplica la misma ponderación tanto si hay fallo como si hay error (como ocurría hasta ahora), 01= se aplica ponderación sólo si hay fallo, no se altera si hay acierto, 10=se aplica ponderación diferente cuando hay fallo que cuando hay acierto, 11=reservado para la siguiente oprimización.
3º prueba todos estos pasos para garantizar que no hay errores de código.
4º pon a trabajar la neurona y obtén valores
5º recrea las estadísticas para ver si tu neurona o red mejora.
optimización 2
1º decidir si esta neurona será de un ciclo interno, de 2 o varios, si es de dos o más ciclos los valores de entradas sólo se toman de nuevo al término del ciclo, mientras se siguen usando las mismas entradas. La salida queda temporalmente desactivada, va a parar a una lista (o la estructura que se te antoje)... en el paso 3 se completa la explicación
2º con esta optimización puedes ahora añadir otro contador, si el anterior era un contador de pulsos de la neurona ahora ese puede ser sólo un contador de ciclo interno y añadirse uno fuera del ciclo, ó sólo tener 1 fuera del ciclo interno. con pulso pués entendemos que un valor se arroja al exterior.
3º Con esta optimización podemos añadir una nueva etapa, esta sería una lista de salidas de cada pulso del ciclo interno, lo que serían entradas a una etapa tras finalizar el ciclo, esta etapa sería una copia casi idéntica de la anterior. Cuando el ciclo interno termina, esta lista dispersa su valor a entradas de la siguiente etapa, el maestro (la respuesta real) es por tanto el mismo que se ha usado en todo el ciclo. Esta etapa también debería contar con retroalimentación.
4º prueba todos estos pasos para garantizar que no hay errores de código.
5º pon a trabajar la neurona y obtén valores
6º recrea las estadísticas para ver si tu neurona o red mejora.
7º realiza cambios leves no bruscos en las funciones de ponderación para ver si se mejora la situación. Salva 'fórmulas' de ponderación que veas han sido más prometedoras por si te alejas con sucesivos cambios volver a la más óptima que tenías hasta el momento.
8º Recuerda que tienes entera libertad para añadir, quitar y hacer cambios, lo que cuenta son los resultados.
9º cuando una neurona obtiene resultados digamos que lo que hasta hora era programado(haciendo pequeños cambios) , el estado inerno que has manejado externamente los funciones, etc.. se debe fijar como si fuera una 'ROM' la neurona ya está lista y especializada.
Ten en cuenta que una neurona entrenada para una cosa puede ser totalmente inútil para otra, no pretendas que una única neurona lleve a cabo múltiples funciones distintas. fíjate en los sentidos aunque todo provenga de los nervios, el nervio óptico está superespecializado en colores, la piel en cambio no reconoce colores pero ambos puedes reconocer formas aunque de forma distinta y de distancias distintas.
Hadess_inf:
Gracias por tomarte un tiempo para contestarme, seguire leyendo cuantas veces sea necesario para entender el ejemplo. Graias. Te aviso cuando lo entienda o cuando tenga otra duda.
Nebire:
Haré unos diagramas a mano alzada (soy muy malo dibujando en el ordenador) y lo escanearé (esto es asequible en tiempo), y luego a medida que vaya encontrando tiempo iré explicando, en detalle el diagrama.
El diagrama responde a lo anotado en el anterior mensaje (que por cierto tiene un par de gazapos).
Con el diagrama y lo que tengas aprendido creo que podrías llevar a cabo tu intento.
El diagrama en realidad serán varios, pero que giran en torno al más básico.
Nebire:
Ya he hecho un par de esquemas, mañana veré si le doy un retoque.
El fin de semana veré si instalo el escáner y subo una de las imágenes y la comento, también he empezado a hacer una clase para ese primer diagrama...
Ahora la duda que tengo es si interesara más hacerlo todo en forma de manual que no a golpe de mensaje, pués la verdad que cuando maduras los conceptos queda más nítido que cuando lo vas 'soltando' sobre la marcha...
Hadess_inf:
Hola . gracias nuevamente. Esperare anioso tusfuturos post. Y con lo que respecta al modo de publicarlos, tu eres el Experto.
Saludos.
Navegación
[*] Página Anterior
Ir a la versión completa