Tranformers — Um guia introdutório

Letícia Mendonça Carraro
Kompa Data & AI
Published in
19 min readAug 30, 2021
Fonte

Introdução

Imagine que você está digitando uma mensagem para um amigo querido. Começa a mensagem com

“Olá amigo, como você está? Estou com …”

e antes que termine de digitar, o seu corretor sugere a palavra “saudades”. Como o seu celular sabe qual seria a próxima mensagem que digitaria? Mágica? Pequenas pessoinhas dentro do seu celular que te conhecem bem o suficiente para prever seus sentimentos? Você deixa essa dúvida de lado por enquanto e continua sua mensagem “quem sabe é meu agente do FBI” você pensa brincando.

“…Estou com saudades. Vamos ao …”

e o corretor sugere “parque”. Agora o corretor foi longe de mais, como ele sabe o que você está pensando?

Decidido a chegar ao fundo desse mistério você começa a digitar no Google

“como funciona o corr..”

“como funciona o corretor do celular”, o Google sugere.

E agora você tem certeza que tem alguém te espionando.

Na verdade, a situação acima é um exemplo da aplicação do mecanismo de autocomplete da arquitetura sobre a qual vamos falar hoje: Os Transformers. Transformers são arquiteturas poderosissimas e seu uso vai além dos exemplificados acima, tendo aplicações diversas e podendo ser utilizado até para Transfer Learning. Para quem quer ver um pouquinho desse tipo de modelo em ação, teste aqui.

Agora que você sabe um pouquinho sobre as incontáveis aplicações dessa arquitetura, vamos buscar compreender ela mais a fundo. Antes de iniciarmos nossa conversa sobre Transformers, precisamos contextualizar um pouco melhor seu uso e entender alguns dos principais conceitos por trás de seus mecanismos. Esse será um texto mais teórico, no qual focaremos em buscar o entendimento dos conceitos envolvendo Transformers.

Modelos de língua

Modelos de língua são aqueles modelos que buscam prever um termo, baseado no contexto. Basicamente, podem ser definidos como sendo uma distribuição de probabilidade de strings de texto. Eles possuem aplicações diversas, algumas mais intuitivas, como autocomplete de textos, mas podem ser utilizados até para fazer Transfer Learning (O modelo pode utilizar todo o conhecimento que ele adquiriu das palavras para diferentes objetivos como fazer análise de sentimentos ou criar frases novas).

O corretor do seu celular é um exemplo de modelo de língua.

Modelos de língua podem ser subdivididos em três grandes grupos: Modelos probabilísticos, modelos sequenciais e modelos de atenção.

Modelos probabilísticos

Esses modelos utilizam, como o nome sugere, a probabilidade para fazer a sua predição. Ou seja, esse modelo estima a probabilidade de um termo, dado determinado contexto.

Imagine que queira prever o próximo termo dessa frase
Basicamente o que você quer é calcular a probabilidade de tal palavra ser o próximo termo da frase dado que o contexto é “O inverno é”
Um exemplo de distribuição de probabilidade para o exemplo acima.

Esse modelo apresenta dois principais problemas: a baixa complexidade e o fato de não levarem em conta a sequência de palavras. Note que apenas as palavras precedentes a uma determinada palavra interferem na distribuição de probabilidade da próxima palavra, o que é um problema imenso, já que textos mais complexos tem um contexto mais profundo e a próxima palavra de uma frase pode não ser evidente baseada nas palavras que a antecederam imediatamente.

Para ficar claro, imagine que eu te dê o seguinte contexto e peça para você completar a frase:

é provável que você queira completar a frase com comidas de sua preferência, talvez “Hambúrguer” ou “Pizza”, até mesmo “Salada”!

Bom, e se eu te disser que a frase completa na verdade é:

Aposto que você não estava esperando por isso! E esse modelo também não!

Além disso, é notável que esse tipo de modelo não é escalável: quanto maior o número de entradas do meu modelo, maior o número de permutações necessárias que eu, além de ter que calcular, terei que guardar!! Isso ocorre porque eu tenho que constantemente calcular a probabilidade de todos os termos do meu vocabulário serem o próximo termo no meu contexto, comparar suas probabilidades e guardar a maior. Muito trabalho, né?!

Modelos Sequenciais

Esses modelos ainda usam probabilidade, mas seu foco está em modelar dados de sequência. Um exemplo desse tipo de modelo são as redes neurais recorrentes (RNN), que são uma poderosa classe de redes neurais voltada para modelar dados da sequência, como séries temporais ou linguagem natural.

Apesar de ser uma ferramenta poderosíssima, redes neurais também possuem certas limitações e problemas.

O primeiro deles é a forma como faz o processamento dos dados, de maneira sequencial. Sendo assim, para processar algo que se encontra na posição 4, é preciso processar todas as posições anteriores (0, 1, 2, 3) antes. Isso, de um ponto de vista computacional, não é ideal, além de provocar maiores tempos de processamento.

Outro problema enfrentado por esse tipo de modelo é a perda de informações com textos extensos. É como se houvesse uma “memória interna” em modelos desse tipo, quando colocamos nele textos muito grandes, acabamos perdendo partes.

Por fim, um outro problema enfrentado são os Vanishing Gradients. Esse problema é encontrado quando estamos treinando RNNs com métodos baseados em gradientes e backpropagation. Com esse tipo de método cada peso da rede neural é atualizado proporcionalmente a derivada parcial da função de erro. O problema é que em alguns casos o gradiente vai ser muito pequeno, a ponto de poder desaparecer! Isso pode chegar até a interromper o treinamento da Rede!

Modelos de atenção

Essa classe de rede neurais é poderosa para modelar sequências paralelamente, utilizando mecanismos de atenção. Transformers são modelos de atenção e para entendê-los bem, precisamos entender tudo que engloba o conceito de atenção: o que é um modelo de atenção, o que são mecanismos de atenção, self attention e multi head attention. Após apresentados esses conceitos, podemos finalmente entender o que são Tranformers! Então vamos lá!

Sequence-to-sequence models

Modelos seq2seq não são necessariamente modelos de atenção, mas veremos como podemos adicionar mecanismos de atenção para melhorar seu desempenho. O primeiro passo é enter como esses modelos funcionam: Modelos seq2seq são aqueles que pegam uma sequência como entrada e tem como saída uma outra sequência. Por exemplo, caso se queira fazer a tradução de uma frase do inglês para português, sua entrada seria a frase em inglês, ou seja uma sequência de palavras em inglês, e sua saída uma sequência de palavras em português.

I am a student → Eu sou uma estudante

Mas como esse modelo faz esse processamento? Bom, a estrutura de um modelo seq2seq é composta de um encoder e um decoder.

O encoder processa cada item na sequência, compilando a informação em um vetor (que chamamos de contexto). Após processar toda a entrada, o encoder manda esse contexto para o decoder que começa a produzir a saída, item por item.

Fonte

Então no caso de tradução o que está entrando no encoder é a frase no idioma de origem.O encoder então fornece um vetor, o contexto, para o decoder que por sua vez produz uma saída sequencial com a frase no idioma de destino. Note que o encoder e o decoder são redes neurais recorrentes.

Uma pausa para word embedding — palavras como vetores

Agora é importante entender que as palavras são representadas por vetores. Para transformar uma palavra em um vetor nós recorremos a um método chamado “word embedding”, cujo objetivo é transformar palavras em espaços vetoriais que apresentam os significados e semânticas de dada palavra.

Esse processo de transformar as palavras em vetores é importante, pois permite que transformemos as palavras em informações numéricas que contém as características de cada palavra. Para ficar mais claro vamos usar um exemplo.

Imagine que eu tenha a palavra “rainha”. Como posso descrever essa palavra? Um primeiro passo poderia ser definir o gênero da palavra, no caso feminino. Numa escala numérica podemos atribuir -1 para o gênero feminino e 1 para masculino.

Sabemos que a palavra Rainha tem gênero feminino então na posição do vetor que se refere ao gênero, encontraríamos um valor mais próximo de -1. Mas gênero não é o único parâmetro que descreve a palavra, precisamos de mais informações, mais dimensões para definir uma palavra. Então, adicionamos mais posições nesse vetor. Os valores de cada uma dessas posições representa a similaridade da palavra Rainha com outras palavras.

Exemplo de embedding com a palavra Rainha, note que palavras com as quais Rainha não tem relação possuem valores pequenos

Naturalmente, atribuir todos esses valores de similaridade a mão é inviável. O que fazemos através de aprendizado de máquina é deixar o computador sozinho aprender as palavras pelo seu contexto e construir esse vetor! Na realidade, quando obtemos o embedding de cada palavra não sabemos nem o que cada posição do vetor representa! Pode parecer loucura que o computador consiga fazer isso, mas ajuda pensar que palavras com significado próximo frequentemente aparecem o mesmo contexto.

Agora sabemos o básico de word embedding, caso queira se aprofundar nesse conceito, recomendo o texto referenciado, mas por agora vamos prosseguir no nosso estudo de modelos seq2seq.

Uma outra pausa — RNNs e Hidden state

Tanto o encoder quanto o decoder são RNNs, sendo assim crucial que saibamos um pouco mais sobre o funcionamento dessas RNNs. Redes Neurais recorrentes permitem que a informação persista dentro de uma rede. Elas fazem isso através de loops que permitem que a informação seja passada de um estado para o outro.

Dessa forma, podemos concluir que RNNS precisam aceitar duas entradas de cada vez: a palavra a ser processada e um hidden state que depende da informação recebida do estado anterior. Um hidden state tem o papel de atribuir pesos às suas entradas então vai servir para passar uma informação mais contextualizada para o próximo estado.

Agora, voltando aos modelos seq2seq

Sabendo agora o formato de entrada e saída de cada encoder podemos definir cada passo dado no encoder: a cada iteração são computados a próxima palavra da sequência e um hidden state advindo do estado anterior.

Fonte

Note que nesse modelo toda a informação precisa ser processada pelo encoder antes de ser passada pelo decoder, ou seja, a única informação sobre o encoder que o decoder tem acesso é a resposta do seu último estado. Isso ocasiona o que chamamos de information bottleneck, isso quer dizer que para que o decoder inicie seu trabalho, ele precisa esperar o último encoder terminar seu processamento. Isso é um problema por vários motivos, por exemplo, se estamos falando de tradução se temos uma frase muito grande, ela não vai ser bem traduzida, porque os estados das primeiras palavras ficam muito distantes, diminuindo a qualidade da tradução.

O BLEAU score é um índice que mede a qualiade de tradução. Note que com o aumento do tamanho da frase a qualidade da tradução diminui de maneira considerável. (Fonte)

Para prevenir essa queda de performance, nós introduzimos o mecanismo de atenção.

Mecanismo de atenção

O conceito de “atenção” tem por objetivo fazer com que o modelo foque nas partes relevantes da sequência.

“Atenção” tenta imitar como uma pessoa faria uma tradução. Seres humanos vão olhar uma ou poucas palavras por vez e começar a sua tradução, eles não vão olhar um longo parágrafo ou texto e tentar traduzir tudo de uma vez! Ao invés disso, vão se focar em pequenas partes da frase de cada vez! É justamente isso que o mecanismo de atenção busca reproduzir.

A “atenção” faz isso atribuindo pesos à cada palavra: a palavra que está sendo processada possui um peso maior (focando sua atenção na palavra que está traduzindo) e as outras palavras possuem um peso menor.

Um modelo seq2seq com mecanismos de atenção se diferencia de um modelo seq2seq tradicional de duas formas principais:

Primeiramente, agora o encoder passa muito mais dados para o decoder! Não é mais passado apenas o último hidden state e sim TODOS os hidden states.

Fonte

Segundo, o decoder faz um passo a mais antes de produzir a sua saída.

💡 Passo-a-Passo decoder

  1. Olha os hidden states recebidos
  2. Atribui a cada hidden state um peso
  3. Multiplica cada hidden state por seu peso, amplificando o valor de hidden states com grandes pesos e reduzindo hidden states com pesos menores.

Esse mecanismo faz bastante sentido intuitivamente. Se eu estou traduzindo uma palavra eu vou dar mais atenção à ela. Esse mecanismo que parece tão simples, já faz o desempenho da seq2seq melhorar muito.

Note no heatmap abaixo que a tradução é feita não é uma correspondência direta, o modelo realmente pesa as palavras e dá mais atenção à palavras relacionadas com a palavra traduzida! Observe como économique se relaciona com Economic mas também com European!

Fonte

Self Attention

Agora que entendemos o que é a atenção, vamos entrar em um conceito fundamental para o entendimento de Transformers: Self Attention.

Digamos que queremos traduzir a seguinte frase:

A galinha não atravessou a rua porque ela estava cansada

A quem o pronome “ela” está se referindo? Para a gente é óbvio que está se referindo à galinha, mas para um algoritmo não é tão simples assim.

É justamente aí que a self attention entra, ela permite a associação da palavra “ela” com a palavra “galinha”. Enquanto o modelo processa cada palavra, self attention permite que ele busque por pistas nas outras posições da entrada para entender melhor como processar essa palavra.

Mas como funciona realmente a self-attention?

Self attention é um mecanismo muito interessante, recomendo a leitura dos links de referência para uma visão mais aprofundada!

Para entender o funcionamento da Self Attention, vamos olhar um pouquinho para a parte matemática. Dada a frase abaixo, primeiro vamos transformar as palavras em tokens e depois em vetores (word embeddings).

A galinha não atravessou a rua porque ela estava cansada

Similarmente ao que fizemos anteriormente para atenção, atribuiremos um peso para cada vetor. Isso tem por objetivo reduzir o ruídos dos dados e direcionar a atenção do nosso modelo. Com isso obteremos uma versão contextualizada das nossas palavras.

Pelo que já vimos de atenção, esse esquema faz sentido! Queremos chegar numa versão contextualizada dos dados e para isso precisamos atribuir pesos à cada palavra. Estamos interessados então em descobrir o qe acontece no quadro rosa de “PESOS”.

Essa versão contextualizada leva em conta a relação que outras palavras da frase tem com a palavra que estamos analisando no momento. Para obter essa versão faremos operações matemáticas para determinar a relação entre as palavras.

Com o objetivo de obter o quanto uma palavra interfere na outra, faremos a multiplicação do embedding de cada palavra, Vₙ, e multiplicaremos pelo embedding de cada uma das outras palavras, incluindo o seu próprio embedding.

Para entender essa relação, vale um exemplo. Imagine que o vetor das palavras sejam compostos apenas de 1s e 0s (não são, mas para esse exemplo essa abstração vai nos ajudar).

Quando eu tenho duas palavras iguais, elas vão ter o mesmo embedding, sendo assim quando eu fizer a multiplicação dela por ela mesma eu vou obter o maior valor possível, já que vou estar multiplicando todos s 1s por 1s e os 0s não vão anular nenhum dos meus 1s.

Agora imagine que eu tenha uma palavra que é o exato oposto da palavra que eu esteja analisando. Isso pode ocorrer porque elas não tem relação nenhuma, mas não estamos preocupados com esse motivo no momento. Quando eu multiplicar o vetor dessa palavra com o vetor da minha palavra original eu vou obter 0, porque todos os meus 1s foram anulados.

É por isso que esse mecanismo funciona! A multiplicação de um Vₖ por ele mesmo vai me fornecer o maior valor de relação possível, ou seja, o maior peso possível. Já quando eu fizer a multiplicação de um Vₖ por um vetor que não tenha tanta relação com ele vou obter um peso muito menor, quase que ínfimo. (Vₖ é um vetor qualquer)

Depois de ter chegado nos pesos Sₙ, o próximo passo é normalizar esses valores para que tenham soma 1, obtendo os valores normalizados Wₙ.

Por fim, para obtermos o valor contextualizado Yₙ, multiplicamos cada valor normalizado Sₙ pelos embeddings originais da palavra Vₙ.

Nesse último passo, estamos somando a influência que cada palavra tem na palavra que estou analisando no momento, ou seja, essa versão contextualizada leva em conta a influência de outras palavras no seu significado. É importante notar que esse mecanismo ainda é limitado na quantidade de palavras que pode “prestar atenção” ao mesmo tempo.

No exemplo, fizemos o cálculo apenas para o primeiro vetor, mas o método é o mesmo para todos os demais embeddings. Perceba que recalculamos todos os vetores em função de V1 A ideia é que estamos determinando a relação do artigo “A” com todas as outras palavras da frase.

Ué, mas até agora não temos parâmetros que são atualizados com o treinamento…

Se você tem maior familiaridade com Machine learning deve ter notado que ainda não temos nenhum valor que é atualizado com treinamento. Vamos ver agora como isso é introduzido em modelos de Self attention!

Inicialmente, dividimos os nossos dados em Query, Keys e Values. Para facilitar a compreensão, podemos pensar na seguinte situação: Você quer buscar um vídeo no Youtube. Para fazer isso você digita sua busca na barra de pesquisa, o que você digitou é sua query. O mecanismo de busca vai então comparar a sua busca com títulos e descrições dos videos na base de dados, essas são as keys. Por fim, será retornado pra você os vídeos que mais se relacionam com aquela sua pesquisa, esses são os values!

Até agora, lidamos com os vetores, mas o que vamos fazer é introduzir uma matriz de peso para cada um dos vetores. Essas matrizes são criadas durante o processo de treinamento.

Cálculos para determinar o peso de cada vetor com matrizes atualizadas com treino

Finalmente, chegamos no seguinte esquema para self attention:

Multi Head Attention

Multi head attention é um mecanismo que vai melhorar a performance da camada de atenção de duas formas:

  1. Vai expandir a habilidade do modelo de focar em diferentes posições. Claro que apenas com self attention, os embeddings atualizados contém um pouco do encoding de outras palavras, mas o peso maior é da palavra sendo analisada naquele momento.
  2. Ele dá à camada de atenção múltiplos “subespaços de representação”. Como veremos mais pra frente, com esse tipo de mecanismo nós temos múltiplos sets de matrizes de peso de Query/Key/Value.

Vamos iniciar o entendimento do conceito com um exemplo.

Note que quando temos que analisar a palavra “ler”, temos que dar atenção a outras palavras, como “mãe”, “livros” e “mim”. No nosso modelo atual entretanto, não temos atenção o suficiente para isso.

No nosso modelo atual, para as Queries/Keys/Values estamos usando uma camada linear. Mas, se queremos que nosso modelo preste atenção em mais de uma coisa, apenas uma camada linar não dá conta.

Modelo atual de atenção com camadas lineares

Se queremos dar atenção a mais de uma palavra ao mesmo tempo, a solução é passar esses embeddings para camadas paralelas! Por exemplo, se quisermos que nosso modelo preste atenção em 4 coisas ao mesmo tempo, então utilizaremos 4 camadas paralelas.

Modelo esquemático Multi Head attention

Cada uma das h camadas são inicializadas com pesos aleatórios e treinadas. Como fizemos anteriormente quando vimos o conceito de self attention, vamos fazer a multiplicação de matrizes em cada etapa. Entretanto agora, essa multiplicação será feita para cada uma dessas h camadas, cada uma com sua matriz, o que vai gerar h vetores y. Mas queremos apenas um vetor y! Para chegar no vetor final contextualizado, nós concatenamos os h vetores y e passamos eles por uma camada densa. Finalmente chegamos no nosso vetor y com embeddings contextualizados.

Transformers

Finalmente chegamos ao nosso objetivo! Tudo que vimos até esse momento são conceitos importantes que precisaremos para entendermos um pouquinho melhor sobre como transformers funcionam.

Antes de Transformers, a arquitetura mais utilizada era a de RNNs. Contudo, vimos que mesmo sendo um modelo poderosíssimo, essa arquitetura ainda apresenta alguns problemas e limitações. No final de 2017, foi publicado o paper “Attention is all you need” em que foi proposta uma arquitetura de rede neural em que se utilizava apenas o mecanismo de atenção, ignorando-se a recorrência. Claro que tirar a recorrência do modelo tem um preço: Em geral, as redes Transformers precisam de várias camadas para terem um bom desempenho, ao contrário das redes recorrentes. Imagine só, estamos tirando fora a sequencialidade da língua, e deixando tudo a cargo do mecanismo de atenção, faz sentido então que precisemos de muito mais camadas para que apenas a atenção seja o suficiente. Nesse tipo de rede, o tipo principal de camada é a “Multi head attention” que vimos anteriormente nesse texto.

O grande diferencial deste tipo de redes é a paralelização. As redes Transformers não precisam operar processar as palavras de forma sequencial.

Essa paralelização permite que seja feito um uso mais efetivo das GPUs. Com isso, as arquiteturas mais profundas se tornaram praticáveis. Conseguimos com transformers fazer redes gigantes com uma quantidade absurda de parâmetros.

Mas afinal, o que são transformers? Transformer é um modelo de atenção que se beneficia sobretudo da paralelização. É composto de dois componentes: um bloco encoder e um bloco decoder conectados entre si. O bloco encoder é constituído de n encoders e o bloco decoder de n decoders.

Os encoders tem todos a mesma estrutura, apesar de não compartilharem o mesmo peso, e eles podem ser divididos em duas sub-layers: uma de Self-attention e uma de feed-forward neural network.

Os decoders possuem essas mesmas duas camadas, porém adicionam mais uma entre elas: uma camada de atenção que ajuda o decoder a focar nas partes relevantes da frase de entrada, um mecanismo similar ao visto para modelos seq2seq.

Fonte

Encoder

O encoder recebe uma lista de vetores como entrada, os embeddings. Ele processa essa lista passando ela pela camada de Self Attention, depois passando ela para a camada de feed forward neural network que por fim, vai mandar a saída para o próximo encoder. Aqui temos a propriedade chave do transformer: Cada palavra tem seu próprio caminho no encoder. Existem dependências entre esses caminhos na camada de Self Attention, mas a camada de feed forward não tem essas dependências, dessa forma, vários caminhos podem ser executados em paralelo nessa camada.

Fonte

Como dito anteriormente, esse modelo não leva em conta a ordem das palavras. Por isso, para resolver esse problema, o transformer adiciona um vetor à cada embedding de entrada que vai ajudar a determinar a posição de cada palavra, ou a distância entre diferentes palavras. Aqui vale notar que, apesar da ordem das palavras ser importante numa frase, a distância semântica nem sempre é um indicador de proximidade das palavras.

Decoder

O encoder começa processando a sequência de entrada. A saída no topo do encoder é então transformada em um set de vetores de atenção K e V que serão usados na camada de atenção entre encoder e decoder que auxilia o decoder a focar nas partes certas. O processo se repete até que seja indicado que o decoder acabou o processamento. Por fim, assim como fizemos com as entradas no encoder, fazemos os embeddings das palavras e adicionamos argumentos posicionais nessas saídas, para indicar a posição de cada palavra na frase.

Fonte

A camada linear final e a camada de softmax

Beleza, o decoder me forneceu um vetor de saída cheio de floats. Como eu transformo esse vetor em uma palavra? Esse é o papel da camada linear final. Essa camada é uma rede neural totalmente conectada que projeta o vetor produzido em um vetor que contém os valores de todas as palavras do nosso vocabulário de saída.

Dessa forma, para escolher qual palavra de saída corresponde a saída do meu decoder eu utilizo probabilidade: do meu vocabulário de saída, qual é a palavra mais provável associada ao valor que o decoder me deu? A responsável por transformar nossos vetores em probabilidades e fazer a escolha da palavra com maior probabilidade é a camada de softmax.

A carinha de um transformer

Fonte

A imagem acima ilustra a arquitetura de transformer. Vamos sintetizar o que acontece: a entrada é recebida pelo transformer e é transformada num vetor com os embeddings das palavras. Depois disso, é passada por uma camada de positional encoding, que é necessária pois esse modelo não possui recorrência e para suprir isso precisamos injetar alguma informação sobre a ordem dos tokens na sequência. Esse vetor é então passado para o bloco de encoders, primeiramente para a camada de Multi-head attention que permite que o modelo possa, ao mesmo tempo coletar informação de diferentes palavras, em diferentes posições. Neste texto, não discutimos a camada de Add e normalize mas ela serve para lidar com conexões residuais. Após passarem pela camada de Multi-Headed attention, os dados seguem para a camada de Feed forward, onde finalmente passarão os dados para o decoder. No decoder o processo é similar, mas ele conta com uma camada de “Masked Multi-Head attention”, que é uma camada de self attention modificada, você não pode dar para a rede a saída para ela te fornecer a saída, por exemplo se você quer que a rede te devolva “amendoim” você não vai passar para ela “amendoim”! Essa máscara serve então para impedir que sua rede tenha acesso à informações que ela não pode ter acesso, ela não consegue ver a palavra seguinte se ela quer prever a palavra seguinte.

Agora você sabe um pouco mais sobre o funcionamento de Transformers! Espero que tenha gostado da Leitura! Esse é o primeiro texto de muitos textos postado pelo time de IA e dados da Kompa Saúde, então se você gostou não esqueça de dar claps e compartilhar com seus amigos e se não gostou, compartilhe coms seus inimigos! Nos siga para ficar sabendo de primeira mão quando postarmos textos novos e tenha um ótimo dia!!

Referências

Language model:

LM.2 What is a language model?

The beginners guide to language models

Neural Language Models Explained

Word Embedding:

Word Embedding: fazendo o computador entender o significado das palavras

Attention:

Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)

Machine Translation using Attention with PyTorch — A Developer Diary

Attention mechanism in Deep Learning, Explained — KDnuggets

Transformers:

The Illustrated Transformer

💡Illustrating the Reformer

InferKit

The Narrated Transformer Language Model

Transformer: A Novel Neural Network Architecture for Language Understanding

Aulas internas de Transformers e Seq2Seq ministradas pelos membros do Turing.USP.

--

--