HeadlinesBriefing favicon HeadlinesBriefing.com

Por que Transformers precisam de codificação posicional

Towards Data Science •
×

Ao me aprofundar nos modelos de fundação para séries temporais, percebi que não poderia realmente entendê-los sem antes entender os transformers. Não queria usar esses modelos como caixas pretas, então comecei a rastrear as ideias de trás para frente, dos modelos de fundação aos transformers, e dos transformers à auto-atenção. O que tornou a transição interessante é que, embora os transformers tenham sido originalmente construídos para linguagem, a ideia central se estende naturalmente às séries temporais. As duas modalidades são muito diferentes, mas compartilham algo fundamental: ambas são sequências, e em ambos os casos, a ordem muda o significado. Na linguagem, o cachorro morde o homem é muito diferente de o homem morde o cachorro. Séries temporais não são diferentes. Uma temperatura de 30° ontem e 20° hoje conta uma história diferente de 20° ontem e 30° hoje. Os valores podem ser os mesmos, mas sua ordem muda o significado da sequência. A questão é que, se a auto-atenção olha para todas as observações de uma vez, como um transformer sabe qual observação veio primeiro, qual veio depois, ou a que distância duas observações estão? Essa pergunta me levou à codificação posicional. O que mais me surpreendeu foi como uma ideia matemática tão simples poderia dar a um Transformer um senso de ordem. As técnicas exatas evoluíram consideravelmente desde então, mas o problema subjacente permanece o mesmo. Este artigo é minha tentativa de construir essa intuição desde o início, começando com uma série temporal simples e seguindo o caminho das observações brutas à auto-atenção e finalmente à codificação posicional.

De observações escalares a representações vetoriais Considere uma série temporal simples contendo a temperatura registrada ao longo de cinco dias úteis: Exemplo de série temporal: histórico de temperatura de 5 dias Cada observação x_t é apenas um escalar. Um transformer, no entanto, opera em vetores de dimensionalidade d_model. As observações escalares, portanto, precisam ser mapeadas para esse espaço de representação primeiro. Uma maneira simples de fazer isso é através de uma projeção linear aprendida, ou seja, embedding: e_t = W_e x_t + b_e nos dando uma sequência de representações vetoriais: e_1, e_2, e_3, e_4, e_5 Um embedding é uma representação profunda e abstrata da série na forma de um vetor numérico multidimensional que codifica suas características e que o modelo entende. Cada token de série temporal é representado por um embedding aprendido. Cada e_t captura informações sobre o valor observado naquele passo de tempo, mas neste ponto, é apenas uma representação da observação. A palavra importante aqui é aprendido. O modelo não recebe uma representação vetorial predefinida para uma temperatura como 18°. Os parâmetros W_e e b_e são aprendidos durante o treinamento para que as representações resultantes se tornem úteis para a tarefa. Neste ponto, e_t representa o que foi observado. Ainda não diz ao modelo onde essa observação ocorreu na sequência.

Como a auto-atenção constrói contexto? A auto-atenção permite que cada observação use informações do restante da sequência. Suponha que queiramos atualizar a representação de sexta-feira. O modelo primeiro cria três projeções aprendidas de cada e_t: q_t = W_Q e_t, k_t = W_K e_t, v_t = W_V e_t Os vetores de consulta, chave e valor são aprendidos no bloco de auto-atenção. As matrizes W_Q, W_K e W_V também são aprendidas durante o treinamento. Não é dito ao modelo de antemão como devem ser uma consulta, chave ou valor úteis. Para sexta-feira, sua consulta q_5 é comparada com as chaves de todas as observações: k_1, k_2, k_3, k_4, k_5. Cada comparação produz um...