MIT Introduction to Deep Learning (2024) | 6.S191
Introdução ao Curso de Deep Learning
- O curso é apresentado por Alexander Amini e Ava, com foco em um campo em rápida evolução.
- A inteligência artificial (IA) e o aprendizado profundo têm revolucionado diversas áreas da ciência nos últimos anos.
- O ensino do curso se torna mais desafiador devido às rápidas mudanças no campo da IA.
Evolução do Ensino de Deep Learning
- O primeiro dia do curso deve cobrir fundamentos que mudam rapidamente, diferente de outras disciplinas.
- Anteriormente, a introdução ao deep learning era feita com vídeos que geravam grande impacto viral.
- Um vídeo criado com IA surpreendeu pela sua realismo e viralizou rapidamente.
Avanços Recentes em Deep Learning
- O custo para gerar conteúdo realista com IA caiu significativamente nos últimos anos.
- Hoje, a geração de conteúdo hiper-realista é comum e acessível a todos.
- As capacidades da IA evoluíram para realizar tarefas muito mais complexas do que antes.
Capacidades Atuais da Inteligência Artificial
- Modelos atuais podem criar conteúdos inteiros apenas a partir de comandos em inglês, sem necessidade de codificação.
- É possível solicitar que redes neurais escrevam código para treinar outras redes neurais.
- Os modelos não apenas produzem código, mas também educam o usuário sobre cada parte dele.
Objetivos do Curso
- O curso visa ensinar as bases dos modelos de deep learning desde o início até os avanços mais recentes.
- A natureza dinâmica do campo torna o ensino cada vez mais desafiador ano após ano.
Introdução ao Aprendizado Profundo
- O aprendizado profundo é um conceito importante que se relaciona com outras áreas da ciência.
- Inteligência, em sua essência, é a capacidade de processar informações para tomar decisões futuras.
- A inteligência artificial permite que computadores processem informações e tomem decisões.
Diferenças entre IA, Aprendizado de Máquina e Aprendizado Profundo
- O aprendizado de máquina é um subconjunto da inteligência artificial focado em ensinar computadores a processar dados.
- Em vez de programar regras fixas, o aprendizado de máquina utiliza dados para informar decisões.
- O aprendizado profundo usa redes neurais para processar grandes conjuntos de dados não estruturados.
Estrutura do Curso
- O curso combina palestras técnicas e laboratórios práticos para reforçar o aprendizado.
- A primeira palestra aborda os fundamentos das redes neurais, começando pelo perceptron.
- Haverá palestras convidadas de patrocinadores da indústria ao longo do curso.
Experiência Prática e Projetos
- Após cada aula, os alunos terão experiências práticas em software e construção de projetos.
- O primeiro laboratório será sobre geração musical usando redes neurais.
- Os alunos aprenderão a construir sistemas de detecção facial no segundo laboratório.
Desafios Finais e Recursos
- Um laboratório final focará em modelos linguísticos grandes e chatbots assistivos.
- Haverá uma competição final onde equipes apresentarão seus projetos por até 5 minutos.
Por que nos importamos com Deep Learning?
- A importância do aprendizado profundo é discutida, questionando por que estamos aqui para aprender sobre isso.
- O aprendizado de máquina tradicional envolve a definição manual de características, o que pode ser frágil.
- A mudança de paradigma busca aprender diretamente das informações brutas, em vez de depender da engenharia manual.
Detecção de Faces e Padrões
- Para detectar rostos, os computadores buscam padrões como olhos e narizes em imagens.
- Deep learning permite identificar esses padrões automaticamente a partir dos dados brutos.
- As bases para deep learning existem há décadas, mas agora estão se expandindo devido a três fatores principais.
Fatores que Impulsionam o Aprendizado Profundo
- A disponibilidade massiva de dados é um fator crucial; modelos precisam de muitos dados para funcionar bem.
- Algoritmos são exigentes em termos computacionais e se beneficiam do hardware paralelo, como GPUs.
- Ferramentas open source facilitam o desenvolvimento e implementação desses modelos.
Compreendendo o Perceptron
- O perceptron é a unidade básica das redes neurais; cada rede é composta por múltiplos perceptrons.
- Um perceptron processa informações através da multiplicação dos inputs por pesos correspondentes.
Propagação Direta e Função de Ativação
- Neurônios podem ingerir múltiplas entradas, cada uma multiplicada por um peso específico.
- Os resultados são somados e passados por uma função de ativação não linear para gerar a saída final.
Introdução aos Vetores e Pesos
- Os inputs são representados por um vetor X, enquanto os pesos são descritos por W.
- Um termo de bias (w0) é adicionado antes da aplicação da função de ativação.
- A função de ativação, como a sigmoid, transforma entradas em valores entre 0 e 1.
Funções de Ativação Não Lineares
- Existem várias funções de ativação não lineares utilizadas em redes neurais.
- A função sigmoid é popular para distribuições de probabilidade.
- A função ReLU (Rectified Linear Unit) é amplamente utilizada devido à sua simplicidade computacional.
Importância das Não Linearidades
- As funções de ativação introduzem não linearidades necessárias para lidar com dados complexos.
- Redes neurais precisam ser capazes de separar dados não lineares, como pontos verdes e vermelhos.
- Sem não linearidades, uma rede neural permanece linear, limitando sua capacidade.
Exemplo Prático com Rede Neural Treinada
- Uma rede neural treinada possui pesos definidos que influenciam suas saídas.
- O processo envolve produto escalar dos inputs com os pesos, adição do bias e aplicação da não linearidade.
Como um Neurônio Funciona?
- O neurônio é representado graficamente, onde a linha que define sua função é plotada.
- A posição de um novo ponto de dados em relação à linha determina o resultado e seu sinal.
- A função sigmoide divide o espaço em duas partes, com base no valor da entrada.
Espaço de Características do Neurônio
- Dependendo do lado da linha, a saída será menor ou maior que 0.5.
- O espaço de características pode ser visualizado para entender como o neurônio responde a diferentes entradas.
- Este exemplo é simplificado; redes neurais reais têm milhões ou bilhões de parâmetros.
Construindo Redes Neurais
- Compreender como funciona um perceptron é crucial para aulas futuras; envolve produto escalar, adição de viés e não linearidade.
- Cada linha no diagrama representa um peso associado ao neurônio; o viés é considerado implícito.
- O resultado antes da não linearidade é uma soma ponderada dos inputs.
Funções Multi-Saída em Redes Neurais
- Para múltiplas saídas, adicionamos mais neurônios na rede, cada um prevendo resultados independentes.
- Cada neurônio possui seus próprios pesos e linhas que se conectam apenas a ele.
- É possível programar uma rede neural desde o início definindo como as informações são propagadas.
Implementação Prática de Redes Neurais
- Definimos os pesos e viéses para cada neurônio na rede neural durante a implementação.
- A função "call" permite passar informações pela camada da rede neural criada.
Inicialização de Camadas Densas
- Exemplo de criação de uma camada densa com dois neurônios, recebendo três entradas.
- Introdução à rede neural de camada única, aumentando a complexidade gradualmente.
- A camada oculta não é observada diretamente e aumenta a capacidade de aprendizado da rede.
Matrizes de Peso em Redes Neurais
- Agora temos duas matrizes de peso: W1 para a camada oculta e W2 para a saída.
- Importância da não linearidade nas camadas ocultas para evitar funções lineares grandes.
- Cálculo do neurônio Z2 através do produto escalar dos pesos com as entradas.
Representação Visual das Camadas Conectadas
- Limpeza da representação visual substituindo linhas por caixas que representam camadas totalmente conectadas.
- Transformações em código são simples, definindo duas camadas densas no TensorFlow.
- Funções de não linearidade podem ser diferentes entre as camadas, dependendo da conveniência.
Construindo Redes Neurais Profundas
- Adição de múltiplas camadas cria um modelo hierárquico mais profundo na rede neural.
- O entendimento básico sobre definição e funcionamento das redes neurais é estabelecido.
- Compreensão do fluxo de informações desde a entrada até a saída na rede neural.
Aplicação Prática: Sistema AI para Aprovação em Classe
- Problema prático: construir um sistema AI para prever se o aluno passará na classe.
- Consideração das características: número de aulas assistidas e horas dedicadas ao projeto final.
Como as Redes Neurais Podem Prever Resultados?
Introdução à Rede Neural
- A rede neural ajuda a entender a probabilidade de passar ou falhar na aula, usando dois inputs: número de aulas assistidas e horas dedicadas ao projeto final.
Resultados da Predição
- A saída prevista para passar na aula é 0.1 (10%), enquanto a probabilidade real é 1 (100%) devido à presença em quatro das cinco aulas.
Problemas com o Treinamento
- A rede neural não foi treinada adequadamente, pois não recebeu dados suficientes para aprender sobre o problema.
Importância do Feedback
- É crucial informar à rede quando suas decisões estão erradas para que ela possa aprender e melhorar suas previsões.
Cálculo da Perda
- O cálculo da perda é feito comparando a previsão com o valor real; quanto mais próximo, menor a perda e mais precisa a rede.
Dados de Múltiplos Estudantes
- Ao incluir dados de vários alunos, podemos avaliar como a rede se comporta em diferentes situações durante o treinamento.
Minimização da Perda Empírica
- O objetivo é encontrar uma rede que minimize a perda empírica entre as previsões e os resultados reais em média.
Classificação Binária
- Para problemas de classificação binária, utiliza-se a função softmax para determinar se as respostas estão corretas ou incorretas.
Predição de Valores Reais
- Para prever valores reais, como notas, usa-se uma função de perda diferente, como erro quadrático médio, já que os outputs não são distribuições de probabilidade.
Unificação do Problema de Treinamento
- O desafio é encontrar um vetor W que represente os pesos da rede neural com base nos dados disponíveis.
Avaliação do Desempenho da Rede Neural
Função de Perda e Paisagem de Perda
- A função de perda é uma função simples dos pesos em uma rede neural, permitindo plotar a paisagem de perda em um espaço bidimensional.
- O objetivo é encontrar o ponto mais baixo na paisagem, onde a perda é mínima, indicando os melhores pesos para a rede.
- Começamos em um ponto aleatório e calculamos o gradiente da paisagem nesse ponto para entender a direção do aumento ou diminuição da perda.
Descendo pela Gradiente
- Ao seguir o gradiente negativo, podemos ajustar os pesos para reduzir a perda, repetindo esse processo até convergir para um mínimo local.
- O algoritmo utilizado para isso é chamado de descida do gradiente; começamos com uma localização aleatória e iteramos até a convergência.
- Continuamos ajustando os pesos até que não haja mais movimento significativo na rede neural.
Implementação do Algoritmo
- Inicializamos aleatoriamente os pesos e usamos um loop para calcular continuamente a perda e o gradiente.
- Multiplicamos o gradiente por uma taxa de aprendizado (learning rate), que determina o tamanho do passo na direção oposta ao gradiente.
- O termo "gradiente" indica como nossa perda muda em relação aos pesos da rede.
Retropropagação
- A retropropagação é o processo usado para calcular como pequenas mudanças nos pesos afetam a perda total da rede neural.
- Começamos com uma rede neural simples com um único neurônio e calculamos o gradiente da perda em relação ao peso W2.
- Usando a regra da cadeia, decompondo as derivadas, conseguimos propagar os gradientes desde a saída até as entradas.
Cálculo dos Gradientes
- Repetimos o processo de retropropagação para todos os pesos, garantindo que entendemos como cada peso individualmente afeta a perda total.
Diferença Funcional entre Neurônio e Perceptron
- A diferença funcional entre neurônios e perceptrons é a mesma; ambos os termos são frequentemente usados de forma intercambiável.
- O algoritmo de retropropagação é simples, baseado na regra da cadeia, e as bibliotecas de deep learning o implementam automaticamente.
- A otimização de redes neurais na prática é complexa e intensiva em computação.
Paisagens de Perda em Redes Neurais Profundas
- Visualizar paisagens de perda em redes neurais profundas revela que elas são extremamente confusas e multidimensionais.
- A inicialização dos parâmetros é crucial; começar em um ponto ruim pode impedir a convergência para a solução global.
- Técnicas podem ser aplicadas para suavizar as paisagens de perda, facilitando a otimização.
Importância da Taxa de Aprendizado
- Definir a taxa de aprendizado correta é desafiador; uma taxa muito pequena pode levar ao aprisionamento em mínimos locais.
- Uma taxa muito alta pode causar divergência, resultando na explosão do modelo sem encontrar mínimos adequados.
- Idealmente, queremos taxas que evitem mínimos locais mas ainda permitam convergir para o mínimo global.
Estratégias para Ajuste da Taxa de Aprendizado
- Testar diferentes taxas de aprendizado pode ser eficaz; essa abordagem é comum na prática.
- Algoritmos adaptativos podem ajustar a taxa com base nas características do modelo e dados observados.
- Existem várias metodologias amplamente utilizadas para definir taxas de aprendizado durante experimentos práticos.
Desafios na Busca por Mínimos Absolutos
- O espaço das soluções não é fechado; cada peso pode variar infinitamente, complicando a busca por mínimos absolutos.
Configuração e Otimizadores
- A configuração da rede neural define o modelo e o otimizador, como o SGD (Stochastic Gradient Descent).
- Testar diferentes otimizadores pode impactar significativamente o procedimento de treinamento.
- Importante focar em dicas práticas para treinar redes neurais.
Batching de Dados
- O algoritmo de gradiente é computacionalmente caro; a abordagem tradicional não é viável para grandes conjuntos de dados.
- O SGD calcula o gradiente usando um único ponto de treinamento, mas isso gera ruído.
- Usar mini-batches permite estimar o gradiente com mais precisão e velocidade.
Vantagens dos Mini-Batches
- Mini-batches aumentam a precisão do cálculo do gradiente, permitindo convergir mais rapidamente.
- Essa técnica também possibilita paralelizar os cálculos, melhorando a eficiência em arquiteturas GPU.
Problema do Overfitting
- Overfitting ocorre quando um modelo se ajusta bem aos dados de treinamento, mas falha nos testes.
- É crucial que os modelos generalizem bem para novos dados não vistos durante o treinamento.
Equilíbrio entre Overfitting e Underfitting
- O objetivo é encontrar um equilíbrio onde o modelo não memorize detalhes excessivos dos dados de treinamento.
Regularização em Redes Neurais
- A regularização é uma técnica para evitar que o modelo aprenda nuances do conjunto de dados de treinamento.
- A técnica mais popular é o Dropout, que desativa aleatoriamente neurônios durante o treinamento.
- O Dropout força a rede a encontrar diferentes caminhos entre entrada e saída, reduzindo a dependência de partes específicas dos dados.
Técnica de Early Stopping
- O overfitting ocorre quando o desempenho no conjunto de teste piora enquanto o desempenho no conjunto de treinamento melhora.
- É importante monitorar a perda durante o treinamento e parar quando a precisão do teste começa a cair.
- O objetivo é encontrar um equilíbrio onde não se utilize toda a capacidade do modelo sem causar overfitting.
Resumo da Aula
- Aprendemos sobre os blocos fundamentais das redes neurais, começando com um neurônio (perceptron).
- Discutimos como empilhar sistemas para criar redes hierárquicas e otimizar matematicamente esses sistemas.