Softmax es una función matemática que convierte un vector de números en un vector de probabilidades, donde las probabilidades de cada valor son proporcionales a la escala relativa de cada valor en el vector.
El uso más común de la función softmax en el aprendizaje aplicado de la máquina es su uso como función de activación en un modelo de red neuronal. Específicamente, la red está configurada para dar salida a valores N, uno por cada clase en la tarea de clasificación, y la función softmax se utiliza para normalizar las salidas, convirtiéndolas de valores de suma ponderada en probabilidades que suman uno. Cada valor de la salida de la función de máxima seguridad se interpreta como la probabilidad de pertenencia a cada clase.
En este tutorial, descubrirá la función de activación de softmax utilizada en los modelos de redes neuronales.
Después de completar este tutorial, lo sabrás:
- Las funciones de activación lineal y sigmoidea son inapropiadas para las tareas de clasificación multiclase.
- Se puede pensar en Softmax como una versión suavizada de la función argmax que devuelve el índice del mayor valor de una lista.
- Cómo implementar la función de softmax desde cero en Python y cómo convertir la salida en una etiqueta de clase.
Empecemos.
Resumen del Tutorial
Este tutorial está dividido en tres partes; son:
- Predicción de probabilidades con redes neuronales
- Max, Argmax y Softmax
- Función de activación de Softmax
Predicción de probabilidades con redes neuronales
Los modelos de redes neuronales pueden utilizarse para modelar los problemas de modelado predictivo de clasificación.
Los problemas de clasificación son los que implican la predicción de una etiqueta de clase para una entrada determinada. Un enfoque estándar para modelar los problemas de clasificación consiste en utilizar un modelo para predecir la probabilidad de pertenencia a una clase. Es decir, por ejemplo, ¿cuál es la probabilidad de que pertenezca a cada una de las etiquetas de clase conocidas?
- Para un problema de clasificación binaria se utiliza una distribución de probabilidad binomial. Esto se logra utilizando una red con un solo nodo en la capa de salida que predice la probabilidad de que un ejemplo pertenezca a la clase 1.
- Para un problema de clasificación de clases múltiples, se utiliza una probabilidad Multinomial. Esto se logra utilizando una red con un nodo para cada clase en la capa de salida y la suma de las probabilidades previstas es igual a uno.
Un modelo de red neuronal requiere una función de activación en la capa de salida del modelo para hacer la predicción.
Hay diferentes funciones de activación para elegir; veamos algunas.
Función de activación lineal
Un enfoque para predecir las probabilidades de pertenencia a una clase es utilizar una activación lineal.
Una función de activación lineal es simplemente la suma de la entrada ponderada del nodo, necesaria como entrada para cualquier función de activación. Como tal, a menudo se denomina «sin función de activación» ya que no se realiza ninguna transformación adicional.
Recordemos que una probabilidad o verosimilitud es un valor numérico entre 0 y 1.
Dado que no se realiza ninguna transformación en la suma ponderada de la entrada, es posible que la función de activación lineal emita cualquier valor numérico. Esto hace que la función de activación lineal sea inapropiada para predecir probabilidades tanto para el caso binomial como para el multinomial.
Función de activación del sigmoide
Otro enfoque para predecir las probabilidades de pertenencia a una clase es utilizar una función de activación sigmoidea.
Esta función también se denomina función logística. Independientemente de la entrada, la función siempre produce un valor entre 0 y 1. La forma de la función es una forma de S entre 0 y 1 con la vertical o el centro del «S» a 0.5.
Esto permite que valores muy grandes dados como la suma ponderada de la entrada salgan como 1,0 y que valores muy pequeños o negativos sean mapeados a 0,0.
La activación sigmoidea es una función de activación ideal para un problema de clasificación binaria en el que la salida se interpreta como una distribución de probabilidad binomial.
La función de activación del sigmoide también puede utilizarse como una función de activación para problemas de clasificación de clases múltiples en los que las clases no son mutuamente excluyentes. A menudo se hace referencia a ellas como una clasificación multi-etiqueta en lugar de una clasificación multi-clase.
La función de activación del sigmoide no es apropiada para problemas de clasificación de clases múltiples con clases mutuamente excluyentes en las que se requiere una distribución de probabilidad multinomial.
En su lugar, se requiere una activación alternativa llamada función softmax.
Max, Argmax y Softmax
Función máxima
El máximo, o «maxLa función matemática «Devuelve el mayor valor numérico de una lista de valores numéricos».
Podemos implementar esto usando el max() La función pitón, por ejemplo:
# Ejemplo del máximo de una lista de números # Definir los datos datos = [[1, 3, 2] # Calcular el máximo de la lista resultado = max(datos) imprimir(resultado) |
Ejecutando el ejemplo se obtiene el mayor valor «3» de la lista de números.
Función Argmax
El argmax, o «arg maxLa función matemática «Devuelve el índice de la lista que contiene el valor más grande».
Piense en ello como la versión meta de max: un nivel de indirección por encima del max, apuntando a la posición en la lista que tiene el valor max en lugar del valor en sí mismo.
Podemos implementarlo usando la función argmax() NumPy; por ejemplo:
# ejemplo del argmax de una lista de números de numpy importación argmax # Definir los datos datos = [[1, 3, 2] # Calcular el argmax de la lista resultado = argmax(datos) imprimir(resultado) |
Ejecutando el ejemplo se obtiene el valor «1» del índice de la lista que apunta al índice de la matriz [1] que contiene el mayor valor de la lista «3».
Función Softmax
El softmax, o «soft max,» la función matemática puede ser pensada como una función probabilística o «más suave» versión de la función argmax.
El término softmax se utiliza porque esta función de activación representa una versión suave del modelo de activación «el ganador se lleva todo» en el que la unidad con la mayor entrada tiene la salida +1 mientras que todas las demás unidades tienen la salida 0.
– Página 238, Redes Neurales para el Reconocimiento de Patrones, 1995.
Desde una perspectiva probabilística, si el argmax() La función devuelve 1 en la sección anterior, devuelve 0 para los otros dos índices de la matriz, dando el peso completo al índice 1 y ningún peso al índice 0 y el índice 2 para el valor más grande de la lista [1, 3, 2].
¿Y si estuviéramos menos seguros y quisiéramos expresar el argmax de forma probabilística, con probabilidades?
Esto puede lograrse escalando los valores de la lista y convirtiéndolos en probabilidades de tal manera que todos los valores de la lista devuelta sumen 1,0.
Esto puede lograrse calculando el exponente de cada valor de la lista y dividiéndolo por la suma de los valores de los exponentes.
- probabilidad = exp(valor) / suma v en la lista exp(v)
Por ejemplo, podemos convertir el primer valor «1» de la lista [1, 3, 2] en una probabilidad como la siguiente:
- probabilidad = exp(1) / (exp(1) + exp(3) + exp(2))
- probabilidad = exp(1) / (exp(1) + exp(3) + exp(2))
- probabilidad = 2.718281828459045 / 30.19287485057736
- probabilidad = 0.09003057317038046
Podemos demostrarlo para cada valor de la lista [1, 3, 2] en Python de la siguiente manera:
# Transformar los valores en probabilidades de matemáticas importación exp # Calcular cada probabilidad p1 = exp(1) / (exp(1) + exp(3) + exp(2)) p2 = exp(3) / (exp(1) + exp(3) + exp(2)) p3 = exp(2) / (exp(1) + exp(3) + exp(2)) # Reportar las probabilidades imprimir(p1, p2, p3) # Informe de la suma de probabilidades imprimir(p1 + p2 + p3) |
Ejecutando el ejemplo se convierte cada valor de la lista en una probabilidad y se informa de los valores, y luego se confirma que todas las probabilidades suman el valor 1,0.
Podemos ver que la mayor parte del peso se pone en el índice 1 (67 por ciento) con menos peso en el índice 2 (24 por ciento) y aún menos en el índice 0 (9 por ciento).
0.09003057317038046 0.6652409557748219 0.24472847105479767 1.0 |
Esta es la función softmax.
Podemos implementarla como una función que toma una lista de números y devuelve la distribución de probabilidad softmax o multinomial de la lista.
El siguiente ejemplo implementa la función y la demuestra en nuestra pequeña lista de números.
# Ejemplo de una función para calcular la máxima seguridad para una lista de números de numpy importación exp # Calcular el softmax de un vector def softmax(vector): e = exp(vector) volver e / e.suma() # Definir los datos datos = [[1, 3, 2] # convertir la lista de números en una lista de probabilidades resultado = softmax(datos) # Reportar las probabilidades imprimir(resultado) # Reportar la suma de las probabilidades imprimir(suma(resultado)) |
La ejecución del ejemplo reporta aproximadamente los mismos números con pequeñas diferencias en la precisión.
[0.09003057 0.66524096 0.24472847]
1.0 |
Finalmente, podemos usar la función incorporada softmax() NumPy para calcular la softmax de un arreglo o lista de números, como sigue:
# Ejemplo de cálculo de la softmax para una lista de números de scipy.especial importación softmax # Definir los datos datos = [[1, 3, 2] # Calcular el softmax resultado = softmax(datos) # Reportar las probabilidades imprimir(resultado) # Reportar la suma de las probabilidades imprimir(suma(resultado)) |
Ejecutando el ejemplo, de nuevo, obtenemos resultados muy similares con diferencias muy pequeñas en la precisión.
[0.09003057 0.66524096 0.24472847]
0.9999999999999997 |
Ahora que estamos familiarizados con la función softmax, veamos cómo se utiliza en un modelo de red neuronal.
Función de activación de Softmax
La función softmax se utiliza como función de activación en la capa de salida de los modelos de redes neuronales que predicen una distribución de probabilidad multinomial.
Es decir, softmax se utiliza como la función de activación para los problemas de clasificación de múltiples clases en los que se requiere la pertenencia a una clase en más de dos etiquetas de clase.
Siempre que queramos representar una distribución de probabilidad sobre una variable discreta con n valores posibles, podemos utilizar la función softmax. Esto puede verse como una generalización de la función sigmoide que se utilizó para representar una distribución de probabilidad sobre una variable binaria.
– Página 184, Aprendizaje profundo, 2016.
La función puede utilizarse como una función de activación de una capa oculta en una red neuronal, aunque esto es menos común. Puede utilizarse cuando el modelo internamente necesita elegir o ponderar múltiples entradas diferentes en un cuello de botella o capa de concatenación.
Las unidades Softmax representan naturalmente una distribución de probabilidad sobre una variable discreta con valores k posibles, por lo que pueden ser utilizadas como una especie de interruptor.
– Página 196, Aprendizaje profundo, 2016.
En la biblioteca de aprendizaje profundo de Keras con una tarea de clasificación de tres clases, el uso de softmax en la capa de salida puede tener el siguiente aspecto:
... modelo.añadir(Densa(3, activación=«softmax)) |
Por definición, la activación de softmax emitirá un valor para cada nodo de la capa de salida. Los valores de salida representarán (o pueden ser interpretados como) probabilidades y los valores suman 1.0.
Cuando se modela un problema de clasificación de clases múltiples, los datos deben ser preparados. La variable objetivo que contiene las etiquetas de clase es la primera etiqueta codificada, lo que significa que se aplica un número entero a cada etiqueta de clase de 0 a N-1, donde N es el número de etiquetas de clase.
La etiqueta codificada (o el entero codificado) de las variables objetivo se codifica entonces en un solo punto. Esta es una representación probabilística de la etiqueta de clase, muy similar a la salida de softmax. Se crea un vector con una posición para cada etiqueta de clase y la posición. Todos los valores se marcan con un 0 (imposible) y un 1 (cierto) se utiliza para marcar la posición para la etiqueta de clase.
Por ejemplo, tres etiquetas de clase serán enteros codificados como 0, 1 y 2. Luego se codificarán en vectores de la siguiente manera:
- Clase 0: [1, 0, 0]
- Clase 1: [0, 1, 0]
- Clase 2: [0, 0, 1]
Esto se llama una codificación de un solo golpe.
Representa la distribución de probabilidad multinomial esperada para cada clase utilizada para corregir el modelo bajo aprendizaje supervisado.
La función softmax dará como resultado una probabilidad de pertenencia a una clase para cada etiqueta de clase y tratará de aproximarse lo mejor posible al objetivo previsto para una entrada determinada.
Por ejemplo, si se esperaba el número entero codificado clase 1 para un ejemplo, el vector objetivo sería:
La salida de la softmax podría verse de la siguiente manera, lo que pone el mayor peso en la clase 1 y menos peso en las otras clases.
- [0.09003057 0.66524096 0.24472847]
El error entre la distribución de probabilidad multinomial esperada y la predicha se calcula a menudo utilizando la entropía cruzada, y este error se utiliza luego para actualizar el modelo. Esto se llama la función de pérdida de entropía cruzada.
Para más información sobre la entropía cruzada para el cálculo de la diferencia entre las distribuciones de probabilidad, véase el tutorial:
Puede que queramos convertir las probabilidades de nuevo en una etiqueta de clase codificada con números enteros.
Esto puede lograrse utilizando el argmax() que devuelve el índice de la lista con el mayor valor. Dado que las etiquetas de clase están codificadas con números enteros de 0 a N-1, el argmax de las probabilidades será siempre la etiqueta de clase codificada con números enteros.
- clase entera = argmax([0.09003057 0.66524096 0.24472847])
- número entero de la clase = 1
Más lecturas
Esta sección proporciona más recursos sobre el tema si desea profundizar en él.
Libros
APIs
Artículos
Resumen
En este tutorial, descubriste la función de activación de softmax utilizada en los modelos de redes neuronales.
Específicamente, aprendiste:
- Las funciones de activación lineal y sigmoidea son inapropiadas para las tareas de clasificación multiclase.
- Se puede pensar en Softmax como una versión suavizada de la función argmax que devuelve el índice del mayor valor de una lista.
- Cómo implementar la función de softmax desde cero en Python y cómo convertir la salida en una etiqueta de clase.
¿Tiene alguna pregunta?
Haga sus preguntas en los comentarios de abajo y haré lo posible por responder.