Implementación de fmincg en Python

8

Estoy tratando de volver a implementar redes neuronales en Python. Implementé la función de costo y el algoritmo de retropropagación correctamente. Los he comprobado ejecutando su código equivalente de octava.

Pero cuando intento usar la scipy.optimize.fmin_cgfunción, las iteraciones tardan mucho tiempo en ejecutarse. Sale con una advertencia y me da un error que dice que "no se logró la tasa de error deseada".

El mismo programa en Octave se ejecuta bien. Sin embargo, tiene su propia fmincgfunción definida.

¿Qué estoy haciendo mal?

garak
fuente
todos, recibí un error "Parece que el kernel murió inesperadamente" ¿Dónde hice mal? ¿Hay algo más que deba hacer para usar el fmin_cg para el cálculo vectorizado?
Wei Gao
Para evitar que se rompa la simetría, debe inicializar los parámetros como: parámetros = numpy.random.randn (dims) * 0.01
Shivam Singh

Respuestas:

6

Como una pista futura, use el doble signo de interrogación. para extraer la fuente de la función:

Mirando las fuentes de scipy, este mensaje de error aparece si el parámetro interno alpha_k es cero o Ninguno.

Este valor a su vez está vinculado al algoritmo de búsqueda interno de Wolfe Line. En particular, se llama cuando la búsqueda no encuentra un mejor valor a lo largo de la trayectoria de búsqueda. Es probable que su función tenga un contorno lineal en algún lugar a lo largo del cual cae el optimizador y se confunde.

¿Quizás intente agregar una devolución de llamada y vea dónde se genera la búsqueda fallida?

meawoppl
fuente
Como seguimiento a esto, scipy elige su recuento máximo de iteraciones en función del tamaño del vector que se optimizará. Esta es una suposición mejor que la media, pero debería documentarse más obviamente.
meawoppl
2

Supongo que no especificó el fprimeparámetro. Si no proporciona este parámetro, fmin_cgtiene que encontrar su propia solución, lo que generalmente es mucho más lento que una solución óptima. Su código podría verse así:

theta = fmin_cg(compute_cost_reg, fprime=compute_gradient_reg,
                x0=theta, args=(X, y, lambd), maxiter=50)
Schickling
fuente
0

Sé que esta es una vieja pregunta, pero he estado luchando con un problema similar y pensé en publicar mi solución en caso de que alguien más se encuentre con esto.

Encontré que el problema era que no había inicializado correctamente el vector para romper la simetría.Θ

Después de hacer esto, corrí fmin_cgcon f y fprime, y aunque todavía funcionó bastante lento, lo hizo sin ninguno de los errores o advertencias que había estado viendo hasta ese momento.

De hecho, en realidad hizo un mejor trabajo al minimizar la función de costos que la implementación de matlab, a pesar de que ambos lo hicieron max_iters = 100.

jfent
fuente