Como definir a condição de terminação para a descida do gradiente?


24

Na verdade, eu queria perguntar como posso definir a condição final para a descida do gradiente.

Posso pará-lo com base no número de iterações, ou seja, considerando valores de parâmetros para, por exemplo, 100 iterações?

Ou devo esperar que o diferente nos dois valores dos parâmetros 'novo' e 'antigo' seja muito pequeno na ordem de digamos ? Definitivamente, isso levará muito tempo.10-6

Qual é a melhor maneira? No meu caso, mesmo uma iteração leva um tempo significativo. Nesta situação, se eu esperar pela 2ª condição, pode levar semanas, eu acho.

Então, qual abordagem devo usar. Como enfrentar esse cenário?


11
Não está explicitamente declarado, mas presumo que você esteja tentando encontrar um MLE. Seu resultado realmente depende inteiramente do seu espaço de parâmetros, da sua função de probabilidade e de suas necessidades (ou seja, melhor não está bem definido). Se você está apenas procurando justificativa teórica, como eficiência assintótica; nas condições Le'Cam, você pode simplesmente usar o MLE de uma etapa (sob a suposição adicional de que você está usando o Método de Newton e a função de pontuação para a descida do gradiente). Isso requer que seu valor inicial seja tal que em probabilidade. n1/2θ^0θ
Jonathan Lisic

então espere, quando você disse que "novo" - "velho" é suficientemente pequeno, isso é uma condição de terminação incorreta para descida de gradiente? (se ponto fixo como teoremas aplicar, essa condição deve ser ok?)
Charlie Parker

Pode-se parar quando qualquer um dos: valores de função , ou gradientes , ou parâmetros , pare de parar de se mover, seja relativo ou absoluto. Mas, na prática, parâmetros .. são muitos, então eles são dobrados, mas todo programa faz isso de maneira diferente. Consulte Tolerâncias do Mathworks e critérios de parada para uma imagem. f i x i 3 × 2fEufEuxEu3×2ftolabs ftolrelxtolabs
Denis

Respostas:


19

Boa pergunta. Eu já vi muitas regras de parada na literatura e existem vantagens e desvantagens para cada uma, dependendo do contexto. A optimfunção em R, por exemplo, possui pelo menos três regras de parada diferentes:

  • maxit, ou seja, um número máximo pré-determinado de iterações. Outra alternativa semelhante que eu vi na literatura é um número máximo de segundos antes do tempo limite. Se tudo o que você precisa é de uma solução aproximada, isso pode ser bastante razoável. De fato, existem classes de modelos (especialmente modelos lineares) para os quais a parada precoce é semelhante a colocar um gaussiano antes nos valores dos parâmetros. Um frequentista diria que você tem uma "norma L2" em vez de uma anterior, mas eles também pensariam nisso como uma coisa razoável a se fazer. Acabei de ler este artigo , mas ele fala sobre a relação entre parada precoce e regularização e pode ajudar a apontar para mais informações. Mas a versão curta é: sim, parar cedo pode ser uma coisa perfeitamente respeitável, dependendo do que você

  • abstol, ou seja, pare quando a função chegar "perto o suficiente" a zero. Isso pode não ser relevante para você (não parece que você está esperando um zero), então eu vou pular.

  • reltol, que é como sua segunda sugestão - pare quando a melhoria cair abaixo de um limite. Na verdade, não sei quanta teoria existe sobre isso, mas você provavelmente tenderá a obter mínimos mais baixos dessa maneira do que com um pequeno número máximo de iterações. Se isso é importante para você, pode valer a pena executar o código para mais iterações.

Outra família de regras de parada tem a ver com a otimização de uma função de custo em um conjunto de dados de validação (ou com validação cruzada), e não nos dados de treinamento. Dependendo do uso do seu modelo, você pode parar bem antes de chegar ao mínimo local nos dados de treinamento, pois isso pode envolver o ajuste excessivo. Tenho certeza de que Trevor Hastie escreveu sobre boas maneiras de fazer isso, mas não me lembro da citação.

Outras opções possíveis para encontrar mínimos mais baixos em um período de tempo razoável podem incluir:

  • Descida de gradiente estocástico, que requer apenas a estimativa de gradientes para uma pequena porção de seus dados por vez (por exemplo, um ponto de dados para SGD "puro" ou pequenos lotes pequenos).

  • Funções de otimização mais avançadas (por exemplo, métodos do tipo Newton ou Gradiente Conjugado), que usam informações sobre a curvatura da sua função objetivo para ajudá-lo a apontar em melhores direções e obter melhores tamanhos de passos à medida que desce.

  • Um termo "momentum" em sua regra de atualização, para que o otimizador faça um trabalho melhor ao descer ladeira abaixo do que delimitar as paredes do canyon em sua função objetivo.

Essas abordagens são todas discutidas nessas notas de aula que encontrei online.

Espero que isto ajude!

Edite oh, e você também pode tentar obter melhores valores iniciais (por exemplo, resolvendo uma versão mais simples do problema) para que sejam necessárias menos iterações para se aproximar do ideal do seu "início a quente".


o problema com a escolha de um número fixo de iterações é que, a menos que você consiga traçar claramente sua curva de custo (e ela possui pouco ruído), é difícil saber quantas iterações são demais, especialmente se a função de otimização for complicada e quem sabe quantos mínimos locais ele possui e se você inicializou aleatoriamente, isso piora ainda mais o problema, pois torna ainda mais difícil adivinhar o que é um bom número "pequeno" de iterações. Como você lida com esses problemas, na realidade, se você realmente deseja parar cedo? Como você se certifica de não atirar em demasia e não ultrapassar demais?
Charlie Parker

Eu gostaria de esclarecer o que reltol(isto é, quando deixa de ser uma "melhoria") significa. A primeira melhoria significa diminuir a função de custo. Então, assumirei que o que você quer dizer é que, quando a função de custo para de diminuir o suficiente (ou começa a aumentar), uma pára, certo? Na verdade, não se faz "| velho - novo |" tipo de regra de atualização, certo?
Charlie

11
O abstolparâmetro só faz sentido se você estiver assumindo a tolerância do gradiente da função de custo, não a própria função de custo. Em um otimizador local, o valor do gradiente é zero; mas não o valor da função.
Mario Becerra

"começo quente" é um truque muito inteligente! obrigado
Mehdi LAMRANI
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.