introduccion a las redes neuronales
TRANSCRIPT
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
1
INTRODUCCIÓN A LAS REDES NEURONALES ARTIFICIALES
El presente artículo tiene como objetivo presentar una visión general del funcionamiento
de las Redes neuronales artificiales supervisadas, específicamente los modelos Perceptron y
Perceptron Multicapa bajo el algoritmo Backpropagation. Para entender el modelo propuesto por
estas técnicas algorítmicas es necesario presentar una explicación básica del funcionamiento de
las redes neuronales biológicas, lo cual permitirá comprender posteriormente la arquitectura de
cada red artificial.
El presente documento mostrará aspectos teóricos del funcionamiento de una red neural
biológica partiendo de la explicación del comportamiento de la neurona. Posteriormente, se
presentarán los modelos de Redes neuronales artificiales supervisadas. Luego, se mostrarán
ejemplos de cálculo para el entrenamiento y validación de dichas redes neuronales. Una vez
entendido el modelo de cada red, se pasará a presentar la implementación algorítmica utilizando
el software Matlab 7.0. Para esto se hará uso de código abierto y de funciones pertenecientes al
Toolbox de Redes neuronales. Finalmente, se presentarán algunos ejemplos de aplicaciones de las
redes neuronales comolo es el reconocimiento de caracteres.
1. El sistema nervioso central
El sistema nervioso central trabaja en compañía del sistema endocrino (encargado de la
secreción de hormonas) con el objetivo de mantener la homeostasis del organismo. Los sentidos
del gusto, tacto, olfato, etc. se originan en las neuronas sensoriales que se encargan de enviar
señales eléctricas al cerebro. Tanto el encéfalo como la médula espinal conforman el Sistema
nervioso central (SNC). Los órganos sensoriales y motores conforman al Sistema nervioso
periférico (SNP).
Los órganos sensoriales utilizan dos tipos de neuronas: aquellas que sensan el ambiente
externo del organismo (por ejemplo, los sensores de tacto en la piel) y aquellos que sensan el
ambiente interno (por ejemplo, los sensores de los órganos internos). La información de todos los
sentidos es integrada tanto en el cerebro como en la médula espinal para su procesamiento. Como
respuesta a esto, se producen impulsos eléctricos transmitidos a los músculos y glándulas
endocrinas a través de las neuronas motoras. Es así que el sistema nervioso controla el
Autor: Mag. Ing. Sergio Salas Arriarán
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
2
movimiento de todos los músculos estriados, lisos y la secreción de los órganos de las glándulas
endocrinas y exocrinas (como lo son las glándulas sudoríparas, lacrimales, etc.)
2. La estructura de la neurona y su potencial de acción
La unidad básica del sistema nervioso es la neurona. La estructura básica y las partes de esta
célula se muestran en la Figura 1. La función de la neurona se basa en el transporte de información
representada como impulsos eléctricos denominadosPotenciales de acción. Las dendritas son
extensiones de la neurona que actúan como antenas receptoras de señales de entrada de otras
células (en la mayoría de los casos de otras neuronas). El soma o cuerpo celular contiene
organelas, las cuales se encargan de mantener el metabolismo de la neurona. El axón es un
conducto que permite el transporte de la señal eléctrica desde el cuerpo celular hasta los
terminales sinápticos o axónicos, los cuales generan la señal de salida. El axón cuenta a su
alrededor con las vainas de mielina, las cuales son lipoproteínas que actúan como aislantes
eléctricos, protegiendo al impulso eléctrico que es transportado. La señal de salida de los
terminales axónicos puede variar dependiendo del tipo de neurona. Por ejemplo, para una
neurona sensorial, la señal de salida podría ser la liberación de un tipo de hormona denominada el
neurotransmisor que será detectada por las dendritas de la neurona adyacente. Para el caso de
una neurona motora, la salida puede ser otra hormona (acetilcolina) que causa la contracción de
las células musculares.
Figura 1. Estructura y partes de la neurona.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
3
Lo interesante resulta al analizar el proceso por el cual el impulso eléctrico es generado y
viaja del soma a los terminales axónicos. Esto se debe a que la membrana celular de la neurona
posee una polaridad eléctrica causada por la permeabilidad a ciertos iones durante su estado de
reposo. El potencial de membrana en esta situación es de aproximadamente -70mV y se produce
debido a la diferencia de cargas eléctricas entre el exterior e interior de la membrana celular. El
interior de la neurona resulta ser más negativo que el exterior. Sin embargo, este potencial puede
cambiar si es que se genera el movimiento de ciertos iones del exterior al interior de la célula. Los
iones no pueden cruzar la membrana celular ya que esta actúa como una barrera infranqueable
gracias a su doble capa bilípida. La única forma que poseen los iones para poder atravesar la
membrana es a través de los poros o canales iónicos. Algunos canales iónicos siempre están
abiertos, permitiendo el escape de iones de un área de alta concentración a una zona de baja
concentración (difusión). En estado de reposo la concentración de iones de potasio es alta dentro
de la neurona. El potencial negativo de reposo se mantiene a pesar de un pequeño flujo de salida
de potasio fuera de la célula, permitiendo una carga negativa. Por otro lado, otros canales iónicos
solamente serán abiertos bajo ciertos estímulos, como el cambio en el potencial de membrana o la
detección de ciertos ligandos específicos. Es así que el potencial de acción es generado por la
apertura de los canales iónicos de sodio ubicados en puntos específicos de la neurona. La apertura
de estos canales genera un ingreso de iones de sodio al citoplasma de la célula lo que causa que el
interior se torne cada vez más positivo con respecto al exterior. Este incremento resulta en una
despolarización de una región de la membrana celular. Después de que los canales de sodio
permanecen abiertos, otros canales de potasio se abren, permitiendo la salida de estos iones y
generando el proceso de repolarización, en el cual la membrana celular retorna a su potencial
negativo de reposo. Mientras que los canales de potasio están abiertos, los canales de sodio están
cerrados e inactivos y no pueden volver a ser activados durante un corto periodo de tiempo
denominado Periodo refractario. Este periodo garantiza que la conducción del potencial de acción
sea unidireccional, transmitiéndose únicamente desde el soma hacia los terminales axonales y
nunca viceversa. Cabe recalcar que la amplitud del impulso eléctrico no se ve atenuada conforme
viaja a través del axón. En la Figura 2 se presenta un típico potencial de acción nervioso.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
4
Figura 2. El potencial de acción nervioso y sus fases.
Las neuronas no son las únicas células que conforman el sistema nervioso. La glía está
conformada por un conjunto de células que rodean a las neuronas y les dan el soporte, protección
y nutrientes necesarios para su sostenimiento. Las células gliales superan en número a las
neuronas en unas 10 a 50 veces más. Un tipo especializado de célula gliales la oligodendrocita que
se encarga de rodear a las neuronas del SNC y del SNP formando los segmentos de mielina en las
neuronas funcionales. Los espacios libres entre los segmentos de mielina se denominan los
Nódulos de Ranvier (obsérvese en la Figura 1 los espacios entre cada bloque de vaina de mielina).
Estas regiones de Ranvier son zonas no aisladas y permiten que el potencial de acción viaje de
nódulo a nódulo. El salto que el potencial de acción debe realizar entre nódulos se conoce como
Conducción saltatoria y esta permite el incremento de la velocidad de conducción de tal manera
que los potenciales de acción puedan atravesar largas distancias en muy cortos periodos de
tiempo. Existen ciertas enfermedades como la Esclerosis múltiple en la cual se genera la pérdida
de mielina y por lo tanto, el paciente presentas síntomas como pérdida de la movilidad motora y
deficiencias visuales.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
5
3. La comunicación inter neuronal
Una pregunta que una persona se puede hacer en este momento es la siguiente: ¿Cómo es
posible que el potencial de acción pase de una neurona a otra? La respuesta se encuentra en el
análisis entre la conexión que existe entre el terminal axonal de la neurona transmisora y la
dendrita de la neurona receptora. El proceso de comunicación entre estos terminales se denomina
Sinapsis y el espacio sináptico es la hendidura (alrededor de 20-40 nm. de distancia) que separa
ambos elementos. En la Figura 3 se puede observar una imagen de esta conexión.
Figura 3. Esquema de conexión sináptica entre dos neuronas.
El proceso de transmisión del potencial de acción de acción de una neurona a otra se
conoce como sinapsis. Este proceso puede ser de dos tipos: sinapsis química y sinapsis eléctrica.
La sinapsis eléctrica ocurre cuando el terminal axonal de la neurona transmisora y la
dendrita de la neurona receptora se encuentran muy cerca (alrededor de 2 a 3 nm.) y existen unas
proteínas de conexión denominadas conexinas que interconectan ambos terminales. Estas
proteínas permiten el paso directo de iones de la neurona transmisora a la receptora lo cual
estimula directamente el potencial de acción en la neurona receptora. Este tipo de sinapsis no es
muy común y normalmente solo se observa entre las señales nerviosas transmitidas a los
músculos lisos viscerales y células cardiacas musculares. Una de las características más
importantes de este tipo de sinapsis es que puede ser bidireccional.
La sinapsis química comienza cuando el potencial de acción alcanza el terminal axonal de
la neurona presináptica acciona a las mitocondrias las cuales liberarán ATP en grandes cantidades
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
6
que estimularán la apertura de canales iónicos de calcio. La apertura de estas compuertas permite
el ingreso de iones de calcio, los cuales estimularán a las vesículas sinápticas a liberar el líquido
neurotransmisor que llevan dentro. Esta sustancia es una hormona hidrofílica capaz de recorrer el
espacio sináptico hasta entrar en contacto con la dendrita de la neurona postsináptica. Dicha
dendrita posee receptores moleculares, los cuales detectan la presencia del líquido
neurotransmisor. Una vez que culmina el paso del potencial de acción en la neurona transmisora
el líquido neurotransmisor es reabsorbido por dicha neurona.
Los receptores de las dendritas reaccionan con losligandos, los cuales son
neurotransmisores específicos. La reacción de este ligando produce la apertura o cierre de canales
iónicos de sodio o de potasio, dependiendo del tipo de ligando y de receptor. Algunos receptores
actúan como compuertas al mismo tiempo, es decir, son compuertas y detectores de
neurotransmisores a la vez. Mientras, otros receptores trabajan de forma indirecta, activando
otras proteínas que se encargaran de estimular la apertura de canales iónicos. Los primeros tienen
la característica de actuar más rápidamente, permitiendo el paso del potencial de acción de forma
inmediata. Los segundos activan a los canales iónicos a través de proteínas G. Este tipo de
receptores se encuentran en las neuronas que requieren sinapsis más lentas. Esto se observa en la
Figura 4.
Figura 4. El proceso de activación de los ligandos.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
7
Un neurotransmisor puede excitar o inhibir a una neurona receptora. Esto dependerá del tipo
de canales iónicos que esta sustancia estimule en dicha neurona. La apertura de canales de sodio
estimula la despolarización de la neurona y por ende el potencial de acción. En cambio, la apertura
de canales de potasio o de cloro causa hiperpolarización, lo cual inhibe al potencial de acción. Una
simple neurona puede recibir miles de señales sinápticas (se sabe que puede tener hasta 10,000
conexiones con otras neuronas transmisoras) y la suma de todas estas despolarizaciones e
hiperpolarizaciones es la que determinará cuando el potencial de acción será generado. Si el nivel
de disparo de la neurona se excede, entonces el potencial de acción aparecerá. En caso contrario
no ocurrirá nada. Esto explica porque el proceso de sinapsis química se conoce como “de todo o
nada”.
4. Las redes neuronales biológicas.
Uno de los aspectos más fascinantes de las redes neuronales biológicas fue descubierto por el
premio Nobel de medicina del año 2000, Eric Kandel cuando comenzó en la década del 50 sus
estudios sobre el caracol gigante de nombre Aplysia. Dicho animal poseía un sistema nervioso
bastante simple, basado únicamente en 20,000 neuronas. Kandel descubrió que hasta el más
simple de los invertebrados era capaz de aprender funciones básicas, como aspectos de
supervivencia ante ataques externos y también era capaz de recordar eventos relacionados a
nuevos peligros encontrados.
Los estudios de Kandel llevaron a descubrir que durante el proceso de aprendizaje y memoria
las conexiones sinápticas entre las neuronas transmisoras y receptoras cambiaban. Cuando la
Aplysia comenzaba a aprender y memorizar acciones básicas, muchas neuronas empezaban a
facilitar el proceso de sinapsis, lo cual se lograba gracias a que los ligandos de las neuronas
receptoras se hacían cada vez más susceptibles a la apertura de canales iónicos de sodio.
Esto demostró que los procesos relacionados al aprendizaje y la memoria guardan relación con
cambios a nivel sináptico. Las neuronas receptoras facilitaban la excitación sobre la inhibición y
estos cambios tenían que ver con estímulos continuos que eran generados por las neuronas
somato sensoriales. De la misma manera, la carencia de excitación podía hacer que dichas
neuronas volvieran a sus estados inhibitorios (razón por la cual, la Aplysia olvidaba situaciones de
peligro que había experimentado días antes).
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
8
Más adelante, se demostró que el proceso de refuerzo de las conexiones sinápticas también
ocurre en los seres humanos. Esto por supuesto, no demuestra al 100% la razón por la cual los
seres humanos somos capaces de aprender o memorizar ciertos eventos, pero, es un punto de
partida muy importante en la búsqueda del entendimiento del funcionamiento del cerebro.
5. El modelo básico de la neurona artificial
Basándose en los modelos de las redes neuronales biológicas, hace más de 50 años,
Rosenblatt presentó el primer modelo de la neurona artificial utilizada en la Red neuronal artificial
del tipo Perceptron. En la Figura 5 se observa una imagen del modelo de una neurona artificial.
Figura 5. Modelo de la neurona artificial.
Según en el modelo biológico se determinan las siguientes características:
1. La salida de la neurona es todo o nada, es decir 1 o 0 (también podría ser -1 o 1).
2. La salida de la neurona depende de la suma ponderada multiplicada los pesos aplicados a
cada entrada. Esta suma debe alcanzar cierto umbral (Ω) para activar la salida.
3. Los pesos asociados con cada entrada representan la eficiencia de la sinapsis para cada
neurona transmisora. Una sinapsis más eficiente tendrá un peso mayor. El proceso de
entrenamiento consiste en el ajuste de los valores numéricos de estos pesos.
En consecuencia, de la Figura 5 se puede obtener que la suma ponderada (SP) se genera de la
siguiente manera:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
9
Si la sumatoria excede el nivel de disparo Ω de la neurona entonces la salida y es 1, en caso
contrario la salida permanecerá en 0. De tal manera que se cumpla:
Ω
Donde fh es la función de activación.En este caso es la funciónHardlim definida de la
siguiente manera:
fh(x) = 1, para x>=0
= 0, para x<0
Se renombraa Ω el bias u offset. ElΩ se puede introducir como una entrada permanente a
la neurona con un valor de 1. Esto permite llevar la expresión a la siguiente ecuación:
∑ )
Entonces el nuevo modelo de la neurona artificial puede quedar como en la Figura 6.
Figura 6. Modelo de la neurona artificial utilizando bias de entrada.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
10
Por ejemplo, se puede utilizar el modelo de la neurona de la Figura 5 para resolver el
problema de la operación lógica AND. Supongamos que X1 y X2 son neuronas cuyos valores
pueden ser 0 o 1. Estas se conectan a la neurona artificial a través de los pesos W1 y W2. Se debe
elegir los pesos de la red de tal manera que se cumpla la siguiente relación:
Tabla 1. Función lógica AND aplicada a una neurona artificial.
X1 X2 Y
0 0 0
0 1 0
1 0 0
1 1 1
Entonces, se deben seleccionar W1 y W2 de tal manera que para las cuatro entradas
posibles la salida Y genere los valores especificados por la Tabla 1. El modelo de la red neuronal
para este problema se muestra en la Figura 7.
Figura 7. Modelo propuesto para la red neuronal que implementa la función AND.
Supongamos que se selecciona W1 = 1 y W2 = 1 y que el nivel de disparo es 1.5. Para este
caso, se evalúan las cuatro posibles entradas:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
11
Y = fh( 0(1)+0(1) - 1.5 ) = fh(-1.5) = 0
Y = fh( 0(1) + 1(1) – 1.5) = fh(-0.5) = 0
Y = fh( 1(1) + 0(1) – 1.5) = fh(-0.5) = 0
Y = fh( 1(1) + 1(1) – 1.5) = fh(0.5) = 1
Lo que nos da el modelo de red neuronal de la Figura 8.
Figura 8. Modelo solución de la red neuronal para la función AND.
Un detalle importante a notar a modo de ir introduciéndonos a las redes neuronales
artificiales es lo siguiente. La Tabla 1 contiene información de la relación entre las entradas y
salidas. Esto se conoce como patrón de entrenamiento y corresponde al tipo supervisado, ya que
al asignarle un valor a la salida Y correspondiente a cada entrada, se le está indicando a la red
neuronal artificial cual deberá ser la salida deseada. Los pesos de la red se han elegido al azar, de
tal manera que se cumplan las cuatro salidas deseadas. Las redes neuronales no supervisadas se
diferencian de las supervisadas en que no requieren que se indique el valor de la salida deseada Y
para la selección de los pesos.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
12
En este ejemplo, la selección de los pesos se realizó de forma aleatoria. Sin embargo, más
adelante se verá que según el modelo de red neuronal existe una metodología para actualizar los
pesos. El proceso de búsqueda de los pesos óptimos para el cumplimiento de la salida deseada se
conoce como entrenamiento o aprendizaje de la red neuronal.
El proceso de verificación de los resultados (multiplicar las entradas por los pesos y aplicar
la función de activación) se conoce como validación y debe verificarse que la salida Y corresponda
para los cuatro elementos de entrada.
6. El Perceptron
La red neuronal Perceptron posee la arquitectura más sencilla de todas las redes. Su
estructura se muestra en la Figura 9. La red cuenta con una capa de entrada y una capa de salida.
Cada entrada se conecta con todas las neuronas de la capa de salida. El proceso de aprendizaje se
obtiene mediante el ajuste de los pesos asociados con cada una de las entradas, de tal manera que
la red pueda clasificar los patrones de entrada. Para una red de este tipo con múltiples neuronas
ya no es posible seleccionar los pesos al azar como ocurrió en el ejemplo de la Tabla 1.
Figura 9. Modelo de la red neuronal Perceptron.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
13
Para el caso del Perceptron, la función de activación de cada neurona corresponde a la
función hardlim (la salida puede ser 1 o 0) o en algunos casos a la función hardlims (la salida puede
ser -1 o 1). Normalmente, las entradas Xn deben ser números enteros y los pesos pueden ser
cualquier valor real. Los pesos de las conexiones bias (bn) pueden tomar cualquier valor real
también y en la mayoría de los casos pueden ser ignorados del sistema.
La red neuronal del tipo Perceptron fue creada en el año 1957 por el psicólogo Frank
Rosenblatt. Esta red simuló de forma directa el comportamiento de los sistemas nerviosos
biológicos y en un inicio se pensó que podía ser capaz de resolver cualquier problema de
aplicación en los campos de la ingeniería, la física, las finanzas y otros más. El modelo fue utilizado
para reconocer secuencias de patrones de entrada que en algunos casos se logró con éxito. Sin
embargo, el Perceptron mostró problemas cuando utilizaba patrones de entrada muy grandes, ya
que no llegaba a encontrar los pesos adecuados para cumplir con todos los patrones introducidos
a la red. Este hecho y el factor de que la red Perceptron era incapaz de poder resolver el problema
de la función lógica XOR hicieron que perdiera importancia y esto hizo que el estudio de las redes
neuronales sea ignorado por varios años.
El algoritmo del Perceptron consiste en lo siguiente:
1. Inicializar los pesos y bias con valores aleatorios (normalmente entre valores de -0.5 y 0.5).
2. Presentar un patrón de entrenamiento (que consiste de la entrada y la salida deseada).
3. Calcular la salida y de la red de la siguiente manera:
Donde f() puede ser la función hardlim o hardlims. La variable t representa la t-ésima
iteración o repetición de los patrones de entrada a la red neuronal. La variable n
representa el número total de neuronas de la capa de salida de la red. El índice i indica el
número de neurona.
4. Adaptar los pesos según el resultado.
Si la salida obtenida y es igual a la salida deseada entonces los pesos no se corrigen de tal
manera que: 1
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
14
Si la salida obtenida y es 0 y debió ser 1, entonces los pesos se corrigen de la siguiente
manera: 1
Si la salida obtenida y es 1 y debió ser 0, entonces los pesos se corrigen de la siguiente
manera: 1
5. El error resultante para cada entrada se puede obtener de la siguiente manera:
, en donde d(t) es la salida deseada e y(t) es la salida actual. Es posible
generalizar el proceso de adaptación de los pesos en función del error de la siguiente
forma general:
1
Donde α se denomina el coeficiente de aprendizaje y normalmente toma un valor entre 0
y 1. Este coeficiente permite estabilizar el proceso de entrenamiento con el costo de
obtener una mayor cantidad de iteraciones. Si se desea ignorar su aporte se define con el
valor de 1. El proceso de actualización de los pesos se conoce como la Regla Delta. El bias
también puede actualizarse de la siguiente manera:
1
6. El proceso se debe repetir para todos los patrones de entrada. Cada iteración t deberá ser
al menos igual al número de patrones de entrada. Estos patrones deberán ingresar de
forma intercalada para permitir que los pesos se ajusten hasta que el error para todas las
entradas sea cero.
7. Algoritmo del Perceptron en Matlab
La intención de esta etapa es observar el código que permite implementar la red neuronal
Perceptron de forma tal que se pueda migrar fácilmente a otros lenguajes de programación. Para
poder portar el algoritmo del Perceptron en código fuente es necesario modelar los procesos
mostrados en algebra matricial. Supongamos que se cuenta con una red neuronal de n entradas y
m neuronas de salida. Entonces, una entrada X se puede representar como un vector columna de
n elementos de la siguiente forma:
!"
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
15
El vector de entrada X es de orden nx1. Dado que existen n entradas y m neuronas, habrá
en total mxn coeficientes, con lo cual, la matriz de pesos será de orden nxm:
# … %! & ! … %"
El bias también se representará como un vector ya que existen m elementos para cada una
de las m neuronas. Entonces el bias se puede representar como un vector de orden 1xm:
'() * … . . %, De esta manera, se puede calcular la salida Y de la red que será también un vector de
orden mx1. Esta salida se puede hallar de la siguiente manera:
- .(/0'1 2 3 #
- .(/0'14* … , 3 … %! & ! … %" * …%,5 6
Nótese que para obtener la salida Y es necesario obtener el vector transpuesta de la
entrada X y multiplicarlo por el peso W, dado que si no se hiciera esta operación, el orden de las
matrices no permitiría la multiplicación entre estas. Observe que se toma la transpuesta del
resultado de manera que la salida Y sea un vector columna de la siguiente forma:
- !%"
Para el proceso de entrenamiento, se debe contar con un vector objetivo T de tal manera
que este tenga el mismo orden que el vector de salida Y:
T 7!7%"
Luego, se debe calcular el vector Error E,el cual debe tener el mismo orden que el vector
de salida Y y el vector objetivo T (orden mx1). El vector Error representará cuán diferente es la
salida actual del valor deseado T. El error se obtiene de la siguiente manera:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
16
8 7
Una vez obtenido el error se deben actualizar la matriz de pesos W y el vector de bias.
Para esto se aplica la regla Delta:
# # 3 2 3 86 '() '() 3 86
El proceso de obtención del vector Y, el cálculo del vector Error, la actualización de la
matriz de pesos W y del vector bias constituyen el proceso de entrenamiento o aprendizaje de la
red neuronal. Si al cabo del primer entrenamiento no se obtuvo un vector Error con todos sus
elementos iguales a 0, esto significará que existen diferencias entre el vector deseado T y el
vector de salida Y, con lo cual el proceso se deberá volver a repetir hasta que se logre obtener un
vector Error con todos sus elementos iguales a 0. Normalmente, el proceso de aprendizaje debe
realizarse tomando como referencia un número máximo de veces o iteraciones en las que el
proceso se repetirá. Si al cabo de esa cantidad de iteraciones no se ha logrado obtener el error
deseado entonces se determinará que el proceso de entrenamiento no ha sido completado. De
darse esta situación el programador tendría que reiniciar el proceso de aprendizaje pero tomando
en cuenta ciertos cambios recomendados:
1. Modificar el valor del coeficiente de aprendizaje α.
2. Probar con otros valores aleatorios de inicio para la matriz de pesos W.
3. Probar con otros valores aleatorios de inicio para la matriz bias.
4. Cambiar el número de neuronas de la capa de entrada.
5. Utilizar otro conjunto de patrones de entrada y salida deseada.
En el Anexo A, se muestra el código de tres funciones que implementan en Matlab el
algoritmo explicado. Se presentan tres funciones: crear_Perceptron(), entrena_Perceptron() y
simula_Percpetron(). Dichas funciones permiten poder crear una red neuronal de un tamaño
específico, entrenarla para determinar sus pesos y bias óptimos y luego validar sus salidas
respectivamente. Previamente, las funciones deben estar almacenadas en la carpeta de trabajo
por defecto del Matlab para que puedan ser invocadas. Para efectos de entender el
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
17
funcionamiento de cada función se presenta un ejemplo aplicado. Supongamos que se cuenta con
un sistema de 5 entradas y tres salidas que debe cumplir la siguiente relación:
Tabla 2. Relación de entrada y salida deseada.
X1 X2 X3 X4 X5 Y1 Y2 Y3
0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0
0 0 0 1 0 0 1 0
0 0 1 0 0 1 0 0
0 1 0 0 0 1 0 1
1 0 0 0 0 1 1 0
1 0 0 0 1 1 1 1
En este ejemplo, se puede notar que la entrada X cuenta con 5 valores y la salida Y con
tres neuronas. El primer paso para implementar este sistema consiste en invocar en Matlab a la
función crear_Perceptron(), de la siguiente manera:
red = crear_Perceptron(5,3,1,’cero’)
La función crear_Perceptron() recibe cuatro parámetros de entrada. El primer parámetro
tiene el valor de 5 y representa el número de entradas a la red neuronal, el cual según el valor de X
corresponde a cinco entradas. El segundo parámetro representa el número de neuronas de salida
de la red. El tercer parámetro representa el valor del coeficiente de aprendizaje α y finalmente, el
último valor es una cadena de caracteres que puede tomar dos valores: ‘cero’ o ‘rand’. En el
primer caso, se especificará que los coeficientes de la matriz de pesos como el vector bias se
inicialicen con ceros. En el segundo caso, se estará especificando que la matriz de pesos y el vector
bias se inicien con valores aleatorios en el rango de -1 y 1. Como valor de retorno, la función
devolverá un objeto de nombre red, el cual tendrá tres parámetros: red.pesos, red.bias y red.alfa.
El primer parámetro tendrá la matriz de pesos iniciales cuyo orden en este caso será de 5x3. El
segundo parámetro es el vector bias cuyo orden será de 1x3. Finalmente, el último valor es el
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
18
coeficiente de aprendizaje. Por ejemplo, al ejecutar la función se obtendrá los siguientes
resultados:
red =
pesos: [5x3 double]
bias: [0 0 0]
alfa: 1
Entonces, la matriz red.pesos es de orden 5x3 y contiene solamente cifras de valor cero.
Igual ocurre para la matriz red.bias que es de orden 1x3. Finalmente, el coeficiente red.alfa toma
el valor de 1 asignado como parámetro de entrada a la función.
Posteriormente, se deberán crear las matrices de entrada X y la matriz objetivo T.
Obsérvese que cada patrón de entrada contiene cinco neuronas y en total se tienen 7 patrones. La
matriz X de entrada a ser usada en la función de entrenamiento debe tener el formato siguiente:
cada columna deberá corresponder a un patrón de entrada. Cada fila representará los diferentes
valores que toman las neuronas de entrada, por ejemplo, la fila 1 representará los valores de X1, la
fila 2 de X2 y así sucesivamente. De esta manera, la matriz X será de orden 5x7 y tendrá el
siguiente formato:
X=
El vector objetivo en cambio tendrá un orden distinto dado que solo existen 3 neuronas de
salida y 7 patrones de salida. La matriz deseada T quedaría de orden 3x7 y tendría los siguientes
valores:
T=
Luego, se invoca a la función entrena_Perceptron() que realiza el entrenamiento de la red
neuronal. El formato de la función es de la siguiente manera:
0 0 0 0 0 1 1
0 0 0 0 1 0 0
0 0 0 1 0 0 0
0 0 1 0 0 0 0
0 1 0 0 0 0 1
0 1 0 1 1 1 1
0 0 1 0 0 1 1
0 0 0 0 1 0 1
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
19
red_T = entrena_Perceptron(red,X,T,500)
Esta función toma cuatro parámetros de entrada. El primero es el objeto red, el cual
contiene la matriz de pesos inicial red.pesos, la matriz bias inicial red.bias y el coeficiente de
aprendizaje red.alfa. El segundo parámetro corresponde a la matriz de entrada X donde cada
columna de X representa un patrón de entrada. Luego, T es la matriz de valores deseados, donde
la i-ésima columna de T representa la salida respectiva para la i-ésima columna de X. Finalmente,
el cuarto parámetro representa el número máximo de iteraciones que puede realizar el proceso de
entrenamiento. En este ejemplo, la red intentará repetir el proceso de entrenamiento hasta 500
veces. Una vez ejecutada la función de entrenamiento, el objeto red_T devuelve los siguientes
valores:
>>red_T.pesos
ans =
1 1 2
1 0 3
1 -1 0
-1 1 0
1 0 1
>>red_T.bias
ans =
-1 -1 -3
>> red_T.epochs
ans =
8
>>red_T.error
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
20
ans =
0
Como se puede observar la matriz de pesos entrenados red_T.pesos es de orden 5x3. Cada
uno de sus valores corresponde a cada coeficiente que interconecta una de las cinco entradas de X
con cada una de las tres neuronas de la capa de salida. Luego, red_T.bias contiene los valores del
vector bias que polariza directamente a cada neurona. Luego, red_T.epochs es una variable que
contiene el número de iteraciones totales que el entrenamiento realizó para obtener el error en
cero. Finalmente, la variable red_T.error representa el error del proceso de entrenamiento y este
debe ser siempre cero, en caso contrario, la red no habría llegado a ser entrenada.
Finalmente, lo único que queda es validar los resultados de la red. Para esto se utiliza la
función simula_Perceptron() de la siguiente manera:
A = simula_Perceptron(red_T,P)
En esta función la variable A es un vector que toma los valores de salida para la entrada P
dada. P es un vector columna con una de las combinaciones de entrada presentadas en la Tabla 2
y red_T es el objeto que contiene la matriz de pesos y bias con los valores entrenados. Suponga
que se toma el vector P con el siguiente valor de entrada en Matlab:
P = [1;0;0;0;0]
P =
1
0
0
0
0
Luego, al simular este valor, el vector A que se obtiene presenta los siguientes valores:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
21
A =
1 1 0
Como se puede observar el vector A contiene la combinación de salida que corresponde a la
entrada X = 1 0 0 0 0, tal y como se puede comprobar en la Tabla 2. Lo interesante es que también
se pueden probar valores de P que no se encuentran en la Tabla 2 y se podría verificar que la
salida generará valores con cierta relación a aquellas entradas que son similares.
8. Toolbox de Matlab 7.0 para configuración del Perceptron
Matlab cuenta con un conjunto de funciones que facilitan la implementación de redes
neuronales de diversos tipos. Para crear una red neuronal del tipo Perceptron lo primero que se
debe hacer es instanciar un objeto del tipo red neuronal de la siguiente manera:
net = newp(PR,S);
En este caso net es el nuevo objeto instanciado. newp() es una función que permite crear el
objeto y al mismo tiempo definir la arquitectura de la red. Esta función cuenta con dos parámetros
de entrada. PR es el primer parámetro y viene a ser una matriz de r filas y 2 columnas, en donde r
viene a ser el número de elementos de entrada. Cada fila posee dos elementos, el primero
corresponde al valor mínimo que puede tomar la entrada Xi (donde i = 1,2,3,..r) y el segundo el
valor máximo. El segundo parámetro S, es una variable escalar que representa el número de
neuronas de la capa de salida. La función de activación de la red neuronal por defecto es la
Hardlim.
Por ejemplo, suponga que se ejecuta la siguiente instrucción:
net = newp([0 2],1);
Esto implica que se está creando una nueva red neuronal de una entrada y una salida. Los
valores mínimos y máximos de nuestra única entrada son 0 y 2 respectivamente.
Una vez inicializada la red, se puede obtener información de los pesos de entrada (en este
caso, al haber una sola entrada y una única neurona de salida solo existirá un único peso). Esto se
logra de la siguiente manera:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
22
Inputw = net.inputweights1,1
Lo que genera como resultado:
Inputw=
delays: 0
initFcn: ‘initzero’ %indica que los pesos iniciales son cero.
learn: 1
learnFcn: ‘learnp’ %indica la función de aprendizaje.
size: [1 1] %Tamaño del vector de pesos, en este caso es un escalar.
User data: [1 x 1 struct]
weightFcn: ‘dotprod’ %indica que la salida es hardlim(entrada x peso + bias).
De la misma manera se puede obtener información del bias:
biases = net.biases1
biases=
initFcn: ‘initzero’
learn: 1
learnFcn: ‘learnp’
learnParam: [ ]
size: 1
userdata: [1 x 1 struct]
Por defecto tanto los pesos como el bias son inicializados en cero. Sin embargo, es posible
asignarle a la red Perceptron un peso y bias iniciales. En el siguiente código se muestra un ejemplo
de inicialización de estos coeficientes:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
23
net = newp([-2 2;-2 2],1); %se crea una red de dos entradas y una salida.
% Esto generará dos pesos y un bias de valor 0.
net.IW1,1 = [-1 1]; %se inicializan los dos pesos con -1 y 1.
net.b1 = [1]; %se inicializa el peso del bias con 1.
Suponga ahora que se desear entrenar la red para que obtenga los pesos y bias necesarios para
cumplir con un patrón de entrada y salida determinado. El siguiente código muestra un ejemplo de
entrenamiento:
net = newp([-2 2;-2 2],1);
net.trainParam.epochs = 1;
P = [ [2;2] [1;-2] [-2;2] [-1;1] ];
T = [0 1 0 1];
En este ejemplo se ha creado una red Perceptron de dos entradas y una salida. Cada
entrada posee un valor mínimo de -2 y máximo de 2. Se eligen cuatro patrones de entrada que
cumplan con la siguiente relación:
Tabla 3. Relación entra la entrada y la salida deseada.
X1 X2 T
2 2 0
1 -2 1
-2 2 0
-1 1 1
En donde T es la salida deseada. La variable net.trainParam.epochs se inicializa en 1 lo que
implica que se presentarán a la red neuronal los parámetros de entrada una sola vez, con lo cual el
cálculo de los pesos solo se hará en una sola iteración. Esto no es recomendable, ya que es muy
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
24
probable que los pesos no se lleguen a ajustar del todo para las cuatro entradas. Sin embargo, se
hace a modo de ejemplo.
Para iniciar el entrenamiento de la red se invoca a la función train, la cual recibe como
parámetro el objeto de la red, la matriz con los valores de entrada y la matriz con los valores de
salida deseada. Una vez invocada la función, los pesos y el bias son calculados. Esto se muestra a
continuación:
net = train(net,P,T)
w = net.IW1,1
w = [-3 -1]
b = net.b1
b = 0
Como se puede observar, los pesos obtenidos no son los adecuados. Si por ejemplo, se
toma la entrada [1 -2], claramente se puede ver que la sumatoria daría hardlim( 1(-3) + -2(-1) ) =
hardlim(-3+2) = hardlim(-1) = 0. Como se puede observar en la tabla anterior, para esta entrada la
salida deseada debió ser 1, con lo cual se puede ver que el entrenamiento no fue adecuado.
Es posible simular la salida de la red neuronal a partir de un conjunto de valores de
entrada. Para esto se hace uso de la función sim(net,P), en donde net es el objeto creado para la
red neuronal Perceptron y P es una matriz con los patrones de entrada que se quieren simular. En
nuestro caso, simularemos la salida para ver qué sucede:
a = sim(net,p)
a = [0] [0] [1] [1]
Como se puede observar, para la entrada P, el segundo y el tercer elemento no cumplen
con los valores de salida deseados. Para esto se recomienda repetir el proceso de entrenamiento,
pero ahora cambiando el número de iteraciones de 1 a 4 con la siguiente instrucción:
net.trainParam.epochs = 4;
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
25
Si se vuelve a simular la red neuronal, los pesos obtenidos darán
w = [-2 -3]
b = 1;
Con esto se obtendrá la siguiente salida después de la simulación:
a = [0] [1.00] [0] [1.00]
Lo que representa la salida deseada, indicando que le error llegó a ser cero probablemente a
la tercera iteración. Como se puede observar, mientras mayor sea el número máximo de
iteraciones permitidas mayor probabilidad habrá de que la red se pueda entrenar correctamente.
9. El Perceptron Multicapa (MLP)
La red neuronal Percpetron multicapa (Multi Layer Perceptron: MLP) es una mejora propuesta
sobre la red neuronal Perceptron simple. Se caracteriza porque las salidas de las neuronas de una
capa se conectan a las entradas de otras neuronas en una capa siguiente conformando una red de
múltiples capas como se observa en la Figura 10. La ventaja de esta propuesta se encuentra en
que posibilita la resolución de problemas en los cuales las entradas y las salidas deseadas no
presentan una relación lineal, como es el caso de la compuerta XOR de dos entradas. La red MLP
se encuentra formada por una capa de entrada (los valores de X), una o más capas intermedias y
una capa de salida.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
26
Figura 10. Modelo de una red neuronal multicapa de dos entradas, una capa oculta y una capa de
salida.
Otra de las ventajas de las redes multicapa es la posibilidad de utilizar funciones de
activación diferentes, las cuales permiten obtener a la salida números reales. Esto permite realizar
aplicaciones en el campo de la predicción, validación, reconocimiento y clasificación con mucha
mayor eficiencia que en el caso del Perceptron simple. Además, esto permite aplicar las redes
neuronales en nuevos campos, como en el de Procesamiento digital de señales en una gran
cantidad de diversos problemas ingenieriles (filtrado de señales, aproximación de señales,
detección de sistemas, compresión de datos, etc).
10. Feedforward Backpropagation
Esta configuración es una de las redes neuronales supervisadas más populares que fue
propuesta por varios autores como David Rumelhart, Geofrey Hinton, Ronal Williams , David
Parker y Yan Lee Cun a mediados de la década de los 80’s. Esta red fue aplicada en una diversidad
de problemas de la ingeniería, comportándose de una manera sumamente eficiente. Es por esta
razón que las redes neuronales Backpropagation son utilizadas en la actualidad.
El término Feedforward que quiere decir “paso hacia adelante” y hace referencia al
funcionamiento de las redes neuronales multicapa. Una combinación de valores de entrada
ingresa a las neuronas de la capa inicial de la red multicapa y todos los valores se multiplican por
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
27
sus respectivos pesos de conexión, generando así una salida en cada neurona que depende de la
función de activación. Dicha salida ingresa como entrada a las neuronas de la siguiente capa y así,
se repite el proceso para las n capas de la red hasta llegar a las neuronas de salida. Es por esto que
una entrada se propaga hacia adelante (de izquierda a derecha). Por otro lado, el término
Backpropagation significa “propagación hacia atrás” y hace referencia al método que se utiliza
para actualizar los pesos y bias de cada neurona: desde adelante hacia atrás (o de derecha a
izquierda).Es decir, primero se actualizan los pesos de las neuronas de la capa de salida y al final el
peso de las neuronas de la capa de entrada.
Las redes neuronales Feedforward Backpropagation utilizan un conjunto de valores de
entrada y salidas objetivo para el proceso de entrenamiento. En dicha etapa, se calcula el error del
sistema para cada iteración. A partir de dicho error se obtiene el valor del Error cuadrático medio
o MSE (Mean Square Error) que es el parámetro objetivo que se desea minimizar en el proceso de
entrenamiento. Normalmente, este error nunca llega a ser cero, por lo cual se debe elegir un error
mínimo que al ser alcanzado determinará el final del entrenamiento. El algoritmo que permite
reducir el MSE es el conocido método LMS (Least Mean Square) utilizado en múltiples técnicas de
Procesamiento digital de señales.
Una de las grandes ventajas de las redes Backpropagation es que sus salidas pueden ser
cualquier valor real definido por la matriz objetivo, gracias a que la función de activación que
utiliza en las neuronas de salida puede ser de tipo lineal. Esto posibilita que la red tenga un campo
de aplicación más variado que las redes Perceptron.
Un concepto importante de toda red Feedforward Backpropagation es la Generalización.
Este concepto está relacionado con el comportamiento de la red ante entradas que no fueron
utilizadas en el proceso de entrenamiento. Dado que las salidas son números reales, entonces
mientras entradas similares produzcan salidas con cifras similares al número real usado como
salida ideal, la generalización será mejor. Para que una red Backpropagation generalice bien (lo
cual es el objetivo para toda aplicación basada en redes neuronales) se deben seguir los siguientes
lineamientos:
1. Utilizar la mayor cantidad de datos de entrada y salidas objetivos posibles en el proceso de
entrenamiento.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
28
2. Utilizar aquellos patrones de entrada y salida objetivo considerados relevantes en su
mayoría.
3. Verificar que el problema pueda ser realizado por la red neuronal.
4. Definir el tamaño de la red óptima.
Encontrar el tamaño adecuado para la red neuronal Feedforward Backpropagation no es
una tarea sencilla. Para esto se deben elegir dos aspectos importantes: el número de capas ocultas
de la red y el número de neuronas a utilizar en cada capa. Examinaremos el primer caso.
Los problemas prácticos que requieren de dos capas ocultas son muy extraños. Sin
embargo, este tipo de red puede representar funciones de cualquier tipo de forma. De esta
manera, no existe una razón teórica para plantear una red Backpropagtion de más de dos capas
ocultas. De hecho, en la mayoría de problemas prácticos la solución se encuentra en redes de una
sola capa oculta.
Por otro lado, elegir el número de neuronas de las capas ocultas es una decisión sumamente
importante para la arquitectura de la red neuronal, ya que de estas depende el valor de salida de
la red. Si se eligen muy pocas neuronas lo más probable es que la red nunca logre entrenarse. Si se
eligen demasiadas neuronas entonces podría suceder que la cantidad de patrones de entrada
usados resulten insuficientes para completar el entrenamiento. Entonces, el valor adecuado de las
neuronas de las capas ocultas debe seguir las siguientes reglas:
1. El número de neuronas de la capa oculta debe ser una valor entre el tamaño de la capa de
entrada y de salida.
2. El número de neuronas ocultas debería ser 2/3 del tamaño de la capa de entrada sumado
al tamaño de la capa de salida.
3. El número de neuronas de la capa oculta debería ser menor al doble del tamaño de la capa
de entrada.
A continuación se explica el funcionamiento del algoritmo de Feedforward Backpropagation.
Suponga que el modelo de la Figura 11 representa a la neurona j de la capa 0 que se encuentra
conectada a q entradas.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
29
Figura 11. Modelo de la neurona de la red Feedforward Backpropagation.
Supongamos que la sumatoria de la neurona j se denomina 9: y se puede calcular de la
siguiente manera:
9: ∑ #: :;
De tal manera que es el i-ésimo elemento de la entrada P, #: representa al i-ésimo
peso conectado con la neurona j de la capa oculta y : es el bias de la neurona j de la capa 0.
Finalmente, la salida de la neurona se determina de la siguiente manera:
(: ∑ #: :;
Donde es la función de activación. En la red neuronal Feedforward Backpropagation la
función de activación puede ser cualquiera de las siguientes formas:
1. Lineal:
Derivada: <=><> 1
2. Sigmoidea:
?@AB Derivada:
<=><> 1
3. Tangente hiperbólica:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
30
@BC@AB@B?@AB Derivada:
<=><> 1
Por lo general la función lineal es utilizada en las neuronas de la capa de salida a fin de que
el valor final pueda ser cualquier número real. Las funciones sigmoidea y tangente hiperbólica son
utilizadas en las capas ocultas. La primera función genera valores cercanos a 0 y 1 mientras que la
segunda valores cercanos a -1 y 1. La elección de dichas funciones depende del diseñador de la red
neuronal.
Se define la variable D: como el error o gradiente de salida de la neurona j y este se calcula
de la siguiente manera:
D: : (:
En esta ecuación : es la salida deseada par la neurona j (en el caso de ser una neurona de
salida) o también la última salida anterior (en caso de ser una neurona de la capa oculta). Luego,
se define el Error cuadrático medio de la siguiente forma:
MSE = E ∑ DFGF
En donde S es el número de neuronas de la capa oculta 0 y DF es el error de la neurona k
de la capa de salida. El objetivo del proceso de entrenamiento consiste en minimizar el MSE a
través del cálculo de los pesos óptimos. Por ejemplo en la Figura 12 se observa una gráfica del MSE
versus los pesos. Aquí se puede observar que para el valor Wo se obtiene el mínimo MSE lo cual es
lo que se requiere.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
31
Figura 12. Gráfica del MSE versus los pesos de las neuronas de una capa.
Como se puede observar de la gráfica el cambio de los pesos es inversamente proporcional
al gradiente de error de tal manera que se cumple la siguiente relación:
∆# 9 I# 89
Y despejando se obtiene que la derivada parcial del MSE con respecto a los pesos es:
I# 89 JKJLM
En donde, n es la n-ésima iteración. Luego, Por la regla de la cadena se despeja la derivada
parcial del MSE:
JKJLM JKMJ@M
J@MJNMJNMJLM
De esta manera, para una función de activación sigmoidea se tiene su derivada de la
siguiente manera:
JKJLM JOP<MCQMLMP
JLM #
JKJLM #
I# 89 JKJLM 9 9
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
32
El término I# 89es el gradiente del MSE con respecto al peso Wi y la actualización de
los nuevos pesos para la iteración n+1 debe cumplir lo siguiente:
# 9 1 # 9 I# 89
Al sumar el gradiente al peso anterior se estima que el nuevo peso se aproxime al valor
óptimo Wo. Entonces, el peso y el bias de la neurona j se actualizan de la siguiente manera:
#: 9 1 #: 9 D:
:9 1 :9 D:
Aquí es el coeficiente de aprendizaje y normalmente toma un valor entre 0 y 1 y Pi son
las entradas a la neurona j.
Ahora, veamos el proceso de aprendizaje en todas las neuronas de la red, siguiendo el
esquema de la red neuronal de la Figura 13. En esta MLP se observa una capa de entrada de
entrada de p muestras, una capa oculta de q neuronas y una capa de salida de r neuronas.
Entonces, la matriz V representa los coeficientes que interconectan las entradas con las neuronas
de la capa oculta y la matriz W representa los coeficientes de la interconexión entre la capa oculta
y la capa de salida. Entonces se cumple lo siguiente:
W tiene orden de qxr elementos.
V tiene orden de pxq elementos.
X tiene orden de px1 elementos.
Y tiene orden de rx1 elementos.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
33
Figura 13. Modelo de MLP Feedforward Backpropagation.
De la Figura 13 se puede analizar lo siguiente:
a. Definiendo h- al punto de entrada de la capa oculta h: .C 3 R
b. Definiendo h+ al punto de salida de la capa oculta aplicando la función de activación:
.? .C
c. La salida de la red y se obtiene de la siguiente manera: .? 3 #
d. Reemplazando (b) en (c): .C 3 #
e. Remplazando (a) en (d): 3 R 3 #
f. Finalmente se halla el error cuadrático medio: S 8 <
Donde yd es la matriz con la salida deseada. Llamemos J la función de costo que es igual al MSE
que se desea optimizar. Entonces la actualización de los pesos y bias nos da:
#T 1 #T USU#
T 1 T JVJL
q1
qr
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
34
Para comprender mejor el funcionamiento de estas ecuaciones observe el esquema de
conexión de la red neuronal de la Figura 14. Aquí la neurona A pertenece a una capa oculta y las
neuronas B y C corresponden a la capa de salida.
Figura 14. Modelo de conexión de una neurona de la capa oculta con dos neuronas de salida.
Los pasos del entrenamiento son los siguientes:
1. Aplique la entrada a la red y calcule la salida. Los pesos iniciales pueden ser cualquier valor
aleatorio (generalmente variando entre -1 y 1) o pueden ser ceros.
2. Calcular el error para la neurona B. El error es el valor deseado menos el valor real
obtenido. En otras palabras: ErrorB = SalidaB(1-SalidaB)(ObjetivoB-SalidaB)
El término “Salida(1-Salida)” es necesario en la ecuación debido a la derivada de la función
sigmoidea. En caso se utilizara la función tangente hiperbólica este término sería “(1-Salida2)”. En
caso se utilizara la función lineal, el error simplemente sería “Objetivo – Salida”.
3. Actualizar el peso. Supongamos que W+AB es el nuevo peso después del entrenamiento
que reemplazará al peso anterior WAB. Entonces:
W+AB = WAB+(ErrorB x SalidaA)
4. Calcular los errores para las neuronas de las capas ocultas. A diferencia de la capa de
salida no podemos calcular estos errores directamente ya que para ellos no tenemos una
salida objetivo. Entonces se tiene que retro propagar el error hacia atrás. Esto se logra
tomando los errores de las neuronas de salida para multiplicarlas por los pesos de
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
35
conexión. Por ejemplo, para la neurona A de la Figura 14 se toman los errores de las
neuronas B y C para obtener su error de la siguiente manera:
ErrorA = SalidaA(1-SalidaA)(ErrorBWAB+ErrorC WAC)
5. Una vez obtenido el error de la capa oculta se repite el proceso desde el paso 3 para
cambiar el peso de la capa oculta.
Supongamos que ahora se cuenta con una red neuronal completa de dos entradas, una capa
oculta de tres neuronas y dos salidas como se observa en la Figura 15. Aquí se visualizan todos los
pesos que conforman a la red neuronal.
Entonces los cálculos a realizar para el entrenamiento de cada peso de la red son los
siguientes:
1. Calcular los errores de las neuronas de salida:
DQ SalidaX(1-SalidaX)(ObjetivoX-SalidaX)
DW SalidaY(1-SalidaY)(ObjetivoY-SalidaY)
2. Cambiar los pesos de las capas de salida:
#XQ? #XQ DQ(0'(Y
#ZQ? #ZQ DQ(0'(T
#[Q? #[Q DQ(0'(\
#XW? #XW DW(0'(Y
#ZW? #ZW DW(0'(T
#[W? #[W DW(0'(\
3. Calcular el error de las capas ocultas (retro propagación):
DX (0'(Y1 (0'(YDQ#XQ DW#XW
DZ (0'(T1 (0'(TDQ#ZQ DW#ZW
D[ (0'(\1 (0'(\DQ#[Q DW#[W
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
36
Figura 15. Modelo de una red neuronal con todos sus pesos de conexión.
4. Cambiar el peso de las capas ocultas:
#]X? #]X DX'9]
#]Z? #]Z DZ'9]
#][? #][ D['9]
# X? # X DX'9^
# Z? # Z DZ'9^
# [? # [ D['9^
5. Ingresar el nuevo patrón de entrada, calcular la SalidaX y SalidaY con los nuevos pesos y
regresar al paso 1.
Por ejemplo, en la Figura 16 se muestra una red neuronal simple de dos entradas, una capa
oculta de dos neuronas y una sola neurona de salida. Se ingresan dos valores A y B y se presentan
los pesos iniciales. Suponga que la función de activación para cada neurona es la sigmoidea y se
ignora el bias de la red. Entonces, aplicamos los pasos del 1 al 5 para iniciar una iteración del
proceso de entrenamiento.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
37
Figura 16. Modelo de una red neuronal para un ejemplo de entrenamiento.
Primer paso. Hallar la salida:
SalidaM = f(0.35(0.1)+0.9(0.8) ) =
?@A_.`aa= 0.68
SalidaN = f(0.9(0.6)+0.35(0.4) ) =
?@A_.bc= 0.6637
SalidaY = f( 0.3(0.68)+0.9(0.6637) ) =
?@A_.c_Odd= 0.69
Segundo paso. Obtener el error de salida:
ErrorY = (objetivo-salidaY)(1-salidaY)salidaY
Supongamos que el objetivo es 0.5. Entonces se halla el gradiente de salida:
DW = (0.5-0.69)(1-0.69)(0.69) = -0.0406;
Tercer paso. Calcular los nuevos pesos que conectan a la neurona Y:
W1+ = W1+D 3 9/((= 0.3+(-0.0406x0.68) = 0.2724
W2+ = W2+D 3 9/(( = 0.9+(-0.0406x0.6637) = 0.873
Cuarto paso. Hallar los errores para las neuronas ocultas:
DX DW#? 3 1 (0'(Y(0'(Y 0.0406 3 0.2724 3(1-0.68)30.68=-0.0079
DZ DW#? 3 1 (0'(T(0'(T 0.0406 3 0.873 3 1 0.6637 3 0.6637=-0.0024
M
N
Y
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
38
Quinto paso. Calcular los nuevos pesos de la capa oculta:
# X 0.1 0.0024 3 0.35 0.09916
#]X 0.8 0.0024 3 0.9 0.7978
# Z 0.4 0.0079 3 0.35 0.3972
#]Z 0.6 0.0079 3 0.9 0.5928
Sexto paso. Verificar si el error cuadrático medio se encuentra por debajo del valor deseado:
MSE = DW = 0.5x(-0.0406)2 = 0.82x10-3
Si este error se considera satisfactorio, el proceso de entrenamiento se detiene aquí. En
caso contrario se continúa el proceso nuevamente desde el primer paso.
11. Funciones que implementan el algoritmo de Feedforward Backpropagation en Matlab
A continuación se presentan las funciones creadas en código abierto en Matlab para la
implementación del entrenamiento y validación de una red neuronal Backpropagation. El objetivo
de este capítulo es el de proveer los algoritmos necesarios para el programador que desee
implementar la red neuronal en otro lenguaje de programación. Las funciones están adjuntadas en
el Aula virtual del curso para que los alumnos puedan disponer de ellas.
Dado que en la mayoría de aplicaciones útiles las redes Backpropagation presentan una
capa oculta y una capa de salida, se presentan funciones que permiten crear una arquitectura de
red basada en dos capas de tamaño variable, que pueden servir para un sinnúmero de
aplicaciones. Una de las ventajas del Backpropagation es que permite combinar las tres funciones
de activación vistas: lineal, sigmoidea y tangente hiperbólica. Sin embargo, en las funciones que se
presentan a continuación se utiliza la función sigmoidea en todas las neuronas de la red. En al Aula
virtual del curso se adjuntará un ejemplo similar al presentado con la función de activación
tangente hiperbólica.
La función red = crear_Backpropagation(n,m,k,mensaje) permite generar un objeto del tipo
red Backpropagation que contendrá cuatro parámetros: red.W1, red.W2, red.b1 y red.b2. Esta
función permite formar un modelo de red del tipo que se observa en la Figura 17.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
39
Figura 17. Modelo de la red neuronal Feedforward Backpropagation a crear con la función
crear_Backpropagation().
De la Figura 17 se puede observar que existen n entradas para el vector X, cuyo orden es
de nx1 y además, existen k neuronas en la capa oculta. Entonces, para cada neurona de la capa
oculta existen n+1 conexiones (tomando en cuenta el bias que siempre tiene entrada 1). Si existen
k neuronas entonces, en total habrán (n+1)xk conexiones. Por otra parte, se observa la conexión
entre la capa oculta y la capa de salida. En la capa oculta hay k salidas que representan k valores
de entrada para la capa de salida. Junto con el bias, la capa de salida tiene k+1 valores. Luego, la
capa de salida posee m neuronas, lo cual generará m valores de salida. Por tanto, el número de
conexiones entre la capa oculta y la capa de salida es de (k+1)xm.
La función red = crear_Backpropagation(n,m,k,mensaje) toma como entradas los siguientes
parámetros:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
40
n: número de entradas u orden del vector columna X.
m: número de neuronas de salida u orden del vector columna Y.
k: número de neuronas de la capa oculta.
mensaje: este puede ser ‘rand’ si se desea que las matrices de pesos y de bias iniciales tengan
pesos aleatorios en el rango de -1 y 1o también puede ser ‘cero’ si se quiere que estos valores
sean ceros.
El valor de retorno de la función es un objeto de nombre red que contiene cuatro matrices
de la siguiente forma:
red.W1: Es una matriz de orden nxk. Cada columna de red.W1 representa las conexiones entre las
n entradas de X y las neuronas de la capa oculta. En otras palabras el elementos Wij de red.W1
representa la conexión de la entrada Xi con la neurona j, en donde i: 1,2…..n y j: 1,2,…..k.
red.b1: Es una matriz fila de orden 1xk. Contiene los valores de los k coeficientes que conectan la
entrada bias (entrada siempre unitaria) con cada una de las neuronas de la capa oculta. El
elemento bi del vector B representa el coeficiente que conecta la entrada constante 1 con la
neurona i, para i: 1,2…..k.
red.W2: Es una matriz de orden kxm. Cada columna de la red.W2 representa las conexiones entre
las k salidas de la capa oculta (o k entradas de la capa de salida) con una única neurona de la capa
de salida. Dicho de otra forma cada elemento Wij de la matriz red.W2 representa la conexión
entre la salida de la neurona i de la capa oculta con la neurona j de la capa de salida, en donde i:
1,2,….k y j: 1,2…..m.
red.b2: Al igual que red.b1 es una matriz fila de orden 1xm. Representa las conexiones del bias con
cada una de las neuronas de la capa de salida.
Una vez creado el componente red, es necesario empezar el proceso de entrenamiento.
Para esto, se cuenta con la función red =
entrena_Backpropagation(red,X,Yd,alfa,max_Epochs,min_MSE) que devuelve otro objeto pero en
este se encuentran las matrices de pesos y bias con los valores que ya permiten validar el conjunto
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
41
de entrada y salida usados en el entrenamiento. Además, el objeto contiene otros parámetros
adicionales que permiten conocer como se obtuvo el proceso de entrenamiento.
En total hay seis parámetros de entrada en la función red =
entrena_Backpropagation(red,X,Yd,alfa,max_Epochs,min_MSE) y son los siguientes:
red: es el objeto devuelto por la función crear_Backpropagation(). Contiene las matrices de pesos
y bias con valores iniciales.
X: es una matriz de orden n x número de patrones. Las filas representan los n valores de entrada
de X y cada columna representa un patrón de entrada. Mientras más patrones tenga esta matriz,
mejor Generalización tendrá la red neuronal.
Yd: corresponde a la matriz de salida deseada de orden m x número de patrones. Las filas
representan los valores de salida (son m valores) y las columnas representan cada patrón de
salida. Esta matriz tiene correspondencia con la entrada X. Ambas matrices deben tener el mismo
número de columnas ya que deben haber tantos patrones de entrada como de salida deseada. En
caso de que esto no ocurra, la función de entrenamiento arrojará un error.
alfa: es un valor escalar y representa el coeficiente de aprendizaje. Su valor se puede elegir entre
el rango 0 y 1. Este parámetro es un factor crítico en el desempeño del bloque del entrenamiento
ya que puede determinar la convergencia de este proceso. Normalmente, valores pequeños de
alfa, contribuyen con la convergencia, pero, afectan tremendamente la velocidad del proceso de
entrenamiento.
max_Epochs: es la máxima cantidad de iteraciones que el programador espera que la red realice
para culminar el proceso de entrenamiento. Si el proceso de entrenamiento converge
satisfactoriamente, debería hacerlo en un número de iteraciones menor a max_Epochs.
min_MSE: es el error cuadrático medio mínimo esperado. Como se sabe el algoritmo
Backpropagation utiliza la minimización de este error para actualizar los pesos de cada conexión.
Dado que este error casi nunca llega a ser cero, se elige un valor mínimo bajo el cual se detendrá
el proceso de entrenamiento.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
42
Una vez ejecutada la función de entrenamiento, esta devolverá un objeto red que
contendrá los siguientes parámetros:
red.W1: es la matriz de conexiones entre la entrada X y la capa oculta. Esta matriz será de orden
nxk y tendrá los coeficientes óptimos como resultado del entrenamiento.
red.b1: es la matriz del bias que conecta a las k neuronas de la capa oculta. Sus valores son
coeficientes óptimos.
red.W2: es la matriz de conexiones de la capa oculta y la capa de salida. Contiene orden de kxm y
sus coeficientes son el resultado del proceso de entrenamiento.
red.b2: al igual que red.b1 es una matriz fila de orden 1xm que contiene los coeficientes óptimos
de conexión de la entrada bias con cada una de las neuronas de salida.
red.mse: es el error cuadrático medio logrado al finalizar el proceso de entrenamiento. Si este
valor no es menor o igual al parámetro min_MSE, entonces el entrenamiento no ha cumplido con
las expectativas iniciales.
red.epochs: representa la cantidad de iteraciones realizadas para lograr el entrenamiento. Si este
valor es igual al parámetro max_Epochs, entonces el entrenamiento no ha logrado reducir el error
cuadrático medio, por lo cual debería repetirse dicho proceso con otros parámetros iniciales.
red.mse_evolucion: es un vector que contiene todos los valores calculados del error cuadrático
medio por cada iteración. Si se grafica usando la función plot permitirá ver dicha secuencia en una
gráfica.
Finalmente, una vez logrado el entrenamiento, solo queda validar la red neuronal. Este
proceso se puede realizar tanto para los parámetros de entrada usados en el entrenamiento como
para los que no han sido utilizados. Para la validación se cuenta con una tercera función cuyo
nombre es Y = valida_Backpropagation(red,IN). Dicha función solo recibe dos parámetros de
entrada y genera un vector de salida de m elementos generados por la red. El parámetro red
corresponde al objeto devuelto por la función de entrenamiento y el parámetro IN es un vector
columna conteniendo los n elementos de un patrón de entrada. Es necesario que la entrada sea
del orden nx1 ya que la función validará esta condición y generará un error en caso de que este
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
43
orden no se cumpla. La salida de la red neuronal siempre estará representada por cifras reales en
el rango de 0 a 1 debido al uso de la función de activación sigmoidea en las neuronas de salida.
Supongamos que se desea crear una red neuronal para resolver el problema de la
compuerta XOR. En este caso se cuentan con dos neuronas de entrada y una neurona de salida
que siguen la relación dada en la Tabla 4. Este tipo de relación por ser no lineal es imposible de
modelar por una red neuronal del tipo Perceptron. Ahora, se va a verificar si la red
Backpropagation es capaz de poder dar solución a este problema.
Tabla 4. Relación entre las entradas y salida en la lógica XOR
X1 X2 Y
0 0 0
0 1 1
1 0 1
1 1 0
Entonces en el problema propuesto se tienen dos parámetros de entrada y uno de salida,
con lo cual n = 2 y m = 1. El número de patrones de entrada es 4. Entonces se define la matriz de
entrada X de la siguiente manera:
X = [0 0 1 1
0 1 0 1];
Y el vector de salida deseado Yd de la siguiente forma:
Yd = [0 1 1 0];
Luego, para este problema, se elige una red neuronal de 3 capas ocultas. A continuación se
crea la arquitectura de la red con valores aleatorios tanto en las matrices de pesos como de bias.
red = crear_Backpropagation(2,1,3,’rand’);
Lo cual devuelve como resultado lo siguiente:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
44
red =
W1: [2x3 double]
W2: [3x1 double]
b1: [-0.0871 -0.9630 0.6428]
b2: 0.8436
Como se puede observar la matriz red.W1 es de orden 2x3 (se conecta a dos entradas y
tres neuronas en la capa oculta) y la matriz red.W2 es de orden 3x1 (conecta tres neuronas en la
capa oculta y 1 neurona de salida). La matriz red.b1 es de orden 1x3 debido a que hay tres
neuronas en la capa oculta y la matriz red.b2 contiene un solo valor ya que solo se cuenta con una
neurona en la capa de salida.
Luego, una vez creado nuestro objeto red, procedemos a realizar el proceso de
entrenamiento en el cual se elige al azar un valor del coeficiente de aprendizaje α de 0.5, un
número máximo de iteraciones de 3000 y un error cuadrático medio mínimo de 0.001. De esta
manera, se invoca a la función de entrenamiento de la siguiente forma:
red_T = entrena_Backpropagation(red,X,Yd,0.5,3000,0.001)
Mientras la función se ejecuta, se deberá esperar desde unos segundos hasta unos
minutos para obtener los resultados. Durante esta espera, aparecerá una ventana con una gráfica
que muestra la evolución del error cuadrático medio durante cada iteración como se observa en la
Figura 18. La idea de esta gráfica es que el usuario pueda observar que la evolución del error
cuadrático medio tienda a disminuir conforme aumenta el número de iteraciones. Si esto no
ocurriera, el programador tendría que detener la ejecución del programa (presionando en el
teclado la combinación CTRL + C) y volver a ejecutar la función del entrenamiento con otros
parámetros iniciales. Normalmente, el programador debe esperar al menos unas 1000 iteraciones
para evaluar si la tendencia del entrenamiento se encuentra o no reduciendo el error.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
45
Figura 18. Evolución del error cuadrático medio por cada iteración o Epoch.
Una vez terminado el proceso de entrenamiento, la función retorna los siguientes resultados:
red_T =
W1: [2x3 double]
W2: [3x1 double]
b1: [2.1739 -1.0994 -0.7499]
b2: -0.3152
mse: 9.9993e-004
epochs: 2214
alfa: 0.5000
0 500 1000 1500 2000 25000
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
0.2
Evolución del MSE
iteraciones
mse
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
46
mse_evolucion: [1x2214 double]
Como se puede observar, el proceso de entrenamiento tomó 2214 iteraciones para hallar
los pesos óptimos que permiten obtener la red neuronal que simula la operación lógica XOR. Una
vez logrado el entrenamiento solo queda validar que las cuatro entradas cumplan con la secuencia
presentada en la Tabla 4. Entonces, a continuación se validan las cuatro entradas:
Para X= [0;0]:
Y = valida_Backpropagation(red_T,[0;0])
Y =
0.0251
Para X = [0;1]:
Y = valida_Backpropagation(red_T,[0;1])
Y =
0.9582
Para X = [1;0]:
Y = valida_Backpropagation(red_T,[1;0])
Y =
0.9553
Para X = [1;1]:
Y = valida_Backpropagation(red_T,[1;1])
Y =
0.0545
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
47
Como se puede observar, a diferencia de la red Perceptron, Backpropagation no da el
resultado exacto. Esto es obvio, dado que nosotros hemos asumido un error cuadrático medio
diferente de cero, por lo cual nuestras respuestas nunca serán iguales a los valores deseados,
pero, se aproximarán con un error máximo igual al que nosotros hemos definido en el
entrenamiento. Es claro al observar los resultados que los cuatro parámetros de entrada cumplen
con la Tabla 4 con un pequeño margen de error.
12. Uso del ToolBox de Matlab para implementar las redes neuronales Feedforward
Backpropagation
El algoritmo de Backpropagation tiene una serie enorme de variantes que se pueden aplicar
en una diversidad de casos. Las funciones presentadas en el inciso 11, son solo un modelo simple
de una red Feedforward Backpropagation la cual carece de una serie de elementos que le
permitirían ser más eficiente. El software Matlab cuenta con un ToolBox de redes neuronales con
funciones especialmente diseñadas para implementar redes del tipo Feedforward
Backpropagation. Estas funciones son altamente eficientes y mucho más veloces en el proceso de
entrenamiento que la función mostrada en el capítulo anterior. Lamentablemente, estas funciones
no son de código abierto, con lo cual, si bien es cierto, podemos utilizarlas en el ámbito de Matlab,
no podemos portar el código en otro lenguaje de programación.
Para mostrar el funcionamiento del ToolBox basta un simple ejemplo. Utilice el software
Paint y dibuje en este una letra con la herramienta lápiz. Por ejemplo, se puede dibujar una letra A
como se muestra en la Figura 19. Una vez creada la imagen de la letra, grábela en un archivo de
extensión .bmp con el nombre “LetraA”, pero, antes elija el formato mapa de bits monocromático
de tal forma que la imagen sea binaria o de blanco y negro. El archivo debe ser almacenado en la
ruta del proyecto de Matlab donde se ejecutará el programa de redes neuronales. Luego, repita el
proceso, y grabe algunas imágenes con la forma de la letra B y la letra C y otras más con la letra A.
Todas estas figuras las debe almacenar en la misma carpeta de proyecto.
Una vez almacenadas las imágenes, se procede a abrirlas para visualizarlas en Matlab. Este
software posee un ToolBox muy interesante de procesamiento de imágenes, el cual permite abrir,
procesar y crear imágenes digitales de forma muy sencilla. Para abrir una imagen en Matlab se
hace uso de la función imread() de la siguiente manera:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
48
Figura 19. Creación de una letra y grabación del archivo en el software Paint de Widows.
A = imread('letraA','bmp');
La variable A es ahora una matriz de k filas x m columnas. El número de filas y columnas de
A dependerá de la resolución de la imagen. Para obtener la resolución de la imagen se hallan las
dimensiones de la matriz de la siguiente manera:
[fil,col]=size(A)
De esta manera se obtiene la resolución de la imagen:
fil =
100
col =
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
49
60
Así, se puede ver que la resolución de la imágenes de 100 filas por 60 columnas.
Para entrenar la red neuronal se requiere que la entrada esté en forma de vector, por lo
cual se debe convertir la matriz en un vector. Para esto se hace uso de la función matriz2vector()
que se presenta en el Anexo B. A continuación se presenta un código que carga cuatro letras
almacenadas en forma de archivo:
A = im2double(imread('letraA_big','bmp'));
A2 = im2double(imread('letraA2_big','bmp'));
B = im2double(imread('letraB_big','bmp'));
C = im2double(imread('letraC_big','bmp'));
La función im2double() es parte de la librería de Matlab y permite convertir los valores
numéricos de la matriz obtenida por la función imread()al un formato de tipo double, el cual es
requerido por la entrada de la función de entrenamiento. Una vez cargadas las cuatro matrices se
deben convertir a vector de la siguiente manera:
A = matriz2vector(A)';
A2 = matriz2vector(A2)';
B = matriz2vector(B)';
C = matriz2vector(C)';
Observe que se desea obtener la matriz en forma de vector columna, por lo cual se
obtiene la transpuesta del vector, ya que la función matriz2vector() entrega un vector fila. Una vez
obtenidos los cuatro patrones de entrada (los dos primeros representan la letra A, el tercero la
letra B y el último la letra C) estos se deben concatenar en una sola matriz que contenga los cuatro
patrones. Cada vector contiene 100x60 o 6000 valores. Entonces la matriz Sample tendrá un orden
de 6000x4. La concatenación se realiza de la siguiente manera:
Sample = [A A2 B C];
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
50
Posteriormente, es necesario crear la matriz objetivo. Por experiencia ya podemos notar
que la red neuronal que vamos a crear contendrá 6000 entradas y 3 salidas. Las tres salidas
correspondientes son YA, YB e YC. Si la primera salida es 1 entonces se habrá reconocido el patrón
de entrada como letra A, en caso sea 0 la letra no es A. Lo mismo ocurre con la segundo y tercera
salida para la letra B y letra C respectivamente. Entonces la matriz objetivo será de esta manera:
Target = [1 1 0 0
0 0 1 0
0 0 0 1];
Como se puede observar, la matriz Target tiene cuatro patrones de salida de tres
neuronas. El primero y segundo patrón son 1 0 0, lo cual indica que se ha reconocido la letra A. El
segundo patrón es 0 1 0 que indica que se ha reconocido la letra B y el último patrón 0 0 1
reconoce a la letra C (observe que este orden se relaciona con el orden de las matrices de entrada
de la matriz Sample).
Luego, se crea la red neuronal Feedforward Backpropagation de dos capas: una capa
oculta de 20 neuronas y una capa de salida de 3 neuronas. La red tiene 6000 entradas. Hacemos
uso de la función newff() tal como se muestra a continuación:
S1 = 20;
[S2,Q1] = size(Target);
net = newff(minmax(Sample),[S1 S2],'logsig' 'purelin','traingda');
La función newff retorna un objeto net que contiene la matriz de pesos y bias necesaria
para empezar el proceso de entrenamiento (de hecho esta función inspiró el modelo de las
funciones presentadas en el capítulo 12). Los parámetros de la función se explican a continuación:
minmax(Sample): la función newff requiere que se le indique los valores mínimos y
máximos de cada elemento de entrada a la red neuronal. En este caso la red va a tener 6000
entradas, por tanto se ingresa una matriz de 6000 filas por 2 columnas, donde el valor de la
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
51
primera columna es el mínimo valor que puede tomar el píxel (en nuestro caso 0) y la segunda
columna representa el máximo valor (en nuestro caso 1):
[S1 S2]: representan las capas de la red neuronal. En este caso S1 es 20 lo que indica que la
primera capa tiene 20 neuronas y S2 es 3 lo que indica que la segunda capa tienen 3 neuronas.
Dado que el último valor del arreglo es S2, la función asume que la capa de salida corresponde a
S2 neuronas.
'logsig' 'purelin': representan las funciones de activación para la primera y segunda capa oculta
respectivamente. En este caso el parámetro ‘logsig’ indica que la función de activación de la capa
oculta es sigmoidea y ‘purelin’ indica que la capa de salida es lineal. Si se deseara usar una función
tangente hiperbólica el parámetro a ingresar es ‘tansig’. Cabe resaltar que deben indicarse tantas
funciones de activación como tantas capas existan en la red neuronal.
traingda: Representa el tipo de entranemiento que la red neuronal realizará para actualizar el
valor de los pesos. En este caso se le está indicando que utilice el método del gradiente
descendente (el método explicado en el capítulo 11) con un coeficiente α fijo. Existen otros
métodos que se pueden aplicar para mejorar el desempeño del proceso de entrenamiento. Para
conocerlos digite en la ventana de comandos de Matlab la siguiente instrucción:
help newff
Una vez generado el objeto net se puede comenzar con el proceso de entrenamiento
invocando a la función train. Pero, previamente, se debe configurar algunos parámetros del objeto
net para poder iniciar el entrenamiento. Estos parámetros son los siguientes:
1. Indicarle a la red neuronal que la función a optimizar es la suma del error cuadrático
medio:
net.performFcn = 'sse';
2. Configurar el mínimo error deseado en 0.1:
net.trainParam.goal = 0.1;
3. Mostrar el resultado de las iteraciones en la ventana de comandos cada 20 iteraciones:
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
52
net.trainParam.show = 20;
4. Indicarle a la red neuronal que el número máximo de iteraciones será de 5000. Pasado
este valor el entrenamiento será etiquetado como fracaso:
net.trainParam.epochs = 5000;
5. Configurar el coeficiente de aprendizaje:
net.trainParam.lr = 0.5;
Una vez realiza la configuración se inicia el entrenamiento de la siguiente manera:
[net,tr] = train(net,Sample,Target);
La función train devuelve dos parámetros: net y tr. El primero contiene la información de
la red neuronal después del entrenamiento y el segundo información sobre la performance del
proceso. En nuestro caso es el primer parámetro el que necesitamos para la validación. La función
trainrecibe como parámetros el objeto net creado por la función newff, la matriz de entrada y la
matriz objetivo. Adicionalmente, la función de entrenamiento presentará una ventana con una
gráfica del error cuadrático medio versus el número de iteraciones, lo cual permitirá observar la
convergencia del proceso.Finalmente, una vez entrenada la red, solo queda simular la validación.
Para esto se utiliza la función sim() que permite verificar los resultados de la red neuronal:
y = sim(net,C)
y = 0.2096
0.0091
0.8480
Como se observa para la matriz C el resultado más cercano a 1 es el tercer valor o YC el cual
nos indica que la letra ingresada es una C. Realice el mismo proceso con las otras matrices y
verifique los resultados.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
53
13. Referencias bibliográficas
[1] Saltzman, W. Mark. Biomedical Engineering: Bridging Medicine and Technology (Cambridge Texts in Biomedical Engineering). Cambridge University Press.2009
[2] Heaton, Jeff. Introduction to neural networks for C#. Heaton Research. 2008.
[3] Begg, Rezaul. Lai, Daniel. Palaniswami, Marimuthu. Computacional Intelligence in Biomedical Engineering.CRC Press. 2008.
[4] Arthur, Guyton. Textbook of Medical Physiology.Elsevier 2008.
[5]Veelenturf, L.P.J. Analysis and Applications of Artificial Neural Networks.Prentice Hall. 1995.
[6] The Matlab Neural Network ToolBox 6.0 Version 4. The Mathmorks 2004.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
54
ANEXO A
FUNCIONES PARA EL MANEJO DE LA RED NEURONAL PERCEPTRON
%Funcion crear_Perceptron(num_entradas,num_salidas,alfa,mensaje)
%Los parámetros de entrada de la función son:
%num_entradas: El número de entradas n de la red neuronal.
%num_salidas: El número de salidas o neuronas de salida m de la red
%neuronal.
%alfa: El coeficiente de aprendizaje.
%mensaje: Si su valor es 'zero' indica que los peso ybias iniciales serán
%cero. Si su valor es 'random', los pesos y bias iniciales serán numeros
%aleatorios entre -1 y 1. Si se coloca cualquier otro mensaje la función
%retornará error.
%Esta función retorna un objeto red del tipo perceptron cuyos parámetros
%principales serán:
%red.pesos: Matriz de nxm que contiene los pesos de la red.
%red.bias: Matriz de 1xm que contiene los pesos de cada bias.
%red.alfa: Valor numérico que equivale al coeficiente de aprendizaje.
%AUTOR: MAG. SERGIO SALAS ARRIARÁN
function red = crear_Perceptron(num_entradas,num_salidas,alfa,mensaje)
n = num_entradas;
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
55
m = num_salidas;
if (mensaje == 'cero')
WI = zeros(n,m);
biasI = zeros(1,m);
elseif (mensaje == 'rand')
%randn produce números aleatorios entre 0 y 1. Nosotros queremos un
%número aleatorio entre -1 y 1.
WI = 2*rand(n,m)-1;
biasI = 2*rand(1,m)-1;
else
error('Debe indicar si los pesos iniciales y bias serán cero o aleatorios');
end
red.pesos = WI;
red.bias = biasI;
red.alfa = alfa;
%--------------------------------------------------------------------------------------------------------------------------------
%Función red_train = entrena_Perceptron(red,X,T,n_iteraciones)
%Esta función realiza el entrenamiento de una red Perceptron y recibe como
%parámetros lo siguiente:
%red: es el objeto de la red Perceptron creado por la función
%crear_Perceptron.
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
56
%X: es la matriz de dimensiones axb que contiene los patrones de entrada. a
%es el número de elementos de entrada a la red y b el número de patrones.
%T: es la matriz con las salidas objetivo de la red. Tiene dimensiones de
%1xm donde m es el número de neuronas de salida.
%n_iteraciones: La red se iterará por n_iteraciones como máximo. De
%encontrarse un error 0 antes de que se alcance el valor de n_iteraciones
%el entrenamiento será detenido.
%La función retoronará un objeto red_train con los siguientes parámetros:
%red_train.pesos: son los pesos de la red entrenada.
%red_train.bias: son los bias de la red entrenada.
%red_train.error: es la sumatoria del vector error. Debe ser 0 si la red
%llegó a entrenarse satisfactoriamente.
%red_train.epochs: es el número de iteraciones que desarrolló la red para
%lograr el entrenamiento.
%AUTOR: MAG. SERGIO SALAS ARRIARÁN
functionred_train = entrena_Perceptron(red,X,T,n_iteraciones)
W = red.pesos;
bias = red.bias;
alfa = red.alfa;
[n,num_patrones] = size(X);
[m,num_patronesT] = size(T);
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
57
max_epochs = n_iteraciones;
epochs = 1;
err = zeros(1,m);
[nn,mm] = size(W);
if( (nn~=n) || (mm~=m))
error('Las dimensiones de la matriz de pesos deben coincidir con las dimensiones de entrada y
salida');
end
if(num_patrones ~= num_patronesT)
error('El numero de patrones de entrada debe ser igual al de salida');
end
if(length(bias)~=m)
error('Las dimensiones de la matriz de bias deben coincidir con las dimensiones del vector
objetivo');
end
for i = 1:max_epochs
error_total = 0;
for j = 1:num_patrones
P = X(:,j)';%Se toma la transpuesta el patrón de entrada j para evaluar la salida de la red.
sum = P*W+bias;
y = hardlim(sum);
err = T(:,j)-y';
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
58
for k = 1:length(err)
error_total = abs(err(k,1))+error_total;
end
W = W+alfa*P'*err';
bias = bias +alfa*err';
end
err = zeros(1,m);
if(error_total==0)
break;
end
end
red_train.pesos = W;
red_train.bias = bias;
red_train.epochs = i;
red_train.error = error_total;
%--------------------------------------------------------------------------------------------------------------------------------
%Función y = simula_Perceptron(red_train,entrada)
%Esta función recibe como parámetros un vector de entrada de orden 1xn o nx1 y genera la salida
%respectiva según los pesos y bias especificados en el objeto red_train.
%AUTOR: MAG. SERGIO SALAS ARRIARÁN
function y = simula_Perceptron(red_train,entrada)
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
59
[n,m] = size(entrada);
if(n~=1 && m~=1)
error('La entrada debe ser un vector columna, no una matriz');
end
if(n~=1 && m==1)
entrada = entrada';
end
W = red_train.pesos;
bias = red_train.bias;
suma = entrada*W+bias;
y = hardlim(suma);
%--------------------------------------------------------------------------------------------------------------------------------
UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS.
MA77- BIOINGENIERÍA
60
ANEXO B
FUNCIÓN PARA LA CONVERSIÓN DE UNA MATRIZ A VECTOR
function out = matriz2vector(A)
[fil,col]=size(A);
a=1;
for i = 1:fil
for j = 1:col
out(a) = A(i,j);
a = a + 1;
end
end
return