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.
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?
algorithms
optimization
gradient-descent
user31820
fonte
fonte
ftolabs
ftolrel
xtolabs
Respostas:
Boa pergunta. Eu já vi muitas regras de parada na literatura e existem vantagens e desvantagens para cada uma, dependendo do contexto. A
optim
funçã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".
fonte
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?abstol
parâ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.