Como escolher o algoritmo de otimização certo?


16

Eu preciso encontrar o mínimo de uma função. Lendo os documentos em http://docs.scipy.org/doc/scipy/reference/optimize.html Vejo que existem vários algoritmos que fazem a mesma coisa, ou seja, encontram o mínimo. Como sei qual devo escolher?

alguns dos algoritmos listados

  • Minimize uma função usando o algoritmo simplex em declive.
  • Minimize uma função usando o algoritmo BFGS.
  • Minimize uma função com o algoritmo de gradiente conjugado não linear.
  • Minimize a função f usando o método Newton-CG.
  • Minimize uma função usando o método de Powell modificado.

Minha função é linear. a dimensionalidade é de cerca de 232750 (são quantos gradientes diferentes eu tenho que calcular a cada vez), leva cerca de 2 minutos para calcular o gradiente e o custo uma vez, então não é barato. Eu não acho que tenho restrições. é determinístico e contínuo.


Bem, você deve investigar a natureza do seu problema: é linear ou não? Qual é a dimensionalidade disso? Sua função de custo é barata de avaliar? Você pode avaliar seus derivados analiticamente e / ou de forma barata? Você tem restrições? Se você tem restrições, pode escrever seu problema facilmente como irrestrito? Por favor, elabore mais sobre esses assuntos.
usεr11852 diz Reinstate Monic

@ user11852 É linear. a dimensionalidade é de cerca de 50 recursos, leva cerca de 2 minutos para calcular o gradiente e o custo uma vez, portanto não é barato. Eu não acho que tenho restrições.
siamii

Não sei o que você quer dizer com "linear" aqui. Se o seu problema é linear, o gradiente é constante e barato de calcular. Se sua função objetivo é linear e não possui restrições, o mínimo é -infinity (ou talvez 0).
5133 paul

@ paul: Na otimização, a linearidade geralmente se refere às restrições, não à função em si. Eu (erroneamente concedido) me referi à "linearidade" em relação à suavidade da função e acho que é a isso que o OP também se refere. Na minha resposta, eu me baseei principalmente no fato de que ele disse "contínuo" depois de qualquer maneira.
usεr11852 diz Reinstate Monic

Respostas:


14

Com base no que você disse: presumo que você precise otimizar para 50 variáveis; Suponho também que você esteja enfrentando uma situação em que é muito caro encontrar derivadas analíticas (muito menos obter números) e que sua otimização é irrestrita.

Deixe-me enfatizar, você é um pouco infeliz porque causa entre 25-30 e 100 variáveis; é um pouco de zona crepuscular quando se trata de escolher entre rotinas de otimização de grande ou pequena escala. Dito isto, porém, nada está perdido.

Dado que mesmo os derivativos de primeira ordem são caros para obter esse tipo, mata a idéia do método de Newton. Você pode ter alguma sorte com o Quasi-Newton (BFGS), mas se o seu Hessian é um pouco diagonal, gostaria de começar. O CG geralmente é um pouco mais lento que o BFGS; portanto, isso provavelmente não melhorará muito as coisas; use-o se a memória também for um problema (ou apenas escolha o L-BFGS nesse caso). Além disso, considerando o quão lento é avaliar sua função, um simples algoritmo de busca por descida / linha mais íngreme seria tortuosamente lento; o mesmo acontece com o Simulated Annealing e outras variantes de pesquisa aleatória (presumo que você não tenha acesso ao HMC e a todo esse jazz).

Portanto, quando você precisar do melhor retorno possível quando se trata de uma única avaliação de função: siga o método de Powell e também teste o COBYLA; apesar de ser um algoritmo de otimização restrito, porque ele aproximará linearmente o gradiente de sua função internamente para acelerar as coisas, ele poderá tirar proveito da linearidade de sua função. Também definitivamente tentar NLopt para Python . Eles têm muitos otimizadores sem gradiente; tente UOBYQA; é a ideia de Powell também (Otimização sem restrições por aproximações quadráticas).

Muito brevemente: Os algoritmos N-CG dependem da computação do Hessian, e seu Hessian parece muito caro para calcular. O NLCG e o BFGS não o exigem, embora possam tentar calculá-lo uma vez em sua primeira etapa.

Eu deixei de fora o algoritmo simplex de propósito porque é um animal totalmente diferente; nada a ver com gradientes como tal. Experimente, mas não posso realmente comentar sobre isso; é realmente dependente da natureza do seu problema.

Para uma primeira boa referência sobre otimização numérica, o livro Métodos Iterativos para Otimização do CTKelly o levará muito longe, muito bem.


Para referência futura: você pode estar interessado em verificar a Ciência da Computação beta no Stackexchange para obter perguntas semelhantes.
usεr11852 diz Reinstate Monic

obrigado pela resposta. Na verdade, minha dimensionalidade é 232.750. Este é o número de gradientes que calculo a cada vez. Eu faço a avaliação da função e computação em gradiente na GPU. Isso seria compatível com o NLopt?
siamii

Eu não usei o NLopt em GPUs, mas não vejo nenhuma razão óbvia para que isso seja um problema de compatibilidade. Eu poderia questionar o problema, apesar da operação frequente de E / S de e para a GPU.
usεr11852 diz Reinstate Monic

@ usεr11852, também é possível discutir a comparação dos métodos de descida de gradiente e decomposição QR para minimizar a função de custo de regressão linear? Preciso fazer uma pergunta separada?
Dr Nisha Arora

@DrNishaArora: Sim. Isso seria apropriado para uma pergunta separada. Consulte o tópico Por que usar descida de gradiente para regressão linear, quando uma solução matemática em formato fechado está disponível? para evitar duplicações!
usεr11852 diz Reinstate Monic

1

Talvez você deva adquirir um livro introdutório sobre otimização numérica. Você precisará levar em conta sua função para decidir o algoritmo.

Entre os algoritmos mencionados, diferenças importantes são se o jacobiano ou o hessiano são necessários ou apenas a função em si.

Considerando que este é um site de perguntas e respostas estatísticas e, portanto, lida com variáveis ​​aleatórias: verifique se sua função é determinística pode ser avaliada de uma maneira que produza resultados contínuos no espaço de pesquisa.


é determinístico e contínuo.
siamii
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.