19 El perceptrón
El perceptrón es la unidad con la que se puede contruir una red neuronal artificial. Éste se basa en el modelo lógico de umbral propuesto por Rosenblatt a finales de los años cincuentas (Rosenblatt 1958). De cierta forma, el perceptrón se asemeja a una neurona biológica (ver figura 2), que cuenta con dendritas para adquirir información, un núcleo para procesarla y un axón para enviarla. Sin embargo, en el perceptrón, la información se representa en forma de números, y el procesamiento se realiza mediante operaciones matemáticas básicas. Este modelo hipotético del sistema nervioso puede configurarse para separar correctamente dos clases contenidas en un conjunto de datos linealmente separable.
El perceptrón inicial fue un dispositivo físico construido con potenciómetros, sumadores, multiplicadores y demás dispositivos eléctricos (Rosenblatt 1960); y diseñado para reconocer patrones simples, como figuras geométricas. Este dispositivo utilizaba una matriz de celdas fotoeléctricas como “ojos” para observar los patrones, y ajustaba sus “pesos” internos en respuesta a los errores cometidos durante la clasificación.

19.1 Modelo del perceptrón
El perceptrón es una función que mapea un conjunto de valores de entrada reales a una de dos posibles clases; al igual que el modelo de MyP podemos decir que el perceptrón se activa o no. La figura 3 muestra los componentes del modelo: entrada (\(X\)), pesos (\(W\)), sesgo (\(b\)), función de activación (\(f\)) y salida (\(\hat{y}\)).

La entrada del perceptrón, \(X\), es un conjunto de valores cuyo domino se encuentra en los reales. Dicha información puede provenir de sensores en tiempo real, bases de datos (datasets), entradas a mano, etc. Por ejemplo, para predecir si una casa se venderá, la entrada puede ser el conjunto de características de la casa como es la cantidad de metros cuadrados o la antigüedad. Formalmente, $$
X = [x_1, x_2, …, x_n],$$
donde \(X\) es un vector que contiene \(n\) valores numéricos reales, es decir \(x_i \in \mathbb{R}\). En los casos donde se hacen predicciones para más de una entrada, por ejemplo, una base de datos que contiene el registro de las características de miles de casas y su valor en el mercado. Cada ejemplo se numera con un super-índice; e.g. \(X^j\) indicaría el ejemplo \(j\)-ésimo de la base de datos, mientras que el sub-índice seguiría indicando el elemento del ejemplo.
La salida del perceptrón se calcula en dos etapas: una combinación lineal y una activación. En la combinación lineal, cada elemento de entrada tiene asociado un peso, \(w\), que indica la importancia de esa entrada: $$
W = [w_1, w_2, …, w_n],$$
donde \(w \in \mathbb{R}\), de tal forma que la combinación lineal de pesos y entradas se describe como una sumatoria de los productos:
$$
\[\begin{split} \bar{h} = W \cdot X^T = \sum_{i=1}^{n} w_i \cdot x_i \end{split}\]$$
Es cómun también adicionar a la ecuación #eq:sumatoria pesos un valor de sesgo. El sesgo o bias, \(b\), permite hacer desplazamientos a la función de activación. De forma similar a la ecuación de una recta \(y=mx+b\), \(m\) nos indica la pendiente que presenta la recta y el valor \(b\) indica cual será su desplazamiento; esto se verá aplicado de la misma forma. Por lo tanto, la forma canónica de la combinación lineal se escribe como:
$$
\[\begin{split} h = W \cdot X^T + b = w_1 \cdot x_2 + \dots w_n \cdot x_n + b \end{split}\]$$
Si incorporamos una entrada adicional \(x_{n+1}=1\) que se multiplique por el parámetro \(b\) tendríamos, $$
h = w_1 x_2 + + b $$
esto nos lleva a una representación similar a la ecuación (#eq:sumatoria pesos). Es por ello que en varias ocasiones durante el libro obviaremos el sesgo de las redes neuronales y únicamente escribiremos la combinación lineal como la ecuación (#eq:sumatoria pesos).
En el segundo paso del cálculo de la salida, la función de activación es la encargada de determinar si se activa o no el perceptrón. Rosenblatt asumió que la salida presenta un comportamiento “todo o nada”, por lo que utilizó la función escalón unitario (ver figura 4). Esta función se define de la siguiente forma:

$$
f(h) = \[\begin{cases} 0 & \text{if } h < a \ 1 & \text{if } h \geq a \end{cases}\]\end{cases} ,$$
donde \(a\) es una constante que indica el valor de \(h\) en el que la función cambia de 0 a 1. Usualmente se considera que \(a=0\). Alternativamente, se puede utilizar la función signo, que simplemente cambia el cero por un valor negativo. Observe la siguiente ecuación,
$$
f(h) = \[\begin{cases} -1 & \text{if } h < a \ 1 & \text{if } h \geq a \end{cases}\]\end{cases} ,$$
Por lo tanto, la salida es: $$
= f(h),
$$
reemplazando (#eq:sumatoria extendida) en (#eq:func_prediccion) podemos escribir la salida como: $$
= f(WX^T + b)
$$
Con lo establecido hasta el momento, es posible definir una formulación completa del comportamiento del perceptrón:
$$
f(x_1,,x_n) = \[\begin{cases} 0 & \text{if } \sum w_i \cdot x_i + b < 0 \ 1 & \text{if } \sum w_i \cdot x_i + b \geq 0 \end{cases}\]\end{cases}$$
En otra literatura, (Hassoun 1995), se le denomina al perceptrón como una compuerta lineal multivariada, y se podría escribir como la función:
$$
f(x_1, , x_n): ^n {0,1}$$
Suponga un perceptrón que acepta entradas de longitud tres y usa la función escalón. Si el perceptrón tiene configurados sus parámetros como \(W = [0.7, -0.3, 0.4]\) y \(b=0\). Calcule la salida cuando la entrada es \(X = [8, 5, 6]\). Solución: primero se calcula el valor intermedio: $$
h = 0.7 + (-0.3) + 0.4 + 0 = 6.5,$$
y a continuación se pasa por la función escalón para obtener la salida: $$
= f(6.5) = 1$$
19.1.1 Acerca de los parámetros
En el modelo de Rosenblatt los pesos y el sesgo se denominan parámetros y se representan como: $$
= {w_1, …, w_n, b}
$$
donde \(w_i \in \mathbb{R}\) y \(b \in \mathbb{R}\). En el resto del libro un modelo que tiene un conjunto de parámetros específico se escribirá como la función: \(\Phi_\theta\). Por lo anterior, podemos especificar que en un perceptrón simple con \(n\) entradas y una sola salida. La cantidad de parámetros es: $$
||= n + 1,$$
donde los símbolos \(| |\) indican la cardinalidad del conjunto. Aunque en la definición de los parámetros, ecuación #eq:parametros perceptron no se limitan los valores que pueden tomar, en la práctica si es recomendable limitarlos por dos razones. La primera tiene que ver con la capacidad de aproximación de los perceptrones, donde ha sido demostrado que su capacidad de aproximador general, depende de que sus variables estén definidas sobre un conjunto compacto (Kolmogorov 1957). La segunda razón tiene como motivación la capacidad de representación numérica que tienen las computadoras, donde el rango cercano a cero tiene un mayor muestreo (Johnson 2018). Por tanto, en términos prácticos se termina seleccionado los parámetros de la siguiente forma:
$$
w,b $$
19.2 Selección de parámetros
Para que el perceptrón pueda tener diferentes comportamientos se requiere obtener un conjunto de pesos específico para cada comportamiento. Por ejemplo, para diferenciar entre fotografías de perros y gatos se requerirá un conjunto específico, el cual no será el mismo para diferenciar señales de tránsito. Al proceso de obtener los parámetros de forma automática se le denomina aprendizaje. El aprendizaje del perceptrón originalmente se realizaba mediante un algoritmo simple de ajuste de pesos, conocido como la regla de aprendizaje del perceptrón (Du y Swamy 2013). Este algoritmo ajusta los pesos del modelo en función de los errores cometidos en las predicciones. Si la predicción es correcta, los pesos se mantienen; si es incorrecta, los pesos se ajustan para mejorar la predicción en futuras iteraciones. El objetivo es encontrar un conjunto de pesos que permita separar los datos de entrada en dos categorías. Dicha regla se encuentra en detalle en la sección #sec:regla de aprendizaje. Posterior a la regla de aprendizaje se propuso el descenso por gradiente, que mejoró el aprendizaje en el perceptrón, en la sección #sec:descenso_por_gradiente, se abordarán los detalles del aprendizaje con el descenso por gradiente.
19.3 Implementación
Para la implementación de la función \(h\) haremos uso de la función zip que nos permitirá empaquetar cada entrada con su respectivo peso mientras se recorren los elementos. Veáse el código #cod:h. Para la función de activación escalón simplemente usaremos condicionales. Véase el código #cod:escalon.
def combinacion_lineal (W, X, b):
suma = 0
for w , x in zip (W , X ):
suma = suma + w * x
suma = suma + b
return sumadef escalon(h):
if h >= 0:
return 1
else:
return 0De esta forma el proceso de inferencia frontal de un perceptrón se puede implementar de forma completa con el código del cuadro #cod:perceptron. En el código se implementa el perceptrón como una función la cual recibe entre los parámetros la función de activación. Esto es posible por que Python trata a las funciones como objetos de primera clase. Esto significa que las funciones en Python pueden ser asignadas a variables, pasadas como argumentos a otras funciones, y retornadas desde otras funciones.
def perceptron(W, X, b, activacion):
h = combinacion_lineal(W, X, b)
return activacion(h)19.4 Limitaciones del perceptrón
Aunque el perceptrón fue un avance significativo en su momento, pronto se encontró con limitaciones. En 1969, Marvin Minsky y Seymour Papert publicaron “Perceptrons” (Minsky y Papert 1988), un libro que demostraba matemáticamente que los perceptrones simples no podían resolver problemas no lineales, como el problema del XOR. Esto llevó a una reducción en el interés y la financiación de la investigación en redes neuronales durante varios años, un período conocido como el “invierno de la IA”.
19.5 Ejercicios
Suponga el perceptrón de la siguiente figura, el cual recibe entradas de longitud igual a dos y cuya función de activación es la función signo. 
- Si \(W = [0.2, -0.5]\) y \(b = 0.3\), determine la salida del perceptrón, \(\hat{y}\), para las siguientes entradas:
1. $X^1 = [0.4, 0.8]$,
2. $X^2 = [0.2, 0.1]$,
3. $X^3 = [0.8, 0.7]$,
- Determine la cantidad de parámetros que tiene el perceptrón.
A partir del siguiente perceptrón de dos entradas cuya función de activación, \(f(h)\), es la función escalón y el sesgo \(b\) es nulo: 
Suponga una entrada \(X = [0.8, 0.2]\) con pesos \(W = [1.0, 0.8]\). Calcule la combinación lineal (\(h\)) y la salida del perceptrón (\(\hat{y}\)).
Suponga que tenemos un conjunto de datos de dos ejemplos de un determinado fenómeno. El conjunto contiene la entrada y el valor de salida de acuerdo a la siguiente tabla:
Ejemplo $x_1$ $x_2$ Objetivo $y$
--------- -------- ------- --------------
1 $-0.5$ $-1$ 0
2 $-1$ $0.5$ 1
Determine por prueba y error que valores para $W$ satisfacen lo asentado en dicha tabla.
Calcule la cantidad de parámetros que tiene un perceptrón con \(45\) entradas.
Implemente en Python un perceptrón que use la función de activación signo y que reciba como entrada un vector de longitud arbitraria. La longitud del vector de entrada deberá ser provista por el usuario y el programa deberá generar los valores de los parámetros de forma aleatoria usando una distribución uniforme.