Conceitos de redes neurais profundas
Antes de saber como treinar um modelo de aprendizado de máquina de DNN (rede neural profunda), é preciso compreender o objetivo a ser alcançado. O aprendizado de máquina procura prever um rótulo com base em alguns atributos de uma determinada observação. Em termos simples, um modelo de machine learning é uma função que calcula y (o rótulo) de x (os recursos): f(x)=y.
Um exemplo de classificação simples
Por exemplo, suponha que sua observação consiste em algumas medidas de um pinguim.
Especificamente, as medidas são:
- O comprimento do bico do pinguim.
- A profundidade do bico do pinguim.
- O comprimento da barbatana do pinguim.
- O peso do pinguim.
Nesse caso, os atributos (x) são um vetor de quatro valores, ou matematicamente, x=[x1,x2,x3,x4].
Suponha que o rótulo a ser previsto (y) é a espécie do pinguim e que há três espécies possíveis:
- Adélia
- Gentoo
- Chinstrap
Esse é um exemplo de um problema de classificação em que o modelo de aprendizado de máquina deve prever a qual classe a observação provavelmente pertence. Um modelo de classificação faz isso prevendo um rótulo que consiste na probabilidade de cada classe. Em outras palavras, y é um vetor de três valores de probabilidade, um para cada uma das classes possíveis: y=[P(0),P(1),P(2)].
Você treina o modelo de aprendizado de máquina usando observações cujo verdadeiro rótulo você já conhece. Por exemplo, você pode ter as seguintes medidas de característica para um pinguim da espécie adélia:
x=[37.3, 16.8, 19.2, 30.0]
Você já sabe que esse é um exemplo de um pinguim-de-adélia (classe 0), portanto, uma função de classificação perfeita deve resultar em um rótulo que indique uma probabilidade de 100% para a classe 0 e uma probabilidade de 0% para as classes 1 e 2:
y=[1, 0, 0]
Um modelo de rede neural profunda
Então, como é possível usar o aprendizado profundo para criar um modelo de classificação para o modelo de classificação dos pinguins? Vejamos um exemplo:
O modelo de rede neural profunda para o classificador consiste em diversas camadas de neurônios artificiais. Nesse caso, há quatro:
- Uma camada de entrada com um neurônio para cada valor de entrada (x) esperado.
- Duas camadas chamadas de ocultas, com cinco neurônios cada.
- Uma camada de saída com três neurônios, um para cada valor de probabilidade de classe (y) a ser previsto pelo modelo.
Devido à arquitetura da rede em camadas, esse tipo de modelo é por vezes chamado de perceptron de várias camadas. Além disso, observe que todos os neurônios nas camadas de entrada e ocultas estão conectados a todos os neurônios nas camadas subsequentes. Este exemplo define uma rede totalmente conectada.
Ao criar um modelo como esse, defina uma camada de entrada que suporte o número de atributos a serem processados por ele, além de uma camada de saída que reflita o número de saídas que ele deve produzir. Você pode decidir quantas camadas ocultas serão incluídas e quantos neurônios serão colocados em cada uma delas, mas não pode controlar os valores de entrada e saída dessas camadas, pois eles são determinados pelo processo de treinamento do modelo.
Treinando uma rede neural profunda
O processo de treinamento de uma rede neural profunda consiste em diversas iterações, chamadas de épocas. Para a primeira época, você começa atribuindo valores de inicialização aleatórios para os valores de peso (w) e desvio b. Em seguida, continue o processo como a seguir:
- Os atributos das observações de dados com valores de rótulo conhecidos são enviados à camada de entrada. Em geral, essas observações são agrupadas em lotes (geralmente chamados de mini-lotes).
- Em seguida, se ativados, os neurônios aplicam sua função passando o resultado para a camada seguinte até que a camada de saída produza uma previsão.
- A previsão é comparada ao valor real conhecido e a quantidade de variação entre os valores previstos e verdadeiros (que chamamos de perda) é calculada.
- Com base nos resultados, são calculados valores revisados para os pesos e o desvio a fim de reduzir a perda e os ajustes são retropropagados para os neurônios nas camadas de rede.
- A próxima época passa novamente o treinamento em lote com os valores revisados de peso e desvio, o que deve melhorar a precisão do modelo (reduzindo a perda).
Observação
O processamento dos atributos de treinamento como um lote melhora a eficiência do processo de treinamento ao organizar diversas observações simultaneamente como uma matriz de atributos com vetores de pesos e desvios. As funções algébricas lineares que operam com matrizes e vetores também aparecem no processamento gráfico 3D, que é o motivo pelo qual os computadores com GPUs (unidades de processamento gráfico) oferecem um desempenho significativamente melhor para treinamento de modelo de aprendizado profundo do que computadores apenas de CPU (unidade de processamento central).
Uma análise mais detalhada das funções de perda e da retropropagação
A descrição anterior do processo de aprendizado profundo mencionou que a perda do modelo é calculada e usada para ajustar os valores de peso e desvio. Como isso funciona exatamente?
Calculando a perda
Suponha que um dos exemplos passados pelo processo de treinamento contenha atributos de um pinguim da espécie adélia (classe 0). A saída correta da rede seria [1, 0, 0]. Agora suponha que a saída produzida pela rede seja [0.4, 0.3, 0.3]. Ao compará-las, é possível calcular uma variação absoluta para cada elemento (em outras palavras, a distância entre cada valor previsto e o valor que foi obtido) como [0.6, 0.3, 0.3].
Na realidade, como estamos lidando com várias observações, normalmente agregamos a variância, por exemplo, elevando ao quadrado os valores de variância individuais e calculando a média para obter como resultado um valor único de perda médio, como 0,18.
Otimizadores
Agora, essa é a parte inteligente. A perda é calculada com uma função, que opera sobre os resultados da camada final da rede, que também é uma função. Essa camada opera nas saídas das anteriores, que também são funções. Ou seja, isso significa que todo o modelo, da camada de entrada ao cálculo da perda, consiste basicamente em uma grande função aninhada. As funções têm características bastante úteis, incluindo:
- Você pode conceituar uma função como uma linha plotada comparando sua saída com cada uma de suas variáveis.
- Você pode usar cálculo diferenciais para calcular a derivação da função em qualquer ponto com relação às variáveis dela.
Considere o primeiro desses recursos. É possível plotar a linha da função para mostrar como um valor de peso individual é comparado à perda e marcar nessa linha o ponto em que o valor de peso atual corresponde ao valor de perda atual.
Agora, você deve aplicar a segunda característica de uma função. O derivativo de uma função para um determinado ponto indica se a inclinação (ou gradiente) da saída da função (nesse caso, perda) está aumentando ou diminuindo com relação a uma variável de função (nesse caso, o valor de peso). Um derivativo positivo indica que a função está aumentando e um derivativo negativo indica que ela está diminuindo. Nesse caso, no ponto plotado para o valor de peso atual, a função tem um gradiente descendente. Em outras palavras, aumentar o peso causará a diminuição da perda.
Com um otimizador, é possível aplicar esse mesmo processo para todas as variáveis de peso e desvio no modelo e determinar em qual direção é preciso ajustá-las (para mais ou para menos) a fim de reduzir a quantidade total de perda no modelo. Há vários algoritmos de otimização usados com frequência, incluindo a SGD (descida gradiente estocástica), a ADADELTA (taxa de aprendizado adaptável), a Adam (estimativa de impulso adaptável), entre outros. Todos eles foram desenvolvidos para descobrir como ajustar os pesos e os desvios para minimizar a perda.
Taxa de aprendizado
Agora, a próxima pergunta óbvia é: para quais valores o otimizador deve ajustar os valores de peso e desvio? No gráfico do valor de peso, é possível observar uma queda na linha da função ao aumentar ligeiramente o peso (o que reduz a perda). No entanto, ao aumentar muito o peso, a linha da função começa a subir novamente (aumentando a perda). Como consequência, é possível que a próxima época revele que é necessário reduzir o peso.
O tamanho do ajuste é controlado por um parâmetro chamado taxa de aprendizado, que é definido por você para o treinamento. Uma taxa de aprendizado baixa resulta em pequenos ajustes (podem ser necessárias mais épocas para minimizar a perda), enquanto uma taxa de aprendizado alta resulta em grandes ajustes (pode haver erro ao atender ao mínimo).