Phase 07: Transformers Deep Dive

Encodificação de posição Sinusoidal, RoPE, ALiBi

A atenção é invariavel em permutação. "O gato sentou no tapete" e "mat o gato sat no tapete" produzem a mesma saída sem sinal posicional. Três algoritmos o corrigem cada um com uma aposta diferente sobre o que significa "posição".

Type: Build

Languages: Python

Prerequisites: Phase 7 · 02 (Self-Attention), Phase 7 · 03 (Multi-Head Attention)

Time: ~45 minutes

O problema

A atenção do produto de ponto é cega à ordem.softmax(Q K^T / √d) VÉ calculado a partir de semelhanças em pares.XNada dentro da atenção se importa com a posição.

Não é um erro num modelo de saco de palavras. Para linguagem, código, áudio, vídeo qualquer coisa onde a ordem carrega significado é fatal.

A solução é injetar posição nos embeddings de alguma forma.

  1. Absolute sinusoidal(Vaswani 2017). Adicionar sin/cosSimples, livres de aprendizagem, extrapolam mal além dos comprimentos treinados.
  2. RoPE — Rotary Position Embeddings(Su 2021). Rotar os vetores Q e K por um ângulo proporcional à posição. Encode posição relativa diretamente no produto de pontos. Dominant em 2026.
  3. ALiBi — Attention with Linear Biases(Presião 2022). Salte integrados inteiramente; adicione uma penalidade linear por cabeça às pontuações de atenção com base na distância. Excelente extrapolação de comprimento.

A partir de 2026, praticamente todos os modelos abertos de fronteira usam RoPE: Llama 2/3/4, Qwen 2/3, Mistral, Mixtral, DeepSeek-V3, Kimi.

O conceito

!Sinusoidal absolute vs RoPE rotations vs ALiBi distance bias

A posição de posição é igual a:

Pre-computação de uma matriz fixa PEde forma(max_len, d_model)- Não .

PE[pos, 2i]   = sin(pos / 10000^(2i / d_model))
PE[pos, 2i+1] = cos(pos / 10000^(2i / d_model))

Então ...X' = X + PE[:N]Cada dimensão é um sinusoide em uma frequência diferente.max_lenO modelo não tinha conhecimento do que acontece na posição 2048 quando só viu posições 02047.

RoPE

Rotar os vetores Q e K (não incorporados). Para um par de dimensões (2i, 2i+1)- Não .

[q'_2i    ]   [ cos(pos·θ_i)  -sin(pos·θ_i) ] [q_2i   ]
[q'_2i+1  ] = [ sin(pos·θ_i)   cos(pos·θ_i) ] [q_2i+1 ]

θ_i = base^(-2i / d_head),  base = 10000 by default

Aplicar a mesma rotação às teclas com posição pos_kO produto de pontosq'_m · k'_ntorna-se uma função de (m - n)- Só a mim.the attention score depends only on the relative distance- É um truque bonito.

Extensão do RoPE: baseO Llama 3 foi ampliado de 8K para 128K de tal forma.

A.L.B.

Esqueça o truque de inserção.

attn_score[i, j] = (q_i · k_j) / √d  -  m_h · |i - j|

Onde ?m_hé uma inclinação específica da cabeça (por exemplo 1 / 2^(8·h/H)O documento mostra que a extrapolação de comprimento supera o sinusoidal e corresponde ao RoPE em seu comprimento treinado original.

O que escolher em 2026

VariantExtrapolationTraining costUsed by
Absolute sinusoidalpoorfreeoriginal transformer, early BERT
Learned absolutenonetinyGPT-2, GPT-3
RoPEgood with scalingfreeLlama 2/3/4, Qwen 2/3, Mistral, DeepSeek-V3, Kimi
RoPE + YaRNexcellentfine-tune stageQwen2-1M, Llama 3.1 128K
ALiBiexcellentfreeBLOOM, MPT, Baichuan

O RoPE ganhou porque chama a atenção sem alterar a arquitetura, codifica a posição relativa e a suabaseO hiperparâmetro dá um botão limpo para ajuste fino de longo contexto.

Construí-lo

Passo 1: codificação sinusoidal

Veja .code/main.pyUm cálculo de 4 linhas:

pythondef sinusoidal(N, d):
    pe = [[0.0] * d for _ in range(N)]
    for pos in range(N):
        for i in range(d // 2):
            theta = pos / (10000 ** (2 * i / d))
            pe[pos][2 * i]     = math.sin(theta)
            pe[pos][2 * i + 1] = math.cos(theta)
    return pe

Adicione isto à matriz de incorporação antes da primeira camada de atenção.

Passo 2: RoPE aplicado a Q, K

O RoPE opera no local em Q e K. Para cada par de dimmers:

pythondef apply_rope(x, pos, base=10000):
    d = len(x)
    out = list(x)
    for i in range(d // 2):
        theta = pos / (base ** (2 * i / d))
        c, s = math.cos(theta), math.sin(theta)
        a, b = x[2 * i], x[2 * i + 1]
        out[2 * i]     = a * c - b * s
        out[2 * i + 1] = a * s + b * c
    return out

Crucial: aplicar a mesma função a Q na posição mE K na posição nO produto deles pega um .cos((m-n)·θ_i)A atenção aprende a posição relativa de graça.

Passo 3: Pistas e preconceitos do ALiBi

pythondef alibi_bias(n_heads, seq_len):
    # slope_h = 2 ** (-8 * h / n_heads) for h = 1..n_heads
    slopes = [2 ** (-8 * (h + 1) / n_heads) for h in range(n_heads)]
    bias = []
    for m in slopes:
        row = [[-m * abs(i - j) for j in range(seq_len)] for i in range(seq_len)]
        bias.append(row)
    return bias  # add to attention scores before softmax

Adicionarbias[h]- O que é ?(seq_len, seq_len)Matriz de pontuação de atenção da cabeça h, depois softmax.

Passo 4: verificar a propriedade relativa de distância do RoPE

Escolha dois vetores aleatórios .a, b- Vira por .(pos_a, pos_b)- Então , por ...(pos_a + k, pos_b + k). Ambos os produtos de pontos devem corresponder no erro de ponto flutuante. Essa propriedade é o ponto inteiro de RoPE é invariante ao deslocamento absoluto, só a diferença relativa é importante.

Usá-lo

PyTorch 2.5+ embarca serviços de RoPE em torch.nn.functionalA maioria dos códigos de produção usaflash_attnou xformersonde o RoPE é aplicado dentro do núcleo de atenção.

pythonfrom transformers import AutoModel
model = AutoModel.from_pretrained("meta-llama/Llama-3.2-3B")
# model.config.rope_scaling → {"type": "yarn", "factor": 32.0, "original_max_position_embeddings": 8192}

Long-context tricks in 2026:

  • NTK-aware interpolation.Redescálculosbase- Não .base * (scale_factor)^(d/(d-2))quando se estende de 4K a 16K+.
  • YaRN.Interpolação mais inteligente que preserva a entropia da atenção em contextos longos.
  • LongRoPE.O método 2024 da Microsoft que usa a pesquisa evolutiva para escolher fatores de escala por dimensão.
  • Position interpolation + fine-tuning.Apenas reduzir as posições pelo fator de extensão e ajustar para tokens de 15B. Surpreendentemente eficaz.

Envia-o

Veja .outputs/skill-positional-encoding-picker.md. A habilidade escolhe uma estratégia de codificação para um novo modelo, dada a extensão do contexto-alvo, as necessidades de extrapolação e o orçamento de formação.

Exercícios

  1. Easy.Traçar o sinusoidal PEMatrix como mapa de calor para max_len=512, d=128Confirmar o padrão "as tiras ficam mais largas à medida que o índice de dimensões cresce".
  2. Medium.Implementar a escalação do RoPE com NTK. Treinar um pequeno LM em sequências de comprimento 256, depois testar no comprimento 1024 com e sem escalação. Medir a perplexidade.
  3. Hard.Implementar ALiBi e RoPE no mesmo módulo de atenção. Treinar um transformador de 4 camadas em uma tarefa de cópia com sequências de comprimento 512. Extrapolar para 2048 no momento do teste. Comparar degradação.

Termos-chave

TermWhat people sayWhat it actually means
Positional encoding"Tells attention about order"Any signal added to embeddings or attention that encodes position.
Sinusoidal"The original one"sin/cos at geometric frequencies added to embeddings; doesn't extrapolate.
RoPE"Rotary embeddings"Rotate Q, K by position-dependent angle; dot product encodes relative distance.
ALiBi"Linear bias trick"Add -m·|i-j| to attention scores; no embedding needed, great extrapolation.
base"RoPE's knob"The frequency scaler in RoPE; increase to extend context at inference.
NTK-aware"A RoPE scaling trick"Rescale base so high-frequency dims aren't squeezed when context expands.
YaRN"The fancy one"Per-dimension interpolation+extrapolation that preserves attention entropy.
Extrapolation"Works beyond trained length"Can the position scheme serve correct output past max_len seen in training?

Mais leitura

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.