Por que adicionar uma penalidade de L1 ao otim de R diminui tanto as coisas (em relação a nenhuma penalidade ou L2)?

8

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 glmnetimplementaçã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?

Count Zero
fonte
o que se entende por "a função objetivo é realmente um algoritmo computacional, não apenas matemática"?
Cliff AB
Mais especificamente, o que você está otimizando? Você está estimando uma regressão do LASSO?
Sycorax diz Restabelecer Monica
@CliffAB Quero dizer que, em vez de otimizar uma função baseada em matemática como "function (b) (Y - X * b) ^ 2", a função é baseada em algum processo iterativo como (Y - X * bootstrap_estimate (b)) ^ 2) Acho que estou dizendo que não posso fornecer uma função de gradiente.
Count Zero
@ user777 Um tipo de modelo gráfico que estou adaptando através da propagação traseira. A diferença é que a estrutura gráfica é qualquer DAG, não os gráficos estruturados que você obtém nas redes neurais. Portanto, tive que configurar a otimização como operações em um gráfico, em vez das multiplicações de matriz que você normalmente faz na propagação traseira.
Count Zero
1
Isso significa que, se você avaliar a função de destino duas vezes com os mesmos parâmetros, obterá resultados ligeiramente diferentes (por exemplo, bootstrap_estimate (b) pode ser diferente em uma iteração diferente, mesmo que seus parâmetros de entrada sejam idênticos)? Nesse caso, esse seria um problema muito mais difícil, e o uso do BFGS da optim, mesmo com penalidades de L2, provavelmente terminaria prematuramente, pois o algoritmo confundiria o erro estocástico com o pico. Meu palpite é que esse não é o caso, ou seja, bootstrap_estimate (b) é constante (para b fixo) para cada execução do BFGS.
Cliff AB

Respostas:

8

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.

Cliff AB
fonte
5

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:

  1. Sua otimização para todos os modelos (rede elástica, regressão de crista e não apenas LASSO) utiliza descida cíclica de coordenadas, o que é uma boa maneira de resolver esse problema.
  2. Os coeficientes são calculados ao longo dos caminhos para um intervalo de valores . Portanto, em vez de vagar pela superfície de resposta para obter um único valor do parâmetro de regularização , ele passa dos valores maiores para os menores, usando estimativas de coeficiente das soluções anteriores como pontos de partida. Isso explora o fato de que as estimativas de coeficiente aumentam de valores menores para maiores à medida que diminui; ele não precisa resolver novamente o mesmo problema repetidamente, a partir de inicializações aleatoriamente inicializadas, como seria o caso de uma implementação ingênua de uma rotina de otimização padrão.λ λλλλ

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

Sycorax diz restabelecer Monica
fonte