Undeflow y Overfolw

Los algoritmos de aprendizaje automático generalmente requieren una gran cantidad de cálculos numéricos. Esto se refiere a algoritmos que resuelven problemas matemáticos mediante métodos que actualizan las estimaciones de la solución a través de un proceso iterativo, en lugar de derivar analíticamente una fórmula que proporciona una expresión simbólica para la solución correcta. Tengamos en cuenta que incluso la simple evaluación de una función matemática en una computadora digital puede ser difícil cuando la función tiene números reales, ya que estos no pueden ser representados con precisión utilizando una cantidad finita de memoria.

La dificultad fundamental para realizar operaciones matemáticas en una computadora digital es que necesitamos representar números reales de infinitas cifras decimales (irracionales) con un número finito de bits. Así, para casi todos los números se comete algún error de aproximación cuando se representa  representamos en la computadora. El problema de esto, es que cuando se combina con muchas operaciones continuas, el error de redondeo se acumula, y eso conlleva a un error significativo al final del proceso.

Un error de redondeo particularmente peligros es el underflow, el cual ocurre cuando números muy pequeños son redondeados a cero. Muchas funciones se comportan de manera muy diferente si son evaluadas en cero en lugar de en un numero muy pequeño. Un caso especial es la división, ya que una división entre cero generalmente produce un error, o retorna un NaN, que es de tipo “no numero”, por lo que si se están realizando una serie de operaciones, este valor dañaría el proceso.

Otra forma de redondeo dañina es el overflow, que es cuando números muy grandes son aproximados a infinito, lo cual también es un tipo “no numero”.

Como ejemplo de estos tipos de redondeo podemos estudiar la función softmax, la cual se usa a menudo para predecir las probabilidades asociadas con una distribución multinoulli. La función softmax se define como:


s o f t m a x ( x ) i   =   e x p ( x i ) j   =  1 n e x p ( x j )

Considerando lo que sucede cuando todas las xi son iguales a una constante k, vemos que la función tiende a 1/n, pero si la constante k es muy grande negativamente tendremos un problema de underflow y los argumentos del exponencial seran cero, por lo cual se tendría una división entre cero y con esto un error. Si en cambio la constante k es muy grande positivamente tendriamos un error de overflow, y ni siguiera podría ser evaluado el exponencial. Para resolver estas dificultades se puede evaluar la función en z = x - maxx. El valor de la función no es afectada por la suma o resta de un escalar en el vector de entrada. Restando resulta en el argumento más grande de la exponencial es 0, lo que excluye la posibilidad de overflow. Del mismo modo, al menos un término en el denominador tiene un valor de 1, que descarta la posibilidad de underflow en el denominador que conduce a una división por cero.

Como se pudo ver en el ejemplo, aunque una función tenga problemas de estabilidad al contar con números muy grandes, estas generalmente pueden ser estabilizadas. Es muy importante tener esto en cuenta en las implementaciones algorítmicas que manejen grandes números para corregir posibles errores evitables.

Comentarios

  1. Traducción literal de "Deep Learning", de Ian Goodfellow, Yoshua Bengio y Aaron Courville. Hay que citar a las fuentes...

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Método del Gradiente.

Fundamentos de Git