Treinando uma rede neural
Agora aprenderemos como treinar uma rede neural. Também aprenderemos o algoritmo de propagação reversa e a passagem reversa no Python Deep Learning.
Temos que encontrar os valores ótimos dos pesos de uma rede neural para obter a saída desejada. Para treinar uma rede neural, usamos o método de descida gradiente iterativo. Começamos inicialmente com a inicialização aleatória dos pesos. Após a inicialização aleatória, fazemos previsões sobre algum subconjunto dos dados com o processo de propagação direta, calculamos a função de custo C correspondente e atualizamos cada peso w por um valor proporcional a dC / dw, ou seja, a derivada das funções de custo em relação ao peso. A constante de proporcionalidade é conhecida como taxa de aprendizado.
Os gradientes podem ser calculados de forma eficiente usando o algoritmo de retropropagação. A principal observação da propagação para trás ou prop para trás é que, por causa da regra da cadeia de diferenciação, o gradiente em cada neurônio na rede neural pode ser calculado usando o gradiente nos neurônios, ele tem bordas de saída para. Conseqüentemente, calculamos os gradientes de trás para frente, ou seja, primeiro calculamos os gradientes da camada de saída, depois a camada oculta mais acima, seguida pela camada oculta anterior e assim por diante, terminando na camada de entrada.
O algoritmo de retropropagação é implementado principalmente usando a ideia de um gráfico computacional, onde cada neurônio é expandido para vários nós no gráfico computacional e executa uma operação matemática simples, como adição, multiplicação. O gráfico computacional não tem pesos nas arestas; todos os pesos são atribuídos aos nós, então os pesos se tornam seus próprios nós. O algoritmo de propagação para trás é então executado no gráfico computacional. Assim que o cálculo for concluído, apenas os gradientes dos nós de peso são necessários para atualização. O resto dos gradientes podem ser descartados.
Técnica de Otimização de Gradiente Descendente
Uma função de otimização comumente usada que ajusta os pesos de acordo com o erro que eles causaram é chamada de "descida gradiente".
Gradiente é outro nome para inclinação, e inclinação, em um gráfico xy, representa como duas variáveis estão relacionadas entre si: a subida sobre a corrida, a mudança na distância sobre a mudança no tempo, etc. Neste caso, a inclinação é a relação entre o erro da rede e um único peso; ou seja, como o erro muda conforme o peso varia.
Para ser mais preciso, queremos descobrir qual peso produz o menor erro. Queremos encontrar o peso que representa corretamente os sinais contidos nos dados de entrada e os traduz para uma classificação correta.
Conforme uma rede neural aprende, ela lentamente ajusta muitos pesos para que eles possam mapear o sinal para o significado corretamente. A razão entre o erro de rede e cada um desses pesos é uma derivada, dE / dw, que calcula a extensão em que uma ligeira mudança em um peso causa uma ligeira mudança no erro.
Cada peso é apenas um fator em uma rede profunda que envolve muitas transformações; o sinal do peso passa por ativações e somas em várias camadas, portanto, usamos a regra da cadeia de cálculo para retrabalhar as ativações e saídas da rede. Isso nos leva ao peso em questão e sua relação com o erro geral.
Dadas duas variáveis, erro e peso, são mediados por uma terceira variável, activation, através do qual o peso é passado. Podemos calcular como uma mudança no peso afeta uma mudança no erro, primeiro calculando como uma mudança na ativação afeta uma mudança no Erro, e como uma mudança no peso afeta uma mudança na ativação.
A ideia básica do aprendizado profundo nada mais é do que isso: ajustar os pesos de um modelo em resposta ao erro que ele produz, até que você não consiga mais reduzir o erro.
A rede profunda treina lentamente se o valor do gradiente for pequeno e rápido se o valor for alto. Quaisquer imprecisões no treinamento levam a resultados imprecisos. O processo de treinar as redes da saída de volta para a entrada é chamado de propagação reversa ou back prop. Sabemos que a propagação progressiva começa com a entrada e segue adiante. O suporte traseiro faz o inverso / oposto calculando o gradiente da direita para a esquerda.
Cada vez que calculamos um gradiente, usamos todos os gradientes anteriores até aquele ponto.
Vamos começar em um nó na camada de saída. A aresta usa o gradiente nesse nó. À medida que voltamos para as camadas ocultas, fica mais complexo. O produto de dois números entre 0 e 1 dá a você um número menor. O valor do gradiente fica cada vez menor e, como resultado, o suporte traseiro leva muito tempo para treinar e a precisão é prejudicada.
Desafios em algoritmos de aprendizado profundo
Existem certos desafios para redes neurais superficiais e redes neurais profundas, como overfitting e tempo de computação. Os DNNs são afetados por overfitting devido ao uso de camadas adicionais de abstração que permitem modelar dependências raras nos dados de treinamento.
Regularizationmétodos como abandono escolar, parada precoce, aumento de dados e aprendizagem por transferência são aplicados durante o treinamento para combater o sobreajuste. A regularização de exclusão omite aleatoriamente unidades das camadas ocultas durante o treinamento, o que ajuda a evitar dependências raras. Os DNNs levam em consideração vários parâmetros de treinamento como o tamanho, ou seja, o número de camadas e o número de unidades por camada, a taxa de aprendizagem e os pesos iniciais. Encontrar parâmetros ótimos nem sempre é prático devido ao alto custo em tempo e recursos computacionais. Vários hacks, como batching, podem acelerar a computação. O grande poder de processamento das GPUs ajudou significativamente o processo de treinamento, pois os cálculos matriciais e vetoriais necessários são bem executados nas GPUs.
Cair fora
Dropout é uma técnica de regularização popular para redes neurais. Redes neurais profundas são particularmente propensas a overfitting.
Vamos agora ver o que é o abandono e como funciona.
Nas palavras de Geoffrey Hinton, um dos pioneiros do Deep Learning, 'Se você tem uma rede neural profunda e ela não está superdimensionada, você provavelmente deveria estar usando uma rede maior e abandonando'.
Dropout é uma técnica em que, durante cada iteração de descida de gradiente, soltamos um conjunto de nós selecionados aleatoriamente. Isso significa que ignoramos alguns nós aleatoriamente como se eles não existissem.
Cada neurônio é mantido com uma probabilidade qe descartado aleatoriamente com probabilidade 1-q. O valor q pode ser diferente para cada camada da rede neural. Um valor de 0,5 para as camadas ocultas e 0 para a camada de entrada funciona bem em uma ampla gama de tarefas.
Durante a avaliação e previsão, nenhum dropout é usado. A saída de cada neurônio é multiplicada por q para que a entrada para a próxima camada tenha o mesmo valor esperado.
A ideia por trás do Dropout é a seguinte - em uma rede neural sem regularização de dropout, os neurônios desenvolvem co-dependência entre si que leva ao overfitting.
Truque de implementação
O dropout é implementado em bibliotecas como TensorFlow e Pytorch, mantendo a saída dos neurônios selecionados aleatoriamente como 0. Ou seja, embora o neurônio exista, sua saída é substituída como 0.
Parada Antecipada
Treinamos redes neurais usando um algoritmo iterativo chamado gradiente descendente.
A ideia por trás da parada precoce é intuitiva; paramos de treinar quando o erro começa a aumentar. Aqui, por erro, queremos dizer o erro medido nos dados de validação, que é a parte dos dados de treinamento usados para ajustar hiperparâmetros. Nesse caso, o hiperparâmetro são os critérios de parada.
Aumento de dados
O processo em que aumentamos o quantum de dados que temos ou o aumentamos usando dados existentes e aplicando algumas transformações a eles. As transformações exatas usadas dependem da tarefa que pretendemos realizar. Além disso, as transformações que ajudam a rede neural dependem de sua arquitetura.
Por exemplo, em muitas tarefas de visão computacional, como classificação de objetos, uma técnica eficaz de aumento de dados é adicionar novos pontos de dados que são cortados ou versões traduzidas dos dados originais.
Quando um computador aceita uma imagem como entrada, ele obtém uma série de valores de pixel. Digamos que toda a imagem seja deslocada 15 pixels para a esquerda. Aplicamos muitas mudanças diferentes em direções diferentes, resultando em um conjunto de dados aumentado muitas vezes o tamanho do conjunto de dados original.
Aprendizagem por transferência
O processo de pegar um modelo pré-treinado e "ajustar" o modelo com nosso próprio conjunto de dados é chamado de aprendizagem por transferência. Existem várias maneiras de fazer isso. Algumas maneiras são descritas abaixo -
Treinamos o modelo pré-treinado em um grande conjunto de dados. Em seguida, removemos a última camada da rede e a substituímos por uma nova camada com pesos aleatórios.
Em seguida, congelamos os pesos de todas as outras camadas e treinamos a rede normalmente. Aqui, congelar as camadas não altera os pesos durante a descida ou otimização do gradiente.
O conceito por trás disso é que o modelo pré-treinado atuará como um extrator de recursos e apenas a última camada será treinada na tarefa atual.