Implementación de una Sola Neurona
Una neurona es la unidad computacional básica de una red neuronal. Procesa múltiples entradas y genera una única salida, lo que permite que la red aprenda y realice predicciones.
Por ahora, se busca construir una red neuronal con una sola neurona. Como ejemplo, se utilizará para una tarea de clasificación binaria, como la detección de spam, donde 0 representa un correo legítimo (no spam) y 1 representa un correo spam.
La neurona tomará características numéricas relacionadas con los correos electrónicos como entradas y producirá una salida entre 0 y 1, que representa la probabilidad de que un correo sea spam.
El proceso paso a paso es el siguiente:
- Cada entrada se multiplica por un peso correspondiente. Los pesos son parámetros ajustables que determinan la importancia de cada entrada;
- Todas las entradas ponderadas se suman;
- Se añade un parámetro adicional llamado sesgo (bias) a la suma de entradas. El sesgo permite que la neurona desplace su salida hacia arriba o hacia abajo, proporcionando flexibilidad al modelo;
- La suma de entradas se pasa a través de una función de activación. Como solo se tiene una neurona, que produce directamente la salida final (una probabilidad), se utilizará la función sigmoide, que comprime los valores en el rango (0,1).
El sesgo de la neurona también es un parámetro entrenable.
Clase Neurona
Una neurona necesita almacenar sus pesos y sesgo, por lo que una clase es una forma natural de agrupar estas propiedades relacionadas.
Aunque esta clase no formará parte de la implementación final de la red neuronal, ilustra de manera efectiva los principios clave.
class Neuron:
def __init__(self, n_inputs):
self.weights = ...
self.bias = ...
weights
: una lista de valores inicializados aleatoriamente que determinan la importancia de cada entrada (n_inputs
es el número de entradas) para la neurona;bias
: un valor inicializado aleatoriamente que ayuda a la neurona a tomar decisiones flexibles.
Los pesos y el sesgo deben ser inicializados aleatoriamente con valores pequeños entre -1 y 1, extraídos de una distribución uniforme, para romper la simetría y asegurar que diferentes neuronas aprendan diferentes características.
En resumen, NumPy proporciona la función random.uniform()
para generar un número aleatorio o un arreglo (especificando el argumento size
) de números aleatorios de una distribución uniforme dentro del rango [low, high)
.
import numpy as np
np.random.uniform(low, high, size=...)
Propagación hacia adelante
Adicionalmente, la clase Neuron
debe incluir un método activate()
, que calcula la suma ponderada de las entradas y aplica la función de activación (sigmoide en nuestro caso).
De hecho, si tenemos dos vectores de igual longitud (weights
y inputs
), la suma ponderada puede calcularse usando el producto punto de estos vectores:
Esto nos permite calcular la suma ponderada en una sola línea de código usando la función numpy.dot()
, eliminando la necesidad de un bucle. El sesgo puede añadirse directamente al resultado para obtener input_sum_with_bias
. La salida se calcula aplicando la función de activación sigmoide:
def activate(self, inputs):
input_sum_with_bias = ...
output = ...
return output
Funciones de activación
La fórmula para la función sigmoide es la siguiente, dado que z representa la suma ponderada de las entradas con el sesgo añadido (valor de salida en bruto) para esta neurona en particular:
σ(z)=1+e−z1Utilizando esta fórmula, la función sigmoide puede implementarse como una función simple en Python:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
La fórmula para la función ReLU es la siguiente, que básicamente establece la salida igual a z si es positiva y 0 en caso contrario:
ReLU(z)=max(0,z)def relu(z):
return np.maximum(0, z)
1. ¿Cuál es el papel del término de sesgo en una sola neurona?
2. ¿Por qué inicializamos los pesos con valores aleatorios pequeños en lugar de ceros?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Can you show me how to complete the Neuron class with random initialization?
How does the activate method work in practice?
Can you explain why we use the sigmoid function for binary classification?
Awesome!
Completion rate improved to 4
Implementación de una Sola Neurona
Desliza para mostrar el menú
Una neurona es la unidad computacional básica de una red neuronal. Procesa múltiples entradas y genera una única salida, lo que permite que la red aprenda y realice predicciones.
Por ahora, se busca construir una red neuronal con una sola neurona. Como ejemplo, se utilizará para una tarea de clasificación binaria, como la detección de spam, donde 0 representa un correo legítimo (no spam) y 1 representa un correo spam.
La neurona tomará características numéricas relacionadas con los correos electrónicos como entradas y producirá una salida entre 0 y 1, que representa la probabilidad de que un correo sea spam.
El proceso paso a paso es el siguiente:
- Cada entrada se multiplica por un peso correspondiente. Los pesos son parámetros ajustables que determinan la importancia de cada entrada;
- Todas las entradas ponderadas se suman;
- Se añade un parámetro adicional llamado sesgo (bias) a la suma de entradas. El sesgo permite que la neurona desplace su salida hacia arriba o hacia abajo, proporcionando flexibilidad al modelo;
- La suma de entradas se pasa a través de una función de activación. Como solo se tiene una neurona, que produce directamente la salida final (una probabilidad), se utilizará la función sigmoide, que comprime los valores en el rango (0,1).
El sesgo de la neurona también es un parámetro entrenable.
Clase Neurona
Una neurona necesita almacenar sus pesos y sesgo, por lo que una clase es una forma natural de agrupar estas propiedades relacionadas.
Aunque esta clase no formará parte de la implementación final de la red neuronal, ilustra de manera efectiva los principios clave.
class Neuron:
def __init__(self, n_inputs):
self.weights = ...
self.bias = ...
weights
: una lista de valores inicializados aleatoriamente que determinan la importancia de cada entrada (n_inputs
es el número de entradas) para la neurona;bias
: un valor inicializado aleatoriamente que ayuda a la neurona a tomar decisiones flexibles.
Los pesos y el sesgo deben ser inicializados aleatoriamente con valores pequeños entre -1 y 1, extraídos de una distribución uniforme, para romper la simetría y asegurar que diferentes neuronas aprendan diferentes características.
En resumen, NumPy proporciona la función random.uniform()
para generar un número aleatorio o un arreglo (especificando el argumento size
) de números aleatorios de una distribución uniforme dentro del rango [low, high)
.
import numpy as np
np.random.uniform(low, high, size=...)
Propagación hacia adelante
Adicionalmente, la clase Neuron
debe incluir un método activate()
, que calcula la suma ponderada de las entradas y aplica la función de activación (sigmoide en nuestro caso).
De hecho, si tenemos dos vectores de igual longitud (weights
y inputs
), la suma ponderada puede calcularse usando el producto punto de estos vectores:
Esto nos permite calcular la suma ponderada en una sola línea de código usando la función numpy.dot()
, eliminando la necesidad de un bucle. El sesgo puede añadirse directamente al resultado para obtener input_sum_with_bias
. La salida se calcula aplicando la función de activación sigmoide:
def activate(self, inputs):
input_sum_with_bias = ...
output = ...
return output
Funciones de activación
La fórmula para la función sigmoide es la siguiente, dado que z representa la suma ponderada de las entradas con el sesgo añadido (valor de salida en bruto) para esta neurona en particular:
σ(z)=1+e−z1Utilizando esta fórmula, la función sigmoide puede implementarse como una función simple en Python:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
La fórmula para la función ReLU es la siguiente, que básicamente establece la salida igual a z si es positiva y 0 en caso contrario:
ReLU(z)=max(0,z)def relu(z):
return np.maximum(0, z)
1. ¿Cuál es el papel del término de sesgo en una sola neurona?
2. ¿Por qué inicializamos los pesos con valores aleatorios pequeños en lugar de ceros?
¡Gracias por tus comentarios!