Video Transcript
Este é um três. Ele foi escrito e transmitido com uma resolução extremamente baixa de 28
por 28 pixels. Mas seu cérebro não tem dificuldade em reconhecê-lo como um três. E quero que você dedique um momento para apreciar o quão louco é que o
cérebro possa fazer isso com tanta facilidade. Quero dizer isso, isso e isso também são reconhecíveis como três, mesmo
que os valores específicos de cada pixel sejam muito diferentes de
uma imagem para a seguinte. As células sensíveis à luz em seu olho que estão disparando quando você
vê esses três são muito diferentes daquelas que são disparadas
quando você vê esses três. Mas algo nesse seu córtex visual inteligente e louco resolve isso como
representando a mesma ideia. Ao mesmo tempo, reconhecendo outras imagens como suas próprias ideias
distintas.
Mas se eu lhe dissesse: “Ei! Sente-se e escreva para mim um programa que ocupa uma grade de 28 por 28
pixels como esta e gera um único número entre zero e 10, dizendo o
que ele acha que é o algarismo.” Bem, a tarefa vai de comicamente trivial a assustadoramente difícil. A menos que você esteja vivendo sob uma rocha, acho que dificilmente
preciso motivar a relevância e a importância do aprendizado de
máquina e das redes neurais para o presente e o futuro. Mas o que eu quero fazer aqui é mostrar o que realmente é uma rede
neural, assumindo que não há histórico. E para ajudar a visualizar o que está fazendo, não como um chavão, mas
como uma peça de matemática. Minha esperança é que você saia sentindo que a estrutura em si é
motivada. E para sentir que sabe o que significa quando lê ou ouve falar de uma
rede neural, indicando ou não, aprendizado.
Este vídeo será dedicado ao componente de estrutura. E o seguinte abordará o aprendizado. O que faremos é montar uma rede neural que possa aprender a reconhecer
algarismos manuscritos. Este é um exemplo clássico para a introdução do tópico. E estou feliz em manter o status quo aqui. Porque no final dos dois vídeos, quero apontar alguns bons recursos para
você aprender mais. E onde você pode baixar o código que faz isso e jogar com ele no seu
próprio computador. Existem muitas variantes de redes neurais. E, nos últimos anos, houve um boom nas pesquisas sobre essas
variantes. Mas nesses dois vídeos introdutórios, você e eu vamos ver a forma mais
simples, sem frescuras. Esse é um pré-requisito necessário para entender qualquer uma das
variantes modernas mais poderosas. E confie em mim, ainda há muita complexidade para envolvermos nossas
mentes.
Mas mesmo desta forma mais simples, ela pode aprender a reconhecer
algarismos manuscritos, o que é uma coisa muito legal para um
computador poder fazer. E, ao mesmo tempo, você verá como fica aquém de algumas esperanças que
possamos ter para isso. Como o nome sugere, as redes neurais são inspiradas pelo cérebro. Mas vamos quebrar isso. Quais são os neurônios e em que sentido eles estão ligados? Agora, quando digo neurônio, tudo o que quero que você pense é algo que
contém um número, especificamente um número entre zero e um. Realmente não é mais do que isso. Por exemplo, a rede começa com um monte de neurônios correspondentes a
cada um dos 28 vezes 28 pixels da imagem de entrada, ou seja, 784
neurônios no total. Cada um deles possui um número que representa o valor da escala de cinza
do pixel correspondente, variando de zero para pixels pretos até um
para pixels brancos.
Esse número dentro do neurônio é chamado de ativação. E a imagem que você pode ter em mente aqui é que cada neurônio é
iluminado quando sua ativação é um número alto. Então todos esses 784 neurônios compõem a primeira camada da nossa
rede. Agora pulando para a última camada, isso tem 10 neurônios cada um
representando um dos algarismos. A ativação desses neurônios, novamente um número entre zero e um,
representa o quanto o sistema pensa que uma determinada imagem
corresponde a um determinado algarismo. Existem também algumas camadas chamadas camadas ocultas, que por enquanto
devem ser apenas um ponto de interrogação gigante sobre como esse
processo de reconhecimento de algarismos será tratado. Nesta rede, escolhi duas camadas ocultas, cada uma com 16 neurônios. E é certo que esse é um tipo de escolha arbitrária. Para ser sincero, escolhi duas camadas com base em como quero motivar a
estrutura em apenas um momento. E 16? Bem, esse foi apenas um bom número para caber na tela.
Na prática, há muito espaço para experimentos com uma estrutura
específica aqui. Da maneira como a rede opera, as ativações em uma camada determinam as
ativações da próxima camada. E, é claro, o coração da rede como mecanismo de processamento de
informações se resume exatamente a como essas ativações de uma
camada provocam ativações na próxima camada. Ele deve ser vagamente análogo ao modo como, em redes biológicas de
neurônios, alguns grupos de neurônios disparando fazem com que
outros disparem. Agora, a rede que estou mostrando aqui já foi treinada para reconhecer
algarismos. E deixe-me mostrar o que quero dizer com isso. Isso significa que, se você alimentar uma imagem que ilumina todos os 784
neurônios da camada de entrada, de acordo com o brilho de cada pixel
da imagem. Esse padrão de ativações causa algum padrão muito específico na próxima
camada, o que causa algum padrão na camada seguinte. O que finalmente fornece algum padrão na camada de saída. E o neurônio mais brilhante dessa camada de saída é a escolha da rede,
por assim dizer, para qual algarismo essa imagem representa.
E antes de começar a matemática sobre como uma camada influencia a
próxima ou como o treinamento funciona, vamos apenas falar sobre
porque é razoável esperar que uma estrutura em camadas como essa se
comporte de maneira inteligente. O que estamos esperando aqui? Qual é a melhor esperança para o que essas camadas intermediárias podem
estar fazendo? Bem, quando você ou eu reconhecemos algarismos, reunimos vários
componentes. Um nove tem um laço no topo e uma linha à direita. Um oito também tem um loop em cima, mas é emparelhado com outro loop
embaixo. Um quatro basicamente se divide em três linhas específicas, e coisas
assim. Agora, em um mundo perfeito, podemos esperar que cada neurônio na
penúltima camada corresponda a um desses subcomponentes. Sempre que você alimenta uma imagem com, digamos, um loop no topo como um
nove ou um oito, há um neurônio específico cuja ativação será
próxima de um.
E não quero dizer esse loop específico de pixels. A esperança seria que qualquer padrão geralmente em loop no topo
desencadeie esse neurônio. Dessa forma, passar da terceira camada para a última exige apenas
aprender qual combinação de subcomponentes corresponde a quais
algarismos. Obviamente, isso apenas chuta o problema para debaixo do caminho. Porque, como você reconheceria esses subcomponentes ou até aprenderia
quais deveriam ser os subcomponentes certos? E ainda nem falei sobre como uma camada influencia a próxima. Mas corra comigo por um momento. O reconhecimento de um loop também pode ser dividido em subproblemas. Uma maneira razoável de fazer isso seria primeiro reconhecer as várias
pequenas arestas que o compõem.
Da mesma forma, uma linha longa como a que você pode ver nos algarismos
um, quatro ou sete, bem, isso é realmente apenas uma borda
longa. Ou talvez você pense nisso como um certo padrão de várias arestas
menores. Talvez nossa esperança seja que cada neurônio na segunda camada da rede
corresponda às várias pequenas arestas relevantes. Talvez quando uma imagem como essa apareça, acenda todos os neurônios
associados a cerca de oito a dez pequenas arestas específicas. O que, por sua vez, ilumina os neurônios associados ao loop superior e a
uma longa linha vertical. E esses acendem o neurônio associado a nove. Se é isso que a nossa rede final realmente faz é outra questão. Uma que voltarei assim que vermos como treinar a rede.
Mas é uma esperança que possamos ter, um tipo de objetivo com uma
estrutura em camadas como essa. Além disso, você pode imaginar como ser capaz de detectar bordas e
padrões como esse seria realmente útil para outras tarefas de
reconhecimento de imagem. E mesmo além do reconhecimento de imagem, existem todos os tipos de
coisas inteligentes que você pode querer fazer que se dividem em
camadas de abstração. Analisar a fala, por exemplo, envolve pegar o áudio bruto e escolher sons
distintos que se combinam para formar certas sílabas. Que se combinam para formar palavras, que se combinam para formar frases
e pensamentos mais abstratos, etc. Mas voltando a como isso realmente funciona, imagine-se agora projetando
como exatamente as ativações em uma camada podem determinar as
ativações na próxima. O objetivo é ter algum mecanismo que possa combinar pixels em arestas ou
arestas em padrões ou padrões em algarismos.
E para ampliar um exemplo muito específico, digamos que a esperança é que
um neurônio em particular na segunda camada compreenda se a imagem
tem uma borda nesta região aqui. A questão em questão é: quais parâmetros a rede deve ter? Quais mostradores e botões você deve ajustar para que seja expressivo o
suficiente para capturar esse padrão ou qualquer outro padrão de
pixel? Ou o padrão em que várias arestas podem fazer um loop e outras coisas
assim? Bem, o que faremos é atribuir um peso a cada uma das conexões entre nosso
neurônio e os neurônios da primeira camada. Esses pesos são apenas números. Em seguida, pegue todas essas ativações da primeira camada e calcule sua
soma ponderada de acordo com esses pesos.
Acho útil pensar nesses pesos como sendo organizados em uma pequena grade
própria. E usarei pixels verdes para indicar pesos positivos e vermelhos para
indicar pesos negativos, onde o brilho desse pixel é uma
representação solta do valor do peso. Agora, se fizermos com que os pesos associados a quase todos os pixels
sejam zero, com exceção de alguns pesos positivos nessa região que
nos interessam. Tomar a soma ponderada de todos os valores de pixel realmente significa
somar os valores do pixel apenas na região com a qual nos
preocupamos. E, se você realmente quiser saber se há uma vantagem aqui, o que você
pode fazer é ter alguns pesos negativos associados aos pixels
circundantes. A soma é maior quando os pixels do meio são claros, mas os pixels ao
redor são mais escuros.
Quando você calcula uma soma ponderada como essa, pode aparecer com
qualquer número. Mas para essa rede, o que queremos é que as ativações tenham algum valor
entre zero e um. Portanto, uma coisa comum a se fazer é bombear essa soma ponderada para
alguma função que compense a linha do número real no intervalo entre
zero e um. E uma função comum que faz isso é chamada de função sigmoide, também
conhecida como curva logística. Basicamente, entradas muito negativas acabam perto de zero, entradas
muito positivas acabam perto de um. E isso aumenta constantemente em torno do zero de entrada. Portanto, a ativação do neurônio aqui é basicamente uma medida de quão
positiva é a soma ponderada relevante.
Mas talvez você não queira que o neurônio acenda quando a soma ponderada
for maior que zero. Talvez você só queira que ele esteja ativo quando a soma for maior que,
digamos, 10. Ou seja, você deseja que haja algum viés para que ela fique inativa. O que faremos então é adicionar outro número como menos 10 a essa soma
ponderada antes de substituí-lo à função esmagada sigmoide. Esse número adicional é chamado de viés. Portanto, os pesos indicam o padrão de pixel que este neurônio na segunda
camada está captando. E o viés indica o quão alto deve ser a soma ponderada antes que o
neurônio comece a ficar significativamente ativo. E isso é apenas um neurônio. Todos os outros neurônios nesta camada serão conectados a todos os 784
pixels da primeira camada. E cada uma dessas 784 conexões tem seu próprio peso associado. Além disso, cada um tem algum viés, outro número que você adiciona à soma
ponderada antes de esmagá-la com o sigmoide.
E isso é muito para se pensar! Com essa camada oculta de 16 neurônios, são 784 vezes 16 pesos, além de
16 vieses. E tudo isso são apenas as conexões da primeira camada para a segunda. As conexões entre as outras camadas também têm vários pesos e desvios
associados a elas. Tudo dito e feito, essa rede possui quase exatamente 13000 pesos e
desvios totais, 13000 botões e mostradores que podem ser ajustados e
girados para fazer com que essa rede se comporte de maneiras
diferentes. Portanto, quando falamos de aprendizado, o que se refere é fazer com que
o computador encontre uma configuração válida para todos esses
muitos e muitos números. Para que ele realmente resolva o problema em questão.
Um experimento mental que é ao mesmo tempo divertido e meio horripilante
é imaginar sentar e definir todos esses pesos e viés à mão. Ajustar propositadamente os números para que a segunda camada apareça nas
bordas. A terceira camada retoma os padrões, etc. Pessoalmente, acho isso satisfatório, em vez de apenas ler a rede como
uma caixa preta total. Porque quando a rede não tem o desempenho esperado. Se você construiu um pouco de relação com o que esses pesos e tendências
realmente significam, você tem um ponto de partida para experimentar
como alterar a estrutura para melhorar. Ou, quando a rede funciona, mas não pelos motivos que você poderia
esperar. Investigar o que os pesos e viés estão fazendo é uma boa maneira de
desafiar suas suposições e realmente expor todo o espaço de
possíveis soluções.
A propósito, a função real aqui é um pouco complicada de escrever, você
não acha? Então, deixe-me mostrar uma maneira mais compacta de observar essas
conexões. É assim que você vê se optar por ler mais sobre redes neurais. Organize todas as ativações de uma camada em uma coluna como um
vetor. Em seguida, organize todos os pesos como uma matriz, onde cada linha
dessa matriz corresponde às conexões entre uma camada e um neurônio
específico na próxima camada. O que isso significa é que calcular a soma ponderada das ativações na
primeira camada de acordo com esses pesos corresponde a um dos
termos no produto vetorial de matriz de tudo o que temos à esquerda
aqui.
A propósito, grande parte do aprendizado de máquina se resume a ter uma
boa compreensão da álgebra linear. Portanto, para qualquer um de vocês que queira uma boa compreensão visual
para matrizes e o que significa multiplicação de vetores matriciais,
dê uma olhada nas séries que fiz na álgebra linear, especialmente no
capítulo três. Voltando à nossa expressão, em vez de falar sobre adicionar o viés a cada
um desses valores independentemente. Representamos isso organizando todos esses vieses em um vetor e
adicionando o vetor inteiro ao produto vetorial da matriz
anterior. Como passo final, enrolarei um sigmoide por fora aqui. E o que isso deve representar é que você aplicará a função sigmoide a
cada componente específico dentro do vetor resultante.
Então, depois de escrever essa matriz de peso e esses vetores como seus
próprios símbolos. Você pode comunicar a transição completa das ativações de uma camada para
a seguinte em uma pequena expressão extremamente firme e clara. E isso torna o código relevante muito mais simples e muito mais rápido,
pois muitas bibliotecas otimizam a multiplicação de matrizes. Lembra-se de como eu disse anteriormente que esses neurônios são
simplesmente coisas que contêm números? Bem, é claro que os números específicos que eles contêm dependem da
imagem que você alimenta. Portanto, é realmente mais preciso pensar em cada neurônio como uma
função. Um que capta as saídas de todos os neurônios da camada anterior e devolve
um número entre zero e um.
Realmente, toda a rede é apenas uma função, que recebe 784 números como
entrada e devolve 10 números como saída. É uma função absurdamente complicada. Uma que envolve 13000 parâmetros nas formas desses pesos e viés que
captam certos padrões. E isso envolve a iteração de muitos produtos vetoriais matriciais e a
função esmagada sigmoide. Mas é apenas uma função, no entanto. E de certa forma, é meio tranquilizador que pareça complicado. Quero dizer, se fosse mais simples, que esperança teríamos de enfrentar o
desafio de reconhecer algarismos? E como ela aceita esse desafio? Como essa rede aprende os pesos e vieses apropriados apenas olhando os
dados? Bem, é isso que vou mostrar no próximo vídeo.
Para encerrar as coisas, tenho comigo Lisha Li, que fez seu doutorado no
lado teórico do aprendizado profundo. E quem atualmente trabalha em uma empresa de capital de risco chamada
Amplify Partners, que gentilmente forneceu parte do financiamento
para este vídeo. Então, Lisha, uma coisa que acho que devemos mencionar rapidamente é essa
função sigmoide. Pelo que entendi, as redes iniciais usavam isso para compactar a soma
ponderada relevante nesse intervalo entre zero e um. Você sabe, meio que motivado por essa analogia biológica dos neurônios,
sendo inativos ou ativos.
LISHA: Exatamente.
LOCUTOR: Mas relativamente poucas redes modernas realmente não usam mais
sigmoides. É um pouco da velha escola, certo?
LISHA: Sim, ou melhor, ReLU parece ser muito mais fácil de treinar.
LOCUTOR: E ReLU significa unidade linear retificada.
LISHA: Sim, é esse tipo de função em que você está usando um máximo de
zero e 𝑎, onde 𝑎 é dado pelo que você estava explicando no
vídeo. E o que isso motivou foi, em parte, uma analogia biológica de como os
neurônios seriam ativados ou não. E assim, se ele ultrapassar um certo limite, seria a função de
identidade. Mas se isso não acontecesse, simplesmente não seria ativado, portanto,
seria zero. Então é uma simplificação. O uso de sigmoides não ajudou no treinamento. Ou, foi muito difícil treinar em algum momento, e as pessoas apenas
experimentaram o ReLU. E isso funcionou muito bem para essas redes neurais incrivelmente
profundas.
LOCUTOR: Ok! Obrigado Lisha.