Aprendizado de máquina e redes neurais - página 51

 

Fazendo redes neurais rápidas com vetorização (DL 10)



Fazendo redes neurais rápidas com vetorização (DL 10)

Para entender o funcionamento interno de uma rede neural, é útil mergulhar no nível de um neurônio individual e considerar as conexões entre os neurônios. Durante a passagem para frente, que calcula ativações, e a passagem para trás, que calcula deltas, pensar em termos de nós e arestas pode ajudar a desenvolver a intuição. No entanto, o aprendizado profundo não funciona dessa maneira. Para construir redes neurais de larga escala que possam ser treinadas com eficiência, precisamos passar para um nível mais alto de abstração e pensar em termos de vetores, matrizes e tensores.

O primeiro passo para esse nível mais alto de abstração é representar as ativações de uma camada como um vetor. Se nossa rede neural estiver organizada em camadas, podemos coletar as ativações de uma camada em um vetor. Por exemplo, o vetor A^l armazena todas as ativações da camada l, com tantas entradas quantos forem os nós dessa camada. Da mesma forma, podemos coletar os deltas de uma camada em um vetor durante a retropropagação. Também podemos usar vetores para representar os bias ou entradas de uma camada.

Para expressar os cálculos nessa notação vetorizada, vamos primeiro considerar como um nó calcula sua soma ponderada de entradas. A entrada X^5 que entra na função de ativação do nó 5 é calculada como uma soma ponderada das ativações da camada anterior mais um viés. Ao coletar as ativações da camada anterior no vetor A^K e ter um vetor de pesos entrando no nó 5, a soma ponderada das entradas pode ser representada como um produto escalar entre esses dois vetores. Outra maneira de escrever o produto escalar é transpor o primeiro vetor e realizar a multiplicação de matrizes entre o vetor linha e o vetor coluna. Portanto, podemos expressar a entrada para o nó 5 como o vetor de peso entrando no nó 5 (transposto) multiplicado pelo vetor de ativação da camada anterior, mais o viés do nó 5.

Essa notação vetorizada pode ir além e nos permitir calcular todo o vetor de entradas para a camada l de uma só vez. Combinando o vetor linha de pesos para o nó 5 com vetores linha de pesos para outros neurônios naquela camada, obtemos uma matriz que contém todos os pesos da camada K à camada l. Essa matriz de pesos tem tantas linhas quantos nós na camada l (cada linha representando um vetor de pesos em um dos neurônios da camada l) e tantas colunas quantos nós na camada anterior K (cada coluna representando um vetor de pesos saindo de um dos nós da camada K). A multiplicação dessa matriz de pesos pelo vetor de ativação para a camada K resulta em um vetor em que cada elemento representa a soma ponderada das entradas para um dos nós da camada l. Para obter as entradas da função de ativação, adicionamos os vieses a esse vetor, que foram coletados em um vetor.

Agora, usando multiplicação matriz-vetor, adição de vetores e funções elementares, podemos expressar as operações para calcular todas as entradas para uma camada. Anteriormente, esses cálculos exigiam loops aninhados, mas agora podemos realizá-los eficientemente de maneira vetorizada.

Avançando, podemos estender essa abordagem vetorizada para o passe para trás também. Em vez de considerar um neurônio por vez, podemos calcular o delta para um nó na camada K como uma soma ponderada de todos os deltas na próxima camada, multiplicado pela derivada da função de ativação desse nó. Novamente, podemos expressar essa soma ponderada como um produto escalar. Multiplicando um vetor de linha de pesos saindo do nó 3 pelo vetor de deltas para a camada l e depois multiplicando pela derivada de ativação, podemos calcular o vetor delta para a camada K. Usando uma matriz de peso que coleta todos os pesos para a camada l neurônios e multiplicando-o pelo vetor de deltas para a camada l, obtemos uma matriz cujas dimensões coincidem com a matriz peso.

Ao alavancar as operações de matriz, podemos obter ganhos significativos de desempenho na computação de redes neurais densamente conectadas de feed-forward. Isso é particularmente vantajoso porque as operações de matriz podem ser executadas com eficiência em hardware especializado, como processadores gráficos (GPUs), que podem acelerar bastante esses cálculos.

Quando representamos nossos cálculos de rede neural usando matrizes, podemos executar as atualizações de passagem para frente, passagem para trás e peso de maneira altamente eficiente e paralelizada. Vamos recapitular as principais etapas:

  1. Forward Pass: Podemos calcular as ativações de cada camada para um lote inteiro de dados realizando a multiplicação matriz-vetor e a aplicação da função de ativação elemento a elemento. Ao organizar as ativações em uma matriz, onde cada coluna representa as ativações para um ponto de dados diferente, podemos calcular com eficiência as ativações para todo o lote.

  2. Backward Pass: Da mesma forma, podemos calcular os deltas (gradientes de erro) para cada camada de maneira vetorizada. Ao representar os deltas como uma matriz, onde cada coluna corresponde aos deltas para um ponto de dados específico, podemos realizar a multiplicação matriz-vetor e a multiplicação elementar com derivadas de ativação para calcular eficientemente os deltas para todo o lote.

  3. Atualizações de peso: Para atualizar os pesos e desvios, podemos usar operações de matriz para calcular o produto escalar entre a matriz de deltas e a transposição da matriz de peso. Esta operação produz uma matriz de atualizações de peso, onde cada entrada representa a atualização para um peso específico. Dividindo os produtos escalares pelo tamanho do lote, obtemos a atualização média e, em seguida, podemos atualizar os pesos subtraindo a taxa de aprendizado multiplicada pela atualização média. As atualizações de viés são calculadas tomando a média dos vetores delta nas colunas e subtraindo a taxa de aprendizado multiplicada pela média dos vieses.

Ao vetorizar esses cálculos e alavancar as operações de matriz, podemos obter eficiência computacional significativa e aproveitar a aceleração de hardware para processamento paralelo. Essa abordagem nos permite treinar redes neurais de grande escala com eficiência, tornando o aprendizado profundo viável em uma ampla gama de tarefas e conjuntos de dados.

Vale a pena observar que, embora o texto forneça uma visão geral de alto nível sobre vetorizar e alavancar operações de matriz, os detalhes reais da implementação podem variar dependendo da linguagem de programação ou estrutura usada. Diferentes linguagens e frameworks podem ter suas próprias funções otimizadas e bibliotecas para operações de matriz, melhorando ainda mais o desempenho.

Além dos benefícios de desempenho, alavancar operações de matriz em aprendizado profundo tem outras vantagens:

  1. Simplicidade e legibilidade do código: ao usar operações de matriz, o código para cálculos de rede neural torna-se mais conciso e fácil de entender. Em vez de escrever loops explícitos para pontos de dados individuais, podemos expressar os cálculos de uma forma mais compacta e intuitiva usando operações de matriz.

  2. Compatibilidade de software: muitas estruturas e bibliotecas populares de aprendizado profundo, como TensorFlow e PyTorch, fornecem implementações eficientes de operações de matriz. Essas estruturas geralmente utilizam bibliotecas de álgebra linear otimizadas, como BLAS (subprogramas de álgebra linear básica) ou cuBLAS (subprogramas de álgebra linear básica CUDA), para acelerar cálculos de matriz em CPUs ou GPUs. Ao aproveitar essas estruturas, podemos nos beneficiar de suas implementações otimizadas e garantir a compatibilidade com outros componentes do pipeline de aprendizado profundo.

  3. Generalização para outros tipos de camada: as operações de matriz podem ser aplicadas não apenas a camadas densamente conectadas, mas também a outros tipos de camada, como camadas convolucionais e camadas recorrentes. Ao expressar os cálculos em forma de matriz, podemos aproveitar as mesmas operações e otimizações de matriz eficientes em diferentes tipos de camadas, simplificando a implementação e melhorando o desempenho geral.

  4. Integração com aceleração de hardware: hardware especializado, como GPUs ou unidades de processamento de tensor (TPUs), são projetados para acelerar cálculos de matriz. Esses aceleradores de hardware se destacam na execução de operações de matriz paralela em larga escala, tornando-os ideais para cargas de trabalho de aprendizado profundo. Ao utilizar as operações de matriz, podemos nos integrar perfeitamente com esses aceleradores de hardware e aproveitar ao máximo seus recursos, levando a acelerações significativas nos tempos de treinamento e inferência.

Em resumo, alavancar operações de matriz em aprendizado profundo oferece benefícios de desempenho, simplicidade de código, compatibilidade de software e integração com aceleradores de hardware. Ao expressar cálculos de redes neurais em forma de matriz e utilizar operações de matriz otimizadas, podemos treinar e implantar com eficiência modelos de aprendizado profundo em uma variedade de tarefas e plataformas.

Making Neural Networks Fast with Vectorization (DL 10)
Making Neural Networks Fast with Vectorization (DL 10)
  • 2022.09.23
  • www.youtube.com
Davidson CSC 381: Deep Learning, Fall 2022
 

Gradientes desaparecendo (ou explodindo) (DL 11)



Gradientes desaparecendo (ou explodindo) (DL 11)

À medida que nos aprofundamos na ampliação das redes neurais para resolver problemas maiores, torna-se necessário adicionar mais camadas. No entanto, redes mais profundas podem encontrar problemas durante o treinamento causados pelo desaparecimento ou explosão de gradientes. Vamos considerar uma rede neural profunda com ativações sigmoides para as camadas ocultas. A visualização de tal rede com vários nós e camadas torna-se impraticável. Em vez disso, podemos representá-lo com um diagrama de blocos, onde cada coluna representa uma camada e as funções de ativação são indicadas dentro de cada bloco.

Outra forma de visualizar a rede é por meio de um gráfico computacional, mostrando a sequência de operações aplicadas a cada lote de dados. Começando com matrizes de entrada, realizamos multiplicações de matrizes, adição de bias e aplicamos funções de ativação em cada camada. Esse processo continua pelas camadas ocultas até chegarmos à camada de saída, onde a função de ativação muda para softmax. A perda é calculada a partir das ativações e alvos.

Expressando os cálculos matematicamente, multiplicamos as matrizes de peso pelas matrizes de entrada, adicionamos vieses e aplicamos funções de ativação. As expressões continuam pelas camadas ocultas, chegando finalmente à camada de saída onde a ativação softmax é aplicada. As ativações de saída e alvos são usados para calcular a perda.

Ao calcular derivadas para atualizações de gradiente descendente, a regra da cadeia é aplicada repetidamente. A partir da camada de saída, calculamos deltas multiplicando com a transposição de matrizes de peso e multiplicando elemento a elemento com a derivada da função de ativação. Este processo propaga deltas para trás através das camadas ocultas.

O problema do gradiente de desaparecimento surge ao usar funções de ativação sigmoide para camadas ocultas. A derivada de um sigmóide tende a ter valores pequenos, fazendo com que os deltas diminuam a cada propagação reversa. Como resultado, os gradientes se tornam cada vez menores, dificultando a atualização efetiva dos pesos, especialmente nas primeiras camadas.

O aprendizado profundo enfrentou dificuldades no treinamento de redes neurais profundas devido ao problema do gradiente de fuga. No entanto, cerca de uma década atrás, foram criadas abordagens para superar esse desafio. Um método é alterar a inicialização da matriz de pesos, gerando pesos aleatórios iniciais maiores para neutralizar os deltas decrescentes causados pelas derivadas sigmoides.

O avanço mais significativo veio com a adoção de unidades lineares retificadoras (ReLU) como funções de ativação. Ao contrário dos derivados sigmoides, os derivados ReLU tendem a não reduzir os deltas significativamente. Essa propriedade tornou as ativações ReLU mais populares, pois facilitaram o treinamento de redes neurais profundas.

No entanto, o uso de ativações ReLU apresenta o risco de explosão de gradientes, onde os deltas podem se tornar maiores à medida que nos propagamos para trás. Para mitigar isso, é aconselhável escolher pesos iniciais menores em comparação com ativações sigmóides.

Os neurônios ReLU são preferidos para camadas ocultas devido à sua facilidade de treinamento e eficiência computacional. A inicialização de pesos depende da função de ativação empregada, e a comunidade de aprendizado profundo fez progressos substanciais na determinação de métodos de inicialização de peso apropriados para diferentes tipos de ativação. As bibliotecas modernas de aprendizado profundo geralmente lidam com a inicialização de peso automaticamente com base nas ativações especificadas.

Vanishing (or Exploding) Gradients (DL 11)
Vanishing (or Exploding) Gradients (DL 11)
  • 2022.09.30
  • www.youtube.com
Davidson CSC 381: Deep Learning, Fall 2022
 

Evitando o Overfitting da Rede Neural (DL 12)



Evitando o Overfitting da Rede Neural (DL 12)

À medida que trabalhamos com redes neurais maiores para aprendizado profundo, o risco de overfitting aumenta significativamente. É crucial entender as causas do overfitting e como detectá-lo e preveni-lo. O overfitting ocorre quando um modelo de aprendizado de máquina se torna muito específico para o conjunto de treinamento e falha ao generalizar para novos dados. A causa principal é quando um modelo tem liberdade excessiva de parâmetros em comparação com a quantidade de dados de treinamento, tornando modelos com altos graus de liberdade ou pequenos conjuntos de treinamento mais suscetíveis.

Na regressão polinomial, por exemplo, aumentar o grau do polinômio fornece mais parâmetros para ajuste fino, permitindo que o modelo ajuste os dados de treinamento com mais precisão. No entanto, isso pode prejudicar sua capacidade de generalizar para exemplos além do conjunto de treinamento.

No contexto das redes neurais, os pesos e vieses servem como parâmetros. À medida que as redes neurais se tornam maiores com mais pesos, elas têm maior liberdade na escolha de seus parâmetros. Portanto, ao treinar uma grande rede neural, é importante estar atento ao possível overfitting, com o principal método de identificação sendo o monitoramento do conjunto de validação.

Dividir o conjunto de dados em conjuntos de treinamento, validação e teste ajuda a avaliar a generalização da rede. Quando ocorre overfitting, há uma discrepância perceptível na perda ou precisão entre o conjunto de treinamento e o conjunto de validação. Idealmente, a perda do conjunto de treinamento deveria diminuir ao longo das épocas, mas se começar a aumentar, isso indica um problema. Da mesma forma, a perda do conjunto de validação deve diminuir em linha com a perda do conjunto de treinamento e, se começar a aumentar enquanto a perda do conjunto de treinamento continua a diminuir, isso significa um forte overfitting. A precisão do modelo em ambos os conjuntos também pode revelar overfitting em problemas de classificação.

Para lidar com o overfitting, uma abordagem é atacar diretamente suas causas. Dados insuficientes podem ser mitigados com a aquisição de mais dados, como visto em sucessos de aprendizado profundo em larga escala usando vastos conjuntos de dados. No entanto, se a obtenção de mais dados não for viável, reduzir o modelo pode ajudar a combater o overfitting e melhorar a eficiência. A diretriz geral é escolher uma arquitetura de rede neural que seja dimensionada adequadamente para o problema específico em questão.

Se as preocupações com overfitting persistirem, existem técnicas avançadas a serem consideradas. Uma dessas técnicas é a parada antecipada, onde o treinamento é interrompido quando uma separação entre os conjuntos de treinamento e validação é observada, antes mesmo de atingir o número máximo de épocas. Além disso, métodos como Dropout e regularização de peso podem ser empregados para evitar o overfitting.

Dropout envolve zerar aleatoriamente algumas ativações na rede durante o treinamento para evitar que neurônios específicos tenham um impacto excessivo. Ao descartar os neurônios, as camadas subsequentes da rede são compelidas a aprender funções que não dependem excessivamente desses neurônios, reduzindo assim o overfitting. Ajustes são feitos durante o teste para compensar a ausência de Dropout.

A regularização de peso combate o overfitting desencorajando os pesos a ficarem muito grandes. Isso é obtido pela incorporação de um termo de penalidade na função de perda que desencoraja pesos grandes. Uma forma comum de regularização de peso é a regularização L2, onde a soma dos quadrados de todos os pesos é adicionada como um termo quadrático de penalidade. Esse termo de regularização, controlado por um hiperparâmetro, equilibra a ênfase na regularização versus a função de perda original.

É crucial monitorar o overfitting ao treinar redes neurais. Considere o tamanho do modelo e os dados disponíveis e empregue técnicas como parada antecipada, Dropout e regularização para lidar com o overfitting quando necessário.

Avoiding Neural Network Overfitting (DL 12)
Avoiding Neural Network Overfitting (DL 12)
  • 2022.10.01
  • www.youtube.com
Davidson CSC 381: Deep Learning, Fall 2022
 

Camadas Convolucionais (DL 13)



Camadas Convolucionais (DL 13)

As redes neurais que consideramos até agora foram densamente conectadas, onde cada camada está conectada à próxima camada. Redes densas são um bom ponto de partida, pois são gerais e versáteis. No entanto, para aplicações específicas, podemos escolher arquiteturas alternativas que sejam mais eficazes. Neste vídeo, exploramos a primeira arquitetura alternativa chamada camadas convolucionais.

As redes convolucionais são adequadas para tarefas de processamento de imagens. Em vez de tratar a imagem de entrada como um vetor plano, as camadas convolucionais preservam as informações espaciais da imagem. Cada neurônio em uma camada convolucional é conectado apenas a uma pequena região da imagem, capturando a proximidade espacial dos pixels. Ao usar essa arquitetura, a rede ganha vantagem no aprendizado de tarefas de processamento de imagem.

As camadas convolucionais têm duas ideias principais: conectividade local e amarração de peso. A conectividade local significa que os neurônios estão conectados a uma pequena sub-região da imagem, permitindo-lhes aprender características específicas. A amarração de peso garante que a mesma função seja aplicada a diferentes regiões da imagem. Ao compartilhar pesos, a rede pode aprender a aplicar a mesma função em várias regiões.

Camadas convolucionais introduzem novos hiperparâmetros a serem considerados. Isso inclui o tamanho do kernel (determinando o tamanho da sub-região), passo (quanto a janela desliza), número de canais de saída (número de funções aplicadas a cada janela), preenchimento (manipulação das bordas da imagem) e pooling (agregação dos resultados dos neurônios para reduzir a dimensionalidade).

O agrupamento ajuda a reduzir o número de parâmetros na rede agregando os resultados dos neurônios em uma região. Isso pode ser feito calculando a média ou tomando o valor máximo. O agrupamento é útil quando não precisamos de uma localização precisa de feições, mas sim da presença geral de feições em uma região.

As redes convolucionais fornecem uma maneira mais eficiente de processar imagens em comparação com redes densas. Eles aproveitam as informações espaciais e reduzem o número de parâmetros, tornando-os mais fáceis de treinar.

O agrupamento ajuda a reduzir a dimensionalidade dos mapas de recursos e o número de parâmetros nas camadas subsequentes. Ao agregar os resultados dos neurônios vizinhos, o agrupamento retém as informações mais importantes enquanto descarta alguns detalhes espaciais.

Existem diferentes tipos de operações de agrupamento, como agrupamento máximo e agrupamento médio. No pooling máximo, o valor máximo dentro de cada janela de pooling é selecionado como o valor representativo para aquela região. Isso ajuda a capturar os recursos mais proeminentes presentes na janela. Por outro lado, o pooling médio leva o valor médio da janela, fornecendo uma representação mais suave dos recursos.

Após o agrupamento, podemos empilhar camadas convolucionais adicionais para aprender recursos mais complexos e abstratos da saída da camada anterior. Cada camada subsequente captura recursos de nível superior combinando as informações de vários campos receptivos menores.

Para resumir, redes neurais convolucionais (CNNs) com camadas convolucionais e de agrupamento são adequadas para tarefas de processamento de imagens. As camadas convolucionais capturam a proximidade espacial e exploram o compartilhamento de peso, permitindo que a rede aprenda recursos locais com eficiência. O agrupamento reduz a dimensionalidade e extrai informações importantes, permitindo que as camadas subsequentes aprendam representações mais abstratas. Esse aprendizado de recursos hierárquicos torna as CNNs poderosas para vários aplicativos de visão computacional, incluindo classificação de imagens, detecção de objetos e segmentação de imagens.

Convolutional Layers (DL 13)
Convolutional Layers (DL 13)
  • 2022.10.15
  • www.youtube.com
Davidson CSC 381: Deep Learning, Fall 2022
 

Treinando grandes redes com poucos dados: aprendizado de transferência e aumento de dados (DL 14)



Treinando grandes redes com poucos dados: aprendizado de transferência e aumento de dados (DL 14)

No aprendizado profundo, é comum encontrar problemas em que queremos aproveitar o poder do aprendizado profundo, mas não temos dados suficientes para treinar um modelo profundo com eficiência. Esse problema surge em vários domínios e arquiteturas de redes neurais. Vamos nos concentrar no cenário de uma tarefa de processamento de imagem usando uma rede convolucional com um pequeno conjunto de dados de imagem. No entanto, os conceitos discutidos aqui também podem ser aplicados a outros domínios.

As redes convolucionais profundas são conhecidas por sua eficácia no processamento de imagens. No entanto, treinar uma rede convolucional profunda em um pequeno conjunto de dados de imagem normalmente levaria a um superajuste extremo, em que a rede apenas memoriza os dados de entrada. Nesses casos, precisamos encontrar maneiras de fazer melhor uso de nossos dados ou explorar fontes alternativas de dados.

Uma abordagem para superar o problema de escassez de dados é por meio do aumento de dados e do aprendizado de transferência. O aprendizado por transferência é um conceito fundamental no aprendizado profundo moderno e é surpreendentemente simples de explicar. A ideia é treinar uma rede neural profunda em um problema relacionado, mas mais geral, e reutilizar essa rede pré-treinada com treinamento adicional em nosso conjunto de dados específico para resolver nosso problema.

Para uma tarefa de processamento de imagem, podemos treinar uma rede em grandes conjuntos de dados de imagens coletados da Web ou de competições de aprendizado de máquina. A rede pré-treinada teria uma última camada dedicada a classificar as imagens desses conjuntos de dados. Ao trabalhar em uma tarefa de processamento de imagem diferente com uma camada de saída distinta, podemos descartar a camada de saída da rede pré-treinada e adicionar nossa própria camada de saída que corresponda aos requisitos do nosso problema. Isso envolve adicionar novos pesos que conectam a nova camada de saída à última camada da rede pré-treinada, que pode ser treinada usando nosso pequeno conjunto de dados.

A expectativa por trás da eficácia do aprendizado por transferência reside na suposição de que, se o problema de pré-treinamento for semelhante o suficiente ao nosso problema específico, a funcionalidade aprendida pela rede pré-treinada será transferida, beneficiando nosso problema. Podemos pensar na rede pré-treinada como tendo aprendido funções genéricas de processamento de imagem e podemos utilizar essa transformação aprendida ao treinar nossa rede no pequeno conjunto de dados.

Ao aplicar o aprendizado por transferência, temos várias opções para utilizar o modelo pré-treinado. Precisamos descartar a camada de saída para corresponder ao nosso problema, mas também podemos remover outras camadas se acreditarmos que o pré-processamento útil já foi realizado. Além disso, podemos adicionar várias camadas para executar um processamento mais sofisticado para nosso problema específico. Para preservar qualquer processamento útil feito pelas primeiras camadas, podemos congelar seus pesos durante o retreinamento, especialmente se o modelo pré-treinado tiver sido treinado em um grande conjunto de dados e nosso problema tiver um pequeno conjunto de dados.

As bibliotecas de aprendizado profundo geralmente fornecem zoológicos de modelos, que são coleções de modelos pré-treinados para diferentes tipos de problemas. Esses modelos servem como pontos de partida para o aprendizado por transferência, tornando o aprendizado profundo acessível para resolver uma ampla gama de problemas.

No entanto, mesmo com a ajuda do aprendizado de transferência, nosso conjunto de dados ainda pode ser muito pequeno para treinar uma rede com eficiência, mesmo nas últimas camadas. Nesses casos, precisamos extrair o máximo de informações possível de nosso conjunto de dados, o que nos leva à ideia de aumento de dados.

O aumento de dados envolve a aplicação de transformações ao conjunto de dados que parecem diferentes para a rede neural, mas retêm o mesmo significado para humanos ou outros sistemas que utilizam o modelo aprendido. No caso do processamento de imagens, várias transformações podem ser aplicadas sem alterar a percepção humana da imagem representada. Por exemplo, girar ou ampliar uma imagem não altera seu conteúdo subjacente. Essas transformações introduzem diferenças substanciais nos dados de entrada vistos pela rede neural, tornando difícil para a rede memorizar exemplos específicos ou confiar em detalhes finos da entrada.

No entanto, devemos garantir que as transformações não alterem o significado dos dados e pareçam distintas da perspectiva da rede. Por exemplo, a tradução de uma imagem pode ter pouco impacto na capacidade de generalização de uma rede convolucional, dada a sua invariância de tradução inerente.

As técnicas de aumento de dados incluem a adição de ruído aleatório, leve desfoque e outras modificações que não distorcem a percepção humana da imagem. Essas transformações podem ser facilmente calculadas e aplicadas aleatoriamente a cada lote de dados durante o treinamento. Ao treinar a rede para várias épocas no conjunto de dados aumentado, evitamos que ela simplesmente memorize os exemplos de entrada exatos e a encorajamos a generalizar melhor.

É importante observar que as técnicas de aumento de dados não são tão eficazes quanto ter mais dados para treinar, incluindo dados relacionados para pré-treinamento. No entanto, quando combinado com o aprendizado por transferência, o aumento de dados nos permite lidar com uma ampla gama de problemas usando redes neurais profundas.

Em resumo, quando confrontado com um problema que requer aprendizado profundo, mas carece de dados suficientes, o aprendizado por transferência e o aumento de dados são estratégias valiosas. O aprendizado por transferência envolve treinar uma rede em um problema relacionado e reutilizá-la, com treinamento adicional, para nosso problema específico. O aumento de dados envolve a aplicação de transformações ao conjunto de dados que retêm seu significado enquanto introduzem variações para uma melhor generalização. Embora essas técnicas não substituam mais dados, elas oferecem soluções práticas para alavancar o aprendizado profundo em cenários com disponibilidade limitada de dados.

Training large networks with little data: transfer learning and data augmentation (DL 14)
Training large networks with little data: transfer learning and data augmentation (DL 14)
  • 2022.10.21
  • www.youtube.com
Davidson CSC 381: Deep Learning, Fall 2022
 

Redes Residuais e Ignorar Conexões (DL 15)



Redes Residuais e Ignorar Conexões (DL 15)

As redes neurais profundas são poderosas, mas difíceis de treinar devido à necessidade de mais dados à medida que o número de parâmetros aumenta. O treinamento de redes profundas geralmente mostra um progresso lento na diminuição da perda em comparação com redes rasas. Isso ocorre porque os dados de entrada, passando por várias camadas com pesos inicializados aleatoriamente, são embaralhados em ruído aleatório, dificultando a propagação de gradientes significativos.

Para resolver esse problema, são introduzidas conexões de salto. As conexões de salto envolvem o agrupamento de camadas em blocos e o fornecimento de dois caminhos para o fluxo de dados dentro e ao redor de cada bloco. A saída de um bloco é combinada com sua entrada usando adição ou concatenação, permitindo que a entrada passe e torne as entradas e atualizações mais significativas.

Blocos residuais, que incorporam conexões de salto, têm várias vantagens. Primeiro, eles simplificam a tarefa de aprendizado para cada bloco, concentrando-se no aumento dos dados existentes, em vez de descobrir tudo sobre a entrada. Em segundo lugar, eles facilitam o fluxo de gradientes, fornecendo caminhos mais curtos para atualizar cada camada da rede. Essas vantagens levam a um progresso de treinamento mais rápido e melhor desempenho em comparação com redes rasas.

Ao usar blocos residuais, é crucial abordar a compatibilidade de forma entre os tensores de entrada e saída, especialmente ao usar camadas convolucionais. Uma consideração especial deve ser dada para combinar as formas e evitar uma explosão no número de parâmetros, principalmente ao usar concatenação. Normalmente, a adição é preferível à concatenação para a maioria das conexões de salto em grandes redes residuais.

Convoluções um a um podem ser empregadas para preservar altura, largura e dimensões de canal em blocos convolucionais. Eles nos permitem ajustar a profundidade da camada de saída especificando o número de filtros na camada convolucional.

Embora existam várias variações e arquiteturas de redes residuais, a ideia principal permanece consistente – melhorar o treinamento de redes neurais profundas aproveitando conexões de salto e blocos residuais. Essas técnicas permitem um melhor fluxo de informações, treinamento mais rápido e maior desempenho do modelo. Explorar diferentes arquiteturas residuais e suas implementações específicas é recomendado para maior compreensão e aplicação.

Além disso, é importante considerar algumas preocupações práticas ao configurar uma rede residual. Uma dessas preocupações é gerenciar a compatibilidade de forma entre os tensores de entrada e saída ao usar conexões de salto. Isso se torna mais complexo quando camadas convolucionais estão envolvidas, pois a altura, a largura e as dimensões do canal precisam se alinhar adequadamente.

Para simplificar os blocos convolucionais, passos um a um e preenchimento apropriado podem ser usados para preservar a altura e a largura da imagem de entrada. Isso garante que pelo menos as dimensões espaciais correspondam ao adicionar os tensores de entrada e saída de um bloco. Para abordar a dimensão do canal, podem ser empregadas convoluções um por um. Embora essas convoluções possam parecer triviais, pois recebem entrada de um único pixel, elas efetivamente nos permitem ajustar a profundidade da camada de saída. Ao especificar o número de filtros na convolução um a um, podemos aumentar ou diminuir a profundidade do tensor de saída, tornando as formas compatíveis.

Ao trabalhar com grandes redes residuais, é essencial encontrar um equilíbrio entre o número de conexões de salto e a explosão de parâmetros. O uso excessivo de concatenação pode levar a um aumento substancial no tamanho do tensor de ativação e no número de parâmetros. Portanto, é aconselhável limitar o número de conexões de salto baseadas em concatenação e preferir a adição para a maioria delas.

A modularidade é outra vantagem oferecida pelas redes residuais. A estrutura uniforme dos blocos residuais e a capacidade de adicionar facilmente mais blocos facilitam a construção de redes mais profundas e poderosas. Ao aumentar incrementalmente o número de blocos, pode-se criar uma rede que se adapte ao compromisso desejado entre recursos computacionais e capacidade do modelo.

Embora as redes residuais tenham se mostrado altamente eficazes, vale a pena notar que existem vários outros tipos de arquiteturas residuais com diferentes opções de design, como a incorporação de camadas de normalização ou vários caminhos dentro de um bloco. Explorar essas variações pode fornecer mais informações e possibilidades para melhorar o treinamento de redes neurais profundas.

No geral, as redes residuais fornecem uma abordagem valiosa para o treinamento de redes neurais profundas, aproveitando conexões de salto e blocos residuais. Eles simplificam as tarefas de aprendizado, aceleram a propagação de gradiente e oferecem modularidade para a construção de poderosas arquiteturas de rede. Compreender os conceitos e considerações por trás das redes residuais contribui para avanços na pesquisa de aprendizado profundo e aplicações práticas.

Residual Networks and Skip Connections (DL 15)
Residual Networks and Skip Connections (DL 15)
  • 2022.10.23
  • www.youtube.com
Davidson CSC 381: Deep Learning, Fall 2022
 

Incorporações de palavras (DL 16)



Incorporações de palavras (DL 16)

A maioria dos dados com os quais trabalhamos em redes neurais são dados de imagem. No entanto, também podemos usar redes neurais para outros tipos de problemas, como dados de texto. Representar dados de texto como entrada para uma rede neural não é tão simples quanto com imagens.

Nos dados de imagem, podemos usar formatos de armazenamento digital padrão, que representam imagens como matrizes de pixels vermelhos, verdes e azuis. Essa representação é conveniente porque captura relações espaciais entre pixels e intensidades de cores relevantes.

Para dados de texto, a representação digital padrão, onde os caracteres são convertidos em ASCII ou outros valores digitais, não é diretamente relevante para a forma como as redes neurais aprendem. Vários métodos podem ser considerados para converter valores ASCII em entradas válidas para uma rede neural, como usar a representação binária de valores ASCII ou normalizar o intervalo de caracteres entre 0 e 1. No entanto, essas representações não capturam a semântica do palavras da mesma forma que um array representa uma imagem.

Uma abordagem é criar vetores gigantes usando codificações one-hot de todo o vocabulário. Cada palavra tem uma representação vetorial única, o que resolve o problema de palavras semelhantes terem significados diferentes. No entanto, isso resulta em uma expansão massiva de dimensões e perde o equilíbrio entre a similaridade de palavras e a dimensionalidade.

Para resolver isso, buscamos uma representação de dados de texto que alcance vários objetivos. Em primeiro lugar, queremos uma representação por palavra que não seja excessivamente dimensional. Em segundo lugar, queremos que a representação carregue informações semânticas, onde palavras semelhantes tenham representações vetoriais semelhantes. Este tem sido um problema desafiador no processamento de linguagem natural.

Nos últimos anos, as redes neurais têm sido usadas com sucesso para gerar representações de entrada apropriadas para dados de texto. Uma abordagem envolve a extração de n-gramas, que são sequências de n palavras, dos dados de texto. Esses n-gramas fornecem informações contextuais para um ponto específico em uma frase ou documento.

A ideia é treinar a rede usando a representação do dicionário one-hot como entrada e prever a codificação one-hot do n-gram circundante. Por exemplo, podemos usar uma entrada de 5 gramas e prever as outras quatro palavras no n-grama. Ao treinar a rede em palavras próximas usando n-grams, esperamos que palavras semanticamente semelhantes tenham representações semelhantes e recebam feedback de gradiente semelhante durante o treinamento.

Ao descartar a camada de saída da rede, podemos usar o vetor de ativações na última camada oculta como uma codificação numérica da palavra de entrada. Essa representação é conhecida como incorporação de palavras, que captura o contexto da palavra no texto real. Existem várias abordagens para produzir incorporações de palavras, como Word2Vec.

Em vez de treinar nossas próprias incorporações de palavras, podemos utilizar incorporações pré-treinadas geradas por outras pessoas com mais dados e recursos computacionais. Podemos gerar facilmente uma tabela de pesquisa para traduzir um documento de texto arbitrário na incorporação de palavras. Essa abordagem nos permite usar incorporações de palavras como entrada para nossa rede neural para aprendizado de máquina em dados de texto.

O uso de incorporações de palavras como entrada para nossa rede neural para aprendizado de máquina em dados de texto oferece várias vantagens. Esses embeddings pré-treinados foram gerados por modelos com dados extensos e recursos computacionais, resultando em representações ricas e significativas de palavras.

Ao passar um documento por uma incorporação de palavras existente, podemos obter uma representação vetorizada do texto. Essa representação vetorial captura as informações contextuais das palavras e pode ser usada como entrada para nossa rede neural.

O uso de incorporação de palavras permite o aprendizado de transferência, onde o conhecimento obtido de uma tarefa (por exemplo, treinar o modelo de incorporação de palavras) pode ser aplicado a outra tarefa relacionada (por exemplo, nosso problema específico de aprendizado de máquina com dados de texto). Em vez de treinar nossos próprios embeddings do zero, podemos aproveitar os embeddings existentes, aproveitando seus recursos de generalização.

Assim que tivermos a representação de incorporação de palavras do texto, podemos prosseguir com o treinamento de nossa rede neural. A rede neural pode usar os vetores de incorporação de palavras como entrada e aprender a fazer previsões com base nas informações semânticas codificadas nas incorporações.

A arquitetura específica da rede neural dependerá da tarefa em questão. Pode ser uma rede neural recorrente (RNN) que considera a natureza sequencial do texto, uma rede neural convolucional (CNN) que captura padrões locais ou uma combinação de ambas. A rede pode ser projetada para executar tarefas como análise de sentimento, classificação de texto, geração de linguagem ou tradução automática, entre outras.

Durante o processo de treinamento, a rede neural aprende a reconhecer padrões e fazer previsões com base nas incorporações de palavras de entrada. Os gradientes propagados pela rede atualizam os pesos, otimizando a capacidade da rede de fazer previsões precisas.

Ao utilizar incorporações de palavras, abordamos os desafios de representar dados de texto de maneira significativa para redes neurais. Essas incorporações capturam relações semânticas entre palavras, permitindo que a rede aprenda com o contexto e faça previsões informadas. Além disso, aproveitar incorporações pré-treinadas economiza recursos computacionais e melhora a eficiência de nosso pipeline de aprendizado de máquina.

Ao usar a incorporação de palavras como entrada para nossa rede neural, podemos aproveitar o poder do aprendizado de transferência e das representações semânticas. Essa abordagem aumenta significativamente a capacidade das redes neurais de processar e entender dados de texto, abrindo a porta para várias tarefas e aplicativos de processamento de linguagem natural.

Word Embeddings (DL 16)
Word Embeddings (DL 16)
  • 2020.10.20
  • www.youtube.com
Davidson CSC 381: Deep Learning, F'20, F'22
 

Redes Neurais Recorrentes (DL 17)



Redes Neurais Recorrentes (DL 17)

Em nossa aula anterior, discutimos o uso de word embeddings, que são representações treináveis de palavras como vetores com um número moderado de dimensões. Essas incorporações podem servir como base para a construção de sistemas de aprendizado de máquina que operam em dados de texto. Para tarefas simples, como classificação de sentimentos de análises de produtos, pode ser suficiente dividir o documento em palavras, incorporar cada palavra e passar a sequência de incorporações como entrada para uma rede neural. No entanto, para tarefas mais complexas, como respostas de conversação ou tradução automática, é necessária uma abordagem mais sofisticada.

Para ilustrar isso, usamos o exemplo de prever a próxima palavra em uma frase. Essa tarefa é mais desafiadora do que a classificação de sentimentos, mas mais fácil do que a tradução automática. Ao configurar redes neurais para operar em dados de texto, enfrentamos duas abordagens amplas. Um extremo é fornecer o documento inteiro como entrada para a rede, enquanto o outro extremo é fornecer uma única palavra como entrada. No entanto, ambas as abordagens têm desvantagens: operar em todo o documento limita os exemplos de treinamento e lida com tamanhos variados de documentos, enquanto operar em uma palavra por vez ignora o contexto circundante necessário para entender o significado da palavra e representar conceitos que não são mapeados diretamente para as palavras .

Para encontrar um meio-termo entre esses extremos, introduzimos um método que opera em uma palavra por vez, mas incorpora a memória da rede de entradas anteriores para reter o contexto importante. A ideia básica é alimentar a saída da rede de volta para sua entrada, permitindo que ela use suas ativações anteriores como um resumo das palavras vistas até agora. Essa abordagem dá origem a redes neurais recorrentes (RNNs), que podem ser visualizadas desenrolando-as ao longo do tempo, representando a rede em diferentes pontos no tempo conforme as palavras são inseridas e a saída da rede é realimentada.

Para a próxima tarefa de previsão de palavras, a saída da camada oculta do RNN serve como um resumo das palavras anteriores na frase. O RNN aprende a prever a próxima palavra com base nesse contexto. As entradas para o RNN são vetores de incorporação, enquanto as saídas estão em uma codificação de dicionário para permitir a expressão de incerteza sobre diferentes saídas possíveis.

RNNs de treinamento envolvem gradientes de computação para atualizar os pesos da rede. O desafio surge do fato de que os pesos influenciam a perda não apenas por meio de sua aplicação à entrada atual, mas também por meio de seu impacto nas entradas de intervalos de tempo anteriores. Para calcular o efeito dos pesos na perda em uma etapa de tempo específica, precisamos considerar tanto seu impacto na entrada atual quanto sua influência nas etapas de tempo anteriores e sua contribuição para o erro na etapa de tempo atual.

As redes neurais recorrentes geralmente empregam funções de ativação sigmoide ou tanh porque são propensas ao problema do gradiente de fuga. Esse problema surge quando os gradientes não podem se propagar muito para trás na rede, limitando a capacidade de capturar dependências de longo prazo. Consequentemente, RNNs simples não são eficazes em tarefas que exigem contexto extenso e memória de longo prazo, e é por isso que nos concentramos em sentenças em vez de documentos.

Na próxima aula, exploraremos uma variante de redes neurais recorrentes projetadas especificamente para resolver o problema de memória de longo prazo e obter melhor desempenho em tarefas de processamento de texto e linguagem.

Recurrent Neural Networks (DL 17)
Recurrent Neural Networks (DL 17)
  • 2020.10.22
  • www.youtube.com
Davidson CSC 381: Deep Learning, F'20, F'22
 

LSTMs (DL 18)



LSTMs (DL 18)

O objetivo desta palestra é demonstrar o uso prático de redes neurais recorrentes (RNNs) para modelagem de linguagem. Anteriormente, discutimos o uso de RNNs para prever a próxima palavra em uma frase, que serve como uma tarefa comum de pré-treinamento para RNNs. Para tarefas mais complexas, como responder a perguntas ou tradução automática, podemos empregar uma abordagem de aprendizagem por transferência. Primeiro, pré-treinamos o RNN na próxima tarefa de previsão de palavras e depois o ajustamos para a tarefa específica em que estamos interessados.

Para obter saídas mais significativas de uma RNN, focamos nas ativações ou estados ocultos que são transmitidos pela rede na direção direta ou inversa. Esses estados ocultos representam a entrada de texto geral. Por exemplo, ao traduzir uma frase, cada palavra é alimentada sequencialmente no RNN, e o estado oculto produzido na última etapa de tempo torna-se uma representação de todo o texto. Podemos então passar esse estado oculto para camadas adicionais de rede neural para resolver a tarefa desejada, como classificação ou geração de texto.

Esse processo de inserir texto em um RNN para codificá-lo em um estado de camada oculta e, em seguida, usar outro RNN como decodificador, nos permite gerar texto de saída. Ao treinar esse par de RNNs em pares de entrada-saída, podemos traduzir sentenças ou gerar respostas.

No entanto, RNNs regulares com ativações de 10h enfrentam dificuldades ao lidar com sequências mais longas devido ao desaparecimento dos gradientes. Para resolver esse problema, podemos empregar uma arquitetura chamada Long Short-Term Memory (LSTM). Os LSTMs oferecem vários caminhos para o fluxo de ativações, permitindo que os gradientes se propaguem com mais eficiência pela rede.

A camada LSTM consiste em uma entrada e uma saída. Podemos usá-los para treinar a rede em tarefas como prever a próxima palavra. A entrada é concatenada com o estado oculto anterior, enquanto um estado oculto adicional (c) é passado da rede para si mesma a cada intervalo de tempo. Este estado c permite a propagação do gradiente sem as limitações impostas pelas ativações de 10h. As funções de ativação sigmóide são usadas para controlar quais informações são retidas ou esquecidas dos estados anteriores, e esses portões são aprendidos durante o treinamento.

Os LSTMs incorporam os caminhos h e c, permitindo cálculos mais complexos em cada intervalo de tempo e facilitando a propagação rápida do gradiente por meio de vários aplicativos da rede LSTM. Embora não tenhamos conhecimento completo das funções específicas aprendidas por cada componente, a arquitetura LSTM provou ser eficaz na prática em comparação com outros tipos de RNNs.

A eficácia prática das arquiteturas LSTM reside em sua capacidade de resolver o problema do gradiente de fuga e capturar dependências de longo prazo em dados sequenciais. Ao incorporar mecanismos de gating e vários caminhos para o fluxo de informações, os LSTMs mostraram melhorias significativas em relação aos RNNs tradicionais em várias tarefas de processamento de linguagem natural.

A natureza fechada dos LSTMs permite que eles lembrem e esqueçam seletivamente informações de etapas de tempo anteriores, tornando-os adequados para modelagem e geração de sequências. As ativações sigmoides nos portões LSTM controlam o fluxo de informações, determinando o que reter e o que descartar. Essas portas aprendem com os dados de treinamento e decidem de forma adaptativa quais partes do estado oculto anterior e da entrada atual são relevantes para o intervalo de tempo atual.

A capacidade do LSTM de lembrar dependências de longo prazo é particularmente crucial na modelagem de linguagem. Na tradução de idiomas, por exemplo, entender o contexto de uma frase requer considerar toda a sequência de entrada. O estado oculto na última etapa da codificação LSTM captura o significado geral da frase, permitindo uma tradução precisa ou outras tarefas posteriores.

Além disso, os LSTMs facilitam a propagação eficiente do gradiente durante as passagens para frente e para trás. Ao preservar informações relevantes e mitigar o impacto dos gradientes de desaparecimento, os LSTMs permitem o treinamento eficaz de redes recorrentes profundas em sequências longas. Isso é feito por meio do uso de caminhos paralelos que permitem que os gradientes fluam ininterruptamente, evitando que desapareçam ou explodam à medida que atravessam a rede.

O sucesso dos LSTMs na modelagem de linguagem os tornou um bloco de construção fundamental em muitos modelos de última geração. Pesquisadores e profissionais estenderam as arquiteturas LSTM com recursos adicionais, como mecanismos de atenção, atenção multicabeça e modelos baseados em transformadores. Esses avanços aprimoram ainda mais os recursos de modelagem dos LSTMs, permitindo que eles lidem com tarefas ainda mais complexas, incluindo resumo de documentos, análise de sentimentos e geração de diálogos.

Em resumo, os LSTMs revolucionaram a modelagem de linguagem abordando as limitações dos RNNs tradicionais. Sua capacidade de capturar dependências de longo prazo, lidar com gradientes de fuga e reter seletivamente informações relevantes os tornou uma ferramenta indispensável no processamento de linguagem natural. Aproveitando as arquiteturas LSTM, pesquisadores e desenvolvedores alcançaram avanços significativos em várias tarefas relacionadas ao idioma, levando a tradução automática aprimorada, sistemas de resposta a perguntas e modelos de geração de texto.

LSTMs (DL 18)
LSTMs (DL 18)
  • 2020.10.25
  • www.youtube.com
Davidson CSC 381: Deep Learning, F'20, F'22
 

Transformadores e Autoatenção (DL 19)



Transformadores e Autoatenção (DL 19)

A arquitetura do Transformer, baseada em redes neurais, alcançou desempenho de ponta em modelagem de linguagem e várias outras tarefas. Vamos explorar as ideias centrais por trás dos Transformers, incluindo sua construção a partir de blocos de auto-atenção e a integração de recursos de rede recorrentes e residuais.

As redes neurais recorrentes (RNNs) se destacam no processamento de texto, construindo gradualmente um estado oculto que representa o conteúdo da informação de um documento. Eles recebem incorporações de palavras como entrada e podem ser treinados em tarefas não supervisionadas, como prever a próxima palavra em uma frase. No entanto, RNNs, incluindo variantes LSTM, lutam com entradas longas devido à necessidade de processamento repetido por meio de camadas.

Por outro lado, as redes residuais são eficazes para lidar com modelos profundos com muitas camadas, utilizando conexões residuais. Essas conexões simplificam o treinamento, permitindo que cada bloco aprimore a entrada e permita que os gradientes se propaguem com mais eficiência.

As redes residuais têm vantagens adicionais no processamento de imagens, como alavancar a convolução dentro dos blocos residuais, que se alinha bem com as funções relacionadas à imagem. Para combinar os pontos fortes das redes recorrentes para processamento de texto e redes residuais para aprender modelos profundos, o Transformer foi introduzido.

Semelhante aos RNNs, um Transformer opera em incorporações de palavras. No entanto, em vez de receber palavras uma de cada vez, ele processa todas as incorporações de um documento inteiro concatenado em uma matriz. Os transformadores podem ser treinados em tarefas não supervisionadas que prevêem palavras ausentes, resultando em uma codificação do documento utilizável para várias tarefas de processamento de linguagem natural.

Das redes residuais, os Transformers herdam conexões de salto que permitem que cada bloco aumente seus predecessores, simplificando o treinamento mesmo em grandes redes. Para facilitar o processamento de texto, a arquitetura dentro dos blocos incorpora uma ideia-chave chamada auto-atenção.

A autoatenção aborda a necessidade de prestar atenção a palavras distantes em uma frase para entender o significado de uma palavra específica. Em vez de projetar explicitamente uma função de atenção, a arquitetura do Transformer é projetada para facilitar o aprendizado dessa função.

Dentro de um bloco codificador de auto-atenção, a incorporação de cada palavra passa por três camadas densas: consulta (q), chave (k) e valor (v). Essas camadas compartilham pesos em todas as palavras, mas são aplicadas a diferentes elementos da frase de entrada. Ao calcular o produto escalar entre a consulta e os vetores-chave, o modelo pode avaliar a similaridade.

O produto escalar entre a consulta e os vetores-chave da mesma palavra indica autossimilaridade. Além disso, os produtos escalares são calculados entre o vetor de consulta de uma palavra específica e os vetores-chave de todas as outras palavras. O Softmax é aplicado para converter os escores de similaridade em pesos entre 0 e 1, enfatizando os vetores mais similares.

Ao multiplicar os pesos softmax com os vetores de valor de cada palavra, a atenção é aplicada a diferentes partes do documento. Essa soma ponderada produz um vetor de saída calculado a partir de todo o documento. Esse processo é executado em paralelo para todas as palavras, resultando em uma matriz que codifica o documento com base na atenção.

As incorporações de palavras originais são aumentadas com as informações derivadas de todo o documento, ponderadas pela atenção. Uma camada densa regular de formato correspondente é então aplicada. Várias cabeças de atenção podem ser utilizadas dentro de um bloco codificador para aprender diferentes padrões de atenção. A saída de todas as cabeças de atenção é somada e combinada com a conexão de salto, resultando na saída do bloco.

O mecanismo de autoatenção permite que a rede aprenda a que prestar atenção em cada cabeça de atenção. Várias cabeças de atenção permitem que o modelo se concentre em diferentes aspectos sob várias circunstâncias, aprimorando a representação de entrada em uma codificação útil do documento de texto.

Essa codificação pode ser processada posteriormente para classificação ou usada como entrada para outra rede neural para tarefas como tradução automática. Os Transformers de treinamento inicialmente focaram na codificação de linguagem em um idioma e na decodificação em outro idioma. O treinamento não supervisionado, semelhante aos RNNs, também pode ser realizado fornecendo documentos com palavras apagadas aleatoriamente e treinando o modelo para prever as palavras ausentes.

Os transformadores revolucionaram várias tarefas de processamento de linguagem natural e se tornaram a arquitetura de ponta para modelagem de linguagem e muitos outros aplicativos. Vamos nos aprofundar nos conceitos centrais dos Transformers e explorar como eles combinam os melhores aspectos das redes recorrentes e residuais.

Redes neurais recorrentes (RNNs), como LSTM, são eficazes para processamento de texto porque processam incorporações de palavras sequencialmente e criam um estado oculto que representa o conteúdo de informações de um documento. Os RNNs podem ser treinados em tarefas não supervisionadas, como prever a próxima palavra em uma frase usando dados prontamente disponíveis. No entanto, RNNs tendem a ter problemas com entradas longas devido à necessidade de passar dados repetidamente por várias camadas.

Por outro lado, as redes residuais são excelentes para lidar com modelos profundos, utilizando conexões residuais, que simplificam o treinamento e permitem que os gradientes se propaguem com eficiência. No processamento de imagens, as redes residuais aproveitam a convolução dentro dos blocos residuais, oferecendo uma vantagem para funções relevantes para a análise de imagens. O objetivo é combinar as vantagens das redes recorrentes no processamento de texto com os benefícios de aprender modelos profundos de redes residuais.

Isso nos leva à arquitetura Transformer. Como as redes recorrentes, os Transformers operam em incorporações de palavras. No entanto, ao contrário das redes recorrentes que processam palavras uma de cada vez, os Transformers recebem as incorporações de um documento inteiro concatenado em uma matriz, com cada linha representando a incorporação de uma palavra diferente. Os transformadores podem ser treinados em tarefas não supervisionadas, como prever palavras ausentes, para gerar codificações de documentos para várias tarefas de processamento de linguagem natural.

Das redes residuais, os Transformers herdam as conexões de salto, garantindo que cada bloco precise apenas aumentar seus predecessores e permitindo que os gradientes se propaguem efetivamente mesmo em grandes redes. Para facilitar o processamento de texto, os Transformers empregam uma arquitetura distinta dentro dos blocos, conhecida como autoatenção.

Autoatenção é a ideia de que para entender uma palavra em uma frase, precisamos prestar atenção em outras palavras que podem estar distantes na frase. A arquitetura não é explicitamente projetada com uma função de atenção específica; em vez disso, ele é projetado para facilitar o aprendizado de tais funções.

Em um bloco codificador de auto-atenção, a incorporação de cada palavra passa por três camadas densas chamadas consulta, chave e valor. Essas camadas são compartilhadas por todas as palavras, mas aplicadas a diferentes elementos da frase de entrada. Tomando o produto escalar entre a consulta e os vetores-chave, podemos avaliar a similaridade. Produtos escalares maiores indicam vetores apontando em direções semelhantes, enquanto produtos escalares menores indicam vetores apontando em direções diferentes.

Para uma determinada palavra, calculamos o produto escalar entre seu vetor de consulta e os vetores-chave de todas as outras palavras. Isso produz um vetor de pontuações de similaridade, representando a semelhança do vetor de consulta com cada vetor de chave. A aplicação de softmax a esses escores os converte em valores entre 0 e 1, enfatizando os vetores mais semelhantes. Os pesos softmax resultantes servem como multiplicadores nos vetores de valor para todas as palavras no documento.

Cada vetor de valor é multiplicado elemento a elemento com seu peso softmax correspondente, criando uma soma ponderada que representa a atenção da palavra a outras palavras. Esse processo é aplicado em paralelo para cada palavra, gerando um vetor de saída calculado a partir de todo o documento, ponderado de acordo com a atenção dada a cada palavra. Essas informações são então adicionadas à incorporação de palavras original.

Para produzir a saída de uma cabeça de atenção, uma camada densa regular de forma correspondente é aplicada. Várias cabeças de atenção podem ser usadas dentro de um bloco codificador, permitindo que a rede aprenda diferentes padrões de atenção em diferentes contextos. A saída de todas as cabeças de atenção é combinada e adicionada à conexão de salto, resultando na saída do bloco.

Semelhante às camadas convolucionais que usam vários canais, os Transformers geralmente empregam várias cabeças de atenção em um bloco codificador para capturar diferentes padrões de atenção. Isso permite que a rede aprenda e combine vários cálculos de atenção, aumentando a representação de entrada em uma codificação útil do documento de texto.

Depois que a codificação é produzida, ela pode ser utilizada para várias tarefas. Por exemplo, camadas adicionais podem ser aplicadas para classificação ou a codificação pode servir como entrada para outra rede neural para tarefas como tradução automática. Inicialmente, o treinamento do Transformer focava na codificação em um idioma e na decodificação em outro. O treinamento não supervisionado também pode ser realizado apagando palavras aleatoriamente em documentos e treinando o modelo para prever as palavras que faltam.

Para levar em consideração a ordem e a proximidade das palavras, os Transformers incorporam a codificação posicional. Essas informações adicionais são adicionadas às incorporações de palavras e permitem que o modelo entenda as posições relativas das palavras no documento.

Transformers são uma arquitetura poderosa para tarefas de processamento de linguagem natural. Ao combinar os pontos fortes das redes recorrentes e residuais, eles alcançaram resultados de ponta em várias aplicações. O mecanismo de auto-atenção permite que o modelo aprenda em quais palavras prestar atenção, e várias cabeças de atenção capturam diferentes padrões de atenção. Os transformadores avançaram significativamente no campo da modelagem de linguagem e continuam a ser uma área ativa de pesquisa e desenvolvimento.

Transformers and Self-Attention (DL 19)
Transformers and Self-Attention (DL 19)
  • 2022.11.05
  • www.youtube.com
Davidson CSC 381: Deep Learning, Fall 2022