Eu queria saber quais são os diferentes casos de uso para os dois algoritmos, descida de coordenadas e descida de gradiente .
Eu sei que a descida de coordenadas tem problemas com funções não suaves, mas é usada em algoritmos populares como SVM e LASSO.
Acho que a descida em gradiente é usada mais amplamente, especialmente com o ressurgimento de RNAs, e para muitas outras tarefas de aprendizado de máquina.
Minha pergunta é: que tipo de problemas se encaixam em um, mas não no outro, e nesse aspecto o que torna o ajuste de descida coordenada para SVMs e LASSO, mas o ajuste de descida gradiente para RNAs?
Como escolher entre os dois ao escolher um algoritmo de otimização?
A descida de coordenadas atualiza um parâmetro de cada vez, enquanto a descida de gradiente tenta atualizar todos os parâmetros de uma só vez.
É difícil especificar exatamente quando um algoritmo será melhor que o outro. Por exemplo, fiquei muito chocado ao saber que a descida de coordenadas era o estado da arte para o LASSO. E eu não era o único; veja o slide 17 .
Com isso dito, existem alguns recursos que podem tornar um problema mais corrigível para coordenar a descida:
(1) Atualizações condicionais rápidas. Se, por algum motivo, o problema permitir otimizar os parâmetros individualmente muito rapidamente, a descida de coordenadas poderá fazer uso disso. Por exemplo, é possível atualizar determinados parâmetros usando apenas um subconjunto dos dados, reduzindo bastante o custo computacional dessas atualizações. Outro caso é se houver uma solução de formulário fechado para um parâmetro individual, condicional aos valores de todos os outros parâmetros.
(2) Modos relativamente independentes para parâmetros. Se o valor ideal de um parâmetro for completamente independente dos outros valores, uma rodada de descida de coordenadas levará à solução (supondo que cada atualização de coordenada encontre o modo atual). Por outro lado, se o modo de um determinado parâmetro for altamente dependente de outros valores de parâmetros, é muito provável que a descida de coordenadas se aproxime, com atualizações muito pequenas a cada rodada.
Infelizmente, para a maioria dos problemas, (2) não se aplica, por isso é raro que a descida de coordenadas faça bem em comparação com algoritmos alternativos. Acredito que a razão pela qual ele tenha um bom desempenho no LASSO é que existem muitos truques que podemos usar para decretar a condição (1).
Para descida de gradiente, esse algoritmo funcionará bem se a segunda derivada for relativamente estável, uma boaα
fonte
Percebo que essa é uma pergunta antiga e tem algumas respostas muito boas. Eu gostaria de compartilhar alguma experiência pessoal prática.
Isso é realmente pedir muito. Com a descida gradiente, geralmente se lida com restrições através de uma função de penalidade. Aqui não vai funcionar. Assim que um valor viola uma dessas restrições, seu código geralmente gera um tipo de erro numérico. Portanto, é preciso lidar com as restrições, nunca permitindo que o algoritmo de otimização a atravesse.
Existem inúmeras transformações que você pode aplicar ao seu problema para satisfazer as restrições e permitir a descida do gradiente. No entanto, se você estiver procurando a maneira mais fácil e preguiçosa de implementar isso, a descida coordenada é o caminho a seguir:
Para alguém como eu que trabalha em Python, isso geralmente significa que eu tenho que usar um loop for adicional que afeta o desempenho de maneira bastante negativa. A descida de gradiente me permite usar o Numpy, que é otimizado para desempenho. Pode-se obter uma velocidade muito boa com ele, no entanto, isso não é possível com a descida de coordenadas, então eu geralmente uso alguma técnica de transformação.
Portanto, a conclusão é que a descida de coordenadas é a opção mais fácil de lidar com restrições muito estritas, como o parâmetro rate na distribuição de Poisson. Se ele se tornar negativo, o código reclama, etc.
Espero que isso tenha adicionado um pouco de insight.
fonte