Implementação fmincg em Python


8

Estou tentando reimplementar redes neurais em Python. Eu implementei a função de custo e o algoritmo de retropropagação corretamente. Eu os verifiquei executando seu código equivalente do Octave.

Mas quando estou tentando usar a scipy.optimize.fmin_cgfunção, as iterações levam muito tempo para serem executadas. Ele sai com um aviso e gera um erro dizendo que "a taxa de erro desejada não foi alcançada".

O mesmo programa no Octave executa bem. No entanto, ele tem sua própria fmincgfunção definida.

O que estou fazendo errado?


todos, eu tenho um error'It parece o kernel morreu inesperadamente" onde foi que eu fiz de errado, há algo mais que eu preciso fazer, a fim de usar o fmin_cg para o cálculo vetorizado?
Wei Gao

Para evitar quebra de simetria que você deve inicializar parâmetros como: params = numpy.random.randn (DIMS) * 0,01
Shivam Singh

Respostas:


6

Como sugestão futura, use o ponto de interrogação duplo? para puxar a fonte da função:

Observando as fontes cíclicas, essa mensagem de erro aparece se o parâmetro interno alpha_k for zero ou Nenhum.

Este valor, por sua vez, está vinculado ao algoritmo de busca interno da Linha Wolfe. Em particular, é chamado quando a pesquisa não encontra um valor melhor ao longo da trajetória de pesquisa. Sua função provavelmente tem um contorno linear em algum lugar ao longo do qual o otimizador se encaixa e fica confuso.

Talvez tente adicionar um retorno de chamada e veja onde a pesquisa com falha é gerada?


Como acompanhamento, o scipy seleciona sua contagem máxima de iterações com base no tamanho do vetor a ser otimizado. Este é um palpite melhor que a média, mas deve ser documentado de maneira mais óbvia.
meawoppl

2

Presumo que você não especificou o fprimeparâmetro. Se você não fornecer esse parâmetro fmin_cg, precisará descobrir sua própria solução, o que geralmente é muito mais lento do que a solução ideal fornecida. Seu código pode ficar assim:

theta = fmin_cg(compute_cost_reg, fprime=compute_gradient_reg,
                x0=theta, args=(X, y, lambd), maxiter=50)

0

Sei que essa é uma pergunta antiga, mas acabei de me deparar com um problema semelhante e pensei em publicar minha solução, caso alguém mais se depare com isso.

Θ

Depois de fazer isso, executei fmin_cgcom f e fprime e , embora ainda funcionasse bem devagar, o fazia sem nenhum dos erros ou avisos que eu estava vendo até aquele momento.

Na verdade, ele realmente fez um trabalho melhor ao minimizar a função de custo do que a implementação do matlab, apesar de ambos terem max_iters = 100.

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.