11 votos

¿Cómo mejora el aprendizaje la sustracción del máximo del logit?

Mi pregunta viene de otro pregunta respondido en Stackoverflow; la implementación de Keras de softmax función de activación se personaliza para restar el valor máximo de los diferentes logits:

def softmax(x, axis=-1):
    # when x is a 2 dimensional tensor
    e = K.exp(x - K.max(x, axis=axis, keepdims=True))
    s = K.sum(e, axis=axis, keepdims=True)
    return e / s

Cuando se utiliza Tensorflow con la implementación normal de softmax significa hacer la siguiente operación antes del softmax llamar:

logits = logits - tf.expand_dims(tf.reduce_max(logits, axis=-1), -1)

Pregunta: ¿Cómo es que restar el máximo de los logits ayuda al aprendizaje? No lo entiendo.

Pregunta subsidiaria: ¿Cómo es que el implemento Keras conocía este hack? ¿Hay alguna publicación relacionada con este descubrimiento?

12voto

Jan Kukacka Puntos 1027

Se trata de un sencillo truco para mejorar la estabilidad numérica. Como probablemente sabes, la función exponencial crece muy rápido, y también lo hace la magnitud de cualquier error numérico. Este truco se basa en la siguiente igualdad:

$$\frac{e^{x+c}}{e^{x+c}+e^{y+c}} = \frac{e^x e^c}{e^x e^c+e^y e^c} = \frac{e^x e^c}{e^c (e^x+e^y)} = \frac{e^x}{e^x+e^y},$$

donde $c$ es el máximo que se resta. Como puede ver, puede restar cualquier valor sin cambiar la salida de softmax. Seleccionar el máximo es una forma conveniente de asegurar la estabilidad numérica.

2 votos

Para añadir: La historia de esto es bastante larga, incluso tiene su propia página en wikipedia: es.wikipedia.org/wiki/LogSumExp

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X