Multi-head attention tidak mengharuskan setiap head query memiliki head key dan head value yang berbeda. Grouped-query attention, atau GQA, membagi head query ke dalam beberapa grup dan memberikan satu head key-value untuk setiap grup. Proyeksi query tetap terpisah, tetapi beberapa head query membaca key dan value hasil proyeksi yang sama.

Perbedaan ini mengubah bentuk parameter dan state yang disimpan di cache tanpa menyatukan head query menjadi satu komputasi attention. Setiap head query tetap menghasilkan skor attention sendiri karena vektor query-nya berbeda.

Jumlah head menentukan pola berbagi

Misalkan sebuah layer memiliki Hq head query dan Hkv head key-value, dengan Hq habis dibagi Hkv. Pengelompokan yang umum menghasilkan:

head query per head KV = Hq / Hkv

Untuk Hq = 8 dan Hkv = 2, salah satu pemetaannya adalah:

Q0 Q1 Q2 Q3 -> K0, V0
Q4 Q5 Q6 Q7 -> K1, V1

Layout tensor yang tepat bergantung pada implementasi, tetapi hubungan logisnya tetap: empat head query menggunakan proyeksi key dan value yang sama pada contoh tersebut.

Standard multi-head attention berada pada titik Hkv = Hq: setiap head query memiliki head key-value sendiri. Multi-query attention berada pada titik lain, Hkv = 1: seluruh head query memakai satu head key-value. GQA menempati kasus di antara keduanya.

Istilah tersebut menjelaskan pola berbagi head, bukan keseluruhan arsitektur transformer. Positional encoding, attention mask, dimensi head, output projection, dan pilihan layer lainnya tetap merupakan dimensi desain yang terpisah.

Key yang sama tidak berarti bobot attention yang sama

Dua head query yang dipetakan ke head key yang sama menerima vektor key yang sama untuk posisi sequence tertentu, tetapi vektor query keduanya dapat berbeda. Karena itu, perhitungan skor tetap terpisah.

Untuk head query h yang dipetakan ke grup KV g(h), bentuk skor sederhana adalah:

score_h = Q_h K_g(h)^T / sqrt(d)

Softmax diterapkan pada skor milik head query tersebut sesuai mask model. Nilai Q_h yang berbeda dapat menghasilkan distribusi skor berbeda walaupun K_g(h) digunakan bersama. Agregasi value juga dapat berbeda karena bobot attention yang dihasilkan tidak sama.

Batas mekanismenya terletak di sini: GQA berbagi representasi key dan value dalam satu grup, bukan seluruh hasil attention. Menganggap semua head query dalam satu grup identik akan menghilangkan perbedaan yang masih direpresentasikan oleh proyeksi query terpisah.

Ukuran KV cache mengikuti jumlah head KV

Pada decoding autoregresif, runtime serving umumnya menyimpan vektor key dan value dari posisi sebelumnya agar keduanya tidak perlu dihitung ulang untuk setiap token baru. Dengan jumlah posisi cache, dimensi head, tipe elemen, dan jumlah layer yang tetap, bagian key-value dari state ini berskala terhadap Hkv, bukan Hq.

Jumlah elemen konseptual per layer untuk T posisi cache adalah:

elemen KV = 2 * T * Hkv * d

Faktor 2 mewakili key dan value. Allocator nyata menambahkan detail layout, block, alignment, metadata, dan batching, sehingga ekspresi ini menggambarkan state tensor, bukan total memori proses.

Mengurangi Hkv ketika faktor lain tetap akan mengurangi ukuran logis tensor KV. Ini menjadi salah satu alasan GQA relevan pada model serving: jumlah head query dapat tetap lebih besar daripada jumlah head key-value yang harus disimpan.

Pengurangan tersebut tidak menetapkan rasio throughput tanpa syarat. Implementasi kernel, bandwidth memori, batching, layout cache, panjang sequence, hardware, dan perilaku scheduler ikut menentukan performa serving yang teramati.

Parameter proyeksi berubah bersama jumlah KV

Berbagi head juga mengubah lebar output proyeksi key dan value. Jika setiap head berdimensi d, proyeksi query menghasilkan Hq * d fitur, sedangkan proyeksi key dan value masing-masing menghasilkan Hkv * d fitur.

Secara konseptual:

lebar Q = Hq  * d
lebar K = Hkv * d
lebar V = Hkv * d

Implementasi model dapat menggabungkan proyeksi tersebut ke satu matriks atau menata dimensinya secara berbeda di memori. Lebar logisnya tetap menggambarkan jumlah state query, key, dan value per token yang direpresentasikan konfigurasi attention.

Karena itu, GQA bukan sekadar opsi kompresi cache yang diterapkan setelah model selesai didefinisikan. Jumlah head KV merupakan bagian dari parameterisasi layer. Mengubah checkpoint sembarang ke jumlah head KV berbeda memerlukan transformasi weight yang terdefinisi atau model yang memang dibangun dengan konfigurasi tersebut; mengganti satu integer runtime saja tidak mempertahankan komputasi semula.

Broadcasting dapat bersifat logis tanpa salinan fisik

Kernel attention perlu memasangkan setiap head query dengan head key-value yang ditetapkan untuknya. Implementasi sederhana dapat memandang tensor KV seolah diulang pada dimensi head query, tetapi membuat salinan fisik berulang akan mengembalikan sebagian traffic memori yang hendak dikurangi melalui mekanisme berbagi.

Implementasi dapat menyatakan pemetaan melalui indexing, view, stride, atau kernel yang memahami grouped heads. Dengan cara itu, beberapa head query memakai satu representasi KV tanpa membuat salinan penuh untuk setiap head.

Perbedaan ini relevan saat membaca trace tensor. Shape logis yang berulang tidak otomatis berarti storage juga diulang, dan operasi API bernama repeat atau expand tidak cukup untuk menetapkan perilaku alokasi tanpa melihat semantik implementasinya.

Berbagi head berbeda dari berbagi posisi token

GQA mengubah pola berbagi antar-head attention pada posisi sequence yang sama. Mekanisme ini tidak mengurangi jumlah posisi token yang boleh diakses sebuah head. Layer GQA dengan full context tetap dapat menyimpan state KV untuk seluruh posisi terdahulu yang masih aktif, sesuai aturan konteks model dan runtime.

Sebaliknya, layer local attention dapat memakai GQA sekaligus membatasi setiap query ke window token tertentu. Kedua mekanisme bekerja pada sumbu berbeda: GQA mengurangi jumlah head KV yang berbeda, sedangkan local window dapat mengurangi jumlah posisi live yang dibutuhkan sebuah layer.

Pemisahan ini mencegah kesalahan perhitungan yang umum. Memori KV bergantung pada struktur head sekaligus jumlah posisi. Mengurangi satu dimensi tidak berarti dimensi lain ikut terbatas.

Batas serving mengikuti topologi head model

Serving engine hanya dapat mengoptimalkan GQA jika pemetaan antara head query dan head KV pada checkpoint tetap dipertahankan. Alokasi cache, kernel attention, partisi tensor-parallel, dan metadata model harus memiliki interpretasi yang konsisten terhadap Hq, Hkv, dan dimensi head.

Untuk perencanaan kapasitas, jumlah attention head yang dipublikasikan saja tidak cukup. Jumlah head KV yang berbeda menentukan berapa banyak vektor key dan value yang ada per posisi cache, sedangkan jumlah head query menentukan berapa banyak proyeksi query dan output attention yang tetap aktif.

GQA sengaja membuat kedua jumlah itu berbeda. Dampak praktisnya berasal dari asimetri tersebut: keragaman query tetap direpresentasikan oleh beberapa head query, sementara state key-value dibagi pada granularitas yang lebih kasar.