Redes neurais roots #2— Treinamento

Italo José
Ensina.AI
Published in
9 min readOct 5, 2018

Como encontrar os pesos corretos?

No artigo anterior falamos sobre como é feita a classificação usando apenas um neurônio, resumindo, você recebe alguns inputs do que você quer classificar (como uma imagem por exemplo), multiplica isso com alguns pesos e então soma com o bias, bem, porém como é que nós vamos saber os valores desses pesos todos? e do bias?, provavelmente você ainda não conseguiu abstrair a função dele na sua cabeça, mas tudo bem não se preocupe com isso(mas ele é importante viu, apesar de um neurônio funcionar sem ele).

Pois bem, vou te contar uma coisa, nós(humanos) não vamos definir os valores desses caras, mas sim algum algoritmo, existe vários algoritmos que “descobrem” o valor dos pesos e dos bias.

Mas antes de falar sobre esses algoritmos, só pra construir uma linha de raciocínio simples, vamos pensar em um algoritmo de brute force (que é um pouquinho semelhante às técnicas existentes hoje em dia).

Treinamento

Muitas pessoas se perguntam como uma rede neural “aprende”, bem, explicando de uma forma simplificada (pois agora não é o momento para entender sobre esse assunto de forma aprofundada)e voltada apenas para um neurônio, o aprendizado se da através da combinação dos pesos com o bias, e para você descobrir os valores certos dos pesos e do bias, você irá ficar fazendo VÁRIAS classificações com VÁRIAS combinações de pesos e bias, cada vez que o seu neurônio roda, é feita uma classificação, seja ela correta ou errada, mas foi feito uma classificação ali, pois bem, você pega essa classificação e verifica se o neurônio acertou ou errou, e conforme as N classificações que vão se seguindo com seus diferentes valores dos pesos e bias, uma hora você vai chegar nos valores corretos, e assim você saberá quais são só pesos corretos que você precisa usar na hora de classificar uma imagem com uma criança, um adulto ou um idoso (lebre-se, por ter 3 neurônios, você precisa fazer esse brute force pra cada neurônio) .

Nós chamamos isso de treinamento, onde você tentar predizer/classificar dados que você já conhece o resultado só pra depois poder verificar se a saída do seu neurônio/rede neural de fato classificou tudo certinho.

Introduzido a linha de raciocínio de um brute force então, podemos seguir para algumas técnicas um pouco mais inteligentes, mas que ainda tem sua certa similaridade com o brute force.

Ajustando os pesos de forma inteligente

Todos sabem que o método de brute force, apesar de “funcionar”, não é performático e eficaz, nesse caso vamos usar uma outra técnica um pouco mais inteligente, vamos continuar seguindo uma linha de raciocínio do brute force, porém não vamos atualizar nossos pesos de uma forma aleatória, dessa vez faremos um calculo para saber o quanto temos de modificar nossos pesos.

Até então nosso processo foi sempre contínuo, Pegamos os inputs → multiplicamos com os pesos(seja la qual eles sejam) →somamos o bias → usamos uma função de ativação na saída dessas coisas todas feitas nos passos anteriores e então validamos a saída da função de ativação com um if ou um outra implementação melhor.

E todo esse processo nós seguimos com essa lógica para “frente”, sempre seguindo o próximo passo, mas em nenhum momento nós voltamos no meio do algoritmo para corrigir algo, e é justamente isso que vamos fazer.

No final do processamento do seu neurônio você irá verificar se a sua saída está correta, e se ela estiver errada, nós vamos verificar o quão errada ela está usando o que chamamos de função de custo ou cost function (que jájá falo mais dela), depois de ter essa informação, nós vamos rodar o nosso neurônio de novo e com novas combinações, porém como já falamos agora a pouco, dessa vez não vamos mudar os valores dos pesos e do bias de forma aleatória, vamos verificar o quão errado foi a classificação do neurônio com nossa função de custo e ajustar os nossos pesos de acordo com a saída desse calculo.

Função de custo

Como a regressão é um calculo para que seja possível fazer estimativas/predição/classificação, pode ser que dependendo dos parâmetros que usamos, façamos predições incorretas, mas como estamos trabalhando com uma base histórica de dados onde temos nossos exemplos e suas saídas, podemos rodar nosso classificador em cima dessa base já classificada para testar os nossos parâmetros(nossos pesos) para se certificar que as predições estão corretas (quando digo predição, estou dizendo de classificação também), e nesse ato de rodar “prever” fatos já ocorridos, podemos saber quais classificação es estão erradas, assim como já comentamos no artigo a cima, e para nisso podemos também saber o quanto errado esta nossas saídas usando um função de custo, que vai nos ajudar a minimizar esses erros quando um valor aproximado de quanto nós temos de mexer nos nossos parâmetros para que possamos ajustar nossos pesos.

Existe várias funções de custo que você pode usar, a que vamos usar o nosso exemplo é o método dos mínimos quadrados médios. A fórmula para tal é esta que se apresenta na imagem abaixo, mas não se assunte, vou explicar tudo:

Parece assuntador né? mas nem é, isso é só porque matemático gosta de complicar as coisas, pois bem, vamos lá, o que significa cada simbolo?

Basicamente a fórmula por escrito seria:

MSE = média da ((classificação correta — valor que foi classificado pelo nosso neuronio)²)

ou seja, vamos pegar o valor do nosso neurônio e vamos subtrair pelo valor que era para ser predito, exemplo: imagine que estamos testando nosso neurônio com uma casa que durante 2 anos, se valorizou 100%, porém nosso neurônio previu que depois de dois anos, essa mesma casa se valorizou 180%, então no fim vamos fazer o seguinte: média de ((200–180)²), como estamos trabalhando com apenas um neurônio, a media não vai fazer muito sentido, mas vamos rever esse tópico quando estivermos falando sobre deses neurais, pois bem, isso nos retornaria o valor ao qual teríamos de arrumar nos nossos pesos

para deixar um pouco mais ilustrado, vamos usar essa imagem, a “linha vermelha” é a nossa linha de regressão linear ou o nosso valor previsto (y^). E os pontos “azuis” são os nossos dados. A média do quadrado da distância dos pontos azuis (nossos dados) até a linha vermelha (valor previsto) deve ser o mínimo possível para obter a linha de regressão de melhor ajuste. A função de custo nos retorna o valor a qual vamos usar para traçar a linha preta que liga os pontos azuis com a linha vermelha, para traçar essa linha vamos precisar usar um cara chamado gradiente descendente.

Gradiente descendente

O Gradient Descent basicamente faz o que estamos fazendo manualmente — muda os valores dos pesos(ou parâmetros), pouco a pouco, até que tenhamos um mínimo( um valor que a predição esteja muito perto da saída correta).

Vamos utilizar um exemplo de uma regressão linear bastante simples (y^=b+x.w) e nós queremos achar os valores b e w que minimizam o erro de y^(que é a classificação do nosso neurônio), esse erro é o valor que nós achamos usando o algoritmo acima, o MSE.

Para saber mais sobre o gradiente descendente, olhe esse vídeo aqui onde ele explica de uma forma mais aprofundada.

A fórmula para o gradiente descendente é essa aqui:

A atualização dos pesos se segue por:

Peso n+1 = isso significa que você está iterando sobre vários pesos, e o peso n+1 significa o próximo peso, ou se você quiser, pode pensar que é o peso atual, não tem problema;

Peso n = peso atual;

Momento = Responsável por escapar de mínimos locais, e o que são mínimos locais? só pra dar um brief, mínimos locais são valores aos quais seu algoritmo ficara tendencioso a usa-los, então pode ser que seu algoritmo sempre fique atualizando os pesos com os mesmos valores e esses valores nem sempre são os corretos.

Se você colocar um valor muito alto aqui(exemplo: 2.0 ou 3.0), seu algoritmo irá aprender mais rápido, porém não será tão eficaz, caso coloque um valor muito baixo(0.00…01), seu algoritmo irá demorar mais para convergir(achar os pesos corretos), porém ele irá encontrar pesos melhores do que quando se usa um learning rate muito alto), mais abaixo teremos uma sessão só pra falar do learning rate. Mais abaixo no artigo detalharei isso melhor.

Entrada = valor do resultado do neurônio (sum(x.w+b))

Delta = Derivada do valor da função de ativação(Sigmoid), caso você não saiba sobre derivadas, pode olhar os conteúdos do khan academy sobre o tema.

Taxa de aprendizado= A taxa de aprendizado, ou learning rate define o quão rápido nosso algorítimo irá aprender, ele segui o mesmo principio do momento, se você colocar um valor muito alto aqui(exemplo: 2.0 ou 3.0), seu algoritmo irá aprender mais rápido, porém não será tão eficaz, caso coloque um valor muito baixo(0.00…01), seu algoritmo irá demorar mais para convergir(achar os pesos corretos), porém ele irá encontrar pesos melhores do que quando se usa um learning rate muito alto), mais abaixo teremos uma sessão só pra falar do learning rate.

Momento/Momentum

O Momentum é um assunto um tanto complexo para o agora, mas ele basicamente é responsável por fazer com que sua atualização de peso não tome uma atualização muito brusca, como por exemplo, seu peso atual é de 10.55 e você atualiza ele para 50.10, o momentum faz com que você continue seguindo a linha de valores próximos à 10.55, como 11 ou 9 por exemplo.

Taxa de aprendizado

A taxa de aprendizado é um hyper-parâmetroque controla o quanto estamos ajustando os pesos de nossa rede com relação ao gradiente descendente. Quanto menor o valor, mais devagar viajamos ao longo do declive descendente. Embora isso possa ser uma boa ideia (usando uma baixa taxa de aprendizado) em termos de garantir que não perderemos nenhum mínimo local, também pode significar que levaremos muito tempo para convergir.

Temos aqui uma baixa taxa de aprendizado:

Perceba que de pouquinho em pouquinho nós conseguimos chegar ao mínimos e erro no nosso neurônio(usando a fórmula do MSE pra ver essa informação).

E qui temos um aprendizado usando uma taxa de aprendizado alta:

Perceba que nesse caso ele necessita de menos iterações para chegar ao nosso valor minimo de erro(mas tome cuidado com isso, valores altos para o learning rate não são recomendados).

Resumo de todo o processo

Você tem valores dados e esses eels tem um certo padrão, e cada padrão tem o que chamamos de classe, esses mesmo dados já estão classificados por alguém(humano) e você que classificar os próximos dados, porém dessa vez de forma automatizada e para isso você irá usar um neurônio/redes neurais para isso.

Dado toda a explicação de o que é um neurônio e como ele “aprende” nós temos o seguinte fluxo:

  • Começa seu neurônio com valores aleatórios de pesos;
  • Faz a predição para um entrada de um exemplo ao qual você já sabe qual é a classificação correta dele(exemplo, valores de pixels de uma imagem ou os valores de preço das casa de uma determinada região) usando uma regressão;
  • Pega o valor dessa regressão e tira a função de ativação dela, exemplo, uma Sigmoid;
  • Verifica o quão errado foi essa predição/classificação com o algortmo MSE
  • Aplica o gradiente descendente em cima de cada peso para atualiza-los com novos valores que vão fazer o resultado do MSE ser menor.
  • Fica repetindo isso durante varias épocas(vezes) até que o valor do MSE seja minimo;
  • Quando o valor do MSE estiver no minimo, isso significa que você encontrou os pesos (e o bias também) corretos e agora pode pegar exemplos aos quais você não tem a classificação e começar a classifica-los

Nos próximos artigos veremos como implementar tudo isso com python!

--

--