Reading the Math in AI Papers · Parte 1 de 1

Como ler a matemática dos artigos de AI no arXiv: um guia prático

Tradução automática

Este artigo foi traduzido automaticamente a partir da versão original em inglês.

Saber ler a matemática de um artigo de AI é uma competência útil para engenheiros que precisam de perceber um modelo, reproduzir um método ou avaliar uma afirmação experimental. Este guia explica como decifrar a notação, verificar uma equação com números pequenos e ligá-la ao resto do artigo e à implementação. Pressupõe que sabe ler código, mas não que a notação de investigação já lhe seja familiar.

Uma equação comprime várias decisões numa só linha: os objetos manipulados, as suas dimensões, os valores que são amostrados e o que é aprendido ou mantido fixo. Recuperar esses pormenores é um bom primeiro passo. Explicar porque é que um método funciona e implementá-lo com fidelidade exige mais trabalho.

Comece pelo percurso da atenção: liga uma equação às formas dos arrays, a números pequenos e a Python executável. A referência de notação explica as expressões que vai encontrar noutros artigos. O resto desta série aplica o mesmo método a equações de artigos concretos: equações de arquitetura como RoPE, MLA e LoRA; objetivos de treino como DPO e GRPO; e modelos generativos e métricas como o ELBO, a difusão e o pass@k. Essas partes ainda não saíram, por isso os percursos a que esta parte se refere não têm ligação. Para um tratamento mais longo dos fundamentos, o livro de Tianhua Chen, The Little Book of Generative AI Foundations, desenvolve a álgebra linear e a probabilidade por trás dos modelos generativos.

Atenção, lida um símbolo de cada vez

A atenção produz um vetor de saída fazendo uma média ponderada de vetores valor. Obtém os pesos comparando um vetor consulta da posição de saída com um vetor chave de cada posição de entrada disponível. As matrizes QQ, KK e VV reúnem esses vetores de consulta, chave e valor. A atenção de produto escalar com escala combina estes passos na equação (1) da §3.2.1 (§ significa «secção») de Attention Is All You Need:

Attention⁡(Q,K,V)=softmax⁡(QK⊤dk)V.\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V.

As definições estão no texto, não na equação. O parágrafo anterior à equação (1) diz que as consultas e as chaves têm dimensão dkd_k e que os valores têm dimensão dvd_v. O método calcula o produto escalar de cada consulta com todas as chaves, divide cada um por dk\sqrt{d_k} e aplica uma softmax «para obter os pesos sobre os valores». As consultas são «agrupadas numa matriz QQ», e as chaves e os valores em KK e VV. Assim, cada linha destas matrizes é o vetor de um token, e a softmax produz um conjunto de pesos por consulta. As matrizes aprendidas que transformam os vetores dos tokens em QQ, KK e VV aparecem mais adiante, na §3.2.2.

Formas e papéis. Uma cabeça de atenção realiza um destes cálculos com os seus próprios vetores de consulta, chave e valor. Escreva as respetivas formas antes de ler os operadores. Para uma cabeça com nn consultas e mm chaves:

SímboloFormaO que éDe onde vem
QQn×dkn\times d_kuma linha de consulta por posição de saídavetores dos tokens vezes uma matriz aprendida
KKm×dkm\times d_kuma linha de chave por posição a que se pode atendervetores dos tokens vezes uma matriz aprendida
VVm×dvm\times d_vuma linha de valor por chavevetores dos tokens vezes uma matriz aprendida
K⊤K^\topdk×md_k\times mKK transposta: as linhas passam a colunasos mesmos números de KK
dkd_kum númeroa largura de cada consulta e de cada chaveuma definição fixa: 64 no Transformer de base

Os artigos indicam uma forma nomeando o conjunto a que a matriz pertence: Q∈Rn×dkQ\in\mathbb R^{n\times d_k} significa uma matriz de números reais com nn linhas e dkd_k colunas, um array de forma [n, dk].

Leia de dentro para fora.

  1. QK⊤QK^\top multiplica uma matriz n×dkn\times d_k por uma matriz dk×md_k\times m. O dkd_k partilhado é somado e desaparece, pelo que o resultado é uma tabela n×mn\times m de pontuações. A entrada (i,j)(i,j) é o produto escalar da consulta ii com a chave jj: multiplicam-se as entradas correspondentes e somam-se os produtos. Para comprimentos de vetor fixos, esta pontuação é maior quando as direções são mais parecidas.

  2. Dividir por dk\sqrt{d_k} impede que as pontuações cresçam com a largura do vetor. A nota de rodapé 4 do artigo mostra porque é que os produtos escalares sem escala crescem. Suponha que as componentes de uma consulta e de uma chave são independentes entre si (saber algumas delas não diz nada sobre as outras), cada uma com média 0 e variância 1 (a distância quadrática média à média). Então:

    one product qiki:variance 1q⊤k=∑i=1dkqiki:variance dk, standard deviation dkq⊤k/dk:standard deviation 1\begin{aligned} \text{one product }q_ik_i:&\quad\text{variance }1\\ q^\top k=\textstyle\sum_{i=1}^{d_k}q_ik_i:&\quad\text{variance }d_k,\ \text{standard deviation }\sqrt{d_k}\\ q^\top k/\sqrt{d_k}:&\quad\text{standard deviation }1 \end{aligned}

    As linhas usam duas regras sobre números independentes. Primeiro, o produto de dois números independentes, ambos com média 0 e variância 1, também tem variância 1. Segundo, quando se somam números independentes, as suas variâncias somam-se, pelo que os dkd_k produtos dão variância dkd_k. O desvio-padrão é a raiz quadrada da variância, dk\sqrt{d_k}. Dividir cada pontuação por dk\sqrt{d_k} reduz a dispersão no mesmo fator, de volta a 1.

    Porque é que as duas regras se verificam

    Variância quando a média é 0. A variância é a distância quadrática média à média. Quando a média é 0, a distância quadrática à média é simplesmente o quadrado do número, pelo que a variância é a média do quadrado. Uma componente qiq_i com média 0 e variância 1 tem, portanto, qi2q_i^2 com média 1.

    A média de um produto. Para números independentes, a média de um produto é o produto das médias. Tome um número aa que é 1 ou 3 com igual probabilidade, pelo que tem média 2, e um número bb que é 1 ou 5, também com igual probabilidade, pelo que tem média 3. Independentes significa que bb toma cada um dos seus valores com a mesma frequência, qualquer que tenha sido o resultado de aa, pelo que os quatro pares são igualmente prováveis. Quando a=1a=1, os produtos são 1 e 5, com média 3=1×33=1\times3. Quando a=3a=3, são 3 e 15, com média 9=3×39=3\times3. Em qualquer dos casos a média é a×3a\times3, pelo que, sobre os dois valores de aa, é (3+9)/2=6(3+9)/2=6, que é 2×32\times3. Sem independência a regra falha: se bb fosse 5 sempre que aa é 3, e 1 sempre que aa é 1, só ocorreriam os produtos 1 e 15, cuja média é 8. A Wikipédia enuncia a regra para quaisquer variáveis aleatórias independentes, com «valor esperado» para a média: independência e valor esperado.

    Regra 1: um produto tem variância 1. Tome um produto qikiq_ik_i. A sua média é o produto das médias, 0×0=00\times0=0, pelo que a sua variância é a média de (qiki)2=qi2ki2(q_ik_i)^2=q_i^2k_i^2. Os quadrados são independentes porque qiq_i e kik_i o são, e cada um tem média 1, pelo que a variância é 1×1=11\times1=1. A fórmula geral é a variância de um produto de variáveis independentes.

    Regra 2: as variâncias de termos independentes somam-se. Chame aos produtos xi=qikix_i=q_ik_i, de modo que o produto escalar é a soma x1+⋯+xdkx_1+\cdots+x_{d_k}. Os termos são independentes porque cada um usa componentes diferentes, e cada um tem média 0 e variância 1. A soma também tem média 0, pelo que a sua variância é a média do seu quadrado. Multiplicar a soma por si própria dá um produto xixjx_ix_j para cada par de termos, uma grelha dk×dkd_k\times d_k:

    Uma grelha de quatro por quatro para o quadrado de x1 + x2 + x3 + x4, com uma célula para cada produto de dois termos. As quatro células da diagonal, de x1 ao quadrado a x4 ao quadrado, estão realçadas: cada uma tem média 1, pelo que somam 4. As outras doze células multiplicam dois termos independentes diferentes e cada uma tem média 0 vezes 0, pelo que somam 0. O quadrado da soma tem média 4: variância 4, desvio-padrão 2. Com 64 termos, a mesma contagem dá variância 64 e desvio-padrão 8.Uma grelha de quatro por quatro para o quadrado de x1 + x2 + x3 + x4, com uma célula para cada produto de dois termos. As quatro células da diagonal, de x1 ao quadrado a x4 ao quadrado, estão realçadas: cada uma tem média 1, pelo que somam 4. As outras doze células multiplicam dois termos independentes diferentes e cada uma tem média 0 vezes 0, pelo que somam 0. O quadrado da soma tem média 4: variância 4, desvio-padrão 2. Com 64 termos, a mesma contagem dá variância 64 e desvio-padrão 8.

    As células da diagonal são os quadrados xi2x_i^2, e cada uma tem média 1. Todas as outras células multiplicam dois termos diferentes e independentes, pelo que a sua média é o produto das médias, 0×0=00\times0=0: os seus valores positivos e negativos anulam-se. Só ficam as dkd_k células da diagonal, pelo que a variância da soma é dkd_k e o seu desvio-padrão é dk\sqrt{d_k}. A dispersão cresce com a raiz quadrada da largura porque a maior parte da grelha se anula. A Wikipédia dá o enunciado geral como a variância de uma soma de variáveis não correlacionadas; as variáveis independentes são sempre não correlacionadas, por isso a regra também as cobre.

    Com dk=64d_k=64, as pontuações em bruto espalham-se tipicamente por cerca de ±8\pm8; com a escala, por cerca de ±1\pm1, seja qual for a largura.

    Pontuações muito dispersas saturam a softmax (passo 3), e os seus gradientes desaparecem. Se uma pontuação de uma linha estiver muito acima das outras, a softmax dá a essa chave um peso próximo de 1 e a todas as outras um peso próximo de 0. Uma pequena alteração a qualquer pontuação quase não move então os pesos, pelo que o gradiente que chega às consultas e às chaves é próximo de zero, e o treino quase não tem com que as ajustar. O artigo apresenta isto como a explicação provável de um resultado anterior: sem a escala, a atenção de produto escalar tinha pior desempenho do que a atenção aditiva, uma forma mais antiga que pontua uma consulta e uma chave com uma pequena rede, para dkd_k grande (Britz et al., 2017). O artigo não mede os gradientes por si próprio.

  3. A softmax transforma cada linha de pontuações em pesos. Seja z=(z1,…,zm)z=(z_1,\ldots,z_m) uma linha das pontuações com escala. A exponencial eae^a, também escrita exp⁡(a)\exp(a), usa a constante e≈2.718e\approx2.718. Então softmax⁡(z)j=ezj/∑j′ezj′\operatorname{softmax}(z)_j=e^{z_j}/\sum_{j'}e^{z_{j'}}, em que j′j' é apenas um segundo nome de índice, pelo que a soma percorre todas as chaves da linha. Os pesos são positivos e cada linha soma 1.

  4. Multiplicar os pesos n×mn\times m pelos valores m×dvm\times d_v soma o eixo das chaves. A linha ii da saída n×dvn\times d_v é uma média ponderada das linhas de valores, ponderada pela qualidade com que cada chave correspondeu à consulta ii.

Uma cabeça de atenção desenhada como grelhas de números, com três consultas, quatro chaves, largura de chave dois e largura de valor três. Q, três por dois, vezes K transposta, dois por quatro, dá uma tabela de pontuações de três por quatro. A softmax mantém essa forma e faz cada linha somar um. Os pesos, três por quatro, vezes V, quatro por três, dão uma saída de três por três, e a linha dois da saída é uma média ponderada das linhas de valores usando a linha dois dos pesos.Uma cabeça de atenção desenhada como grelhas de números, com três consultas, quatro chaves, largura de chave dois e largura de valor três. Q, três por dois, vezes K transposta, dois por quatro, dá uma tabela de pontuações de três por quatro. A softmax mantém essa forma e faz cada linha somar um. Os pesos, três por quatro, vezes V, quatro por três, dão uma saída de três por três, e a linha dois da saída é uma média ponderada das linhas de valores usando a linha dois dos pesos.

Conte os quadrados na figura: cada produto remove o eixo que as duas grelhas partilham.

Verifique com dois números. Tome uma consulta e duas chaves cujas pontuações com escala são (0,log⁡3)(0,\log3), escolhidas para que as exponenciais dêem 1 e 3, e os valores v1=(2,0)v_1=(2,0) e v2=(0,4)v_2=(0,4). A figura resolve-o com uma operação por coluna:

Uma tabela com uma linha por chave. Chave 1: pontuação com escala 0, exponencial 1, peso 1/4, valor (2, 0), valor ponderado (0.5, 0). Chave 2: pontuação com escala log 3, exponencial 3, peso 3/4, valor (0, 4), valor ponderado (0, 3). As exponenciais somam 4, os pesos somam 1 e os valores ponderados dão a saída (0.5, 3).Uma tabela com uma linha por chave. Chave 1: pontuação com escala 0, exponencial 1, peso 1/4, valor (2, 0), valor ponderado (0.5, 0). Chave 2: pontuação com escala log 3, exponencial 3, peso 3/4, valor (0, 4), valor ponderado (0, 3). As exponenciais somam 4, os pesos somam 1 e os valores ponderados dão a saída (0.5, 3).

A atenção misturou os dois valores; não escolheu o token que correspondia melhor.

Compare com o código. A função NumPy abaixo implementa uma cabeça. k.T é a transposta. axis=1 é o eixo das chaves, pelo que a linha de cada consulta é normalizada em separado. O máximo da linha é subtraído antes de np.exp: somar o mesmo número a todas as pontuações de uma linha cancela-se na razão da softmax, pelo que o resultado não muda, mas as pontuações grandes deixam de provocar overflow. A máscara opcional põe as pontuações bloqueadas a −∞-\infty, o que torna os seus pesos exatamente zero. Um decoder usa uma máscara destas para impedir que cada token atenda a tokens posteriores (§3.2.3 do artigo).

Guarde o bloco como attention_example.py e execute uv run --with numpy python attention_example.py. As verificações passam em silêncio.

import numpy as np

def attention(q, k, v, allowed=None):
    """One head. q: [n, dk], k: [m, dk], v: [m, dv], allowed: bool [n, m]."""
    scores = q @ k.T / np.sqrt(q.shape[1])  # [n, m]
    if allowed is not None:
        if not allowed.any(axis=1).all():
            raise ValueError("every query needs at least one allowed key")
        scores = np.where(allowed, scores, -np.inf)
    scores = scores - scores.max(axis=1, keepdims=True)
    weights = np.exp(scores)
    weights = weights / weights.sum(axis=1, keepdims=True)  # rows sum to 1
    return weights @ v, weights  # [n, dv], [n, m]

# The two-key example from the text.
out, w = attention(
    np.array([[1.0]]),
    np.array([[0.0], [np.log(3.0)]]),
    np.array([[2.0, 0.0], [0.0, 4.0]]),
)
np.testing.assert_allclose(w, [[0.25, 0.75]])
np.testing.assert_allclose(out, [[0.5, 3.0]])

# A causal mask: query i may attend only to keys 0..i.
x = np.random.default_rng(0).normal(size=(3, 4))
out, w = attention(x, x, x, allowed=np.tril(np.ones((3, 3), dtype=bool)))
assert out.shape == (3, 4)
np.testing.assert_allclose(w.sum(axis=1), 1.0)
assert np.all(w[np.triu_indices(3, k=1)] == 0)

Uma consulta cujas chaves estão todas bloqueadas é um caso que a equação deixa em aberto: todos os pesos da sua linha seriam 0/00/0. A função levanta um erro em vez de devolver NaN.

De uma cabeça para várias. O Transformer de base executa oito cabeças em paralelo, cada uma com as suas próprias matrizes aprendidas para produzir QQ, KK e VV, e cada uma com dk=dv=64d_k=d_v=64. Concatena as suas saídas e multiplica o resultado por outra matriz aprendida, WOW^O (Attention Is All You Need, §3.2.2).

Uma implementação também pode processar um lote (batch): várias sequências de entrada em conjunto. Por exemplo, a scaled dot-product attention do PyTorch aceita um tensor de consultas Q com forma [batch, heads, n, d_k]. As duas primeiras dimensões selecionam uma sequência e uma cabeça; Q[b, h] é a matriz [n, d_k] desse par. A fórmula da atenção aplica-se separadamente a cada par. A função NumPy aqui apresentada trata apenas um destes pares: as suas operações .T e axis=1 pressupõem entradas bidimensionais.

Seis perguntas para qualquer equação

PerguntaResposta para a atenção
O que devolve a equação, e com que forma?Uma matriz n×dvn\times d_v: uma linha de saída por consulta
Cada símbolo é um dado, um peso treinado, um modelo congelado, uma definição ou uma amostra?QQ, KK e VV são calculados a partir de tokens por matrizes aprendidas; dkd_k é uma definição fixa; nada é amostrado
Sobre que índice ou eixo corre cada operação?A softmax corre sobre as mm chaves da linha de cada consulta; o produto dos pesos por VV soma sobre as chaves
Onde estão as definições?O parágrafo anterior à equação (1), a nota de rodapé 4, e a §3.2.2 para as projeções aprendidas
O que dá uma verificação com dois ou três números?Pesos (1/4,3/4)(1/4,3/4) e saída (0.5,3)(0.5,3)
O que teve o código de decidir que a equação deixa em aberto?Subtrair o máximo da linha, o valor usado para as pontuações mascaradas, uma linha sem nenhuma chave permitida

Que tipo de afirmação faz uma equação

A atenção é um cálculo: diz como obter uma saída a partir de entradas. Os artigos também escrevem equações que cumprem outras funções:

TipoExemplo nesta sérieO que verificar
CálculoA saída da atenção; o vetor comprimido da MLAA forma de cada resultado intermédio
DefiniçãoA pontuação da GRPO relativa a outras respostasO que o novo nome representa, para o poder substituir de volta
Objetivo: uma perda a minimizar ou uma pontuação a maximizarA perda da DPOSe é minimizado ou maximizado, e sobre que dados se calcula a média
Regra de atualizaçãoDescida do gradiente; a memória da Gated DeltaNetO que muda em cada passo e o que fica fixo
Restrição, ou um conjunto de valores permitidosAs matrizes de mistura permitidas da mHCComo o artigo produz um valor que a satisfaz
Limite: um máximo ou um mínimo de uma grandezaO limite inferior da evidência (ELBO)A diferença entre os dois lados, e quando é zero
Estimador ou métricapass@kO que é contado, e a partir de quantas amostras
Ajuste empíricoA lei de escala do DeepSeek LLMO intervalo de dados em que a curva foi ajustada

Uma restrição enuncia uma propriedade que o resultado tem de ter. Para os pesos da atenção, essa propriedade é: todos os pesos são não negativos e cada linha soma 1. A softmax é um cálculo que produz pesos com essa propriedade. O requisito, por si só, não diz que se deve usar a softmax.

== afirma que duas expressões são iguais. :=:= significa «é definido como»: dá um nome a uma expressão. Uma definição pode dar nome a uma métrica, a uma perda ou a um conjunto de valores permitidos, pelo que ver :=:= não lhe diz que tipo de equação da tabela acima está a ler.

Por exemplo, Evaluating Large Language Models Trained on Code, o artigo que apresentou o modelo de geração de código Codex, usa :=:= para definir o seu estimador do pass@k (equação 1). Esta métrica mede a probabilidade de pelo menos um de kk programas gerados passar nos testes. No relatório técnico do DeepSeek-V4, a equação (2) combina duas afirmações: M:={…}\mathcal M:=\{\ldots\} define um conjunto de matrizes permitidas, e Bl∈MB_l\in\mathcal M exige que a matriz de mistura do modelo BlB_l pertença a esse conjunto. A definição usa :=:=; a restrição usa ∈\in, que significa «pertence a». As secções sobre pass@k e mHC percorrem esses exemplos.

Encontrar a nova equação, as suas definições e o seu código

A secção de métodos de um artigo descreve como funciona o seu modelo ou algoritmo de treino. O título pode ser «Method», «Architecture» ou algo mais específico. Os autores costumam explicar primeiro um método existente e depois mostrar o que mudaram. Para identificar a contribuição reivindicada, comece pelo resumo da introdução sobre o que há de novo. Por exemplo, DeepSeekMath, §1.1 apresenta a Group Relative Policy Optimization (GRPO), o seu método para treinar modelos a partir de respostas pontuadas. Os números de secção e de equação aqui referem-se ao artigo ligado.

Depois compare o método proposto com o método anterior que ele altera. Dois artigos ilustram isto:

  • Uma mudança de arquitetura. O DeepSeek-V2 descreve a atenção multi-head padrão na §2.1.1 e apresenta a multi-head latent attention (MLA) na §2.1.2. A atenção padrão guarda as chaves e os valores de todos os tokens anteriores. A MLA guarda um vetor comprimido a partir do qual eles podem ser reconstruídos. Comparar essas equações revela o que o modelo guarda de forma diferente; o percurso da MLA deriva a poupança de memória.
  • Uma mudança de treino. DeepSeekMath, §4.1.1 apresenta o objetivo da Proximal Policy Optimization (PPO) como equação (1) e o da GRPO como equação (3). Ambos usam uma vantagem: um número que diz se uma resposta foi melhor ou pior do que o esperado. A PPO estima-a com uma segunda rede aprendida, o modelo de valor, que prevê a recompensa ainda por vir a partir de uma resposta parcial. A GRPO, em vez disso, compara a recompensa da resposta com as recompensas de outras respostas à mesma pergunta. O percurso da GRPO compara estes termos usando a notação de resposta completa do DeepSeek-R1.

Encontre as definições à volta da equação. Verifique o parágrafo anterior, qualquer frase «onde …» que se lhe siga, as notas de rodapé e os apêndices. Em Attention Is All You Need, o parágrafo anterior à equação (1) define as dimensões, e a nota de rodapé 4 explica o fator de escala. O DeepSeek-V3 define a maioria dos seus símbolos de encaminhamento logo a seguir à equação (15), e o viés bib_i imediatamente antes da equação (16). O DeepSeek-V2 desenvolve a MLA ao longo das equações (9)–(19) e depois reúne o cálculo no Apêndice C.

Verifique o algoritmo e o código. Uma caixa de algoritmo é uma listagem numerada de pseudocódigo que dá a ordem das operações. O Algoritmo 1 do DeepSeekMath mostra quando gerar respostas e quando atualizar o modelo. O Algoritmo 1 de Denoising Diffusion Probabilistic Models (DDPM) especifica como amostrar a imagem de treino, o nível de ruído e o ruído. As implementações resolvem outros pormenores: por omissão, np.std divide a soma dos desvios quadráticos por nn, enquanto torch.std divide por n−1n-1. O exemplo da GRPO mostra como essa escolha altera os valores de vantagem calculados a partir das mesmas recompensas.

As versões do arXiv podem mover secções e repetir equações com novos números, por isso cite a versão. No DeepSeek-R1 v1, o objetivo da GRPO está na §2.2.1, equações (1)–(3). Na v2, publicada em janeiro de 2026, está na §2.1, e as mesmas equações reaparecem como (11)–(13) no Suplemento A.3. Uma ligação sem versão abre a mais recente, por isso todas as ligações do arXiv nesta série incluem a versão com que foram verificadas.

Verificar a sua leitura com um LLM

Um modelo de conversação pode redigir a tabela de símbolos, o índice de cada soma e uma verificação com números pequenos, se lhe der as definições e lhe pedir que assinale o que falta. O texto copiado de um PDF achata subscritos, sobrescritos e frações numa só linha; as ligações «HTML (experimental)» e «TeX Source» na página de resumo do arXiv dão texto limpo para colar. Cole a equação e os parágrafos à volta com um prompt como este:

Below is equation (N) from <paper title, arXiv ID and version>, followed by
the paragraphs that define its symbols.

1. Make a table with one row per symbol: shape or type, meaning, and whether
   it is input data, a trained weight, a frozen model, a fixed setting or a
   random sample. Quote the sentence that defines it.
2. List every symbol the pasted text does not define. Do not guess them.
3. For every sum, mean, softmax, min or expectation, name the index or the
   distribution it runs over.
4. Work through the equation with the smallest numbers that use every term.
5. Say which kind of statement it is: a computation, definition, objective,
   update rule, constraint, bound, estimator or empirical fit.

Sem o passo 2, nada impede o modelo de preencher uma definição em falta com o significado habitual da letra, como ler σ\sigma na DPO como um desvio-padrão em vez da sigmoide. As citações do passo 1 tornam a tabela verificável: procure cada uma no PDF e trate uma linha cuja citação não encontra como um palpite.

O mesmo procedimento como skills de agente. O paper-math-skills reúne esta secção e a referência de notação abaixo em duas skills escritas para o Claude Code; outros agentes que carregam ficheiros SKILL.md também as podem usar. A read-paper-math obtém a versão fixada do arXiv, cita a frase que define cada símbolo, lê a equação de dentro para fora e executa uma verificação com números pequenos. A check-paper-math revê uma dessas leituras face ao artigo: procura cada citação, volta a executar os números e assinala afirmações mais fortes ou mais fracas do que as do artigo. O paper-math-readings tem as leituras das skills para as Partes 2–4, uma para cada uma das 15 secções com uma linha Source:.

Referência de notação

Se uma letra grega lhe for desconhecida, abra a referência de letras gregas deste artigo (Apêndice A) para ver o nome e os significados habituais. Para praticar mais a matemática, a Stanford CS229 disponibiliza revisões de probabilidade e de álgebra linear com exercícios; os preliminares do Dive into Deep Learning explicam os fundamentos com código.

Subscritos, marcas e sinais de relação

As letras são nomes de variáveis locais: cada artigo define as suas. Os subscritos são normalmente índices. xix_i pode ser a coordenada ii de um vetor ou o exemplo ii de um dataset, e hth_t é o vetor do modelo para o token tt, chamado o seu estado oculto.

Nos artigos sobre modelos, os sobrescritos são muitas vezes etiquetas. Em ht(ℓ)h_t^{(\ell)}, o sobrescrito entre parênteses é normalmente um número de camada, não uma potência; em FFN⁡i(s)\operatorname{FFN}^{(s)}_i e FFN⁡i(r)\operatorname{FFN}^{(r)}_i do DeepSeek-V3 marca os especialistas partilhados e os encaminhados, os que todos os tokens usam e os que um router escolhe (ver o exemplo de encaminhamento MoE). No DeepSeek-V2, WDKVW^{DKV} e ktCk_t^C levam etiquetas, não expoentes; o exemplo da MLA define essas etiquetas. W⊤W^\top é uma transposta e x2x^2 é um quadrado.

x1:Tx_{1:T} significa as posições 1 a TT, inclusive TT, ao contrário de uma fatia de Python; os artigos costumam contar a partir de 1. x<tx_{<t} significa todas as posições anteriores a tt. Xt,:X_{t,:} seleciona a linha tt, como na indexação por fatias do NumPy.

As marcas numa letra costumam alterar o seu significado de uma destas formas:

MarcaLeitura habitualExemplo ou exceção
y^\hat yUma previsão ou uma estimativaExemplo: A^i,t\hat A_{i,t} no DeepSeekMath estima quanto melhor do que o esperado uma resposta foi pontuada
xˉ\bar xUma médiaExceção: no DDPM, αˉt\bar\alpha_t multiplica os fatores do calendário de ruído do passo 1 até tt
x~\tilde xUma versão perturbada ou sem restriçãoExemplo: no DeepSeek-V4, B~l\tilde B_l é uma matriz antes de a normalização impor as suas restrições
x∗x^\astO ótimoExceção: na DPO, r∗r^\ast é a verdadeira recompensa, que o método nunca observa
x′x'Um valor novo ou intermédioExemplo: no DeepSeek-V3, gi,t′g'_{i,t} é o peso de um especialista antes da normalização
A−1A^{-1}A matriz inversaNão o recíproco entrada a entrada: A−1A^{-1} desfaz AA, A−1A=IA^{-1}A=I (a matriz identidade), e em geral (A−1)ij≠1/Aij(A^{-1})_{ij}\neq1/A_{ij}

Alguns símbolos que não são letras gregas também têm várias funções:

SímboloSignificados
∣\midCondicionamento em p(y∣x)p(y\mid x); «tal que» dentro de um conjunto
∣x∣\vert x\vertUm valor absoluto; o comprimento de uma sequência, como em ∣oi∣\vert o_i\vert, o número de tokens da resposta oio_i da GRPO; o tamanho de um conjunto
∼\sim«É amostrado de» em x∼px\sim p; «aproximadamente» em texto informal
TTUm comprimento de sequência; uma temperatura da softmax; o número de passos de difusão
qqUm vetor de consulta (atenção); uma pergunta (GRPO); o modelo aluno qθq_\theta (destilação); o codificador qϕq_\phi (ELBO)

Cinco sinais dizem como dois lados se relacionam. :=:=, por vezes ≜\triangleq, define um novo nome. ≈\approx marca uma aproximação, como a média amostrada em Valores esperados e de onde vêm as amostras. ∝\propto significa «proporcional a», com uma constante de normalização omitida: pi∝ezip_i\propto e^{z_i} só se torna uma distribuição depois de dividir por ∑jezj\sum_j e^{z_j}. ≪\ll significa «muito menor do que», como em dc≪dhnhd_c\ll d_hn_h do DeepSeek-V2: a largura comprimida é muito menor do que a largura total de todas as cabeças. ←\leftarrow é uma atribuição, como numa regra de atualização.

Somas, contagens, intervalos e logaritmos

O ∑\sum grande soma termos e o ∏\prod multiplica-os. O índice por baixo de cada operador começa aqui em 1 e percorre até ao limite superior NN:

∑i=1Nxi=x1+⋯+xN,∏i=1Nxi=x1⋯xN.\sum_{i=1}^{N}x_i=x_1+\cdots+x_N,\qquad\prod_{i=1}^{N}x_i=x_1\cdots x_N.

O índice pertence ao operador, tal como uma variável de ciclo pertence ao seu ciclo. Em yi=∑j=1dWijxjy_i=\sum_{j=1}^{d}W_{ij}x_j, a soma corre sobre jj, enquanto ii identifica uma entrada da saída. O resultado é um vetor com uma entrada por ii: o produto matriz-vetor WxWx escrito por extenso. Os índices do lado esquerdo dizem-lhe a forma da saída.

O fator à frente de uma soma decide o que recebe peso igual. Um lote com uma resposta de 2 tokens e outra de 8 tokens, em que ℓit\ell_{it} é a perda no token tt da resposta ii (na GRPO, ℓ\ell é antes um termo a maximizar), pode ter a média calculada de duas formas:

Lanswers=12(12∑t=12ℓ1t+18∑t=18ℓ2t)Ltokens=110(∑t=12ℓ1t+∑t=18ℓ2t)\begin{aligned} L_{\text{answers}}&=\frac12\left(\frac12\sum_{t=1}^{2}\ell_{1t}+\frac18\sum_{t=1}^{8}\ell_{2t}\right)\\ L_{\text{tokens}}&=\frac1{10}\left(\sum_{t=1}^{2}\ell_{1t}+\sum_{t=1}^{8}\ell_{2t}\right) \end{aligned}

Na primeira, cada resposta recebe o peso 12\tfrac12, repartido pelos seus tokens:

short answer, each token:12×12=14long answer, each token:12×18=116\begin{aligned} \text{short answer, each token:}&\quad\tfrac12\times\tfrac12=\tfrac14\\ \text{long answer, each token:}&\quad\tfrac12\times\tfrac18=\tfrac1{16} \end{aligned}

Na segunda, cada token tem peso 1/101/10. A GRPO amostra GG respostas o1,…,oGo_1,\ldots,o_G para cada pergunta, e ∣oi∣\vert o_i\vert é o número de tokens da resposta ii. As duas médias ficam então assim, para a GRPO do DeepSeekMath e para o DAPO, uma variante posterior da GRPO:

DeepSeekMath’s GRPO, per answer:1G∑i=1G1∣oi∣∑t=1∣oi∣ℓitDAPO, per token:1∑i∣oi∣∑i=1G∑t=1∣oi∣ℓit\begin{aligned} \text{DeepSeekMath's GRPO, per answer:}&\quad\frac1G\sum_{i=1}^{G}\frac1{\vert o_i\vert}\sum_{t=1}^{\vert o_i\vert}\ell_{it}\\ \text{DAPO, per token:}&\quad\frac1{\sum_i\vert o_i\vert}\sum_{i=1}^{G}\sum_{t=1}^{\vert o_i\vert}\ell_{it} \end{aligned}

Com G=2G=2, estas são LanswersL_{\text{answers}} e LtokensL_{\text{tokens}} acima. O DAPO passou para a média por token (§3.3) porque a média por resposta dava pouco peso aos tokens das respostas longas: o modelo aprendia pouco com respostas longas boas e não penalizava o suficiente as respostas longas, repetitivas e más.

Uma soma também pode contar. Os artigos fazem-no com um indicador: um «1» a negrito seguido de uma condição, 1[C]\mathbf 1[C], que é igual a 1 quando a condição CC é verdadeira e a 0 quando é falsa. Alguns artigos põem a condição entre parênteses ou imprimem um «1» de traço duplo; o significado é o mesmo. Somar indicadores conta, portanto, quantas vezes a condição se verifica. A exatidão é o exemplo habitual. Se y^i\hat y_i é a classe prevista e yiy_i a classe correta do exemplo ii, então ∑i1[y^i=yi]\sum_i\mathbf 1[\hat y_i=y_i] é o número de previsões corretas. As previsões (gato, cão, cão) face às etiquetas corretas (gato, gato, cão) dão os indicadores 1, 0 e 1, pelo que a contagem é 2 e a exatidão 2/3. Numa camada mixture-of-experts (MoE), um router envia cada token para algumas de muitas sub-redes feed-forward, chamadas especialistas. Na perda de equilíbrio do DeepSeek-V3 (equação 18), o indicador é 1 quando a pontuação de um especialista para um token está entre as KrK_r pontuações mais altas desse token, em que KrK_r é o número de especialistas para onde cada token é encaminhado. A sua soma sobre os tokens de uma sequência conta quantas vezes isso aconteceu. A pontuação aqui deixa de fora o viés que o encaminhamento acrescenta, pelo que a contagem pode diferir dos especialistas que o router realmente escolhe (encaminhamento MoE).

O coeficiente binomial (nk)\binom nk, que se lê «nn escolhe kk», conta as formas de escolher kk itens distintos de entre nn sem ter em conta a ordem. Para inteiros 0≤k≤n0\leq k\leq n, é igual a n!/(k! (n−k)!)n!/(k!\,(n-k)!). O ponto de exclamação significa fatorial: n!=1×2×⋯×nn!=1\times2\times\cdots\times n, com 0!=10!=1. Por exemplo, (52)=5!/(2! 3!)=10\binom52=5!/(2!\,3!)=10: cinco itens têm dez pares distintos. O DeepSeekMoE usa coeficientes binomiais para contar combinações de especialistas, e o estimador pass@k usa-os para contar conjuntos de amostras.

Os intervalos usam parênteses retos para as extremidades incluídas: [a,b][a,b] inclui ambas, (a,b)(a,b) nenhuma. Na Gated DeltaNet, αt∈(0,1)\alpha_t\in(0,1) significa estritamente entre 0 e 1. Noutros contextos, (a,b)(a,b) é um par.

O logaritmo natural inverte a exponenciação: log⁡(ea)=a\log(e^a)=a. Os logaritmos transformam produtos em somas e razões em diferenças: log⁡(ab)=log⁡a+log⁡b\log(ab)=\log a+\log b e log⁡(a/b)=log⁡a−log⁡b\log(a/b)=\log a-\log b, mas log⁡(a+b)\log(a+b) não se decompõe. É por isso que os artigos trabalham com log-probabilidades. O logaritmo de um produto de probabilidades de tokens é uma soma, e o logaritmo de uma razão das probabilidades de dois modelos é uma diferença, a forma usada nos objetivos da DPO e da GRPO. Os artigos de ML referem-se ao logaritmo natural, a menos que digam o contrário; os resultados estão em nats, e os logaritmos de base 2 dão bits. Para uma probabilidade p≤1p\leq1, −log⁡p≥0-\log p\geq0, e cresce sem limite à medida que pp se aproxima de 0, pelo que uma previsão errada com confiança é cara.

Log-sum-exp significa: exponenciar cada pontuação ziz_i, somar os resultados e depois tomar o logaritmo. Calcular log⁡∑iezi\log\sum_i e^{z_i} diretamente pode provocar overflow quando uma pontuação é grande. Em vez disso, encontre a maior pontuação e chame-lhe mm. A notação m=max⁡izim=\max_i z_i significa «compare todas as entradas ziz_i e tome a maior»; em NumPy, m = z.max().

Subtraia mm a cada pontuação antes de exponenciar e some-o de volta depois de tomar o logaritmo:

log⁡∑iezi=m+log⁡∑iezi−m.\log\sum_i e^{z_i}=m+\log\sum_i e^{z_i-m}.

Para z=(1000,1001)z=(1000,1001), a maior pontuação é m=1001m=1001. As pontuações deslocadas são (−1,0)(-1,0), pelo que o cálculo passa a 1001+log⁡(e−1+1)≈1001.3131001+\log(e^{-1}+1)\approx1001.313. Nenhuma exponencial é maior do que 1. O código da atenção usa a mesma subtração antes da softmax; aí o fator comum cancela-se na divisão, pelo que nada é somado de volta.

Probabilidade condicional e a probabilidade de texto

pθ(y∣x)p_\theta(y\mid x) é a probabilidade que o modelo com parâmetros θ\theta atribui à saída yy dada a entrada xx. O subscrito nomeia os parâmetros; alguns artigos escrevem p(y∣x;θ)p(y\mid x;\theta), em que o ponto e vírgula também marca parâmetros e não uma condição. Com um ponto no lugar da saída, pθ(⋅∣x)p_\theta(\cdot\mid x) é a distribuição completa sobre as saídas e não um único número. Os artigos de RL escrevem o mesmo objeto como πθ(o∣q)\pi_\theta(o\mid q), a probabilidade de o modelo escrever a resposta oo à pergunta qq, e chamam ao modelo uma política (policy).

Trocar o acontecimento e a condição dá um número diferente. Suponha 100 respostas de um modelo: 60 estão corretas, 50 são JSON válido e 40 são ambas as coisas. Então

P(correct∣valid JSON)=40/50=0.8,P(valid JSON∣correct)=40/60≈0.67.\begin{aligned} P(\text{correct}\mid\text{valid JSON})&=40/50=0.8,\\ P(\text{valid JSON}\mid\text{correct})&=40/60\approx0.67. \end{aligned}

Seja AA «a resposta está correta» e BB «a resposta é JSON válido». A probabilidade condicional restringe a contagem às respostas que satisfazem a condição: P(A∣B)=P(A∩B)/P(B)P(A\mid B)=P(A\cap B)/P(B), desde que P(B)>0P(B)>0. O símbolo ∩\cap significa «ambos os acontecimentos ocorrem». Aqui a fração é 0.4/0.5=0.80.4/0.5=0.8, o mesmo que 40 respostas corretas entre 50 respostas com JSON válido.

Dois acontecimentos são independentes quando saber que um ocorreu não altera a probabilidade do outro. Isso exige P(A∩B)=P(A)P(B)P(A\cap B)=P(A)P(B). Nesta amostra, P(both)=0.4P(\text{both})=0.4, enquanto P(correct)P(valid JSON)=0.6×0.5=0.3P(\text{correct})P(\text{valid JSON})=0.6\times0.5=0.3, pelo que as proporções observadas não satisfazem a independência.

O teorema de Bayes, também chamado regra de Bayes, relaciona as duas direções do condicionamento: P(A∣B)=P(B∣A)P(A)/P(B)P(A\mid B)=P(B\mid A)P(A)/P(B). Permite calcular a probabilidade de AA dado BB a partir da probabilidade de BB dado AA e das probabilidades dos dois acontecimentos. O exemplo do ELBO usa-o para encontrar a probabilidade de um código oculto dada uma imagem observada.

Um modelo de linguagem pontua uma sequência um token de cada vez. Pela regra da cadeia da probabilidade,

pθ(y1:T∣x)=∏t=1Tpθ(yt∣x,y<t)log⁡pθ(y1:T∣x)=∑t=1Tlog⁡pθ(yt∣x,y<t)\begin{aligned} p_\theta(y_{1:T}\mid x)&=\prod_{t=1}^{T}p_\theta(y_t\mid x,y_{<t})\\ \log p_\theta(y_{1:T}\mid x)&=\sum_{t=1}^{T}\log p_\theta(y_t\mid x,y_{<t}) \end{aligned}

Cada fator condiciona-se a todos os tokens anteriores, pelo que a fórmula não pressupõe que os tokens são independentes. Se três tokens têm probabilidades condicionais 0.5, 0.2 e 0.1:

p=0.5×0.2×0.1=0.01log⁡p=log⁡0.5+log⁡0.2+log⁡0.1≈−0.693−1.609−2.303≈−4.61\begin{aligned} p&=0.5\times0.2\times0.1=0.01\\ \log p&=\log0.5+\log0.2+\log0.1\approx-0.693-1.609-2.303\approx-4.61 \end{aligned}

A perda de treino habitual é o negativo desta soma, dividido pelo comprimento:

L(θ)=−1T∑t=1Tlog⁡pθ(yt∣x,y<t).\mathcal L(\theta)=-\frac1T\sum_{t=1}^{T}\log p_\theta(y_t\mid x,y_{<t}).

Durante o treino, os tokens anteriores y<ty_{<t} vêm do dataset. Durante a geração, são as escolhas anteriores do próprio modelo.

Valores esperados e de onde vêm as amostras

Um valor esperado é uma média ponderada pela probabilidade:

Ex∼p[f(x)]=∑xp(x)f(x).\mathbb E_{x\sim p}[f(x)]=\sum_x p(x)f(x).

Leia Ex∼p[f(x)]\mathbb E_{x\sim p}[f(x)] como «a média de f(x)f(x) quando xx é extraído de pp». A notação ∑x\sum_x soma sobre todos os valores discretos possíveis de xx. Sem subscrito, E[X]\mathbb E[X] calcula a média de uma variável aleatória XX sobre a sua própria distribuição: se XX é 1 com probabilidade 0.75 e 3 com probabilidade 0.25, então E[X]=1×0.75+3×0.25=1.5\mathbb E[X]=1\times0.75+3\times0.25=1.5.

Quando uma variável tem uma densidade p(x)p(x), isto é, probabilidade por unidade de xx, a média ponderada é um integral, ∫f(x)p(x) dx\int f(x)p(x)\,dx. O dxdx identifica xx como a variável de integração; sem limites escritos aqui, o integral cobre todo o seu intervalo. O exemplo da densidade explica a probabilidade por unidade e mostra um integral como a área sob uma curva.

O código de treino não consegue somar sobre todas as entradas possíveis, por isso amostra e faz a média: Ex∼p[f(x)]≈1N∑i=1Nf(xi)\mathbb E_{x\sim p}[f(x)]\approx\frac1N\sum_{i=1}^{N}f(x_i), com cada xix_i extraído independentemente de pp, o que os artigos escrevem como xi∼iidpx_i\overset{\text{iid}}{\sim}p. Os artigos chamam a isto uma estimativa de Monte Carlo, e em código é loss.mean() sobre um lote. A média do lote só estima o valor esperado se o lote for extraído da distribuição do subscrito do E\mathbb E, pelo que o subscrito diz-lhe como os dados de treino são produzidos:

  • A DPO calcula a média sobre exemplos guardados (x,yw,yl)∼D(x,y_w,y_l)\sim\mathcal D: um prompt, uma resposta preferida e uma resposta rejeitada. As respostas são recolhidas e etiquetadas antes desta fase de treino; podem vir de uma geração anterior do modelo. Em cada passo de treino, o modelo calcula as probabilidades dessas respostas fornecidas e atualiza os seus pesos. Não amostra respostas novas para esse passo.
  • GRPO no DeepSeek-R1: gerar respostas e depois comparar as suas recompensas. O treino extrai uma pergunta do dataset, gera várias respostas e pontua-as com uma função de recompensa, como verificar um resultado matemático ou executar testes unitários. A atualização favorece as respostas que pontuaram acima da média do grupo. A notação q∼P(Q)q\sim P(Q) significa «amostrar uma pergunta qq da distribuição das perguntas». A notação {oi}∼πθold(O∣q)\{o_i\}\sim\pi_{\theta_{old}}(O\mid q) significa «amostrar respostas oio_i a essa pergunta a partir da cópia do modelo chamada πθold\pi_{\theta_{old}}». O subscrito old marca a cópia que gerou estas respostas; essa cópia mantém-se fixa enquanto o lote é usado para atualizações. O percurso da GRPO explica a comparação de recompensas e as atualizações.
  • Destilação on-policy no MiniLLM e no DeepSeek-V4: gerar texto e depois aprender com as probabilidades do professor. O modelo que está a ser treinado é o aluno. Gera texto; um professor congelado fornece probabilidades do token seguinte para os mesmos prefixos, e o treino ajusta as probabilidades do aluno em direção às do professor. Estas probabilidades fornecem o sinal de treino, em vez da pontuação de recompensa de uma resposta da GRPO. O MiniLLM escreve o texto amostrado pelo aluno como y∼qθy\sim q_\theta: yy é o texto e qθq_\theta nomeia o modelo aluno. O DeepSeek-V4 chama πθ\pi_\theta ao seu aluno e usa vários professores especialistas. O procedimento de amostragem real do MiniLLM também mistura tokens extraídos do professor. O percurso da destilação explica os objetivos e essa distinção na amostragem.

A ordem diz-lhe o que o treino otimiza. Suponha que um modelo atribui as probabilidades 0.9 e 0.1 às saídas corretas de dois exemplos de treino com o mesmo peso. Calcular a média das suas log-probabilidades significa tomar primeiro cada logaritmo e depois fazer a média: np.log(probs).mean(). Tomar o logaritmo da sua média é np.log(probs.mean()). Se XX é a probabilidade atribuída à saída correta de um exemplo escolhido ao acaso:

E[log⁡X]=12(log⁡0.9+log⁡0.1)≈−1.20log⁡E[X]=log⁡((0.9+0.1)/2)=log⁡0.5≈−0.69\begin{aligned} \mathbb E[\log X]&=\tfrac12(\log0.9+\log0.1)\approx-1.20\\ \log\mathbb E[X]&=\log\bigl((0.9+0.1)/2\bigr)=\log0.5\approx-0.69 \end{aligned}

Negar estas pontuações dá perdas de 1.20 e 0.69. Um segundo modelo que atribui 0.5 a cada saída correta obtém 0.69 em qualquer dos cálculos. Assim, calcular a média das probabilidades antes de tomar o logaritmo trata os dois modelos como igualmente bons, enquanto a média habitual da log-probabilidade negativa penaliza mais o primeiro modelo pela sua baixa probabilidade na segunda saída correta. Ao traduzir uma perda para código, preserve a ordem do logaritmo e da média.

A desigualdade de Jensen enuncia a relação geral para XX positivo: E[log⁡X]≤log⁡E[X]\mathbb E[\log X]\leq\log\mathbb E[X]. Também ajuda a construir objetivos de treino alternativos. Quando a probabilidade dos dados segundo o modelo exige uma média dispendiosa sobre variáveis ocultas, uma média de termos logarítmicos pode fornecer um limite inferior mais fácil de estimar. O percurso do ELBO explica esse problema de treino; ELBO significa evidence lower bound (limite inferior da evidência). A secção 2.4 do livro de Tianhua Chen, The Little Book of Generative AI Foundations, deriva o limite usando a desigualdade de Jensen.

Densidades, variância e barras de erro

p(x)p(x) tem dois significados comuns. Para resultados discretos, como tokens ou classes, dá a probabilidade do resultado xx: um número entre 0 e 1, com as probabilidades a somar 1 sobre todos os resultados.

Para perceber o outro significado, suponha que XX é escolhido uniformemente entre 0 e 0.5. Intervalos com o mesmo comprimento têm probabilidades iguais. O intervalo de 0.1 a 0.2 ocupa um quinto de todo o intervalo, pelo que

P(0.1≤X≤0.2)=0.2−0.10.5=0.2.P(0.1\leq X\leq0.2)=\frac{0.2-0.1}{0.5}=0.2.

Dentro deste intervalo, a probabilidade é a largura do intervalo multiplicada por 2. Esse multiplicador é a densidade de probabilidade: p(x)=2p(x)=2 para 0≤x≤0.50\leq x\leq0.5, e zero fora. A densidade descreve a probabilidade por unidade da variável, não a probabilidade de um valor exato.

Probabilidade zero para um ponto não significa que nada seja amostrado. Estreite um intervalo à volta de 0.15: a sua probabilidade é o dobro da largura, pelo que se aproxima de zero quando a largura se aproxima de zero. O ponto exato tem, portanto, probabilidade zero. Uma extração produz mesmo assim algum valor em [0,0.5][0,0.5], e esse intervalo inteiro tem probabilidade 1. Se registar o resultado arredondado a duas casas decimais, um valor registado de 0.15 representa o intervalo de 0.145 a 0.155, cuja probabilidade é 2×0.01=0.022\times0.01=0.02.

Para uma densidade não uniforme, o multiplicador varia com xx. O integral soma as contribuições ao longo do intervalo:

P(a≤X≤b)=∫abp(x) dx.P(a\leq X\leq b)=\int_a^bp(x)\,dx.

Geometricamente, é a área sob a curva da densidade entre aa e bb; a área sobre todo o intervalo é 1. No exemplo uniforme, a área é simplesmente a altura 2 vezes a largura 0.5. Uma densidade pode, portanto, exceder 1, e o seu logaritmo pode ser positivo, como log⁡2≈0.69\log2\approx0.69 aqui. Uma probabilidade nunca excede 1.

A distribuição gaussiana usada para o ruído no DDPM tem uma densidade deste tipo. Nem toda a distribuição contínua tem uma densidade vulgar: a distribuição de Cantor é um contraexemplo matemático, fora dos modelos aqui discutidos. Armazenar valores reais também não implica uma distribuição contínua: uma variável restrita a 0.0 e 1.0 continua a ter dois resultados discretos.

Os artigos usam muitas vezes a mesma letra para probabilidades e densidades. Verifique como o artigo define a distribuição da variável e que variável é somada ou integrada. Um integral sobre uma variável oculta zz, como o código latente do ELBO da Parte 4, não lhe diz se um xx observado é discreto ou contínuo. Alguns artigos escrevem PP maiúsculo para probabilidades e pp minúsculo para densidades, mas muitos usam pp para ambos.

Para descrever quanto uma distribuição se dispersa à volta da sua média, os artigos usam a variância: a diferença quadrática média em relação à média, Var⁡(X)=E[(X−μ)2]\operatorname{Var}(X)=\mathbb E[(X-\mu)^2], com μ=E[X]\mu=\mathbb E[X]. O desvio-padrão é a sua raiz quadrada, pelo que tem as mesmas unidades que XX.

Estas grandezas também aparecem nos nomes das distribuições. A distribuição gaussiana, também chamada distribuição normal, escreve-se N(μ,σ2)\mathcal N(\mu,\sigma^2): μ\mu é a sua média e σ2\sigma^2 a sua variância. Para um vetor, N(μ,Σ)\mathcal N(\mu,\Sigma) usa uma matriz de covariância Σ\Sigma: a entrada (i,j)(i,j) mede como as coordenadas ii e jj variam em conjunto, e a diagonal contém as suas variâncias. N(0,I)\mathcal N(0,I) descreve um vetor de números normais padrão independentes, cada um com média 0 e variância 1; II é a matriz identidade.

As tabelas de benchmarks costumam indicar uma pontuação média juntamente com uma medida de variação. A dispersão das execuções individuais difere da incerteza da sua média: para NN execuções independentes com desvio-padrão σ\sigma, o erro-padrão da média é σ/N\sigma/\sqrt N.

Antes de comparar duas entradas como 82.3±0.482.3\pm0.4 e 81.5±0.481.5\pm0.4, descubra na legenda se 0.4 é um desvio-padrão entre execuções, um erro-padrão ou a semilargura de um intervalo de confiança. Para comparar as médias, calcule um intervalo para a sua diferença. Um procedimento de intervalo de confiança a 95% produz intervalos que contêm a verdadeira diferença em 95% das experiências repetidas, sob os seus pressupostos.

Para este exemplo, assuma quatro execuções independentes por modelo, pontuações das execuções aproximadamente normais e variâncias populacionais iguais. Se as execuções forem emparelhadas, como dois modelos avaliados nas mesmas tarefas amostradas de forma independente, analise antes as diferenças dentro dos pares. O guia de duas amostras do NIST explica estes casos.

Para médias independentes, a variância da sua diferença é a soma das suas variâncias. Uma variável normal padrão cai entre −1.96-1.96 e 1.961.96 com probabilidade de cerca de 0.95, o que fornece o multiplicador para uma aproximação normal de um intervalo a 95%. Se 0.4 for o desvio-padrão entre quatro execuções, esse primeiro cálculo dá:

standard error of each mean=0.4/4=0.2standard error of the gap=0.22+0.22≈0.28gap=82.3−81.5=0.8normal approximation=0.8±1.96×0.28≈0.8±0.55=from 0.25 to 1.35\begin{aligned} \text{standard error of each mean}&=0.4/\sqrt4=0.2\\ \text{standard error of the gap}&=\sqrt{0.2^2+0.2^2}\approx0.28\\ \text{gap}&=82.3-81.5=0.8\\ \text{normal approximation}&=0.8\pm1.96\times0.28\approx0.8\pm0.55\\ &=\text{from }0.25\text{ to }1.35 \end{aligned}

Esse multiplicador 1.96 trata a dispersão estimada como conhecida. Com apenas quatro execuções por modelo, use a distribuição t de Student para ter em conta a incerteza na dispersão. Sob os pressupostos acima, os seus graus de liberdade são 4+4−2=64+4-2=6 (oito execuções menos duas médias estimadas). scipy.stats.t.ppf(0.975, 6) dá cerca de 2.447 em vez de 1.96; 0.975 deixa 2.5% fora em cada extremo de um intervalo a 95%. Se o pressuposto de variâncias iguais não for adequado, use um intervalo de Welch, cujos graus de liberdade são calculados de outra forma.

Considere agora a outra leitura da legenda: 0.4 já é o erro-padrão de cada média, estimado a partir dessas quatro execuções. Nada é dividido por 4\sqrt4, e o erro-padrão da diferença é cerca de 0.566. O multiplicador t continua a ser necessário. As duas leituras dão:

0.4 a standard deviation, t interval:0.8±2.4470.22+0.22≈0.8±0.69from 0.11 to 1.490.4 a standard error, t interval:0.8±2.4470.42+0.42≈0.8±1.38from −0.58 to 2.18\begin{aligned} \text{0.4 a standard deviation, t interval:}&\quad0.8\pm2.447\sqrt{0.2^2+0.2^2}\approx0.8\pm0.69\\ &\quad\text{from }0.11\text{ to }1.49\\ \text{0.4 a standard error, t interval:}&\quad0.8\pm2.447\sqrt{0.4^2+0.4^2}\approx0.8\pm1.38\\ &\quad\text{from }-0.58\text{ to }2.18 \end{aligned}

A figura compara a aproximação normal inicial com os dois intervalos t:

Três intervalos para a mesma diferença de 0.8, assumindo quatro execuções independentes aproximadamente normais por modelo e variâncias populacionais iguais. Com 0.4 como desvio-padrão, a aproximação normal dá 0.25 a 1.35 e o intervalo t dá 0.11 a 1.49. Com 0.4 como erro-padrão estimado, o intervalo t dá menos 0.58 a 2.18 e contém o zero.Três intervalos para a mesma diferença de 0.8, assumindo quatro execuções independentes aproximadamente normais por modelo e variâncias populacionais iguais. Com 0.4 como desvio-padrão, a aproximação normal dá 0.25 a 1.35 e o intervalo t dá 0.11 a 1.49. Com 0.4 como erro-padrão estimado, o intervalo t dá menos 0.58 a 2.18 e contém o zero.

Quando 0.4 é o desvio-padrão, o intervalo t exclui o zero: sob estes pressupostos, os resultados sustentam uma diferença positiva. Quando 0.4 é o erro-padrão estimado, o intervalo contém o zero, pelo que os resultados não estabelecem qual dos modelos tem a pontuação média mais alta.

Entropia cruzada e divergência KL

Durante o treino, um modelo precisa de uma perda numérica que meça o grau de concordância das suas probabilidades previstas com o alvo de treino. O algoritmo de treino altera os parâmetros do modelo para reduzir essa perda. A entropia cruzada fornece uma perda dessas para exemplos etiquetados ou para as probabilidades de um modelo professor. A divergência de Kullback–Leibler (KL) mede a discrepância entre duas distribuições. Os artigos usam-na para treinar um aluno a imitar um professor ou para penalizar afastamentos de um modelo de referência fixo.

Aqui os resultados são discretos, como tokens ou classes. Escreva a distribuição alvo como pp e a distribuição prevista pelo modelo sobre os mesmos resultados como qq. Comece com um resultado observado ii: quando o modelo lhe atribuiu a probabilidade qiq_i, a sua perda é −log⁡qi-\log q_i. É 0 quando qi=1q_i=1, cerca de 0.69 quando qi=0.5q_i=0.5, cerca de 2.3 quando qi=0.1q_i=0.1, e infinita quando qi=0q_i=0.

A entropia cruzada faz a média dessa perda sobre resultados extraídos do alvo:

H(p,q)=Ei∼p[−log⁡qi]=−∑ipilog⁡qi.H(p,q)=\mathbb E_{i\sim p}[-\log q_i]=-\sum_i p_i\log q_i.

Com uma etiqueta one-hot pp, que é 1 na classe correta yy e 0 nas restantes, só conta a classe correta, e H(p,q)=−log⁡qyH(p,q)=-\log q_y: a perda de classificação habitual. A nn.CrossEntropyLoss do PyTorch calcula-a a partir das pontuações em bruto do modelo, chamadas logits, e aplica internamente a log-softmax; a sua entrada não é o vetor de probabilidades qq. Com a distribuição suave de um modelo professor como pp, todas as classes contam em proporção da probabilidade do professor. A destilação clássica treina um modelo pequeno com as probabilidades de um modelo grande desta forma. Para o alvo p=(0.9,0.1)p=(0.9,0.1), dois modelos têm estas entropias cruzadas H(p,q)H(p,q):

q=(0.5,0.5):−0.9log⁡0.5−0.1log⁡0.5≈0.693q=(0.9,0.1):−0.9log⁡0.9−0.1log⁡0.1≈0.095+0.230=0.325\begin{aligned} q=(0.5,0.5):&\quad -0.9\log0.5-0.1\log0.5\approx0.693\\ q=(0.9,0.1):&\quad -0.9\log0.9-0.1\log0.1\approx0.095+0.230=0.325 \end{aligned}

O segundo modelo coincide com o alvo, e nenhum modelo pode fazer melhor. Esse mínimo, 0.325 aqui, é H(p)=−∑ipilog⁡piH(p)=-\sum_ip_i\log p_i, a entropia de pp. Só é 0 para um alvo one-hot: quando o próprio alvo é incerto, resta alguma perda que nenhum modelo consegue remover.

A divergência KL subtrai esse mínimo e mantém apenas a perda causada por qq diferir de pp. Escreve-se com uma barra dupla ∥\Vert, que apenas separa os dois argumentos; não é a barra de probabilidade condicional ∣\mid de Probabilidade condicional e a probabilidade de texto nem as barras de comprimento ∥x∥\Vert x\Vert da referência de vetores. Os artigos usam-na em vez de uma vírgula para marcar que a ordem importa: a média corre sobre resultados extraídos do primeiro argumento.

DKL(p ∥ q)=H(p,q)−H(p)=∑ipilog⁡piqi=Ei∼p[log⁡piqi].D_{\mathrm{KL}}(p\,\Vert\,q)=H(p,q)-H(p)=\sum_i p_i\log\frac{p_i}{q_i}=\mathbb E_{i\sim p}\Bigl[\log\frac{p_i}{q_i}\Bigr].

Para o primeiro modelo acima, 0.693−0.325≈0.370.693-0.325\approx0.37. A KL é 0 quando as duas distribuições coincidem e positiva caso contrário.

A ordem altera as discrepâncias que são penalizadas. Um termo com pi>0p_i>0 e qi=0q_i=0 é infinito, pelo que DKL(p∥q)D_{\mathrm{KL}}(p\Vert q) penaliza qq por atribuir probabilidade zero a algo que pp pode produzir. Os resultados com pi=0p_i=0 não acrescentam nada (por convenção 0log⁡0=00\log0=0), pelo que não contribuem com penalização direta mesmo que qi>0q_i>0. Trocar os argumentos dá DKL(q∥p)D_{\mathrm{KL}}(q\Vert p), que é infinita sempre que qi>0q_i>0 e pi=0p_i=0. Os resultados com qi=0q_i=0 passam agora a não acrescentar nada, mesmo que pi>0p_i>0. Com pp como alvo, DKL(p∥q)D_{\mathrm{KL}}(p\Vert q) chama-se KL direta (forward) e DKL(q∥p)D_{\mathrm{KL}}(q\Vert p) KL inversa (reverse).

Para p=(0.5,0.5)p=(0.5,0.5) e q=(1,0)q=(1,0), a KL direta é infinita, porque qq falha um resultado que pp produz, enquanto a KL inversa é apenas 1×log⁡(1/0.5)+0=log⁡21\times\log(1/0.5)+0=\log2: o resultado que qq ignora não acrescenta nada. Para p=(0.9,0.1)p=(0.9,0.1) e q=(0.5,0.5)q=(0.5,0.5), a KL direta é a 0.37 encontrada acima, calculada aqui termo a termo, e a KL inversa difere:

DKL(p∥q)=0.9log⁡0.90.5+0.1log⁡0.10.5≈0.53−0.16=0.37DKL(q∥p)=0.5log⁡0.50.9+0.5log⁡0.50.1≈−0.29+0.80=0.51\begin{aligned} D_{\mathrm{KL}}(p\Vert q)&=0.9\log\tfrac{0.9}{0.5}+0.1\log\tfrac{0.1}{0.5}\approx0.53-0.16=0.37\\ D_{\mathrm{KL}}(q\Vert p)&=0.5\log\tfrac{0.5}{0.9}+0.5\log\tfrac{0.5}{0.1}\approx-0.29+0.80=0.51 \end{aligned}

Esta assimetria é a razão por que a KL se chama divergência e não distância.

Como H(p,q)=H(p)+DKL(p∥q)H(p,q)=H(p)+D_{\mathrm{KL}}(p\Vert q), e a entropia H(p)H(p) de um professor fixo não depende do aluno, a entropia cruzada face a um professor fixo dá ao aluno os mesmos gradientes que DKL(p∥q)D_{\mathrm{KL}}(p\Vert q). Alterar um parâmetro do aluno altera as duas perdas na mesma quantidade, pelo que as suas derivadas usadas no treino são iguais; Gradientes e otimização explica esse cálculo. Isto permite que o código de classificação e de destilação clássica use a entropia cruzada. A troca só funciona com o professor em primeiro lugar. Com o aluno em primeiro lugar, DKL(q∥p)=H(q,p)−H(q)D_{\mathrm{KL}}(q\Vert p)=H(q,p)-H(q), e a entropia do próprio aluno H(q)H(q) muda à medida que ele treina, pelo que os dois já não dão os mesmos gradientes.

Vetores e matrizes

As equações de arquitetura descrevem cálculos sobre arrays de números. A forma de um array diz-lhe como os seus números estão organizados, que operações são válidas e o que essas operações produzem. Um vetor é uma lista ordenada de números. Uma matriz organiza números em linhas e colunas. No código de ML, tensor é o termo geral para estes arrays numéricos, incluindo arrays com mais de dois eixos. Um eixo é uma dimensão ao longo da qual se indexa o array: uma matriz tem um eixo das linhas e um eixo das colunas.

O estado oculto de um token é um vetor de números calculado dentro do modelo para representar esse token. Suponha que processamos em conjunto um lote de BB sequências, cada uma com TT posições de token, e que cada estado oculto contém dd números. O array de estados ocultos tem a forma [B, T, d], que os artigos também escrevem como B×T×dB\times T\times d. Os seus três eixos selecionam a sequência, a posição do token e o número dentro do vetor desse token. Por exemplo, [2, 3, 4] contém duas sequências, três vetores de token por sequência e quatro números por vetor: 24 números no total. Aqui dd é a largura do vetor. A forma lista os três tamanhos; multiplicá-los dá o número de entradas.

Os artigos escrevem muitas vezes as formas como pertença a um conjunto: a∈Rda\in\mathbb R^d significa que aa é um vetor de dd números reais, e A∈Rm×nA\in\mathbb R^{m\times n} significa que AA é uma matriz com mm linhas e nn colunas. As letras a negrito marcam por vezes vetores ou tensores, mas é a definição do artigo que determina a forma.

Na tabela abaixo, aa e bb são vetores coluna: os seus números estão dispostos na vertical. O sobrescrito ⊤\top significa transposta: trocar linhas e colunas. Assim, a⊤a^\top é uma linha com os mesmos números da coluna aa. O AA e o BB maiúsculos aqui nomeiam matrizes; BB já não significa o tamanho do lote.

ExpressãoValores que usaO que a operação fazResultado
a⊤ba^\top b — produto escalarDois vetores coluna, cada um com dd entradasMultiplicar as entradas correspondentes e somar os produtos: ∑iaibi\sum_i a_i b_iUm número
ab⊤ab^\top — produto externoUma coluna aa com mm entradas e uma coluna bb com nn entradasMultiplicar cada entrada de aa por cada entrada de bbUma matriz m×nm\times n; a entrada (i,j)(i,j) é aibja_i b_j
ABAB — produto de matrizesAA com mm linhas e kk colunas; BB com kk linhas e nn colunasPara a entrada (i,j)(i,j), multiplicar os números correspondentes da linha ii de AA e da coluna jj de BB e somarUma matriz m×nm\times n; o número de colunas de AA tem de ser igual ao número de linhas de BB
A⊙BA\odot B — produto elemento a elementoDois arrays com a mesma formaMultiplicar as entradas em posições correspondentes, sem as somarUm array com a mesma forma
[a;b][a;b] — concatenaçãoColunas aa e bb com mm e nn entradasColocar as entradas de bb a seguir às de aaUma coluna com m+nm+n entradas; verifique a convenção do artigo para o eixo de junção

Para uma comparação concreta, tome a=(12)a=\begin{pmatrix}1\\2\end{pmatrix} e b=(34)b=\begin{pmatrix}3\\4\end{pmatrix}. Mover a transposta altera tanto o cálculo como o resultado:

a⊤b=1×3+2×4=11ab⊤=(1×31×42×32×4)=(3468).\begin{aligned} a^\top b&=1\times3+2\times4=11\\ ab^\top&=\begin{pmatrix}1\times3&1\times4\\2\times3&2\times4\end{pmatrix}=\begin{pmatrix}3&4\\6&8\end{pmatrix}. \end{aligned}

O produto escalar dá uma única pontuação, como na comparação consulta–chave da atenção. O produto externo mantém um valor separado para cada par de entradas; a atualização da Gated DeltaNet usa-o para construir uma atualização de matriz a partir de dois vetores.

Um produto de matrizes pode ser reagrupado, (AB)C=A(BC)(AB)C=A(BC), mas não reordenado; a derivação da MLA usa o reagrupamento para evitar reconstruir as chaves. O NumPy escreve a multiplicação de matrizes como @ e o produto elemento a elemento como *. Os artigos não herdam as regras de broadcasting do NumPy: somar um vetor a uma matriz exige um eixo indicado. Os artigos também divergem quanto a um vetor ser uma linha ou uma coluna: a atenção empilha os tokens como linhas de QQ, enquanto a MLA, a Gated DeltaNet e a LoRA escrevem WhWh com vetores coluna, e a nn.Linear do PyTorch calcula x @ W.T sobre linhas.

Uma equação de arquitetura também pode descrever o tamanho de um vetor, restringir as matrizes permitidas ou reorganizar um produto:

NotaçãoSignificado
∥x∥2=∑ixi2\Vert x\Vert_2=\sqrt{\sum_i x_i^2}O comprimento euclidiano; ∥x∥2\Vert x\Vert^2, sem a raiz, aparece na perda do DDPM
∥x∥1=∑i∣xi∣\Vert x\Vert_1=\sum_i\vert x_i\vertA soma dos valores absolutos
∥A∥2\Vert A\Vert_2A norma espectral: o maior fator pelo qual AA aumenta o comprimento de um vetor; a mHC mantém-na no máximo em 1
rank⁡(A)\operatorname{rank}(A)O número de colunas independentes; a atualização da LoRA tem posto no máximo rr
det⁡A\det AO determinante: ∣det⁡A∣\vert\det A\vert é o fator pelo qual AA escala o volume, e o sinal regista se AA inverte a orientação; o exemplo de mudança de variáveis no Apêndice B deste artigo usa-o
A≥0A\geq0Todas as entradas são não negativas, como na mHC; A⪰0A\succeq0 é uma condição diferente, semidefinida positiva: x⊤Ax≥0x^\top Ax\geq0 para todo o xx
II, 1n\mathbf 1_nA matriz identidade (1 na diagonal, 0 nas restantes entradas, pelo que Ix=xIx=x); um vetor de nn uns
(AB)⊤=B⊤A⊤(AB)^\top=B^\top A^\topTranspor um produto inverte a ordem; as secções de RoPE e MLA da Parte 2 usam-no

Gradientes e otimização

O treino usa derivadas para decidir como alterar os parâmetros do modelo. Seja L\mathcal L uma perda escalar e θ\theta o vetor de todos os parâmetros; θi\theta_i é uma entrada desse vetor.

A derivada parcial ∂L/∂θi\partial\mathcal L/\partial\theta_i é um número, avaliado nos valores atuais dos parâmetros. Mede a taxa de variação da perda quando só θi\theta_i muda e os outros parâmetros ficam fixos. Leia-a como «a derivada parcial da perda em relação ao parâmetro θi\theta_i».

O gradiente ∇θL\nabla_\theta\mathcal L reúne esses números de todos os parâmetros num só vetor. A sua entrada ii é ∂L/∂θi\partial\mathcal L/\partial\theta_i. O símbolo ∇\nabla chama-se nabla; aqui significa «tome o gradiente». Com apenas um parâmetro, o gradiente tem uma entrada igual à derivada habitual.

Por exemplo, tome L(θ1,θ2)=θ12+3θ22\mathcal L(\theta_1,\theta_2)=\theta_1^2+3\theta_2^2. Em θ1=2\theta_1=2 e θ2=1\theta_2=1:

∂L∂θ1=2θ1=4∂L∂θ2=6θ2=6∇θL=(46).\begin{aligned} \frac{\partial\mathcal L}{\partial\theta_1}&=2\theta_1=4\\ \frac{\partial\mathcal L}{\partial\theta_2}&=6\theta_2=6\\ \nabla_\theta\mathcal L&=\begin{pmatrix}4\\6\end{pmatrix}. \end{aligned}

A primeira derivada parcial, 4, significa que aumentar θ1\theta_1 em 0.01 faz subir a perda aproximadamente 0.04, enquanto θ2\theta_2 fica fixo. O gradiente contém esta informação para os dois parâmetros. A descida do gradiente subtrai a derivada de cada parâmetro, multiplicada por uma taxa de aprendizagem positiva η\eta que controla o tamanho do passo:

θ←θ−η∇θL,η>0.\theta\leftarrow\theta-\eta\nabla_\theta\mathcal L,\qquad\eta>0.

Com η=0.1\eta=0.1, o exemplo passa de (2,1)(2,1) para (1.6,0.4)(1.6,0.4), e a perda desce de 7 para 3.04. Para uma perda diferenciável com gradiente não nulo, um passo suficientemente pequeno reduz a perda. Um gradiente nulo não dá atualização.

O subscrito em ∇\nabla diz o que varia. ∇θlog⁡pθ(x)\nabla_\theta\log p_\theta(x) varia os parâmetros; ∇xlog⁡pθ(x)\nabla_x\log p_\theta(x) varia a entrada, e os artigos de difusão chamam-lhe a pontuação (score), que nada tem a ver com a pontuação de um benchmark.

Uma jacobiana regista derivadas para várias saídas. Uma camada de uma rede neuronal pode produzir muitos números, como as componentes do estado oculto de um token. Para descrever como cada saída responde a cada entrada, reúnem-se as derivadas parciais numa matriz chamada jacobiana. Para y=f(x)y=f(x) com nn números de entrada e mm números de saída, a sua forma é m×nm\times n: as linhas correspondem às saídas, as colunas às entradas, e a entrada Jij=∂yi/∂xjJ_{ij}=\partial y_i/\partial x_j mede como a saída ii muda quando a entrada jj muda.

Por exemplo, seja uma função que toma dois números e devolve y1=x1+2x2y_1=x_1+2x_2 e y2=3x1−x2y_2=3x_1-x_2. A sua jacobiana é

J=(∂y1/∂x1∂y1/∂x2∂y2/∂x1∂y2/∂x2)=(123−1).\begin{aligned} J&=\begin{pmatrix} \partial y_1/\partial x_1 & \partial y_1/\partial x_2\\ \partial y_2/\partial x_1 & \partial y_2/\partial x_2 \end{pmatrix}\\ &=\begin{pmatrix}1&2\\3&-1\end{pmatrix}. \end{aligned}

A segunda coluna diz que aumentar x2x_2 em 0.1 mantendo x1x_1 fixo faz subir y1y_1 em 0.2 e descer y2y_2 em 0.1. Este exemplo é linear, pelo que a sua jacobiana é constante. Para uma função não linear, as entradas podem depender da entrada atual e descrevem pequenas variações locais. Com uma única saída escalar, a jacobiana tem uma linha: as mesmas derivadas do gradiente, transpostas segundo a nossa convenção de vetores coluna. Deep Learning, §4.3, dá as definições gerais.

A retropropagação (backpropagation) usa estas derivadas para calcular o gradiente da perda através de camadas sucessivas. O exemplo de mudança de variáveis no Apêndice B deste artigo usa outra propriedade: o valor absoluto do determinante de uma jacobiana quadrada dá o fator local de escala do volume, necessário para ajustar uma densidade de probabilidade.

No treino, as derivadas descrevem variações locais; um objetivo de otimização enuncia o que as atualizações devem minimizar ou maximizar. Os artigos distinguem o melhor valor de um objetivo dos parâmetros que o atingem: min⁡θf(θ)\min_\theta f(\theta) é o menor valor de ff, enquanto arg min⁡θf(θ)\operatorname*{arg\,min}_\theta f(\theta) dá os valores dos parâmetros que o atingem. Para f(θ)=(θ−3)2f(\theta)=(\theta-3)^2, o mínimo é 0 e o argmin é 3. Um argmin especifica o resultado pretendido, mas deixa em aberto o algoritmo de atualização.

Por exemplo, o MiniLLM escreve o seu objetivo como θ=arg min⁡θDKL(qθ∥p)\theta=\operatorname*{arg\,min}_\theta D_{\mathrm{KL}}(q_\theta\Vert p) (equação 1), em que qθq_\theta é o modelo aluno e pp o professor com quem aprende. A secção 2.2 deriva depois um gradiente e modifica-o para tornar o treino mais estável; a equação (7) é o gradiente usado nas atualizações. O exemplo da destilação on-policy explica essas alterações. Ler apenas o argmin perdê-las-ia.

Um stop-gradient, sg⁡(x)\operatorname{sg}(x), passa xx para a frente inalterado mas bloqueia os gradientes através dele, como .detach() no PyTorch. Duas expressões com o mesmo valor direto podem treinar de forma diferente se uma delas for separada do grafo. No exemplo da GRPO, o Hugging Face TRL trata a log-probabilidade do modelo antigo como fixa. No atalho de destilação discutido pelo DeepSeek-V4, uma log-razão professor–aluno separada do grafo fornece um peso fixo à atualização.

Conjuntos e restrições

Uma restrição enuncia que valores são permitidos. Os artigos expressam muitas vezes restrições com conjuntos: coleções de membros distintos, escritas entre chavetas, como {1,2,3}\{1,2,3\}. A ordem não importa, pelo que {3,1,2}\{3,1,2\} nomeia o mesmo conjunto. As entradas repetidas contam apenas uma vez. Em comparação, os parênteses de um vetor como (1,2,3)(1,2,3) descrevem uma lista ordenada: (3,1,2)(3,1,2) é um vetor diferente.

Depois de um artigo definir um conjunto, pode testar a pertença, combinar conjuntos, contar os seus membros ou enunciar uma condição sobre eles. Tome A={1,2,3}A=\{1,2,3\} e B={3,4}B=\{3,4\}:

NotaçãoSignificadoExemplo e como ler
x∈Ax\in APertença: xx pertence a AA2∈A2\in A: 2 é um membro de AA
A∪BA\cup BUnião: incluir todos os membros de qualquer dos conjuntosA∪B={1,2,3,4}A\cup B=\{1,2,3,4\}; incluir o 3 só uma vez
A∩BA\cap BInterseção: manter apenas os membros partilhados pelos dois conjuntosA∩B={3}A\cap B=\{3\}
∣A∣\vert A\vertO número de membros distintos∣A∣=3\vert A\vert=3
∀\forall«Para todo»: uma condição tem de se verificar para todos os membros indicados∀x∈A: x>0\forall x\in A:\ x>0: todos os membros de AA são positivos
∃\exists«Existe»: pelo menos um membro tem de satisfazer a condição∃x∈A: x>2\exists x\in A:\ x>2: AA tem um membro maior do que 2, o 3

A notação de forma de Vetores e matrizes também nomeia conjuntos: Rd\mathbb R^d é o conjunto de todos os vetores de dd números reais, e Rn×d\mathbb R^{n\times d} o conjunto de todas as matrizes reais com nn linhas e dd colunas. Assim, Q∈Rn×dkQ\in\mathbb R^{n\times d_k} especifica que forma QQ tem de ter.

A notação de construção de conjuntos descreve um conjunto por uma condição: {x∈S∣condition}\{x\in S\mid\text{condition}\} lê-se «os membros de SS que satisfazem a condição», como a compreensão de conjuntos de Python {x for x in S if condition(x)}. A barra significa «tal que», não probabilidade condicional; alguns artigos usam antes dois pontos. Os exemplos desta série incluem as matrizes permitidas da mHC, os especialistas selecionados da MoE e os tokens selecionados da atenção esparsa.

O DAPO, um método de treino que filtra grupos de respostas geradas, só mantém uma pergunta quando algumas respostas estão corretas e outras erradas. Para GG respostas amostradas o1,…,oGo_1,\ldots,o_G e a resposta de referência aa, escreva o conjunto dos índices das respostas corretas como

C={i∈{1,…,G}∣is_equivalent⁡(a,oi)}.C=\{i\in\{1,\ldots,G\}\mid\operatorname{is\_equivalent}(a,o_i)\}.

O filtro é 0<∣C∣<G0<\vert C\vert<G. Usar índices torna a contagem explícita: duas amostras com texto idêntico contam na mesma como duas respostas. O artigo do DAPO escreve o conjunto sobre as respostas oio_i; lido à letra como um conjunto de textos, essa forma conta duas respostas idênticas uma só vez.

Exercícios

  1. Formas. QQ é 4×84\times8, KK é 6×86\times8 e VV é 6×36\times3. Quais são as formas das pontuações e da saída? Sobre que eixo corre a softmax?
  2. Softmax. Calcule a softmax de (0,log⁡4)(0,\log4). Somar 100 às duas entradas altera o resultado?
  3. Médias. Uma resposta tem um único token com perda 4; outra tem três tokens com perda 0. Calcule a média por token e a média por resposta.
  4. Condicionamento. De 200 respostas, 120 estão corretas, 80 passam a validação de formato e 60 cumprem ambas. Encontre P(correct∣valid)P(\text{correct}\mid\text{valid}) e P(valid∣correct)P(\text{valid}\mid\text{correct}).
  5. KL. Para um professor p=(1,0)p=(1,0) e um aluno q=(0.5,0.5)q=(0.5,0.5), calcule as duas direções da KL.
  6. Conjuntos. O DAPO só mantém uma pergunta se 0<∣C∣<G0<\vert C\vert<G, em que CC contém os índices das respostas corretas entre GG amostras. Com G=4G=4, mantém uma pergunta cujas respostas pontuam (1,1,1,1)(1,1,1,1)? E uma cujas respostas pontuam (1,0,1,1)(1,0,1,1)? A resposta à primeira muda se as quatro amostras contiverem texto correto idêntico?

Respostas:

  1. As pontuações são 4×64\times6 e a saída é 4×34\times3. A softmax corre ao longo das seis chaves da linha de cada consulta.

  2. (1/5,4/5)(1/5,4/5). Somar o mesmo número a todas as entradas deixa a softmax inalterada, mas calcular e100e^{100} diretamente provoca overflow em floats de 32 bits.

  3. As duas médias:

    per token:(4+0+0+0)/4=1per answer:(4/1+0/3)/2=(4+0)/2=2\begin{aligned} \text{per token:}&\quad(4+0+0+0)/4=1\\ \text{per answer:}&\quad(4/1+0/3)/2=(4+0)/2=2 \end{aligned}
  4. 60/80=0.7560/80=0.75 e 60/120=0.560/120=0.5.

  5. DKL(p∥q)=log⁡2≈0.69D_{\mathrm{KL}}(p\Vert q)=\log2\approx0.69, e DKL(q∥p)=∞D_{\mathrm{KL}}(q\Vert p)=\infty, porque o aluno põe probabilidade num resultado que o professor exclui.

  6. Não: C={1,2,3,4}C=\{1,2,3,4\} tem quatro membros, o que é igual a GG. Sim: C={1,3,4}C=\{1,3,4\} tem três membros, entre 0 e 4. O texto idêntico não altera a resposta à primeira: são quatro amostras separadas, pelo que os seus quatro índices continuam a contar.

Apêndice A. Letras gregas

Os papéis são exemplos comuns; cada artigo continua a definir o que os seus símbolos significam.

LetraNomePapéis comuns nos artigos de ML
α\alphaalfaUm peso de mistura ou uma escala; um decaimento (Gated DeltaNet); um calendário de ruído (DDPM)
β\betabetaUma intensidade de penalização (DPO, GRPO); uma intensidade de escrita (Gated DeltaNet); um calendário de ruído (DDPM)
γ\gammagamaUm fator de desconto em RL; um tamanho de passo (a atualização do viés no DeepSeek-V3)
δ,Δ\delta,\DeltadeltaUma diferença ou uma variação
ϵ,ε\epsilon,\varepsilonépsilonRuído (DDPM); um intervalo de clipping (GRPO); um pequeno estabilizador
η\etaetaA taxa de aprendizagem
θ,Θ\theta,\ThetatetaParâmetros do modelo; os ângulos de rotação da RoPE
λ,Λ\lambda,\LambdalambdaUm peso de regularização; um valor próprio
μ\mumiUma média; o número de passos de gradiente por lote no Algoritmo 1 do DeepSeekMath
π,Π\pi,\PipiUma política; ∏\prod é o operador de produto
ρ\rhoróUma razão de probabilidades, como na secção da GRPO da Parte 3; uma correlação
σ,Σ\sigma,\SigmasigmaA sigmoide (DPO); um desvio-padrão; uma covariância; ∑\sum é o operador de soma
τ\tautauUma temperatura; um limiar; uma trajetória em RL
ϕ,φ,Φ\phi,\varphi,\PhifiOs parâmetros de uma segunda rede, como um codificador; características; um ângulo
ψ,Ψ\psi,\PsipsiOs parâmetros de outra rede, como o modelo de valor VψV_\psi na PPO do DeepSeekMath
ω,Ω\omega,\OmegaómegaUma frequência; Ω\Omega é também um limite inferior em complexidade, ou um conjunto de resultados

Variantes como ϕ/φ\phi/\varphi e ϵ/ε\epsilon/\varepsilon são normalmente a mesma letra com outro tipo de letra, mas um artigo pode usar ambas para variáveis diferentes.

Apêndice B. Outras famílias de equações

Formas de equações que esta série não percorre, com as definições de que cada uma precisa:

Modelos de espaço de estados seletivos. Um modelo de espaço de estados processa uma sequência atualizando um estado guardado em cada passo. Uma atualização da forma ht=Aˉtht−1+Bˉtxth_t=\bar A_th_{t-1}+\bar B_tx_t, yt=Cthty_t=C_th_t combina o estado anterior com a entrada atual e depois calcula uma saída. Aqui xtx_t é a entrada atual, hth_t o estado guardado e yty_t a saída. As matrizes Aˉt\bar A_t, Bˉt\bar B_t e CtC_t transformam, respetivamente, o estado anterior, acrescentam a contribuição da entrada e produzem a saída. As barras marcam parâmetros convertidos de um modelo em tempo contínuo para passos discretos; não significam médias. No Mamba, os parâmetros de atualização dependem da entrada atual, que é o que «seletivo» significa.

Equações diferenciais estocásticas. dx/dt=f(x,t)dx/dt=f(x,t) descreve como um estado xx muda com o tempo tt: ff é a sua taxa de variação. Uma equação diferencial estocástica (SDE) acrescenta variações aleatórias, dXt=f(Xt,t) dt+g(Xt,t) dWtdX_t=f(X_t,t)\,dt+g(X_t,t)\,dW_t. Aqui ff descreve a variação determinística, gg define a escala do ruído e dWtdW_t é um incremento de movimento browniano. Para a aproximar em código, o método de Euler–Maruyama usa um pequeno passo de tempo Δt\Delta t e substitui dWtdW_t por ruído gaussiano de variância Δt\Delta t. A secção 5.1 do livro de Tianhua Chen, The Little Book of Generative AI Foundations, dá uma atualização deste tipo; a §6.4 do mesmo livro usa SDEs para descrever modelos de difusão.

Mudança de variáveis. Transformar uma variável aleatória altera a sua densidade conforme a transformação altera o volume local. Suponha que y=f(x)y=f(x) faz a correspondência entre espaços com a mesma dimensão, e que tanto ff como a sua inversa f−1f^{-1} são diferenciáveis. As densidades antes e depois da transformação, pXp_X e pYp_Y, satisfazem pY(y)=pX(f−1(y)) ∣det⁡Jf−1(y)∣p_Y(y)=p_X\bigl(f^{-1}(y)\bigr)\,\bigl\vert\det J_{f^{-1}}(y)\bigr\vert. A inversa f−1f^{-1} recupera xx a partir de yy. A sua jacobiana Jf−1J_{f^{-1}} é a matriz quadrada das primeiras derivadas; o valor absoluto do seu determinante corrige a variação local do volume. Por exemplo, se y=2xy=2x numa dimensão, a densidade passa a pY(y)=pX(y/2)/2p_Y(y)=p_X(y/2)/2: duplicar a largura reduz a densidade a metade. Os normalizing flows usam transformações invertíveis deste tipo para modelar densidades; o livro de Tianhua Chen, §7.1, explica o método.

Objetivos min–max. Nas generative adversarial networks (GANs), um gerador GG produz exemplos e um discriminador DD tenta distingui-los dos dados reais. O objetivo V(D,G)V(D,G) mede o sucesso do discriminador: DD maximiza-o enquanto GG o minimiza. A meta min⁡Gmax⁡DV(D,G)\min_G\max_DV(D,G) (equação 1) diz: para cada gerador possível, considere o melhor discriminador contra ele e depois escolha o gerador com o menor objetivo resultante. O treino não resolve essa maximização interna com exatidão. O Algoritmo 1 do artigo alterna kk passos de subida do gradiente em DD com um passo de descida do gradiente em GG; as suas experiências usaram k=1k=1.

O simplex de probabilidade. Um vetor de probabilidade tem entradas não negativas que somam 1. O conjunto de todos esses vetores com KK entradas chama-se simplex de probabilidade, escrito ΔK−1={p∈RK∣pi≥0, ∑ipi=1}\Delta^{K-1}=\{p\in\mathbb R^K\mid p_i\geq0,\ \sum_ip_i=1\}. Toda a saída de uma softmax está nele. Aqui Δ\Delta nomeia um conjunto, e o sobrescrito K−1K-1 é a sua dimensão, não uma potência: depois de escolhidas K−1K-1 probabilidades, a última tem de fazer a soma igualar 1. Com duas escolhas, toda a distribuição tem a forma (a,1−a)(a,1-a) para 0≤a≤10\leq a\leq1, pelo que só um número é livre.

Normalização. A normalização reescala valores pela média e pela dispersão de um grupo escolhido. Uma forma comum é x^=(x−μ)/σ2+ϵ\hat x=(x-\mu)/\sqrt{\sigma^2+\epsilon}, em que μ\mu é uma média, σ2\sigma^2 uma variância e ϵ\epsilon um número positivo pequeno que evita a divisão por zero. A equação, por si só, não diz que entradas são usadas para calcular a média e a variância. Para um lote de vetores de características, a batch normalization calcula-as separadamente para cada característica ao longo dos exemplos. A layer normalization de um Transformer calcula-as separadamente para cada token ao longo das suas características. Verifique os eixos especificados ao comparar implementações.

Fontes e versões

Os números de secção e de equação referem-se às versões ligadas aqui.

  1. Tianhua Chen. The Little Book of Generative AI Foundations: An Intuitive Mathematical Primer. 2026. Versão 2; a §2.4 e a §3.2 tratam da desigualdade de Jensen e do ELBO, a §5.1 e a §6.4 do ruído em tempo contínuo.
  2. Vaswani et al. Attention Is All You Need. 2017. Versão 7, §3.2.1, equação (1) e nota de rodapé 4.
  3. Dai et al. DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models. 2024. Segmentação fina de especialistas e contagens de combinações, §3.1; ablação, §4.4 e Figura 3.
  4. Shao et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. 2024. Versão 3, §1.1, §4.1.1, equações (1)–(4) e Algoritmo 1.
  5. DeepSeek-AI. DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model. 2024. Versão 5, §2.1.1–2.1.3, equações (9)–(19) e Apêndice C.
  6. DeepSeek-AI. DeepSeek-V3 Technical Report. 2024–2025. Versão 2, §2.1.2, equações (12)–(18).
  7. DeepSeek-AI. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning. 2025. Versão 1: §2.2.1, equações (1)–(3). Versão 2, 2026: §2.1 e Suplemento A.3.
  8. DeepSeek-AI. DeepSeek-V4: Towards Highly Efficient Million-Token Context Intelligence. 2026. Versão 1: §2.2, equações (1)–(8); §5.1.2, equação (29).
  9. Rafailov et al. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. 2023–2024. Versão 3, §4, equação (7).
  10. Gu et al. MiniLLM: Knowledge Distillation of Large Language Models. 2023–2024. Versão 4, §2.1, equação (1), e §2.2, equações (2) e (7).
  11. Yu et al. DAPO: An Open-Source LLM Reinforcement Learning System at Scale. 2025. Versão 2, §3.2–3.3, equações (11)–(12).
  12. Gu e Dao. Mamba: Linear-Time Sequence Modeling with Selective State Spaces. 2023–2024.
  13. Yang et al. Gated Delta Networks: Improving Mamba2 with Delta Rule. 2024–2025. Versão 3, §3.1, equação (10) e §3.3–3.4.
  14. Ho, Jain e Abbeel. Denoising Diffusion Probabilistic Models. 2020. Versão 2, §2, equações (4)–(5); §3.2, equação (12); §3.4, equação (14); e Algoritmos 1–2.
  15. Goodfellow et al. Generative Adversarial Nets. 2014. Equação (1) e Algoritmo 1.
  16. Chen et al. Evaluating Large Language Models Trained on Code. 2021. Versão 2, §2.1, equação (1) e Figura 3.
  17. Hugging Face TRL. GRPOTrainer e GRPOConfig no commit c6eac19, outubro de 2026.
  18. Stanford CS229. Probability Theory Review e Linear Algebra Review and Reference.
  19. Dive into Deep Learning. Preliminaries.
  20. Britz, Goldie, Luong e Le. Massive Exploration of Neural Machine Translation Architectures. 2017. Versão 2, Tabela 5; citado em Attention Is All You Need para a comparação entre atenção de produto escalar e atenção aditiva.