Vídeo: O Que a Retropropagação Realmente está Fazendo? Aprendizagem Profunda

Grant Sanderson • 3Blue1Brown • Boclips

O Que a Retropropagação Realmente está Fazendo? Aprendizagem Profunda

12:27

Transcrição do vídeo

Aqui, abordamos a retropropagação, o principal algoritmo por trás do aprendizado das redes neurais. Após uma rápida recapitulação de onde estamos, a primeira coisa que farei é uma explicação intuitiva do que o algoritmo está realmente fazendo, sem nenhuma referência às fórmulas. Então, para aqueles que desejam mergulhar na matemática, o próximo vídeo entra no cálculo subjacente a tudo isso.

Se você assistiu aos dois últimos vídeos ou está apenas entrando com o plano de fundo apropriado, sabe o que é uma rede neural e como ela alimenta informações futuras. Aqui, estamos fazendo o exemplo clássico de reconhecimento de algarismos manuscritos cujos valores de pixel são inseridos na primeira camada da rede com 784 neurônios. E eu tenho mostrado uma rede com duas camadas ocultas com apenas 16 neurônios cada e uma camada de saída de 10 neurônios, indicando qual algarismo a rede está escolhendo como resposta. Também espero que você entenda a descida do gradiente, conforme descrito no último vídeo. E o que queremos dizer com aprendizado é que queremos descobrir quais pesos e vieses minimizam uma determinada função de custo.

Como um lembrete rápido, pelo custo de um único exemplo de treinamento, o que você faz é levar a saída que a rede fornece junto com a saída que você queria que ela desse. E você apenas soma os quadrados das diferenças entre cada componente. Fazendo isso para todas as dezenas de milhares de exemplos de treinamento e calculando a média dos resultados, isso fornece o custo total da rede. E como se isso não bastasse, como descrito no último vídeo, o que estamos procurando é o gradiente negativo dessa função de custo, que mostra como você precisa alterar todos os pesos e vieses, todos dessas conexões, para diminuir o custo com mais eficiência.

A retropropagação, o tópico deste vídeo, é um algoritmo para calcular esse gradiente complicado e louco. E a única ideia do último vídeo que eu realmente quero que você mantenha firmemente em sua mente agora é que, porque pensar no vetor gradiente como uma direção em 13000 dimensões é, para ser mais claro, além do escopo de nossa imaginação, existe outra maneira de pensar sobre isso. A magnitude de cada componente aqui está informando o quanto a função de custo é sensível a cada peso e viés.

Por exemplo, digamos que você passe pelo processo que estou prestes a descrever e calcule o gradiente negativo. E a componente associada ao peso nesta aresta aqui sai para 3.2, enquanto o componente associado a essa aresta aqui sai como 0.1. A maneira como você interpretaria isso é que o custo da função é 32 vezes mais sensível a alterações no primeiro peso. Então, se você mexer um pouco esse valor, isso causará algumas mudanças no custo, e essa mudança é 32 vezes maior do que o que a mesma oscilação no segundo peso daria.

Pessoalmente, quando eu estava aprendendo sobre a retropropagação, acho que o aspecto mais confuso foi apenas a notação e o índice de tudo isso. Mas uma vez que você desembrulha o que cada parte desse algoritmo está realmente fazendo, cada efeito individual que ele está tendo é realmente bastante intuitivo. Só que há muitos pequenos ajustes sendo colocados em camadas uns sobre os outros. Então, começarei as coisas aqui com total desconsideração da anotação e analisarei os efeitos que cada exemplo de treinamento está tendo nos pesos e vieses.

Como a função de custo envolve a média de um determinado custo por exemplo, em todas as dezenas de milhares de exemplos de treinamento, a maneira como ajustamos os pesos e os vieses para uma única etapa de descida de gradiente também depende de cada exemplo. Ou melhor, em princípio deveria. Mas, para eficiência computacional, faremos um pequeno truque mais tarde para impedir que você precise dar todos os exemplos para cada etapa. Em outro caso, no momento, tudo o que faremos é focar nossa atenção em um único exemplo, essa imagem de dois. Que efeito esse exemplo de treinamento deve ter sobre como os pesos e vieses são ajustados?

Digamos que estamos em um ponto em que a rede ainda não está bem treinada. Portanto, as ativações na saída parecerão bem aleatórias, talvez algo como 0.5, 0.8, 0.2 e assim por diante. Agora não podemos mudar diretamente essas ativações. Nós só temos influência nos pesos e vieses. Mas é útil acompanhar quais ajustes desejamos que ocorram nessa camada de saída. E como queremos que ela classifique a imagem como dois, queremos que o terceiro valor seja reduzido, enquanto todos os outros serão reduzidos. Além disso, os tamanhos dessas cutucadas devem ser proporcionais à distância que cada valor atual está do seu valor alvo.

Por exemplo, o aumento da ativação do número dois neurônios, é, em certo sentido, mais importante do que a diminuição do número oito, que já está bem próximo de onde deveria estar. Então, ampliando ainda mais, vamos nos concentrar apenas nesse neurônio, aquele cuja ativação queremos aumentar. Lembre-se de que a ativação é definida como uma certa soma ponderada de todas as ativações na camada anterior, mais um viés, que foi conectado a algo como a função condensada sigmoide ou uma ReLU. Portanto, existem três caminhos diferentes que podem ser agrupados para ajudar a aumentar essa ativação. Você pode aumentar o viés, aumentar os pesos e alterar as ativações da camada anterior.

Focando apenas em como os pesos devem ser ajustados, observe como os pesos realmente têm níveis diferentes de influência. As conexões com os neurônios mais brilhantes da camada anterior têm o maior efeito, pois esses pesos são multiplicados por valores de ativação maiores. Portanto, se você aumentar um desses pesos, ele realmente terá uma influência mais forte na função de custo final do que aumentar os pesos das conexões com neurônios mais escuros, pelo menos no que diz respeito a este exemplo de treinamento. Lembre-se de que, quando falamos de descida de gradiente, não nos preocupamos apenas com o fato de cada componente ser empurrada para cima ou para baixo, nos preocupamos com quais delas oferecem o melhor retorno possível.

A propósito, isso é pelo menos um pouco remanescente da teoria da neurociência sobre como as redes biológicas de neurônios aprendem. A teoria hebbiana, muitas vezes resumida na frase “neurônios que disparam juntos se unem”. Aqui, os maiores aumentos de peso, o maior fortalecimento das conexões, ocorrem entre os neurônios que são os mais ativos e os que queremos tornar mais ativos. Em certo sentido, os neurônios que estão disparando ao ver um dois ficam mais fortemente ligados aos que estão disparando quando pensam em um dois.

Para deixar claro, eu realmente não estou em posição de fazer declarações de uma maneira ou de outra sobre se as redes artificiais de neurônios se comportam como cérebros biológicos. E essa ideia do “fogo-junto-mantem-junto” vem com alguns asteriscos significativos. Mas, tomado como uma analogia muito vaga, acho interessante notar. De qualquer forma, a terceira maneira pela qual podemos ajudar a aumentar a ativação desse neurônio é alterando todas as ativações na camada anterior. Ou seja, se tudo conectado a esse algarismo dois neurônios com um peso positivo ficasse mais brilhante, e se tudo conectado a um peso negativo ficasse mais escuro, então esse algarismo dois neurônios, se tornaria mais ativo.

E, semelhante às alterações de peso, você obterá o melhor retorno possível, buscando alterações proporcionais ao tamanho dos pesos correspondentes. Agora, é claro, não podemos influenciar diretamente essas ativações. Nós só temos controle sobre os pesos e vieses. Mas, assim como na última camada, é útil apenas anotar quais são as alterações desejadas. Mas lembre-se, diminuindo um passo aqui, é exatamente isso que o algarismo dois neurônios de saída desejam. Lembre-se, também queremos que todos os outros neurônios da última camada se tornem menos ativos. E cada um desses outros neurônios de saída tem seus próprios pensamentos sobre o que deve acontecer com a penúltima camada.

Assim, o desejo desse algarismo dois neurônios, é adicionado juntamente com os desejos de todos os outros neurônios de saída pelo que deve acontecer com a penúltima camada, novamente, na proporção dos pesos correspondentes e na proporção de quanto cada um desses neurônios precisam mudar. É aqui que surge a ideia de propagar para trás. Ao adicionar todos esses efeitos desejados, você basicamente obtém uma lista de cutucadas que deseja que aconteçam na penúltima camada. E depois que você os tiver, poderá aplicar recursivamente o mesmo processo aos pesos e vieses relevantes que determinam esses valores, repetindo o mesmo processo pelo qual acabei de passar e retrocedendo pela rede.

E, um pouco mais longe, lembre-se de que tudo é como um único exemplo de treinamento que deseja cutucar cada um desses pesos e vieses. Se apenas ouvirmos o que os dois desejavam, a rede seria incentivada apenas para classificar todas as imagens como dois. Então, o que você faz é seguir a mesma rotina de retroprop para todos os outros exemplos de treinamento, registrando como cada um deles gostaria de alterar os pesos e os vieses. E você calcula a média das alterações desejadas.

Essa coleção da média de cutucadas para cada peso e viés é, em termos gerais, o gradiente negativo da função de custo referenciado no último vídeo, ou pelo menos algo proporcional a ele. Digo vagamente falando apenas porque ainda não preciso ser quantitativamente preciso sobre essas cutucadas. Mas se você entendeu todas as mudanças que acabei de referir, porque algumas são proporcionalmente maiores que outras e como todas precisam ser adicionadas, você entende a mecânica do que a retropropagação está realmente fazendo.

Aliás, na prática, os computadores levam um tempo extremamente longo para adicionar a influência de cada exemplo de treinamento, cada passo de descida de gradiente. Então, aqui está o que geralmente é feito. Você aleatoriamente embaralha seus dados de treinamento e os divide em vários lotes de minilotes, digamos, cada um com 100 exemplos de treinamento. Então você calcula uma etapa de acordo com o minilote. Não será o gradiente real da função de custo, que depende de todos os dados de treinamento, não deste pequeno subconjunto. Portanto, não é o degrau mais eficiente ladeira abaixo. Mas cada minilote oferece uma boa aproximação. E, mais importante, fornece uma significativa velocidade computacional.

Se você planejasse a trajetória de sua rede sob a superfície de custo relevante, seria um pouco mais como um homem bêbado tropeçando sem rumo em uma colina, mas dando passos rápidos, em vez de um homem calculista que determina a direção exata da descida cada passo antes de dar um passo muito lento e cuidadoso nessa direção. Essa técnica é conhecida como descida de gradiente estocástico. Há muita coisa acontecendo aqui. Então, vamos resumir por nós mesmos, sim?

A retropropagação é o algoritmo para determinar como um único exemplo de treinamento gostaria de alterar os pesos e vieses, não apenas em termos de aumento ou redução, mas em termos de quais proporções relativas a essas mudanças causam a diminuição mais rápida do custo. Uma verdadeira etapa de descida de gradiente envolveria isso para todos os seus dezenas e milhares de exemplos de treinamento e a média das alterações desejadas que você obtiver. Mas isso é computacionalmente lento. Então, em vez disso, você subdivide os dados aleatoriamente nesses minilotes e calcula cada etapa com relação a um minilote. Repetidamente, passando por todos os minilotes e fazendo esses ajustes, você convergirá para um mínimo local da função de custo, ou seja, sua rede vai acabar fazendo um trabalho muito bom nos exemplos de treinamento.

Portanto, com tudo isso dito, toda linha de código que seria implementada no retroprop realmente corresponde a algo que você já viu, pelo menos em termos informais. Mas, às vezes, saber o que a matemática faz é apenas metade da batalha, e apenas representar a maldita coisa é onde tudo fica confuso. Portanto, para aqueles que desejam aprofundar, o próximo vídeo aborda as mesmas idéias que acabamos de apresentar aqui, mas em termos do cálculo subjacente, o que, espero, deve torná-lo um pouco mais familiar à medida que você vê o tópico em outros recursos.

Antes disso, uma coisa que vale a pena enfatizar é que, para que esse algoritmo funcione, e isso vale para todo tipo de aprendizado de máquina, além das redes neurais, você precisa de muitos dados de treinamento. No nosso caso, uma coisa que torna os algarismos manuscritos um exemplo tão bom é que existe o banco de dados MNIST, com tantos exemplos que foram rotulados por seres humanos. Portanto, um desafio comum com o qual você trabalha no aprendizado de máquina é apenas obter os dados de treinamento rotulados de que você realmente precisa, seja para que as pessoas rotulem dezenas de milhares de imagens ou qualquer outro tipo de dado com o qual você esteja lidando.

A Nagwa usa cookies para garantir que você tenha a melhor experiência em nosso site. Saiba mais sobre nossa Política de privacidade.