Modelos linguísticos de grande dimensão (LLM)

Concluído

Observação

Consulte a guia Texto e imagens para obter mais detalhes!

No núcleo da IA generativa, os grandes modelos de linguagem (LLMs) - e suas relações mais compactas, os modelos de linguagem pequena (SLMs) - encapsulam as relações linguísticas e semânticas entre as palavras e frases em um vocabulário. O modelo pode usar essas relações para raciocinar sobre a entrada de linguagem natural e gerar respostas significativas e relevantes.

Fundamentalmente, os LLMs são treinados para gerar finalizações com base em prompts. Pense neles como exemplos superpoderosos do recurso de texto preditivo em muitos celulares. Um prompt inicia uma sequência de previsões de texto que resulta em uma conclusão semanticamente correta. O truque é que o modelo entende as relações entre as palavras e pode identificar quais palavras na sequência até agora são mais prováveis de influenciar a próxima; e usá-lo para prever a continuação mais provável da sequência.

Por exemplo, considere a seguinte frase:

Ouvi um cão latir alto para um gato

Agora, suponha que você só ouviu as primeiras palavras: "Eu ouvi um cachorro...". Você sabe que algumas dessas palavras são pistas mais úteis sobre qual pode ser a próxima palavra do que outras. Você sabe que "ouvido" e "cão" são fortes indicadores do que vem a seguir, e isso ajuda a reduzir as probabilidades. Você sabe que há uma boa chance de a frase continuar como "Eu ouvi um cachorrolatir".

Você é capaz de adivinhar a próxima palavra porque:

  • Você tem um grande vocabulário de palavras para desenhar.
  • Você aprendeu estruturas linguísticas comuns, então você sabe como as palavras se relacionam umas com as outras em frases significativas.
  • Você tem uma compreensão dos conceitos semânticos associados às palavras - você sabe que algo que você ouviu deve ser um som de algum tipo, e você sabe que existem sons específicos que são feitos por um cão.

Então, como treinamos um modelo para ter essas mesmas habilidades?

Tokenização

O primeiro passo é fornecer ao modelo um grande vocabulário de palavras e frases; e nós queremos dizer grande. A última geração de LLMs tem vocabulários que consistem em centenas de milhares de tokens, com base em grandes volumes de dados de treinamento de toda a Internet e outras fontes.

Espera um minuto. Tokens?

Enquanto tendemos a pensar na linguagem em termos de palavras, os LLMs dividem seu vocabulário em tokens. Os tokens incluem palavras, mas também subpalavras (como o "un" em "inacreditável" e "improvável"), pontuação e outras sequências de caracteres comumente usadas. O primeiro passo no treinamento de um modelo de linguagem grande, portanto, é dividir o texto de treinamento em seus tokens distintos e atribuir um identificador inteiro exclusivo a cada um, da seguinte forma:

  • Capítulo I (1)
  • ouvidas (2)
  • a (3)
  • cão (4)
  • casca (5)
  • Em voz alta (6)
  • em (7)
  • a (3) já atribuído
  • gato (8)

e assim sucessivamente.

À medida que você adiciona mais dados de treinamento, mais tokens serão adicionados ao vocabulário e identificadores atribuídos; Assim, pode acabar por ter tokens para palavras como cachorrinho, skateboard, carro e outros.

Observação

Neste exemplo simples, tokenizamos o texto de exemplo com base em palavras. Na realidade, também haveria subpalavras, pontuação e outros tokens.

Transformando tokens com um transformador

Agora que temos um conjunto de tokens com IDs exclusivos, precisamos encontrar uma maneira de relacioná-los uns com os outros. Para fazer isso, atribuímos a cada token um vetor (uma matriz de vários valores numéricos, como [1, 23, 45]). Cada vetor tem vários elementos numéricos ou dimensões, e podemos usá-los para codificar atributos linguísticos e semânticos do token para ajudar a fornecer uma grande quantidade de informações sobre o que o token significa e como ele se relaciona com outros tokens, em um formato eficiente.

Precisamos transformar as representações vetoriais iniciais dos tokens em novos vetores com características linguísticas e semânticas embutidas neles, com base nos contextos em que aparecem nos dados de treinamento. Como os novos vetores têm valores semânticos embutidos neles, nós os chamamos de incorporações.

Para realizar esta tarefa, usamos um modelo de transformador . Este tipo de modelo consiste em dois "blocos":

  • Um bloco codificador que cria as incorporações aplicando uma técnica chamada atenção. A camada de atenção examina cada token por vez e determina como ele é influenciado pelos tokens ao seu redor. Para tornar o processo de codificação mais eficiente, a atenção de várias cabeças é usada para avaliar vários elementos do token em paralelo e atribuir pesos que podem ser usados para calcular os novos valores de elementos vetoriais. Os resultados da camada de atenção são alimentados em uma rede neural totalmente conectada para encontrar a melhor representação vetorial da incorporação.
  • Uma camada de decodificador que usa as incorporações calculadas pelo codificador para determinar o próximo token mais provável em uma sequência iniciada por um prompt. O decodificador também utiliza o mecanismo de atenção e uma rede neural percetora para fazer as previsões.

Diagrama da arquitetura do Transformer com as camadas de codificação e decodificação.

Observação

Simplificamos muito a arquitetura e o processo do transformador na descrição e no diagrama. Não se preocupe muito com os detalhes específicos de como a atenção funciona - o ponto-chave é que ele ajuda a capturar características linguísticas e semânticas de cada token com base nos contextos em que é usado. Se quiser um mergulho mais profundo na arquitetura do transformer e como ele usa a atenção, pode ler o artigo original Attention is all you need.

Vetores iniciais e codificação posicional

Inicialmente, os valores vetoriais do token são atribuídos aleatoriamente, antes de serem alimentados através do transformador para criar vetores de incorporação. Os vetores de token são alimentados no transformador junto com uma codificação posicional que indica onde o token aparece na sequência de texto de treinamento (precisamos fazer isso porque a ordem em que os tokens aparecem na sequência é relevante para como eles se relacionam entre si). Por exemplo, nossos tokens podem começar assim:

Símbolo Identificador de Token Position Vector
I 1 1 [3, 7, 10]
escutado 2 2 [2, 15, 1]
a 3 3 [9, 11, 1]
cão 4 4 [2, 7, 11]
casca 5 5 [9, 12, 0]
Em voz alta 6 6 [3, 8, 13]
at 7 7 [5, 7, 10]
a 3 8 [9, 11, 1]
cat 8 9 [8, -6, 9 ]
... ... ... ...
filhote de cachorro 127 45 [7, 7, -2]
carro 128 56 [5, -5, 1 ]
skateboard 129 67 [4, 7, 14]

Observação

Mantivemos as coisas simples usando vetores com apenas três elementos (o que nos ajudará a visualizá-los em três dimensões mais tarde). Na realidade, os vetores têm milhares de elementos.

Atenção e incorporações

Para determinar as representações vetoriais de tokens que incluem informações contextuais incorporadas, o transformador usa camadas de atenção . Uma camada de atenção considera cada token por vez, dentro do contexto da sequência de tokens em que aparece. Os tokens em torno do atual são ponderados para refletir sua influência e os pesos são usados para calcular os valores dos elementos para o vetor de incorporação do token atual. Por exemplo, ao considerar o token "latir" no contexto de "ouvi um cão latir", os tokens para "ouvido" e "cão" receberão mais peso do que "eu" ou "a", uma vez que são indicadores mais fortes para "latir".

Inicialmente, o modelo não "sabe" quais tokens influenciam outros; Mas, à medida que é exposto a volumes maiores de texto, ele pode iterativamente aprender quais tokens geralmente aparecem juntos e começar a encontrar padrões que ajudam a atribuir valores aos elementos vetoriais que refletem as características linguísticas e semânticas dos tokens, com base em sua proximidade e frequência de uso juntos. O processo torna-se mais eficiente usando a atenção de várias cabeças para considerar diferentes elementos dos vetores em paralelo.

O resultado do processo de codificação é um conjunto de incorporações; vetores que incluem informações contextuais sobre como os tokens no vocabulário se relacionam entre si. Um transformador real produz incorporações que incluem milhares de elementos, mas para manter as coisas simples, vamos nos ater a vetores com apenas três vetores em nosso exemplo. O resultado do processo de codificação do nosso vocabulário pode ser mais ou menos assim:

Símbolo Identificador de Token Incorporação
I 1 [2, 0, -1 ]
escutado 2 [-2, 2, 4 ]
a 3 [-3, 5, 5 ]
cão 4 [10, 3, 2 ]
casca 5 [9, 2, 10 ]
Em voz alta 6 [-3, 8, 3 ]
at 7 [-5, -1, 1]
cat 8 [10, 3, 1]
filhote de cachorro 127 [5, 3, 2 ]
carro 128 [-2, -2, 1 ]
skateboard 129 [-3, -2, 2 ]
casca 203 [2, -2, 3 ]

Se você é observador, você pode ter visto que nossos resultados incluem duas incorporações para o token "casca". É importante entender que as incorporações representam um token dentro de um contexto particular; e alguns tokens podem ser usados para significar várias coisas. Por exemplo, a casca de um cão é diferente da casca de uma árvore! Os tokens que são comumente usados em vários contextos podem produzir várias incorporações.

Podemos pensar nos elementos das incorporações como dimensões em um espaço-vetor multidimensional. Em nosso exemplo simples, nossas incorporações têm apenas três elementos, para que possamos visualizá-las como vetores no espaço tridimensional, assim:

Diagrama de incorporação de vetores para tokens em três dimensões.

Como as dimensões são calculadas com base em como os tokens se relacionam linguisticamente uns com os outros, os tokens que são usados em contextos semelhantes (e, portanto, têm significados semelhantes) resultam em vetores com direções semelhantes. Por exemplo, as incorporações para "cão" e "cachorro" apontam mais ou menos na mesma direção, o que não é muito diferente da incorporação para "gato"; mas muito diferente da incorporação para "skate" ou "carro". Podemos medir o quão próximos os tokens estão uns dos outros semanticamente calculando a semelhança cosseno dos seus vetores.

Prevendo completamentos a partir de prompts

Agora que temos um conjunto de incorporações que encapsulam a relação contextual entre tokens, podemos usar o bloco decodificador de um transformador para prever iterativamente a próxima palavra em uma sequência baseada em um prompt inicial.

Mais uma vez, a atenção é usada para considerar cada token no contexto; Mas desta vez o contexto a ser considerado só pode incluir os tokens que precedem o token que estamos tentando prever. O modelo decodificador é treinado, usando dados para os quais já temos a sequência completa, aplicando uma técnica chamada atenção mascarada; em que os tokens após o token atual são ignorados. Como já sabemos o próximo token durante o treinamento, o transformador pode compará-lo com o token previsto e ajustar os pesos aprendidos em iterações de treinamento posteriores para reduzir o erro no modelo.

Ao prever uma nova conclusão, para a qual os próximos tokens são desconhecidos, as camadas de atenção calculam possíveis vetores para o próximo token e a rede feed-forward é usada para ajudar a determinar o candidato mais provável. O valor previsto é então adicionado à sequência, e todo o processo se repete para prever o próximo token; e assim por diante, até que o decodificador preveja que a sequência terminou.

Por exemplo, dada a sequência "Quando o meu cão era um...", o modelo avaliará os tokens na sequência até agora, usará a atenção para atribuir pesos e preverá que o próximo token mais provável é "filhote" em vez de, digamos, "gato" ou "skateboard".