NumPy Softmax en Python

Muhammad Waiz Khan 30 enero 2023
  1. Función Softmax de NumPy para arrays 1D en Python
  2. Función NumPy Softmax para matrices 2D en Python
NumPy Softmax en Python

Este tutorial explicará cómo implementar la función softmax utilizando la biblioteca NumPy en Python. La función softmax es una forma multidimensional generalizada de la función logística. Se utiliza en la regresión logística multinomial y como función de activación en las redes neuronales artificiales.

La función softmax normaliza todos los elementos del array en el intervalo (0,1) para que puedan ser tratados como probabilidades. La función softmax se define mediante la siguiente fórmula:

fórmula softmax

Vamos a ver los métodos para implementar la función softmax en arrays de una y dos dimensiones en Python utilizando la librería NumPy.

Función Softmax de NumPy para arrays 1D en Python

Supongamos que necesitamos definir una función softmax que tome un array 1D como entrada y devuelva el array normalizado requerido.

El problema común que puede ocurrir al aplicar softmax es el problema de estabilidad numérica, lo que significa que el ∑j e^(z_j) puede llegar a ser muy grande debido al error exponencial y de desbordamiento que puede ocurrir. Este error de desbordamiento puede resolverse restando a cada valor del array su valor máximo.

Los siguientes ejemplos de código demuestran la implementación original de la función softmax y la implementación con sustracción de máximos utilizando la librería NumPy en Python.

  • Softmax original:
import numpy as np


def softmax(x):

    f_x = np.exp(x) / np.sum(np.exp(x))
    return f_x
  • Softmax numéricamente estable:
import numpy as np


def softmax(x):

    y = np.exp(x - np.max(x))
    f_x = y / np.sum(np.exp(x))
    return f_x

Función NumPy Softmax para matrices 2D en Python

La función softmax para un array 2D realizará la transformación softmax a lo largo de las filas, lo que significa que el máximo y la suma se calcularán a lo largo de las filas. En el caso del array 1D, no tenemos que preocuparnos de estas cosas; sólo tenemos que aplicar todas las operaciones sobre el array completo.

El siguiente ejemplo de código demuestra cómo se transformará la transformación softmax en un array 2D de entrada utilizando la librería NumPy en Python.

import numpy as np


def softmax(x):

    max = np.max(
        x, axis=1, keepdims=True
    )  # returns max of each row and keeps same dims
    e_x = np.exp(x - max)  # subtracts each row with its max value
    sum = np.sum(
        e_x, axis=1, keepdims=True
    )  # returns sum of each row and keeps same dims
    f_x = e_x / sum
    return f_x

Supongamos que necesitamos realizar la transformación softmax a lo largo de las columnas del array 2D; podemos hacerlo simplemente tomando el transporte de entrada y salida del método softmax() descrito anteriormente.

Código de ejemplo:

softmax(x.T).T