En realidad, quería preguntarle cómo puedo definir la condición de terminación para el descenso de gradiente.
¿Puedo detenerlo en función del número de iteraciones, es decir, considerando los valores de los parámetros para, por ejemplo, 100 iteraciones?
¿O debería esperar de modo que la diferencia en los valores de los dos parámetros 'nuevo' y 'viejo' sea muy pequeña en el orden de digamos ? Esto definitivamente tomará mucho tiempo.
¿Cuál es la mejor manera? En mi caso, incluso una iteración lleva mucho tiempo. En esta situación, si espero la segunda condición, incluso podría tomar semanas, supongo.
Entonces, ¿qué enfoque debo usar? ¿Cómo abordar este escenario?
algorithms
optimization
gradient-descent
usuario31820
fuente
fuente
ftolabs
ftolrel
xtolabs
Respuestas:
Buena pregunta. He visto muchas reglas de detención en la literatura, y hay ventajas y desventajas para cada una, según el contexto. La
optim
función en R, por ejemplo, tiene al menos tres reglas de detención diferentes:maxit
, es decir, un número máximo predeterminado de iteraciones. Otra alternativa similar que he visto en la literatura es un número máximo de segundos antes de que se agote el tiempo de espera. Si todo lo que necesita es una solución aproximada, esta puede ser muy razonable. De hecho, hay clases de modelos (especialmente modelos lineales) para los cuales la detención temprana es similar a poner un gaussiano anterior en los valores de sus parámetros. Un frecuentista diría que tiene una "norma L2" en lugar de una anterior, pero también consideraría que es algo razonable. Solo he leído este documento , pero habla sobre la relación entre la interrupción temprana y la regularización y podría ayudarlo a obtener más información. Pero la versión corta es, sí, detenerse temprano puede ser una cosa perfectamente respetable, dependiendo de lo que usted haga.abstol
, es decir, deténgase cuando la función se "acerque lo suficiente" a cero. Esto puede no ser relevante para usted (no parece que esté esperando un cero), así que lo omitiré.reltol
, que es como su segunda sugerencia: deténgase cuando la mejora caiga por debajo de un umbral. En realidad, no sé cuánta teoría hay sobre esto, pero probablemente tenderás a obtener mínimos más bajos de esta manera que con un pequeño número máximo de iteraciones. Si eso es importante para usted, entonces podría valer la pena ejecutar el código para más iteraciones.Otra familia de reglas de detención tiene que ver con la optimización de una función de costo en un conjunto de datos de validación (o con validación cruzada) en lugar de en los datos de capacitación. Dependiendo de para qué desee usar su modelo, es posible que desee detenerse mucho antes de llegar al mínimo local en sus datos de entrenamiento, ya que eso podría implicar un sobreajuste. Estoy bastante seguro de que Trevor Hastie ha escrito sobre buenas formas de hacer esto, pero no recuerdo la cita.
Otras opciones posibles para encontrar mínimos más bajos en un período de tiempo razonable podrían incluir:
Descenso de gradiente estocástico, que solo requiere estimar los gradientes para una pequeña porción de sus datos a la vez (por ejemplo, un punto de datos para SGD "puro" o pequeños mini lotes).
Funciones de optimización más avanzadas (por ejemplo, métodos de tipo Newton o gradiente conjugado), que utilizan información sobre la curvatura de su función objetivo para ayudarlo a apuntar en mejores direcciones y tomar mejores tamaños de pasos a medida que avanza cuesta abajo.
Un término de "impulso" en su regla de actualización, para que su optimizador haga un mejor trabajo al rodar cuesta abajo en lugar de delimitar las paredes del cañón en su función objetivo.
Todos estos enfoques se discuten en estas notas de clase que encontré en línea.
¡Espero que esto ayude!
Edite oh, y también puede intentar obtener mejores valores iniciales (por ejemplo, resolviendo una versión más simple del problema) para que se necesiten menos iteraciones para acercarse al óptimo desde su "inicio en caliente".
fuente
reltol
(es decir, cuando deja de ser una "mejora"). La primera mejora significa la disminución de la función de costos. Entonces supondré que lo que quieres decir es que, cuando la función de costo deja de disminuir lo suficiente (o comienza a aumentar) uno se detiene, ¿verdad? Uno no hace "| viejo - nuevo |" tipo de regla de actualización, ¿verdad?abstol
parámetro solo tiene sentido si toma la tolerancia del gradiente de la función de costo, no la función de costo en sí. En un optimizador local, el valor del gradiente es cero; pero no el valor de la función.