Onde os fatos de um modelo realmente vivem.

SRC·35 Source
A atenção leva o crédito. Esta camada guarda as memórias.

A atenção leva o crédito. Esta camada guarda as memórias.

Cada bloco transformer tem duas metades. A atenção decide o que olhar — e leva todo o crédito. A outra metade, a camada feed-forward, vem logo depois e, em silêncio, guarda quase tudo o que o modelo de fato sabe. Quando ele lembra que um limão é azedo ou que um rio corta uma cidade, esse fato provavelmente vive aqui — não no olhar, mas no lembrar.
A metade famosa é a menor.

A metade famosa é a menor.

attn: 4d2vsFFN: 2ddff=8d2    (dff=4d)    8d212d2=23\text{attn: } 4d^2 \quad\text{vs}\quad \text{FFN: } 2\,d\,d_{ff} = 8d^2 \;\;(d_{ff}=4d)\;\Rightarrow\; \frac{8d^2}{12d^2}=\frac{2}{3}
Como um iceberg: a atenção é a ponta brilhante acima da água, mas a camada feed-forward é a massa lá embaixo. Conte as grandes matrizes de pesos de um bloco e cerca de dois terços delas ficam nesta única camada. A parte que todos estudam é a menor. E, ao contrário da atenção, ela trabalha em cada palavra sozinha — sem mistura, sem vizinhos, apenas um token passando.
Primeiro ela testa cada palavra contra milhares de padrões.

Primeiro ela testa cada palavra contra milhares de padrões.

h=max(0,  xW1+b1)Rdff,dff=4dh = \max(0,\; xW_1 + b_1)\in\mathbb{R}^{d_{ff}}, \qquad d_{ff} = 4d
Como uma bandeja de agulhas de bússola: passe um ímã por cima e só giram as que estão alinhadas a ele. A camada feed-forward faz isso com cada palavra — ela a expande para um espaço cerca de quatro vezes maior, onde esperam milhares de padrões aprendidos. Cada padrão mede o quanto a palavra combina; um limiar simples mantém acesos os acertos fortes e zera o resto.
Cada padrão está ligado a uma resposta guardada.

Cada padrão está ligado a uma resposta guardada.

FFN(x)=i=1dfff ⁣(kix)vi\text{FFN}(x) = \sum_{i=1}^{d_{ff}} f\!\left(k_i^{\top} x\right)\, v_i
Eis o segredo: cada unidade acesa é uma key ligada a um value. A key é o padrão que ela procura; o value é a fatia de significado que ela escreve de volta. Como um conjunto de carimbos com tinta: os que são pressionados deixam sua marca, e a página acaba carregando todas de uma vez. A saída de uma palavra é, simplesmente, cada value ativado, somado.
Então esta é a memória do modelo — e dá para editá-la.

Então esta é a memória do modelo — e dá para editá-la.

x    x+FFN(x)x \;\leftarrow\; x + \text{FFN}(x)
Se um fato é uma key ligada a um value, então ele tem um endereço. E a camada nunca sobrescreve a palavra — ela soma os values recuperados ao fluxo em andamento. Como furar um rolo de pianola: cada furo dispara uma nota guardada, então refurar um único furo muda só aquela — o resto da música continua tocando. Ache os values certos e, muitas vezes, dá para localizar e mudar um único fato, deixando o resto intacto.
Modelos modernos acrescentam um portão mais esperto.

Modelos modernos acrescentam um portão mais esperto.

Swish(z)=zσ(z),σ(z)=11+ezSwiGLU(x)=(Swish(xW1)xW3)W2\begin{aligned} \text{Swish}(z) &= z\,\sigma(z), \quad \sigma(z)=\tfrac{1}{1+e^{-z}} \\ \text{SwiGLU}(x) &= \big(\text{Swish}(xW_1)\otimes xW_3\big)\,W_2 \end{aligned}
As camadas mais novas dividem o trabalho em dois. Um ramo propõe o conteúdo; um segundo ramo vira um portão que decide, canal por canal, quanto disso passa — e então os dois são multiplicados. Como um estêncil sobre tinta spray: a tinta é o conteúdo, o estêncil decide onde ela cai. Esse portão, chamado SwiGLU, acrescenta uma terceira matriz, então os modelos cortam a largura oculta para dois terços e não pagam nada a mais.
Dois movimentos por bloco: reunir e depois lembrar.

Dois movimentos por bloco: reunir e depois lembrar.

xx+Attn(x)(gather)xx+FFN(x)(recall)\begin{aligned} x &\leftarrow x + \text{Attn}(x) && \text{(gather)} \\ x &\leftarrow x + \text{FFN}(x) && \text{(recall)} \end{aligned}
Agora o bloco inteiro se encaixa. A atenção reúne o contexto — ela pergunta o que aqui é relevante? Então a camada feed-forward responde a partir da memória — aqui está o que eu sei sobre isso. Como a passagem de bastão: um corredor leva o contexto, o próximo leva o conhecimento até a linha de chegada. Empilhe esse par dezenas de vezes — com as normalizações estabilizadoras no meio — e você tem o motor: olhar, lembrar, olhar, lembrar.
🌱 Lembrar um fato é diferente de procurá-lo?

🌱 Lembrar um fato é diferente de procurá-lo?

Achamos onde o conhecimento mora: keys ligadas a values, padrões ligados a respostas — uma biblioteca que responde no instante em que a pergunta certa a roça. Mas uma biblioteca não entende os livros que guarda. Se tudo o que o modelo sabe é um value à espera de sua key, lembrar um fato é uma espécie de pensamento — ou apenas uma busca muito rápida? E em algum ponto de toda essa fiação, onde o saber vira compreensão?
toque →deslize ↑ para maisdeslize ↓ para sair