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.
En este ejemplo, el objetivo es construir una red neuronal con una sola neurona. Se utilizará para una tarea de clasificación binaria, como la detección de spam, donde 0 corresponde a un correo legítimo (no spam) y 1 corresponde a un correo spam.
La neurona recibirá como entradas características numéricas extraídas de los correos electrónicos y producirá una salida entre 0 y 1, que representa la probabilidad de que un correo dado sea spam.
El proceso ocurre de la siguiente manera, paso a paso:
- 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 término de sesgo a la suma de entradas, lo que permite que la neurona desplace su salida y proporciona flexibilidad adicional al modelo;
- La suma se pasa a través de una función de activación. Como una sola neurona produce directamente la salida final (una probabilidad), se utiliza la función sigmoide para comprimir 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_inputses 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
La clase Neuron debe incluir un método activate() que calcule la suma ponderada de las entradas y luego aplique la función de activación (en este caso, la función sigmoide).
Cuando se dispone de dos vectores de igual longitud — weights y inputs — la suma ponderada puede calcularse de manera eficiente utilizando el producto punto de estos vectores.
Esto 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
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.
En este ejemplo, el objetivo es construir una red neuronal con una sola neurona. Se utilizará para una tarea de clasificación binaria, como la detección de spam, donde 0 corresponde a un correo legítimo (no spam) y 1 corresponde a un correo spam.
La neurona recibirá como entradas características numéricas extraídas de los correos electrónicos y producirá una salida entre 0 y 1, que representa la probabilidad de que un correo dado sea spam.
El proceso ocurre de la siguiente manera, paso a paso:
- 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 término de sesgo a la suma de entradas, lo que permite que la neurona desplace su salida y proporciona flexibilidad adicional al modelo;
- La suma se pasa a través de una función de activación. Como una sola neurona produce directamente la salida final (una probabilidad), se utiliza la función sigmoide para comprimir 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_inputses 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
La clase Neuron debe incluir un método activate() que calcule la suma ponderada de las entradas y luego aplique la función de activación (en este caso, la función sigmoide).
Cuando se dispone de dos vectores de igual longitud — weights y inputs — la suma ponderada puede calcularse de manera eficiente utilizando el producto punto de estos vectores.
Esto 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!