b belajar.myudak

Satu blok transformer

Gabungkan semua yang sudah kamu bangun menjadi satu blok transformer pre-LN gaya GPT:

x←x+MHA(LN(x))x←x+ReLU(LN(x) W1) W2\begin{aligned} x &\leftarrow x + \text{MHA}(\text{LN}(x)) \\ x &\leftarrow x + \text{ReLU}(\text{LN}(x)\,W_1)\,W_2 \end{aligned}
  • LN: LayerNorm di axis terakhir tanpa parameter (γ=1\gamma = 1, β=0\beta = 0, eps = 1e-5).
  • MHA: causal multi-head attention seperti soal sebelumnya.
  • MLP tanpa bias. Biasanya F = 4D.

Dua langkah, berulang

Setiap blok transformer melakukan dua hal:

  1. Attention: token-token berkomunikasi, karena setiap token mengumpulkan informasi dari token sebelumnya.
  2. MLP: setiap token berpikir sendiri, karena fungsi yang sama diterapkan ke setiap posisi secara terpisah.

GPT menumpuk LL blok seperti ini (GPT-2 kecil: L=12L = 12, D=768D = 768, H=12H = 12).

Residual stream

Perhatikan x = x + .... Setiap sub-layer tidak mengganti x, tapi menambahkan sesuatu ke dalamnya. Akibatnya, gradien punya “jalan tol” langsung dari loss ke layer paling awal tanpa melewati perkalian yang bisa mengecilkannya. Tanpa residual, jaringan sedalam ini nyaris tidak bisa dilatih.

Pre-LN vs post-LN

Transformer asli (2017) menormalkan setelah penjumlahan: x = LN(x + f(x)). GPT-2 dan hampir semua model modern menormalkan sebelum sub-layer: x = x + f(LN(x)). Pre-LN menjaga residual stream tetap bersih dan jauh lebih stabil untuk jaringan yang dalam.

Penjelasan

Yang diminta. Satu blok GPT pre-LN: attention dengan residual, lalu MLP dengan residual.

Langkah di kode:

  1. Dua fungsi pembantu dari soal sebelumnya: layer_norm (tanpa γ/β) dan mha (causal multi-head attention).
  2. x = x + mha(layer_norm(x), ...): normalisasi dulu, jalankan attention, lalu tambahkan hasilnya ke x asli. Ini langkah komunikasi antar-token.
  3. x = x + np.maximum(layer_norm(x) @ W1, 0) @ W2: normalisasi x yang baru, lalu MLP D → F → D dengan ReLU, lalu tambahkan lagi. Ini langkah komputasi per token.

Kenapa residual (x + ...). Setiap sub-layer hanya perlu mempelajari koreksi kecil terhadap x, bukan membangun ulang seluruh representasi. Selain itu, gradien bisa mengalir langsung lewat penjumlahan ke layer awal tanpa dilemahkan.

Kenapa pre-LN. LN dipasang di jalur cabang, bukan di jalur utama. Residual stream x tetap tidak dinormalkan, sehingga jaringan yang dalam lebih stabil dilatih.

Kesalahan umum: x = mha(layer_norm(x)) tanpa x + (residual hilang); x = layer_norm(x + mha(x)) (itu post-LN, hasilnya berbeda); memakai layer_norm(x) dari sebelum langkah 2 di langkah 3.

Yang dikembalikan: array (T, D), bentuk yang sama dengan input. Karena itu blok bisa ditumpuk sebanyak apa pun.

Topik
transformerresiduallayernormmlp
Petunjuk 1

Mulai dari fungsi pembantu: layer_norm(x) dan mha(X, Wq, Wk, Wv, Wo, H). Keduanya sudah kamu tulis di soal sebelumnya.

Petunjuk 2

Pre-LN: normalisasi dilakukan SEBELUM sub-layer, dan hasil sub-layer ditambahkan ke x yang belum dinormalkan (residual).

Python 3.14 · NumPy

Pengaturan editor

Ukuran font
Ukuran huruf di editor.
Ukuran tab
Lebar indentasi. Otomatis: 2 spasi untuk TypeScript, 4 untuk Python.
Key bindings
Ganti ke mode Vim.
Nomor baris relatif
Nomor baris dihitung dari posisi kursor (berguna untuk gerakan Vim).
Word wrap
Baris panjang dilipat agar muat di lebar editor.
IntelliSense
Saran kode otomatis saat mengetik (Ctrl+Spasi tetap bisa dipakai saat mati).

Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.