Estou tentando implementar um procedimento de otimização em Python usando BFGS e L-BFGS em Python, e estou obtendo resultados surpreendentemente diferentes nos dois casos. O L-BFGS converge para o mínimo adequado super rápido, enquanto o BFGS converge muito lentamente, e isso também para um mínimo sem sentido.
PERGUNTA: Das minhas leituras, parece-me que BFGS e L-BFGS são basicamente o algoritmo (métodos quase-Newton), exceto que o último usa menos memória e, portanto, é mais rápido. Isso é verdade? Caso contrário, se eles são mais diferentes, então como?
Por fim, quero descobrir se a diferença de desempenho se deve a algumas diferenças nos algoritmos reais ou à sua implementação nos módulos SciPy do python.
EDIT: estou adicionando alguns dados para apoiar minhas alegações de comportamento divergente dos dois algoritmos.
RUNNING THE L-BFGS-B CODE
* * *
Machine precision = 2.220D-16
N = 147 M = 10
This problem is unconstrained.
At X0 0 variables are exactly at the bounds
At iterate 0 f= 2.56421D+04 |proj g|= 1.19078D+03
At iterate 1 f= 2.12904D+04 |proj g|= 1.04402D+03
At iterate 2 f= 1.49651D+03 |proj g|= 2.13394D+02
At iterate 3 f= 6.08288D+02 |proj g|= 9.85720D+01
At iterate 4 f= 2.91810D+02 |proj g|= 6.23062D+01
...
At iterate 142 f= 3.27609D+00 |proj g|= 8.80170D-04
Time taken for minimisation: 36.3749790192
*** BFGS code ***
At iterate 1, f= 21249.561722
At iterate 2, f= 15710.435098
At iterate 3, f= 15443.836262
At iterate 4, f= 15386.035398
At iterate 5, f= 15311.242917
At iterate 6, f= 15211.986938
At iterate 7, f= 15022.632266
...
At iterate 524, f= 67.898495
...
Warning: Desired error not necessarily achieved due to precision loss.
Iterations: 1239
Time taken: 340.728140116
fonte
Respostas:
Não, eles não são os mesmos. Em certo sentido, o L-BFGS é uma aproximação ao BFGS, que requer muito menos memória. BFGS e L-BFGS são explicados em grande detalhe em muitos recursos padrão.
Muito grosseiramente, você pode pensar na diferença assim. O BFGS calcula e armazena o Hessian completoH em cada passo; isto exigeΘ (n2) espaço onde n conta o número de variáveis (dimensões) que você está otimizando. O L-BFGS calcula e armazena uma aproximação ao Hessian, escolhida para que a aproximação possa ser armazenada emΘ ( n ) espaço. Efetivamente, o L-BFGS usa a aproximaçãoH≈M⊤M para alguns k × n matriz M (Eu acho que).
Cada passo do L-BFGS é uma tentativa de aproximar / adivinhar o que o passo correspondente do BFGS faria. No entanto, uma única etapa do L-BFGS ocupa muito menos espaço e tempo do que uma única etapa do BFGS. Conseqüentemente, você pode executar muito mais etapas do L-BFGS dentro de um determinado período de tempo que o BFGS. Portanto, você pode achar que o L-BFGS converge mais rapidamente, porque ele pode fazer muito mais iterações em um determinado período de tempo do que o BFGS.
Não sei o que significa um mínimo sem sentido, ou por que o BFGS convergiria para algo pior que o L-BFGS se ambos pudessem executar por um período ilimitado de tempo.
fonte