Vídeo: Gradiente Descendente, Como as Redes Neurais Aprendem, Aprendizado Profundo

Grant Sanderson • 3Blue1Brown • Boclips

Gradiente Descendente, Como as Redes Neurais Aprendem, Aprendizado Profundo

19:58

Transcrição do vídeo

No último vídeo, expus a estrutura de uma rede neural. Vou fazer uma rápida recapitulação aqui apenas para que fique fresco em nossas mentes. E então eu tenho dois objetivos principais para este vídeo. A primeira é a introdução da ideia de descida gradiente, subjacente não apenas ao aprendizado das redes neurais, mas também a muitas outras aprendizagens de máquina. Depois disso, vamos nos aprofundar um pouco mais no desempenho dessa rede em particular e no que essas camadas ocultas de neurônios realmente procuram.

Como lembrete, nosso objetivo aqui é o exemplo clássico de reconhecimento de algarismos manuscritos: o Olá Mundo das redes neurais. Esses algarismos são renderizados em uma grade de 28 por 28 pixels, cada pixel com algum valor em escala de cinza entre zero e um. É isso que determina as ativações dos 784 neurônios na camada de entrada da rede. E então a ativação para cada neurônio nas camadas a seguir é baseada em uma soma ponderada de todas as ativações na camada anterior, mais um número especial chamado viés. Então você compõe essa soma com alguma outra função, como o esmagamento sigmoide ou um ReLu, do jeito que eu passei no último vídeo.

No total, dada a escolha um tanto arbitrária de duas camadas ocultas aqui com 16 neurônios cada, a rede possui cerca de 13000 pesos e vieses que podemos ajustar. E são esses valores que determinam o que exatamente a rede, você sabe, faz. Então, o que queremos dizer quando dizemos que essa rede classifica um determinado algarismo é que o mais brilhante desses 10 neurônios na camada final corresponde a esse algarismo. E lembre-se, a motivação que tínhamos em mente aqui para a estrutura em camadas era que talvez a segunda camada pudesse captar as bordas. E a terceira camada pode pegar padrões como voltas e linhas. E o último poderia juntar esses padrões para reconhecer algarismos.

Então, aqui, aprendemos como a rede aprende. O que queremos é um algoritmo, no qual você possa mostrar a esta rede um monte de dados de treinamento, que vêm na forma de um monte de imagens diferentes de algarismos manuscritos, juntamente com rótulos para o que eles deveriam ser. E ajustará esses 13000 pesos e vieses para melhorar seu desempenho nos dados de treinamento. Felizmente, essa estrutura em camadas significa que o que ele aprende generaliza para imagens além dos dados de treinamento. E a maneira como testamos é que, depois de treinar a rede, você mostra mais dados rotulados que nunca foram vistos antes. E você vê com que precisão classifica essas novas imagens.

Felizmente para nós, e o que torna este exemplo tão comum, é que as pessoas boas por trás do banco de dados MNIST reuniram uma coleção de dezenas de milhares de imagens em algarismos manuscritos, cada uma com os números que deveriam ter. E por mais provocativo que seja descrever uma máquina como aprendizado, uma vez que você realmente vê como funciona, parece muito menos uma premissa de ficção científica maluca e muito mais um exercício de cálculo. Quero dizer, basicamente tudo se resume a encontrar o mínimo de uma determinada função.

Lembre-se, conceitualmente, estamos pensando em cada neurônio como estando conectado a todos os neurônios na camada anterior. E os pesos na soma ponderada que definem sua ativação são como os pontos fortes dessas conexões. E o viés é uma indicação de se esse neurônio tende a ser ativo ou inativo. E, para começar, vamos inicializar todos esses pesos e vieses de maneira totalmente aleatória. Desnecessário será dizer que esta rede terá um desempenho horrível em um determinado exemplo de treinamento, já que está apenas fazendo algo aleatório.

Por exemplo, você alimenta essa imagem de três, e a camada de saída, parece apenas uma bagunça. Então, o que você faz é definir uma função de custo, uma maneira de dizer ao computador: “Não! Computador ruim! Essa saída deve ter ativações que são zero para a maioria dos neurônios, mas um para esse neurônio. O que você me deu é lixo total!” Para dizer um pouco mais matematicamente, o que você faz é somar os quadrados das diferenças entre cada uma dessas ativações de saída lixo e o valor que você deseja que elas tenham. E é isso que chamaremos de custo de um único exemplo de treinamento. Observe que essa soma é pequena quando a rede classifica a imagem com confiança corretamente. Mas é grande quando a rede parece que realmente não sabe o que está fazendo.

Então, o que você faz é considerar o custo médio de todas as dezenas de milhares de exemplos de treinamento à sua disposição. Esse custo médio é a nossa medida de quão ruim é a rede e quão ruim o computador deve se sentir. E isso é uma coisa complicada. Lembre-se de como a rede em si era basicamente uma função, que recebe 784 números como entradas, os valores de pixel e cospe 10 números como saída. E, de certa forma, é parametrizado por todos esses pesos e vieses. Bem, a função de custo é uma camada de complexidade além disso. Toma como entrada esses cerca de 13000 pesos e vieses. E cospe um único número descrevendo quão ruins são esses pesos e vieses. E a maneira como é definida depende do comportamento da rede em todas as dezenas de milhares de dados de treinamento. Isso é muito em que pensar!

Mas apenas informar ao computador o trabalho ruim que está sendo feito não ajuda muito. Você quer dizer como alterar esses pesos e desvios para que fique melhor. Para facilitar, em vez de tentar imaginar uma função com 13000 entradas, imagine uma função simples que tenha um número como entrada e um número como saída. Como você encontra uma entrada que minimiza o valor dessa função? Os alunos de cálculo saberão que às vezes você pode descobrir esse mínimo explicitamente. Mas isso nem sempre é viável para funções realmente complicadas, certamente não na versão de 13000 entradas dessa situação para a nossa louca e complicada função de custo de rede neural. Uma tática mais flexível é começar com qualquer entrada antiga e descobrir em que direção você deve seguir para diminuir essa saída.

Especificamente, se você puder descobrir a inclinação da função em que está, desloque para a esquerda se essa inclinação for positiva e desloque a entrada para a direita se a inclinação for negativa. Se você fizer isso repetidamente, em cada ponto verificando a nova inclinação e dando o passo apropriado, você abordará um mínimo local da função. E a imagem que você pode ter em mente aqui é uma bola rolando ladeira abaixo. E observe que, mesmo para esta função de entrada única realmente simplificada, existem muitos vales possíveis nos quais você pode pousar, dependendo de qual entrada aleatória você inicia. E não há garantia de que o mínimo local em que você chegar seja o menor valor possível da função de custo. Isso também será transferido para o nosso caso de rede neural. E também quero que você observe como, se você aumentar o tamanho dos degraus proporcionalmente à inclinação, quando a inclinação estiver nivelando ao mínimo, seus degraus ficarão cada vez menores. E esse tipo ajuda você a ultrapassar.

Aumentando um pouco a complexidade, imagine uma função com duas entradas e uma saída. Você pode pensar no espaço de entrada como o plano 𝑥𝑦 e a função de custo como representada graficamente como uma superfície acima dele. Agora, em vez de perguntar sobre a inclinação da função, você deve perguntar em qual direção deve pisar neste espaço de entrada para diminuir a saída da função mais rapidamente. Em outras palavras, qual é a direção em declive? E, novamente, é útil pensar em uma bola rolando ladeira abaixo. Quem conhece o cálculo multivariável saberá que o gradiente de uma função fornece a direção da subida mais acentuada. Basicamente, em qual direção você deve avançar para aumentar a função mais rapidamente.

Naturalmente, tomar o negativo desse gradiente fornece a direção para a etapa que diminui a função mais rapidamente. E mais do que isso, o comprimento desse vetor de gradiente é realmente uma indicação de quão íngreme é a inclinação mais íngreme. Agora, se você não conhece o cálculo multivariável e deseja saber mais, confira alguns dos trabalhos que fiz para a Khan Academy sobre o assunto. Honestamente, tudo o que importa para você e para mim agora é que, em princípio, existe uma maneira de calcular esse vetor. Esse vetor que indica qual é a direção em declive e como é íngreme. Você ficará bem se isso é tudo o que você sabe e não é sólido quanto aos detalhes. Porque se você conseguir isso, o algoritmo de minimizar a função é calcular essa direção do gradiente. Então dê um pequeno passo ladeira abaixo e repita isso várias vezes.

É a mesma ideia básica para uma função que possui 13000 entradas em vez de duas entradas. Imagine organizar todos os 13000 pesos e vieses de nossa rede em um vetor de coluna gigante. O gradiente negativo da função de custo é apenas um vetor. É uma direção dentro desse espaço de entrada incrivelmente grande que indica quais cutucadas em todos esses números causarão a diminuição mais rápida da função de custo. E, é claro, com nossa função de custo especialmente projetada, alterar os pesos e desvios para diminuí-la significa fazer com que a saída da rede em cada parte dos dados de treinamento pareça menos uma matriz aleatória de 10 valores e mais uma decisão real que quero que faça. É importante lembrar que essa função de custo envolve uma média de todos os dados de treinamento. Portanto, se você a minimizar, significa que é um desempenho melhor em todas essas amostras.

O algoritmo para calcular esse gradiente de forma eficiente, que é efetivamente o coração de como uma rede neural aprende, é chamado de propagação reversa. E é sobre isso que eu vou falar no próximo vídeo. Lá, eu realmente quero ter tempo para analisar o que exatamente acontece com cada peso e cada viés para uma determinada peça de dados de treinamento, tentando dar uma sensação intuitiva do que está acontecendo além da pilha de cálculos e fórmulas relevantes. Bem aqui, agora, a principal coisa que eu quero que você saiba independentemente dos detalhes da implementação é que o que queremos dizer quando falamos sobre um aprendizado de rede é que ele está apenas minimizando uma função de custo.

E observe, uma consequência disso é que é importante que essa função de custo tenha uma saída agradável e suave para que possamos encontrar um mínimo local, dando pequenos passos ladeira abaixo. É por isso que, a propósito, os neurônios artificiais têm ativações de alcance contínuo, em vez de simplesmente serem ativos ou inativos de uma maneira binária, da maneira que os neurônios biológicos são. Esse processo de cutucar repetidamente uma entrada de uma função por algum múltiplo do gradiente negativo é chamado descida do gradiente. É uma maneira de convergir para uma função local de custo mínimo, basicamente um vale neste gráfico. Ainda estou mostrando a imagem de uma função com duas entradas, é claro, porque cutucadas em um espaço de entrada de 13000 dimensões são um pouco difíceis de entender. Mas, na verdade, existe uma boa maneira não espacial de pensar sobre isso.

Cada componente do gradiente negativo nos diz duas coisas. O sinal, é claro, nos diz se o componente correspondente do vetor de entrada deve ser empurrado para cima ou para baixo. Porém, o mais importante é que as magnitudes relativas de todos esses componentes informam quais mudanças são mais importantes. Você vê, em uma rede, um ajuste em um dos pesos pode ter um impacto muito maior na função de custo do que o ajuste em algum outro peso. Algumas dessas conexões são mais importantes para nossos dados de treinamento. Então, uma maneira de pensar sobre esse vetor gradiente de nossa função de custo maciçamente impressionante é que ele codifica a importância relativa de cada peso e viés. Ou seja, qual dessas mudanças terá mais retorno pelo seu dinheiro?

Esta é realmente apenas outra maneira de pensar sobre direção. Para dar um exemplo mais simples, se você tem alguma função com duas variáveis ​​como entrada e calcula que seu gradiente em algum momento específico sai como três, um. Por um lado, você pode interpretar isso como dizendo que, quando está parado nessa entrada, mover-se nessa direção aumenta a função mais rapidamente. Quando você representa graficamente a função acima do plano dos pontos de entrada, esse vetor é o que está lhe dando a direção reta para cima. Mas outra maneira de ler isso é dizer que as alterações nessa primeira variável têm três vezes a importância que as alterações na segunda variável. Que pelo menos na vizinhança da entrada relevante, empurrar o valor 𝑥 traz muito mais retorno para seu investimento.

Tudo bem, vamos diminuir o zoom e resumir onde estamos até agora. A própria rede é essa função com 784 entradas e 10 saídas, definidas em termos de todas essas somas ponderadas. A função de custo é uma camada de complexidade, além disso. Ele usa os 13000 pesos e vieses como entradas e cospe uma única medida péssima de base nos exemplos de treinamento. E o gradiente da função de custo ainda é mais uma camada de complexidade. Ele nos diz quais cutucadas em todos esses pesos e vieses causam a alteração mais rápida no valor da função de custo, que você pode interpretar como dizendo quais alterações em quais pesos são mais importantes.

Então, quando você inicializa a rede com pesos e vieses aleatórios e os ajusta várias vezes com base nesse processo de descida de gradiente, quão bem ele realmente é executado em imagens que nunca foram vistas antes? Bem, a que eu descrevi aqui, com as duas camadas ocultas de 16 neurônios cada, escolhidas principalmente por razões estéticas, não é ruim! Ele classifica cerca de 96 por cento das novas imagens que vê corretamente. E honestamente, se você olhar para alguns dos exemplos em que ele estraga tudo. Você se sente compelido a diminuir um pouco.

Agora, se você brinca com a estrutura da camada oculta e faz alguns ajustes, pode conseguir isso em 98 por cento. E isso é muito bom! Não é o melhor. Certamente, você pode obter melhor desempenho ficando mais sofisticado do que essa rede simples de baunilha. Mas, dada a assustadora tarefa inicial, acho que há algo de incrível em qualquer rede que esteja se saindo bem com imagens nunca vistas antes, já que nunca dissemos especificamente quais padrões procurar.

Originalmente, o modo como motivei essa estrutura foi descrevendo uma esperança que poderíamos ter. Que a segunda camada pode pegar em pequenas arestas. Que a terceira camada junte essas arestas para reconhecer voltas e linhas mais longas. E que essas possam ser reunidas para reconhecer algarismos. Então é isso que nossa rede está realmente fazendo? Bem, pelo menos para este, de modo algum! Lembre-se de como o último vídeo vimos como os pesos das conexões de todos os neurônios da primeira camada para um dado neurônio na segunda camada podem ser visualizados como um padrão de pixel determinado pelo qual o neurônio da segunda camada está captando?

Bem, quando realmente fazemos isso pelos pesos associados a essas transições da primeira camada para a próxima, em vez de pegar pequenas arestas isoladas aqui e ali, elas aparecem, bem, quase aleatórias, apenas alguns padrões ruins lá no meio. Parece que no espaço incomumente grande de 13000 dimensões de possíveis pesos e vieses, nossa rede encontrou um mínimo local feliz que, apesar de classificar com sucesso a maioria das imagens, não atende exatamente aos padrões que poderíamos esperar. E para realmente levar esse ponto para casa, observe o que acontece quando você insere uma imagem aleatória. Se o sistema for inteligente, você pode esperar que ele se sinta incerto, talvez não esteja realmente ativando nenhum desses 10 neurônios de saída ou ativando todos uniformemente. Mas, em vez disso, fornece uma resposta sem sentido, como se tivesse certeza de que esse ruído aleatório é cinco, assim como uma imagem real de cinco é cinco.

De maneira diferente, mesmo que essa rede possa reconhecer algarismos muito bem, ela não tem ideia de como desenhá-los. Muito disso ocorre porque é uma configuração de treinamento muito restrita. Quero dizer, coloque-se no lugar da rede aqui. Do seu ponto de vista, o universo inteiro consiste em nada além de algarismos imóveis claramente definidos, centralizados em uma minúscula grade. E sua função de custo simplesmente nunca incentivou a confiança em suas decisões. Portanto, se essa é a imagem do que esses neurônios de segunda camada estão realmente fazendo, você deve se perguntar por que eu introduziria essa rede com a motivação de entender as arestas e os padrões. Quero dizer, isso não é exatamente o que acaba fazendo.

Bem, esse não é nosso objetivo final, mas um ponto de partida. Francamente, essa é uma tecnologia antiga, do tipo pesquisado nos anos 80 e 90. E você precisa entendê-la antes de entender as variantes modernas mais detalhadas. E é claramente capaz de resolver alguns problemas interessantes. Mas quanto mais você se interessa pelo que essas camadas ocultas estão realmente fazendo, menos inteligente parece. Mudando o foco por um momento, de como as redes aprendem e como você aprende, isso só acontecerá se você se envolver ativamente com o material aqui de alguma forma. Uma coisa bem simples que eu quero que você faça é parar agora e pensar profundamente por um momento sobre as mudanças que você pode fazer neste sistema e como ele percebe as imagens, se você quiser entender melhor coisas como bordas e padrões.

Mas, melhor que isso, para realmente se envolver com o material, recomendo o livro de Michael Nielsen sobre aprendizado profundo e redes neurais. Nele, você pode encontrar o código e os dados para baixar e reproduzir neste exemplo exato. E o livro orientará você passo a passo sobre o que esse código está fazendo. O mais impressionante é que este livro é gratuito e está disponível ao público. Portanto, se você conseguir algo com isso, considere se juntar a mim para fazer uma doação aos esforços de Nielsen. Também vinculei alguns outros recursos de que gosto muito na descrição, incluindo a postagem fenomenal e bonita de Chris Ola e os artigos em Distill.

Para encerrar as coisas aqui nos últimos minutos, quero pular de volta para um trecho da entrevista que tive com Lisha Li. Você deve se lembrar dela desde o último vídeo. Ela fez seu doutorado em aprendizagem profunda. E neste pequeno trecho, ela fala sobre dois artigos recentes que realmente se aprofundam em como algumas das redes de reconhecimento de imagem mais modernas estão realmente aprendendo. Apenas para definir onde estávamos na conversa, o primeiro artigo utilizou uma dessas redes neurais particularmente profundas que é realmente boa no reconhecimento de imagens. E, em vez de treiná-lo em um conjunto de dados rotulado corretamente, ele embaralhou todos os rótulos antes do treinamento.

Obviamente, a precisão dos testes aqui não seria melhor que aleatória, pois tudo é rotulado aleatoriamente. Mas ainda era possível obter a mesma precisão de treinamento que você obteria em um conjunto de dados rotulado corretamente. Basicamente, os milhões de pesos para essa rede específica foram suficientes para memorizar os dados aleatórios, o que levanta a questão de se minimizar essa função de custo realmente corresponde a qualquer tipo de estrutura na imagem. Ou é apenas, você sabe, memorização?

Lisha Li: ... memorize todo o conjunto de dados de qual é a classificação correta. E assim, alguns, você sabe, meio ano depois na ICML deste ano, não havia exatamente um artigo de refutação, mas um documento que abordasse alguns aspectos de - como ei. Na verdade, essas redes estão fazendo algo um pouco mais inteligente do que isso. Se você olhar para essa curva de precisão, se estiver apenas treinando em um conjunto de dados aleatórios, essa curva meio que caiu muito, você sabe, muito lentamente, quase de uma maneira linear. Então, você está realmente lutando para encontrar os mínimos locais possíveis, sabe, os pesos certos que proporcionariam essa precisão. Considerando que, se você está realmente treinando em um conjunto de dados estruturado, com os rótulos corretos, sabe, você mexe um pouco no começo.

Mas então você meio que caiu muito rápido para chegar a esse nível de precisão. E assim, em certo sentido, era mais fácil encontrar esse máximo local. E o que é interessante também é que traz à tona outro artigo de alguns anos atrás, que tem muito mais simplificações sobre as camadas da rede. Mas um dos resultados foi dizer como, se você observar o cenário de otimização, os mínimos locais que essas redes tendem a aprender são de igual qualidade. Portanto, de certa forma, se seu conjunto de dados estiverem estruturados, você poderá encontrá-lo com muito mais facilidade.

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