File size: 10,612 Bytes
5ec22b6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
---
license: cc-by-4.0
language:
- id
tags:
- transformer
- multi-head-attention
- block-diagonal
- architecture
---

# Split Multi-Head Total: Transformer dengan Proyeksi Block-Diagonal per Head

Artikel asli: https://catatanwildanardiansyah.blogspot.com/2026/10/split-multi-head-total-transformer.html

**Ringkasan.** Split Multi-Head Total (SMHT) adalah varian Transformer decoder yang membatasi semua proyeksi linear di dalam blok, yaitu Q, K, V, W_O, dan dua lapisan FFN, menjadi block-diagonal per head. Vektor berdimensi `d_model` dipecah menjadi `H` potongan, dan potongan ke-`i` hanya diproses oleh bobot milik head ke-`i`. Dokumen ini menjelaskan strukturnya, menelusuri cara kerjanya dari token masukan sampai logit keluaran langkah demi langkah, lalu menghitung jumlah parameternya.

## 1. Notasi

| Simbol | Arti |
| --- | --- |
| `B, L` | ukuran batch, panjang sekuens (jumlah token) |
| `V` | ukuran kosakata |
| `d_model` | dimensi vektor tiap token di seluruh model |
| `H` | jumlah head; harus membagi `d_model` dan `d_ff` |
| `d_head` | `d_model / H`, lebar satu potongan |
| `d_ff`, `d_ff_head` | lebar hidden FFN, dan `d_ff / H` |

Semua proyeksi linear di dalam blok tidak memakai bias.

## 2. Gagasan inti: dari matriks padat ke block-diagonal

Pada Transformer standar, proyeksi Q, K, dan V dibagi per head, tetapi setiap head membaca seluruh `d_model` dari inputnya. Setelah attention, matriks W_O berukuran penuh `d_model × d_model` mencampur semua head. FFN juga berupa dua matriks padat penuh.

SMHT mengganti setiap matriks padat itu dengan matriks block-diagonal berisi `H` blok kecil. Head ke-`i` hanya membaca potongan ke-`i` dari vektor, dan hanya menulis ke potongan ke-`i` dari keluaran. Dengan `H = 4`, matriks proyeksi yang efektif berbentuk:

~~~text
[ A  0  0  0 ]
[ 0  B  0  0 ]
[ 0  0  C  0 ]
[ 0  0  0  D ]
~~~

A, B, C, dan D adalah matriks `d_head × d_head`, masing-masing milik satu head. Angka 0 tidak disimpan sebagai parameter.

## 3. Struktur model

~~~text
token_ids                                       (B, L)
  → Embedding token + Embedding posisi           (B, L, d_model)
  → [ Blok SMHT ] × N                            (B, L, d_model)
  → LayerNorm akhir                              (B, L, d_model)
  → LM head: Linear(d_model → V, tanpa bias)     (B, L, V)

Blok SMHT (pre-norm):
  x = x + SplitWO( SplitAttention( LayerNorm(x) ) )
  x = x + SplitFFN( LayerNorm(x) )
~~~

Embedding posisi bersifat terpelajar (tabel dengan `max_seq` baris), bukan sinusoidal. LayerNorm, kedua embedding, dan LM head tetap padat (tidak dipecah). Weight tying antara embedding token dan LM head bersifat opsional.

## 4. Cara kerja langkah demi langkah

Agar mudah dilacak, bagian ini memakai model mini: `V = 100`, `max_seq = 16`, `d_model = 8`, `H = 4` (jadi `d_head = 2`), `d_ff = 16` (jadi `d_ff_head = 4`), satu blok, `B = 1`, dan masukan 4 token (`L = 4`). Pada model sebenarnya hanya angkanya yang lebih besar; langkahnya sama. Bentuk tensor ditulis dalam urutan `(B, ...)`.

### Langkah 0: masukan

`token_ids` berbentuk `(1, 4)`, berisi bilangan bulat dalam rentang `[0, V)`, misalnya `[17, 52, 3, 88]`.

### Langkah 1: embedding token → (1, 4, 8)

Tabel `E` berukuran `100 × 8` dibaca per baris: token 17 menjadi baris ke-17 dari `E`, dan seterusnya. Setiap token kini berupa vektor 8 dimensi.

### Langkah 2: embedding posisi, lalu dijumlahkan → (1, 4, 8)

Tabel `P` berukuran `16 × 8` dibaca pada baris 0 sampai 3 (posisi tiap token) dan dijumlahkan elemen demi elemen: `x0 = E[token] + P[posisi]`. Mulai titik ini, 8 dimensi tiap token dibagi menjadi 4 potongan: dimensi `[0,1]` milik head 0, `[2,3]` milik head 1, `[4,5]` milik head 2, dan `[6,7]` milik head 3. Pembagian ini tetap sama di seluruh blok.

### Langkah 3: blok SMHT, sub-lapisan attention

**3a. LayerNorm pertama → (1, 4, 8).** Untuk tiap token secara terpisah, dihitung rata-rata μ dan varians σ² atas 8 dimensinya, lalu (x − μ) / √(σ² + ε) · γ + β. Parameter γ dan β berukuran 8 dan tidak dipecah per head. Perhatikan bahwa μ dan σ² dihitung dari seluruh dimensi, jadi semua potongan berbagi dua angka ini.

**3b. Pecah menjadi head → (1, 4, 4, 2).** Vektor 8 dimensi di-*reshape* menjadi 4 potongan berisi 2 dimensi. Langkah ini hanya mengubah bentuk tensor dan tidak ada perhitungan. Sumbu ketiga sekarang adalah sumbu head.

**3c. Proyeksi Q, K, V per head → masing-masing (1, 4, 4, 2).** Head `h` punya tiga matriks `2 × 2` sendiri: `Wq[h]`, `Wk[h]`, `Wv[h]`. Untuk tiap token:

~~~text
q_h = x_h · Wq[h]
k_h = x_h · Wk[h]
v_h = x_h · Wv[h]
~~~

Semua head dihitung serentak dengan satu `einsum` atas bobot berbentuk `(H, d_head, d_head)`:

~~~python
# head h memakai Wq[h]
q = torch.einsum('blhd,hde->bhle', x, Wq)
~~~

Head 0 hanya membaca dimensi 0 dan 1, sehingga tidak melihat dimensi 2 sampai 7.

**3d. Skor attention dan softmax → (1, 4, 4, 4).** Untuk tiap head: `S_h = q_h · k_hᵀ / √d_head`, yaitu matriks `4 × 4` berisi kemiripan setiap pasang posisi, dibagi √2. Lalu diterapkan mask kausal: elemen pada posisi kolom `s` yang lebih besar dari baris `t` diisi −∞, agar token tidak melihat token sesudahnya. Setelah softmax per baris, baris ke-`t` berisi bobot perhatian atas posisi `0..t` yang jumlahnya 1. Tiap head memiliki peta perhatiannya sendiri, dihitung hanya dari potongannya.

**3e. Menimbang value → (1, 4, 4, 2).** `A_h = softmax(S_h) · v_h`. Setiap token kini berisi campuran value dari token-token sebelumnya, di dalam potongannya.

**3f. Konkatenasi head → (1, 4, 8).** Sumbu head dikembalikan ke samping sumbu `d_head` lalu digabung, sehingga hasil head `h` kembali menempati dimensi `2h` dan `2h+1`. Tiap potongan tetap berada di posisinya semula.

**3g. W_O per head → (1, 4, 8).** Hasil dipecah lagi menjadi `(1, 4, 4, 2)` dan tiap potongan dikalikan `Wo[h]` (`2 × 2`): `y_h = A_h · Wo[h]`, lalu digabung kembali. Tidak ada matriks `8 × 8` yang mencampur potongan sesudahnya.

**3h. Koneksi residual → (1, 4, 8).** `x1 = x0 + y`, penjumlahan elemen demi elemen.

### Langkah 3 (lanjutan): sub-lapisan FFN

**3i. LayerNorm kedua → (1, 4, 8).** Sama seperti 3a, dengan γ dan β miliknya sendiri.

**3j. Pecah menjadi head → (1, 4, 4, 2).** Sama seperti 3b.

**3k. FFN per head → (1, 4, 4, 2).** Head `h` punya dua matriks: `W1[h]` berukuran `2 × 4` dan `W2[h]` berukuran `4 × 2`.

~~~text
u_h = GELU( x_h · W1[h] )
z_h = u_h · W2[h]
~~~

Di sini `u_h` berbentuk `(1, 4, 4)`, yaitu potongan 2 dimensi dilebarkan menjadi 4, dan `z_h` berbentuk `(1, 4, 2)`, yaitu dikembalikan menjadi 2 dimensi. Bobot seluruh head berbentuk `W1: (4, 2, 4)` dan `W2: (4, 4, 2)`.

**3l. Konkatenasi dan residual → (1, 4, 8).** Hasil `z_h` digabung menjadi `(1, 4, 8)`, lalu `x2 = x1 + z`. Bila ada `N` blok, `x2` menjadi masukan blok berikutnya, yang bobotnya terpisah dari blok ini.

### Langkah 4: LayerNorm akhir → (1, 4, 8)

Sama seperti 3a, dengan parameter sendiri.

### Langkah 5: LM head → (1, 4, 100)

Matriks padat `U` berukuran `8 × 100` (tanpa bias) dikalikan ke tiap vektor token: `logits = x · U`. Pada langkah inilah seluruh 8 dimensi, dari semua potongan, digabung menjadi 100 skor. Bila weight tying dipakai, `U = Eᵀ`.

### Langkah 6: membaca keluaran

Logit pada posisi `t` adalah 100 skor untuk token yang mungkin muncul *sesudah* posisi `t`. Softmax atas sumbu terakhir mengubahnya menjadi distribusi probabilitas. Saat menghasilkan teks, distribusi pada posisi terakhir (`L − 1`) dipakai untuk memilih token berikutnya.

## 5. Jumlah parameter

- **Q, K, V:** standar `3 · d_model²`; SMHT `3 · d_model · d_head`. Model mini: 192 → 48.
- **W_O:** standar `d_model²`; SMHT `d_model · d_head`. Model mini: 64 → 16.
- **FFN:** standar `2 · d_model · d_ff`; SMHT `2 · d_model · d_ff_head`. Model mini: 256 → 64.
- **Total satu blok:** pada SMHT setiap proyeksi bernilai `1/H` dari standar. Model mini: 512 → 128.
- **LayerNorm** (2 per blok + 1 akhir): `2 · d_model` per LayerNorm, sama untuk keduanya. Model mini: 3 × 16 = 48.
- **Embedding token, embedding posisi, LM head:** `V · d_model`, `max_seq · d_model`, `V · d_model`, sama untuk keduanya. Model mini: 800, 128, 800.

Total model mini dengan SMHT: 800 + 128 + 128 + 48 + 800 = **1.904** parameter. Bila `H` dan `d_model` besar, bagian blok menjadi sangat kecil dibanding embedding dan LM head.

## 6. Sifat struktural

### 6.1 H Transformer sempit yang berjalan paralel

Karena semua bobot block-diagonal, potongan ke-`i` berevolusi seperti Transformer berlebar `d_head` dengan satu head attention dan hidden FFN selebar `d_ff_head`. SMHT dapat dibaca sebagai `H` model sempit yang berbagi satu lintasan komputasi.

### 6.2 Titik kopling antar potongan

1. **LayerNorm** (langkah 3a, 3i, 4): rata-rata dan varians dihitung atas seluruh `d_model`, sehingga semua potongan berbagi dua angka per token.
2. **LM head** (langkah 5): karena linear atas hasil konkatenasi, logit kosakata ke-`v` adalah jumlah kontribusi tiap potongan: `logit_v = Σ_i ⟨U_v[i], z_i⟩`.

Koneksi residual hanya menjumlahkan dimensi yang sama dengan dimensi yang sama, jadi tidak mencampur potongan. Menambah jumlah blok juga tidak menambah pencampuran, kecuali lewat LayerNorm.

### 6.3 Kasus H = 1

Seluruh bobot menjadi matriks padat `d_model × d_model`, dan FFN-nya `d_model → d_ff → d_model`. Ini identik dengan Transformer standar satu head. Untuk `H > 1`, SMHT dan Transformer multi-head standar adalah dua arsitektur yang berbeda, sebab pada yang standar tiap head membaca seluruh `d_model` dan W_O mencampur semua head.

### 6.4 Kasus H = d_model (d_head = 1)

Setiap potongan berupa satu channel skalar. Q, K, dan V adalah skalar: dengan `a = Wq · Wk`, skor antara posisi `t` dan `s` adalah `a · x_t · x_s`. FFN-nya adalah fungsi skalar `GELU(w1 · x) · w2` bila `d_ff_head = 1`.

## 7. Ruang lingkup

Dokumen ini hanya menjelaskan struktur dan cara kerja arsitektur SMHT. Kualitas model, kecepatan, dan perbandingan dengan Transformer standar tidak dibahas dan tidak diklaim.

## Referensi

1. Vaswani, A., et al. (2017). *Attention Is All You Need*. NeurIPS.
2. Ba, J. L., Kiros, J. R., Hinton, G. E. (2016). *Layer Normalization*. arXiv:1607.06450.
3. Hendrycks, D., Gimpel, K. (2016). *Gaussian Error Linear Units (GELUs)*. arXiv:1606.08415.

*Catatan penulisan: naskah ini disusun dengan bantuan AI, dan rumus serta jumlah parameternya dihitung ulang secara manual.*

---

**Ahmad Wildan Ardiansyah**

D4 Teknik Jaringan Telekomunikasi Digital

Teknik Elektro

Politeknik Negeri Malang