Estou executando algumas otimizações com a implementação do BFGS do optim. A função objetivo é na verdade um algoritmo computacional, não apenas matemática. Descobri que quando adiciono uma penalidade de L1, as coisas diminuem um pouco. Por que isso pode ser? Existe algo no L1 que atrasa as coisas? Então, como é a glmnet
implementação do LASSO tão rápida?
Uma rápida pesquisa no Google encontrou uma chamada de pacote "lbfgs" que "encontra o ideal de um objetivo mais a norma L1 dos parâmetros do problema" com "uma implementação rápida e com eficiência de memória dessas rotinas de otimização, que é particularmente adequada para problemas dimensionais ". Devo procurar soluções como essa?
r
optimization
lasso
Count Zero
fonte
fonte
Respostas:
Eu acho que a razão pela qual a adição de uma penalidade L1 torna as coisas significativamente mais lentas é que uma penalidade L1 não é diferenciável (ou seja, valor absoluto), enquanto a penalidade L2 é. Isso significa que a superfície da função não será lisa e, portanto, os métodos quase-Newton padrão terão muitos problemas com esses problemas. Lembre-se de que uma maneira de pensar em um método quase-Newton é fazer uma aproximação quadrática da função e, em seguida, a proposta inicial terá o máximo dessa aproximação. Se a aproximação quadrática corresponder razoavelmente bem à função de destino, devemos esperar que a proposta seja próxima do máximo (ou mínimo, dependendo de como você olha o mundo). Mas se sua função de destino não for diferencial, essa aproximação quadrática pode ser muito ruim,
Se você encontrou um pacote R que implementa as penalidades de BFGS para L1, tente fazê-lo. BFGS, em geral, é um algoritmo muito genérico para otimização. Como é o caso de qualquer algoritmo genérico, haverá muitos casos especiais em que isso não ocorre bem. Algoritmos que são especialmente adaptadas para o seu problema claramente deve fazer melhor (supondo que o pacote é tão bom como ele é autor afirma: Eu não ouvi falar de lbfgs, mas há um monte de grandes coisas que eu não tenha ouvido falar. Atualização : I usei o pacote lbfgs do R e a implementação do L-BFGS que eles têm é muito boa! Ainda não usei o algoritmo OWL-QN, que é o que o OP está se referindo).
Se não der certo, tente o método "Nelder-Mead" com o otim de R. Ele não usa derivativos para otimização. Como tal, normalmente será mais lento em uma função suave, mas mais estável em uma função não suave como a sua.
fonte
Não sei por que seu problema diminui quando você adiciona uma penalidade de . Provavelmente depende de (1) qual é o problema; (2) como você o codificou; e (3) o método de otimização que você está usando.L1
Eu acho que existe uma "resposta não dita" à sua pergunta: as soluções mais eficientes para problemas numéricos geralmente são feitas sob medida. Os algoritmos de uso geral são apenas isso: uso geral. As soluções especializadas para problemas específicos tenderão a funcionar melhor, porque podemos levar em consideração observações sobre como esse problema específico é apresentado e suas propriedades específicas conhecidas pelo analista. Para sua pergunta específica sobre
glmnet
, ela possui vários "truques", o que a torna altamente eficiente - para o problema específico que está tentando resolver! O Journal of Statistical Software paper on fornece detalhes:E está codificado em FORTRAN.
L-BFGS é um algoritmo BFGS de memória limitada. Embora tenha truques que podem torná-lo mais eficiente do que o BFGS padrão para alguns problemas, não está claro se os problemas resolvidos têm alguma influência no problema específico em questão. O L-BFGS também é uma das opções
optim
, portanto, não sei por que você precisaria de um pacote adicional.Observe que o BFGS depende de derivativos, que são calculados por diferenças finitas quando os formulários analíticos não são fornecidos. É aí que você terá problemas, porque a penalidade não é diferenciável em todos os lugares. Isso não significa apenas que você provavelmente não estimará os coeficientes do LASSO precisamente em 0, mas também poderá causar estragos na atualização de iteração para iteração.L1
fonte