A descida de gradiente e muitos outros métodos são úteis para encontrar mínimos locais em funções de custo. Eles podem ser eficientes quando a função de custo pode ser avaliada rapidamente em cada ponto, seja numericamente ou analiticamente.
Eu tenho o que me parece ser uma situação incomum. Cada avaliação da minha função de custo é cara. Estou tentando encontrar um conjunto de parâmetros que minimizem uma superfície 3D contra superfícies verdadeiras do solo. Sempre que altero um parâmetro, preciso executar o algoritmo em todo o grupo de amostras para medir seu efeito. Para calcular um gradiente, preciso alterar todos os 15 parâmetros de forma independente, o que significa que tenho que regenerar todas as superfícies e comparar com o grupo de amostras muitas vezes por gradiente e definitivamente muitas vezes ao longo da otimização.
Eu desenvolvi um método para contornar esse problema e atualmente o estou avaliando, mas estou surpreso por não ter encontrado muito na literatura a respeito de avaliações dispendiosas da função de custo. Isso me faz pensar se estou dificultando o problema e se pode haver uma maneira melhor já disponível.
Então, minhas perguntas são basicamente as seguintes: alguém conhece métodos para otimizar funções de custo, convexas ou não, quando a avaliação é lenta? Ou, estou fazendo algo bobo em primeiro lugar, executando novamente o algoritmo e comparando com o grupo de amostras tantas vezes?
fonte
Respostas:
TL; DR
Eu recomendo usar o LIPO. É comprovadamente correto e comprovadamente melhor que a pesquisa aleatória pura (PRS). Também é extremamente simples de implementar e não possui hiperparâmetros. Não conduzi uma análise que compara o LIPO ao BO, mas minha expectativa é que a simplicidade e a eficiência do LIPO impliquem que ele terá um desempenho superior ao BO.
(Veja também: Quais são algumas das desvantagens da otimização de hiper parâmetros bayesianos? )
Otimização Bayesiana
Os métodos do tipo otimização bayesiana constroem modelos substitutos do processo gaussiano para explorar o espaço dos parâmetros. A idéia principal é que as tuplas de parâmetros que estão mais próximas terão valores de função semelhantes; portanto, a suposição de uma estrutura de covariância entre pontos permite que o algoritmo faça suposições informadas sobre qual melhor melhor tupla de parâmetro vale a pena tentar a seguir. Essa estratégia ajuda a reduzir o número de avaliações de funções; de fato, a motivação dos métodos BO é manter o número de avaliações de funções o mais baixo possível, enquanto "usa todo o búfalo" para fazer boas suposições sobre qual ponto testar a seguir. Existem diferentes figuras de mérito (melhoria esperada, melhoria quantílica esperada, probabilidade de melhoria ...) que são usadas para comparar pontos a serem visitados a seguir.
Compare isso com algo como uma pesquisa em grade, que nunca usará nenhuma informação de suas avaliações de funções anteriores para informar para onde ir.
Aliás, essa também é uma poderosa técnica de otimização global e, como tal, não faz suposições sobre a convexidade da superfície. Além disso, se a função é estocástica (por exemplo, as avaliações têm algum ruído aleatório inerente), isso pode ser explicado diretamente no modelo GP.
Por outro lado, você precisará ajustar pelo menos um GP a cada iteração (ou vários, escolhendo o "melhor", ou calculando a média sobre alternativas ou métodos totalmente bayesianos). Em seguida, o modelo é usado para fazer (provavelmente milhares) de previsões, geralmente na forma de otimização local com várias etapas, com a observação de que é muito mais barato avaliar a função de previsão do GP do que a função sob otimização. Mas mesmo com essa sobrecarga computacional, costuma acontecer que mesmo funções não-convexas possam ser otimizadas com um número relativamente pequeno de chamadas de função.
Um artigo amplamente citado sobre o tema é Jones et al , "Otimização global eficiente de funções caras de caixa preta". Mas há muitas variações nessa idéia.
Pesquisa aleatória
Mesmo quando a função de custo é cara de avaliar, a pesquisa aleatória ainda pode ser útil. A pesquisa aleatória é muito simples de implementar. A única opção a ser feita pelo pesquisador é definir a probabilidade que seus resultados estejam em algum quantil ; o restante prossegue automaticamente usando os resultados da probabilidade básica.qp q
Suponha que seu quantil seja e você deseje uma probabilidade que os resultados do modelo estejam no top % de todas as tuplas hiperparâmetro. A probabilidade de que todas as tentativas de tuplas não estejam nessa janela é (porque elas são escolhidas independentemente de forma aleatória na mesma distribuição); portanto, a probabilidade de que pelo menos uma tupla esteja nessa região é de . Juntando tudo, temosp = 0,95 100 × ( 1 - q ) = 5 n q n = 0,95 n 1 - 0,95 nq=0.95 p=0.95 100×(1−q)=5 n qn=0.95n 1−0.95n
que no nosso caso específico gera .n≥59
Esse resultado é o motivo pelo qual a maioria das pessoas recomenda tentativas de tuplas para pesquisa aleatória. Vale ressaltar que é comparável ao número de experimentos necessários para obter bons resultados com métodos baseados no Processo Gaussiano, quando há um número moderado de parâmetros. Diferentemente dos processos gaussianos, o número de tuplas de consultas não muda com o número de hiperparâmetros a serem pesquisados; de fato, para um grande número de hiperparâmetros, um método baseado em processo gaussiano pode levar muitas iterações para avançar.n = 60n=60 n=60
Como você tem uma garantia probabilística de como os resultados são bons, pode ser uma ferramenta persuasiva para convencer seu chefe de que não é necessário executar mais experimentos.
LIPO e suas variantes
É uma chegada emocionante que, se não é nova , certamente é nova para mim. Ele prossegue alternando entre a colocação de limites informados na função e a amostragem do melhor limite e o uso de aproximações quadráticas. Ainda estou trabalhando em todos os detalhes, mas acho que isso é muito promissor. Esta é uma boa redação do blog , e o artigo é Cédric Malherbe e Nicolas Vayatis " Otimização global das funções de Lipschitz ".
fonte
A literatura sobre avaliação da função cara-caixa preta é bastante vasta e geralmente é baseada em métodos de modelo substituto, como outras pessoas apontaram. Caixa preta aqui significa que pouco se sabe sobre a função subjacente, a única coisa que você pode fazer é avaliar em um ponto escolhido (os gradientes geralmente não estão disponíveis).xf(x) x
Eu diria que o atual padrão ouro para avaliação da função de caixa preta (muito) dispendiosa é a otimização bayesiana (BO) (global ). O Sycorax já descreveu alguns recursos do BO, então estou apenas adicionando algumas informações que podem ser úteis.
Como ponto de partida, você pode ler este documento de visão geral 1 . Há também um mais recente [2].
A otimização bayesiana tem crescido constantemente nos últimos anos, com uma série de oficinas dedicadas (por exemplo, BayesOpt , e confira esses vídeos na oficina de Sheffield sobre BO), pois possui aplicações muito práticas no aprendizado de máquina, como para otimizar hiperparâmetros dos algoritmos ML - veja, por exemplo, este documento [3] e a caixa de ferramentas relacionada SpearMint . Existem muitos outros pacotes em várias linguagens que implementam vários tipos de algoritmos de otimização bayesiana.
Como mencionei, o requisito subjacente é que cada avaliação de função seja muito cara, de modo que os cálculos relacionados à BO adicionem uma sobrecarga insignificante. Para dar uma estimativa, o BO pode ser definitivamente útil se sua função for avaliada em um tempo da ordem de minutos ou mais. Você também pode aplicá-lo para cálculos mais rápidos (por exemplo, dezenas de segundos), mas dependendo do algoritmo usado, você pode ter que adotar várias aproximações. Se sua função é avaliada na escala de segundos , acho que você está atingindo os limites da pesquisa atual e talvez outros métodos possam se tornar mais úteis. Além disso, devo dizer, o BO raramente é realmente uma caixa preta e você geralmente precisa ajustar os algoritmos, às vezes muito , para fazê-lo funcionar em pleno potencial com um problema específico do mundo real.
BO à parte, para uma revisão dos métodos gerais de otimização sem derivadas, você pode dar uma olhada nesta revisão [4] e verificar se há algoritmos que possuem boas propriedades de convergência rápida. Por exemplo, a Pesquisa de coordenadas em vários níveis (MCS) geralmente converge muito rapidamente para uma vizinhança de um mínimo (nem sempre o mínimo global, é claro). O MCS é pensado para otimização global, mas você pode torná-lo local definindo restrições de limites apropriadas.
Finalmente, você está interessado no BO para funções de destino caras e barulhentas , veja minha resposta a esta pergunta .
Referências:
1 Brochu et al., "Um Tutorial sobre Otimização Bayesiana de Funções de Custo Caro, com Aplicação à Modelagem de Usuários Ativos e Aprendizagem por Reforço Hierárquico" (2010).
[2] Shahriari et al., "Tirando o ser humano do círculo: uma revisão da otimização bayesiana" (2015).
[3] Snoek et al., "Otimização bayesiana prática de algoritmos de aprendizado de máquina", NIPS (2012).
[4] Rios e Sahinidis, "Otimização sem derivados: uma revisão de algoritmos e comparação de implementações de software", Journal of Global Optimization (2013).
fonte
Eu não conheço os algoritmos, mas acredito que o tipo de algoritmo de otimização que você está procurando é a otimização sem derivativos , usada quando o objetivo é caro ou barulhento .
Por exemplo, dê uma olhada neste artigo (Björkman, M. & Holmström, K. "Otimização global de funções não-convexas caras usando funções de base radial." Otimização e engenharia (2000) 1: 373. doi: 10.1023 / A: 1011584207202) cujo resumo parece indicar que é exatamente isso que você deseja:
fonte
Você não está sozinho.
Sistemas caros de avaliar são muito comuns em engenharia, como modelos de método de elementos finitos (MEF) e modelos de dinâmica de fluidos computacional (CFD). A otimização desses modelos caros em termos de computação é muito necessária e desafiadora, porque os algoritmos evolutivos geralmente precisam de dezenas de milhares de avaliações do problema, o que não é uma opção para problemas caros para avaliar. Felizmente, existem muitos métodos (algoritmos) disponíveis para resolver esse problema. Até onde eu sei, a maioria deles é baseada em modelos substitutos (metamodelos). Alguns estão listados abaixo.
No verão, esses algoritmos de otimização baseados em substitutos tentam encontrar o melhor global do problema usando o mínimo de avaliações possível. Isso é alcançado através do uso completo das informações fornecidas pelo substituto (substituto). Revisões sobre otimização de problemas computacionais caros estão em [4-6].
Referência:
fonte
As duas estratégias simples que usei com sucesso no passado são:
Essas estratégias são muito específicas para cada caso, não sei se elas podem ser aplicáveis no seu caso ou não, desculpe se não forem. Ambos podem ser aplicáveis (como nos meus casos de uso): aplique a estratégia "delta-cost" a um modelo analítico mais simples - o desempenho pode melhorar em várias ordens de magnitudes.
Outra estratégia seria usar um método de segunda ordem que normalmente tende a reduzir o número de iterações (mas cada iteração é mais complexa) - por exemplo, algoritmo Levenberg – Marquardt . Mas, considerando que você não parece ter uma maneira direta e eficiente de avaliar o gradiente, essa provavelmente não é uma opção viável nesse caso.
fonte
Como outras pessoas mencionaram, um modelo substituto (também chamado superfície de resposta) é uma abordagem poderosa. Na minha opinião, uma coisa crucial que as pessoas esquecem é que você pode executar várias avaliações de funções em paralelo , se estiver usando CPUs multicore.
Eu sugiro que, olhando para este código , ele use um modelo de resposta simples, mas seja escalável em CPUs multicore, o que fornece uma aceleração igual à quantidade de núcleos usados. Uma matemática por trás do método é descrita neste artigo .
fonte
Existem muitos truques usados na descida do gradiente estocástico que também podem ser aplicados à avaliação da função objetivo. A ideia geral é tentar aproximar a função objetivo usando um subconjunto de dados .
Minhas respostas nesses dois posts discutem por que a descida estocástica do gradiente funciona: a intuição por trás disso é aproximar o gradiente usando um subconjunto de dados.
Como a descida estocástica do gradiente poderia economizar tempo em comparação com a descida padrão do gradiente?
Como executar a regressão linear de maneira paralela / distribuída para a configuração de big data?
O mesmo truque se aplica à função objetivo.
Vamos ainda usar a regressão linear como exemplo: suponha que a função objetivo seja . Se for enorme, digamos trilhões de linhas, avaliar uma vez levará muito tempo. Sempre podemos usar um subconjunto de e para aproximar a função objetivo, que é a perda ao quadrado no subconjunto dos dados.∥Ax−b∥2 A A b
fonte