Acabei de aprender sobre a regularização como uma abordagem para controlar o ajuste excessivo e gostaria de incorporar a ideia em uma implementação simples de retropropagação e perceptron de múltiplas camadas (MLP) que montei.
Atualmente, para evitar o ajuste excessivo, valido cruzadamente e mantenho a rede com a melhor pontuação até agora no conjunto de validação. Isso funciona bem, mas adicionar regularização me beneficiaria com a escolha correta do algoritmo e parâmetro de regularização, fazendo com que minha rede convergisse de forma mais sistemática para um modelo sem super-ajuste.
A fórmula que eu tenho para o termo de atualização (do curso Coursera ML) é declarada como uma atualização em lote, por exemplo, para cada peso, depois de somar todos os deltas aplicáveis a todo o conjunto de treinamento a partir da propagação de erros, um ajuste lambda * current_weight
é adicionado também antes da combinação delta é subtraído no final do lote, onde lambda
é o parâmetro de regularização.
Minha implementação de retropropagação usa atualizações de peso por item. Estou preocupado que não possa simplesmente copiar a abordagem em lote, embora pareça estar bem intuitivamente para mim. Um termo de regularização menor por item também funciona?
Por exemplo, lambda * current_weight / N
onde N é o tamanho do conjunto de treinamento - à primeira vista, isso parece razoável. Porém, não consegui encontrar nada sobre o assunto, e me pergunto se isso ocorre porque a regularização não funciona tão bem com uma atualização por item ou mesmo sob um nome diferente ou fórmula alterada.
fonte
Para complementar o que insys disse:
A regularização é usada ao calcular a retropropagação para todos os pesos em seu MLP. Portanto, em vez de calcular o gradiente em relação a todas as entradas do conjunto de treinamento (
batch
), você usa apenas alguns / um item (s) (stochastic or semi-stochastic
). Você acabará limitando o resultado da atualização em relação a um item em vez de tudo o que também está correto.Além disso, se bem me lembro, Andrew NG usado
L2-regularization
. O/N
nolambda * current_weight / N
não é obrigatória, ele apenas ajuda rescaling a entrada. No entanto, se você optar por não usá-lo, terá (na maioria dos casos) para selecionar outro valor paralambda
.Você também pode usar o algoritmo de pesquisa em grade para escolher o melhor valor
lambda
(o hiperparâmetro => aquele que você deve escolher).fonte