Até agora nós construímos uma rede neural em Python
calculamos a função de custo para sabermos o desempenho da nossa rede
calculamos o gradiente de nossa função de custo para que possamos treinar nossa rede
e finalmente validamos numericamente nossos cálculos de gradiente
depois de todo esse trabalho é finalmente hora de treinar nossa rede neural
de volta na parte três, decidimos treinar nossa rede usando descida do gradiente
enquanto a descida do gradiente é conceitualmente bastante simples
sua implementação pode ser bastante complexa
especialmente à medida que aumentamos o tamanho e o número de camadas em nossa rede
se nós apenas marcharmos em declive com tamanhos de passos consistentes
podemos ficar presos em um ponto mínimo ou plano local
podemos nos mover muito devagar e nunca alcançar o mínimo
ou podemos nos mover muito rapidamente e sair de nosso mínimo
e lembre-se, tudo isso deve acontecer em um espaço de alta dimensão
tornando as coisas significativamente mais complexas
descida do gradiente é um método maravilhosamente inteligente
mas não oferece garantias de que convergiremos para uma boa solução em um determinado período de tempo
ou que vamos conseguir convergir para uma solução
a boa e a má notícia aqui é que esse problema não é exclusivo das redes neurais
há um campo inteiro dedicado a encontrar a melhor combinação de entradas
para minimizar a saída de uma função objetiva
o campo da otimização matemática
a má notícia é que a otimização pode ser um pouco esmagadora
existem muitas técnicas diferentes que podem se aplicar ao nosso problema
parte do que torna a otimização desafiadora é
a ampla gama de abordagens cobertas por métodos teóricos muito rigorosos
para gerenciar mais métodos heuristicamente dirigidos
A publicação de Yann LeCun' de 1998, apresenta eficientemente
uma excelente revisão de várias técnicas de otimização aplicadas a redes neurais
aqui vamos usar uma variante mais sofisticada na descida do gradiente
o popular algoritmo de otimização numérica de Broyden Fletcher Goldfarb Shanno
o algoritmo BFGS supera algumas das limitações da descida do gradiente plano
estimando a segunda derivada ou curvatura da superfície da função de custo
e usando esta informação para fazer movimentos mais informados em declive
O BFGS nos permitirá encontrar a solução com mais frequência
e mais rapidamente
usaremos a implementação do BFGS integrada no pacote otimizado do SyFy
especificamente dentro da função minimizar
para usar o BFGS, a função minimizar nos obriga a passar em uma função objetiva
que aceita um vetor de dados de entrada e saída de parâmetros
e retorna tanto o custo quanto os gradientes
nossa implementação de rede neural não segue essa semântica
então vamos usar uma função wrapper para dar esse comportamento
também passará nos parâmetros iniciais
defina o parâmetro jacobiano como verdadeiro
já que estamos calculando o gradiente dentro da nossa classe de rede neural
defina o método para BFGS
passe os nossos dados de entrada e saída
e algumas opções
finalmente vamos implementar uma função de retorno
que nos permitem rastrear o valor da função de custo
enquanto treinamos a rede
uma vez que a rede é treinada
vamos substituir os parâmetros aleatórios originais pelos parâmetros do trem
se plotarmos o custo em relação ao número de iterações por meio de treinamento
nós vemos uma boa função monotonicamente decrescente
Além disso, vemos que o número de avaliações de funções necessárias para encontrar uma solução
é inferior a 100 e muito menos do que a 10ª à 27ª avaliação de funções
que teria sido necessário encontrar uma solução pela força bruta
como mostrado na parte três
finalmente podemos avaliar nosso gradiente em nossa solução e ver valores muito pequenos
isso faz sentido como o nosso mínimo deve ser bastante plana
o mais interessante aqui é que nós finalmente treinamos uma rede
que pode prever sua pontuação em um teste
com base em quantas horas você dorme e quantas horas você estuda na noite anterior
se nós executarmos nossos dados de treinamento através de nosso método de avanço agora
vemos que nossas previsões são excelentes
podemos ir mais longe e explorar
o espaço de entrada para várias combinações de nosso sono e nosso estudo
e talvez possamos descobrir uma combinação ideal dos dois para o seu próximo teste
nossos resultados parecem bastante razoáveis
e vemos que, para o nosso modelo, o sono realmente tem um impacto maior em suas notas do que o estudo
algo que eu gostaria de ter percebido quando estava na escola
então estamos bem, certo?
Não
nós fizemos possivelmente o erro mais perigoso
e tentador no aprendizado de máquina
overfitting
embora nossa rede esteja se saindo incrivelmente bem em nossos dados de treinamento
isso não significa que o nosso modelo é um bom ajuste para o mundo real
e é com isso que vamos trabalhar da próxima vez.
