Hitungan NLP (Latihan Kertas, Pensil, dan Kalkulator)

Kumpulan semua perhitungan dari materi UTS_NLP (note 1, 2, 3, 5, 6, 7) yang masuk akal diminta saat ujian tanpa laptop. Tiap hitungan berisi: rumus, maksud simbol, satu soal pendek, jawaban langkah demi langkah, dan cara cek atau jebakan. Istilah yang belum jelas ada di Glosarium_NLP.

Versi lengkap ada di PDF. _Materi/NLP/hitungan/Hitungan_NLP.pdf (lokal, tidak ikut terbit di web; sumber LaTeX di folder yang sama) memuat penjelasan materi tiap topik, tabel arti simbol, pembahasan langkah demi langkah, dan soal penuh untuk tiap bab. Catatan ini adalah versi ringkas yang lebih lama; nomor bagiannya tidak sama dengan PDF.

Bentuk soal yang jadi acuan: 3_Exercise_Transformer_Encoder (kalikan matriks kecil, softmax, residual, FFN, logits, prediksi) dan 2_Exercise_Sentence_Comparison (cosine, skor sparse dan multi-vector, gabung berbobot, cari titik impas bobot). Transformer Encoder sudah ditutup (2 Oktober 2026, 13:00) dan Sentence Comparison sudah dikerjakan (status selesai), jadi keduanya dipakai langsung sebagai contoh (bagian 3.6 dan 6.5).

Catatan jujur. Isi ujian sebenarnya tidak diketahui. Daftar hitungan ini disusun dari rumus yang ada di catatan dan pola dua latihan di atas. Semua angka jawaban saya hitung ulang di komputer, bukan dari kepala. Bagian bertanda (tambahan) adalah rumus atau angka yang tidak disebut di slide (mis. ukuran vocabulary BERT); jangan dianggap pasti keluar.

0. Sebelum Mulai: Kebiasaan Kalkulator

HalAturan
Mode sudutRadian (RAD) untuk sin dan cos pada positional encoding. Mode derajat memberi angka salah
log vs lnlog di kalkulator = basis 10; ln = basis e. Slide menulis log(N/df) tanpa basis: tulis basis yang kamu pakai di jawaban
Log basis 2log₂ x = ln x / ln 2 (kalkulator biasanya tidak punya tombol log₂)
PembulatanSimpan 4 angka di belakang koma selama hitung, bulatkan di akhir
SoftmaxHitung e^x tiap elemen, jumlahkan, bagi. Cek: hasil harus berjumlah 1
Dua kelasSoftmax dua kelas = 1 / (1 + e^(−selisih logit)). Cepat dan mudah dicek
Hemat kerjaKalau yang ditanya hanya [CLS], hitung hanya baris Query [CLS] (K dan V tetap semua baris). Lihat 3.6

1. Klasifikasi Teks

1.1 TF-IDF

Rumus: w(x,y) = tf(x,y) × log(N / df_x)

  • tf(x,y): berapa kali kata x muncul di dokumen y.
  • df_x: berapa dokumen (dari seluruh korpus) yang memuat kata x.
  • N: jumlah seluruh dokumen.
  • Kata yang ada di semua dokumen punya log(N/N) = 0, jadi bobotnya 0.

Soal. Korpus 4 dokumen. D1 = “ball player goal ball”. Kata ball muncul di 2 dokumen, player di 3 dokumen, goal di 1 dokumen. Hitung TF-IDF tiap kata di D1 (log basis 10).

Jawaban.

Katatf di D1dfidf = log₁₀(4/df)TF-IDF
ball22log₁₀ 2 = 0,30102 × 0,3010 = 0,6021
player13log₁₀ 1,333 = 0,12490,1249
goal11log₁₀ 4 = 0,60210,6021

Dengan ln hasilnya 1,3863; 0,2877; 1,3863 (urutan sama).

Cek. player paling rendah karena paling umum. ball dan goal seri meski ball muncul dua kali: goal lebih langka, jadi idf-nya mengganti selisih tf.

1.2 Mutual Information (pemilihan fitur)

Rumus: MI(t,l) = log₂ [ p(t,l) / (p(t) p(l)) ] ≈ log₂ [ A·N / ((A+B)(A+C)) ]

  • A: jumlah dokumen yang memuat t dan berlabel l.
  • B: dokumen yang memuat t tetapi bukan label l.
  • C: dokumen berlabel l tetapi tidak memuat t.
  • N: jumlah seluruh dokumen dalam korpus (slide menyebutnya “jumlah dokumen berlabel”), jadi N = A + B + C + D dengan D dokumen yang tidak memuat t dan bukan label l.
  • A+B = semua dokumen yang memuat t. A+C = semua dokumen berlabel l.
  • MI > 0: kata dan label berkaitan; MI ≈ 0: tidak berkaitan; MI < 0: saling menjauh.

(Catatan: slide menyebut B dan C dengan kata “kata/dokumen” secara campur; di sini dipakai hitungan dokumen, yang standar.)

Soal. N = 100, A = 20, B = 5, C = 10 (jadi D = 65). Hitung MI kata “gratis” terhadap label spam.

Jawaban. A+B = 25, A+C = 30. MI = log₂ (20 × 100 / (25 × 30)) = log₂ (2000/750) = log₂ 2,667 = ln 2,667 / ln 2 = 0,9808 / 0,6931 = 1,415. Positif, jadi “gratis” berkaitan kuat dengan spam.

Cek. Kalau A = (A+B)(A+C)/N (di sini 7,5), MI tepat 0. A = 20 jauh di atasnya, jadi MI jelas positif.

1.3 Naive Bayes (tambahan, prasyarat)

Naive Bayes ada di daftar classifier tetapi hitungannya tidak diajarkan di slide. Sertakan hanya sebagai cadangan.

Rumus: P(kelas | kata-kata) ∝ P(kelas) × Π P(kata | kelas), dengan Laplace (add-1) P(kata|kelas) = (hitungan kata di kelas + 1) / (total kata di kelas + |V|).

Soal. Data latih: spam = {“free discount”, “free gift”}, ham = {“meeting today”}. Vocabulary V = {free, discount, gift, meeting, today}, |V| = 5. Klasifikasikan “free today”.

Jawaban. Total kata spam = 4 (free×2, discount, gift), ham = 2. Prior: spam 2/3, ham 1/3.

  • Spam: 2/3 × (2+1)/(4+5) × (0+1)/(4+5) = 2/3 × 3/9 × 1/9 = 0,02469
  • Ham: 1/3 × (0+1)/(2+5) × (1+1)/(2+5) = 1/3 × 1/7 × 2/7 = 0,01361

Normalisasi: spam = 0,02469/(0,02469+0,01361) = 0,645, ham = 0,355. Prediksi: spam.

Jebakan. Tanpa add-1, P(today|spam) = 0 dan seluruh skor spam jadi 0.

1.4 Precision, Recall, F1, Accuracy (tambahan)

Rumus: P = TP/(TP+FP), R = TP/(TP+FN), F1 = 2PR/(P+R), Acc = (TP+TN)/total.

Soal. Filter spam: TP = 40, FP = 10, FN = 20, TN = 30. Hitung semuanya.

Jawaban. P = 40/50 = 0,80; R = 40/60 = 0,667; F1 = 2(0,80)(0,667)/(1,467) = 0,727; Acc = 70/100 = 0,70.

Cek. F1 selalu di antara P dan R, lebih dekat ke yang lebih kecil.

2. Word Representation

2.1 Cosine Similarity (dipakai di mana-mana)

Rumus: cos(u,v) = (u·v) / (‖u‖ ‖v‖); u·v = Σ uᵢvᵢ; ‖u‖ = √(Σ uᵢ²). Nilai 1 = searah (sangat mirip), 0 = tegak lurus, −1 = berlawanan.

Soal. u = (0,6; 0,5; 0,4) dan v = (0,8; 0,05; 0,1). Hitung cosine.

Jawaban. u·v = 0,48 + 0,025 + 0,04 = 0,545. ‖u‖ = √0,77 = 0,8775, ‖v‖ = √0,6525 = 0,8078. cos = 0,545 / (0,8775 × 0,8078) = 0,769.

Cek. Hasil tidak boleh lebih dari 1. Vektor yang semua elemennya positif tidak akan menghasilkan cosine negatif.

2.2 SVD dan LSI (matriks kecil)

Rumus: A = U S Vᵀ. Kolom V = eigenvector AᵀA. Singular value σᵢ = √λᵢ (λ = eigenvalue AᵀA), diurutkan menurun. Kolom U: uᵢ = A vᵢ / σᵢ. Eigenvalue matriks 2×2 dari λ² − (trace)λ + det = 0. Input baru dipetakan dengan q = Qᵀ U S⁻¹.

Soal. A = [[1,1],[0,1],[1,0]] (3 term × 2 dokumen). Cari AᵀA, eigenvalue, singular value, V, dan U. Berapa persen “energi” dimensi pertama?

Jawaban.

  1. AᵀA = [[2,1],[1,2]] (kolom A: (1,0,1) dan (1,1,0); dot masing-masing).
  2. trace = 4, det = 3: λ² − 4λ + 3 = 0, jadi λ = 3 dan 1.
  3. Singular value: σ₁ = √3 = 1,732, σ₂ = √1 = 1.
  4. Eigenvector: λ = 3: (A−3I)v = 0 memberi v₁ = (1,1)/√2 = (0,707; 0,707). λ = 1: v₂ = (1,−1)/√2 = (0,707; −0,707).
  5. u₁ = A v₁/σ₁: A(1,1)/√2 = (2,1,1)/√2, dibagi 1,732 → (0,816; 0,408; 0,408). u₂ = A v₂/σ₂: A(1,−1)/√2 = (0,−1,1)/√2 = (0; −0,707; 0,707).
  6. Energi dimensi pertama: σ₁² / (σ₁² + σ₂²) = 3/4 = 75%.

Fold-in. Query hanya berisi term 1: Q = (1,0,0). Qᵀ U = baris 1 dari U = (0,816; 0). Kali S⁻¹ = diag(1/1,732; 1/1): q = (0,471; 0).

Cek. σ₁ ≥ σ₂. v₁ ⟂ v₂ (dot = 0). Tanda eigenvector boleh terbalik (−v juga benar). Contoh dari slide (A = [[1,2],[0,1],[1,1]], λ = 4 ± √13, σ = 2,7578 dan 0,6281) ada di UTS_NLP 2.3.

2.3 HAL (Hyperspace Analogue to Language)

Rumus: window W; bobot jarak w(d) = W − d + 1; R[w1][w2] = jumlah bobot saat w2 muncul sesudah w1 dalam window; L = Rᵀ (konteks sebelum); vektor kata v(w) = [R[w,:] ‖ L[w,:]] (panjang 2V); vektor dokumen v(d) = (1/|d|) Σ count(w,d) v(w).

Soal. Stream a b c a b, V = {a, b, c}, W = 2. Hitung R, L, v(a), dan vektor dokumen “a b a”.

Jawaban. Untuk W = 2: w(1) = 2, w(2) = 1.

Pasangan jarak 1 (bobot 2): (a,b), (b,c), (c,a), (a,b). Pasangan jarak 2 (bobot 1): (a,c), (b,a), (c,b).

R (baris = kata, kolom = kata yang muncul sesudahnya)     L = R^T
        a  b  c                                                   a  b  c
   a [  0  4  1 ]      R[a][b] = 2+2 = 4                    a [  0  1  2 ]
   b [  1  0  2 ]                                           b [  4  0  1 ]
   c [  2  1  0 ]                                           c [  1  2  0 ]

v(a) = [R[a,:] ‖ L[a,:]] = (0,4,1 ‖ 0,1,2), v(b) = (1,0,2 ‖ 4,0,1).

Dokumen “a b a” (|d| = 3, count a = 2, b = 1): v(d) = (2 v(a) + v(b))/3 = (1,8,4 ‖ 4,2,5)/3 = (0,333; 2,667; 1,333; 1,333; 0,667; 1,667).

Cek. Diagonal R selalu 0 pada contoh ini (tidak ada kata berurutan dengan dirinya). Jumlah semua isi R = jumlah semua isi L. Setiap pasangan berurutan masuk satu kali ke R, dan otomatis muncul di L.

2.4 LDA

Rumus.

  • θ_d: proporsi topik dokumen d (jumlah = 1). φ_k: peluang kata dalam topik k (jumlah = 1).
  • Peluang kata di dokumen: P(w|d) = Σ_k θ_dk · φ_kw.
  • Peluang topik untuk satu kata dalam dokumen: P(z=k | w, d) = θ_dk φ_kw / P(w|d).
  • Gibbs sampling (bentuk di slide): P(z=k | …) ∝ (n_dk + α) × (n_kw + β), lalu dinormalkan.

Soal A. θ = (0,7; 0,3) (topik Sport, Politics). Atas kata (w1, w2, w3): φ_Sport = (0,5; 0,3; 0,2), φ_Politics = (0,1; 0,2; 0,7). Hitung P(w|d) tiap kata, dan peluang topik Sport untuk w1.

Jawaban A. P(w1|d) = 0,7×0,5 + 0,3×0,1 = 0,38; P(w2|d) = 0,21 + 0,06 = 0,27; P(w3|d) = 0,14 + 0,21 = 0,35. Jumlah = 1,00 (cek lolos). P(Sport | w1, d) = 0,35 / 0,38 = 0,921.

Soal B (Gibbs). α = 0,5, β = 0,1. Untuk satu kata: n_dk = (3, 1) dan n_kw = (4, 2) untuk topik 1 dan 2. Hitung peluang masing-masing topik.

Jawaban B. Topik 1: (3+0,5)(4+0,1) = 3,5 × 4,1 = 14,35. Topik 2: (1+0,5)(2+0,1) = 1,5 × 2,1 = 3,15. Jumlah 17,5. Peluang: 0,82 dan 0,18.

Jebakan. Rumus slide tidak membagi dengan jumlah total (n_k + Vβ); ikuti rumus slide kecuali soal menyebut bentuk lengkap. Dirichlet: α kecil (0,3) membuat dokumen condong ke satu topik, α besar (8) membuat campuran merata.

2.5 GloVe

Rumus.

  • Target: wᵢ·c_j + bᵢ + bc_j ≈ log X_ij.
  • Bobot: f(x) = (x/x_max)^α jika x < x_max, selain itu 1 (umum x_max = 100, α = 0,75).
  • Loss satu pasangan: J = f(X_ij) (wᵢ·c_j + bᵢ + bc_j − log X_ij)².
  • Update (bentuk di slide): error = pred − log X; gradient g_w = f · error · c_j; w_baru = w − η · g_w. (Turunan sebenarnya punya faktor 2; slide membuangnya, jadi ikuti soal.)
  • Vektor akhir v(word) = w + c.

Soal. w = (0,1; 0,2), c = (0,3; −0,1), b = 0,01, bc = −0,02, X = 4, learning rate 0,05. Hitung f, error, loss, dan w baru.

Jawaban.

  1. f(4) = (4/100)^0,75 = 0,04^0,75: ln 0,04 = −3,2189, dikali 0,75 = −2,4142, e^(−2,4142) = 0,0894.
  2. pred = w·c + b + bc = (0,03 − 0,02) + 0,01 − 0,02 = 0,000.
  3. log X = ln 4 = 1,3863. error = 0 − 1,3863 = −1,3863.
  4. J = f × error² = 0,0894 × 1,9218 = 0,1719.
  5. g_w = f · error · c = (0,0894)(−1,3863)(0,3; −0,1) = −0,1240 × (0,3; −0,1) = (−0,0372; +0,0124).
  6. w_baru = w − 0,05 g_w = (0,1 + 0,00186; 0,2 − 0,00062) = (0,1019; 0,1994).

Cek. Error negatif (prediksi di bawah target) membuat w bergerak ke arah +c: dot product naik, error mengecil. f(x) = 1 untuk x ≥ 100; f(25) = 0,3536.

2.6 Word2Vec

Analogi. V_king − V_man + V_woman lalu cari kata dengan cosine tertinggi, tidak termasuk tiga kata masukan.

Soal. king = (0,9; 0,8), man = (0,5; 0,1), woman = (0,4; 0,6), queen = (0,8; 1,3), prince = (0,9; 0,3), apple = (−0,2; 0,5). Apa hasil analogi king − man + woman?

Jawaban. t = (0,9 − 0,5 + 0,4; 0,8 − 0,1 + 0,6) = (0,8; 1,3). Cosine terhadap: queen 1,000, woman 0,999 (masukan, dikecualikan), king 0,958, prince 0,767, man 0,681, apple 0,596. Jawaban: queen.

Jebakan. Kata masukan dikecualikan karena pada embedding nyata hasil analogi sering paling dekat dengan salah satu kata masukan. Pada data soal ini queen tetap menang walau tidak dikecualikan (1,000 > 0,999), tetapi aturan pengecualian tetap dipakai.

Jumlah parameter skip-gram. Vocabulary 10.000, hidden 300: matriks input→hidden 10.000 × 300 = 3.000.000, hidden→output 300 × 10.000 = 3.000.000; total 6.000.000 (tanpa bias). Setelah training, matriks input→hidden dipakai sebagai lookup table vektor kata.

3. Transformer

3.1 Softmax dan Cross-Entropy

Rumus: softmax(zᵢ) = e^zᵢ / Σ_j e^z_j. Loss untuk kelas benar y (cross-entropy, prasyarat): L = −ln p_y.

Soal. Logits (2,0; 1,0; 0,1). Hitung peluang dan loss jika kelas benar adalah kelas 1.

Jawaban. e^2 = 7,389, e^1 = 2,718, e^0,1 = 1,105; jumlah 11,212. Peluang: 0,659; 0,242; 0,099. L = −ln 0,659 = 0,417.

Cek. Jumlah peluang = 1. −ln 0,7 = 0,357; −ln 0,05 = 2,996 (salah yakin = loss besar).

3.2 Positional Encoding

Rumus: PE(t, 2k) = sin(ω_k t), PE(t, 2k+1) = cos(ω_k t), ω_k = 1 / 10000^(2k/d). Hasilnya dijumlah ke embedding kata.

Soal. d = 4. Hitung vektor posisi untuk t = 1.

Jawaban. Indeks 0 dan 1 (k = 0): ω₀ = 10000^0 = 1. Indeks 2 dan 3 (k = 1): ω₁ = 1/10000^(2/4) = 1/100 = 0,01. PE(1) = (sin 1; cos 1; sin 0,01; cos 0,01) = (0,8415; 0,5403; 0,0100; 1,0000). Untuk t = 2: (0,9093; −0,4161; 0,0200; 0,9998).

Jebakan. Kalkulator harus mode radian. Pasangan sin dan cos memakai frekuensi yang sama (k sama). Pada BERT, position embedding dipelajari, bukan rumus ini.

3.3 Scaled Dot-Product Attention (satu head)

Rumus: Attention(Q,K,V) = softmax(Q Kᵀ / √d_k) V. Dimensi: Q, K berukuran (n × d_k), V berukuran (n × d_v), skor berukuran (n × n), keluaran (n × d_v). Baris skor = satu token sebagai query.

Soal. Tiga token, d_k = 2:

Q = [[1,0],[0,2],[1,1]]    K = [[1,1],[0,1],[2,0]]    V = [[1,0],[0,1],[1,1]]

Hitung keluaran attention untuk token 1.

Jawaban.

  1. Q Kᵀ: baris 1 = Q₁ dikali tiap baris K = (1·1+0·1; 1·0+0·1; 1·2+0·0) = (1, 0, 2).
  2. Bagi √d_k = √2 = 1,414: (0,707; 0; 1,414).
  3. Softmax: e^0,707 = 2,028, e^0 = 1, e^1,414 = 4,113; jumlah 7,141. Bobot (0,284; 0,140; 0,576).
  4. z₁ = 0,284·(1,0) + 0,140·(0,1) + 0,576·(1,1) = (0,860; 0,716).

Seluruh matriks bobot (untuk cek):

token1: 0.284, 0.140, 0.576
token2: 0.446, 0.446, 0.108
token3: 0.401, 0.198, 0.401

Cek. Tiap baris berjumlah 1. Token dengan skor tertinggi mendapat bobot terbesar. Keluaran z adalah campuran baris V (tiap elemen z selalu di antara min dan max kolom V).

3.4 Masked Self-Attention (decoder)

Aturan: skor j > i diganti −∞ sebelum softmax, sehingga bobotnya 0. Token i hanya memperhatikan token ≤ i.

Soal. Pakai data 3.3. Hitung keluaran masked attention untuk ketiga token.

Jawaban.

  • Token 1: hanya dirinya, bobot (1,0,0) → z₁ = (1; 0).
  • Token 2: skor (1,414; 1,414; −∞) → bobot (0,5; 0,5; 0) → z₂ = 0,5(1,0) + 0,5(0,1) = (0,5; 0,5).
  • Token 3: semua terlihat, sama seperti 3.3 → z₃ = (0,802; 0,599).

Cek. Baris terakhir tidak berubah karena tidak ada token di depannya. Bobot berbentuk segitiga bawah.

3.5 Multi-Head: Dimensi dan Jumlah Parameter

Rumus. d_k = d_v = d_model / h. Hasil tiap head (n × d_v) dikonkatenasi menjadi (n × h·d_v = d_model), lalu dikali W^O (d_model × d_model). Parameter attention satu layer tanpa bias: W^Q, W^K, W^V masing-masing h · d_model · d_k = d_model², ditambah W^O = d_model²; total 4 d_model².

Soal. d_model = 512, h = 8. Tentukan d_k, ukuran konkatenasi, dan jumlah parameter attention.

Jawaban. d_k = d_v = 512/8 = 64. Konkatenasi: 8 × 64 = 512 kolom. Parameter: 4 × 512² = 4 × 262.144 = 1.048.576.

(Tambahan) FFN dengan d_ff = 4·d_model = 2048 (nilai Transformer asli): 2 × 512 × 2048 = 2.097.152 parameter (tanpa bias).

3.6 Soal Penuh: Transformer Encoder-Only (Exercise)

Ini soal 3_Exercise_Transformer_Encoder (assignment ditutup 2 Oktober 2026, 13:00; matriks sudah dicocokkan dengan PDF aslinya). Soal: klasifikasi spam vs not spam dari “give discount”, tanpa LayerNorm, d_model = 4, 2 head.

Soal 1: dimensi. d_k = d_v = d_model / h = 4/2 = 2.

Soal 2: matriks input X = token embedding + positional embedding, baris per posisi:

[CLS]    (1,0,1,0) + Pos-0 (0,0,0,0) = (1,0,1,0)
give     (0,1,1,0) + Pos-1 (0,0,1,0) = (0,1,2,0)
discount (1,1,0,0) + Pos-2 (0,1,0,0) = (1,2,0,0)
[SEP]    (0,0,1,1) + Pos-3 (0,0,0,1) = (0,0,1,2)

X = [[1,0,1,0],[0,1,2,0],[1,2,0,0],[0,0,1,2]]

Soal 3: multi-head self-attention. Untuk tiap head: Q = X W_Q, K = X W_K, V = X W_V, skor Q Kᵀ/√2, softmax per baris, kali V.

Head 1.

Q = [[2,0],[2,1],[1,2],[1,2]]   K = [[1,1],[1,2],[3,0],[0,3]]   V = [[2,0],[2,1],[1,2],[1,2]]

(Angka di blok matriks memakai titik desimal dan koma pemisah elemen, seperti di soal aslinya.)

Q Kᵀ = [[2, 2, 6, 0],[3, 4, 6, 3],[3, 5, 3, 6],[3, 5, 3, 6]] /√2 = [[1.414, 1.414, 4.243, 0.000], [2.121, 2.828, 4.243, 2.121], [2.121, 3.536, 2.121, 4.243], [2.121, 3.536, 2.121, 4.243]] bobot = [[0.052, 0.052, 0.883, 0.013], [0.081, 0.164, 0.674, 0.081], [0.069, 0.285, 0.069, 0.577], [0.069, 0.285, 0.069, 0.577]] Z1 = [[1.104, 1.843],[1.245, 1.674],[1.354, 1.577],[1.354, 1.577]]

*Head 2.*

Q = K = V = [[0, 2],[1, 2],[2, 1],[2, 1]]

Q Kᵀ = [[4, 4, 2, 2],[4, 5, 4, 4],[2, 4, 5, 5],[2, 4, 5, 5]] bobot = [[0.402, 0.402, 0.098, 0.098], [0.199, 0.403, 0.199, 0.199], [0.046, 0.189, 0.383, 0.383], [0.046, 0.189, 0.383, 0.383]] Z2 = [[0.793, 1.804],[1.199, 1.602],[1.720, 1.235],[1.720, 1.235]]

*Konkatenasi, `W_O = I`, lalu residual (`Y = X + Concat`):*

Concat = [[1.104, 1.843, 0.793, 1.804], [1.245, 1.674, 1.199, 1.602], [1.354, 1.577, 1.720, 1.235], [1.354, 1.577, 1.720, 1.235]] Y = [[2.104, 1.843, 1.793, 1.804], [1.245, 2.674, 3.199, 1.602], [2.354, 3.577, 1.720, 1.235], [1.354, 1.577, 2.720, 3.235]]


**Soal 4: FFN (ReLU) + residual.** `W₁ = I`, jadi `ReLU(Y W₁) = ReLU(Y) = Y` (semua elemen Y positif, ReLU tidak mengubah apa pun). Lalu `FFN = Y W₂`:

FFN = [[ 0.300, 0.050, -0.050, -0.300], [-0.357, -0.525, 0.525, 0.357], [ 1.119, 1.858, -1.858, -1.119], [-1.881, -1.142, 1.142, 1.881]] Output = FFN + Y = [[ 2.404, 1.894, 1.743, 1.504], [ 0.887, 2.150, 3.723, 1.960], [ 3.473, 5.435, -0.138, 0.115], [-0.527, 0.435, 3.862, 5.115]]

Baris pertama contoh perhitungan: `Y₀ W₂ = (2,104 − 1,804; 1,843 − 1,793; −1,843 + 1,793; −2,104 + 1,804) = (0,300; 0,050; −0,050; −0,300)`.

**Soal 5: logits dan softmax dari `[CLS]`** (baris pertama output) `= (2,404; 1,894; 1,743; 1,504)`, `W_cls = [[1,−1],[0,1],[1,0],[−1,1]]`, `b = 0`:
- logit spam (kolom 1) `= 2,404 + 0 + 1,743 − 1,504 =` **2,643**
- logit not spam (kolom 2) `= −2,404 + 1,894 + 0 + 1,504 =` **0,994**
- softmax: selisih `1,649`; `P(spam) = 1/(1 + e^−1,649) =` **0,839**, `P(not spam) =` **0,161**

**Soal 6: prediksi.** **Spam** (0,839 > 0,161), sesuai target "give discount → spam".

**Cara hemat waktu.** Karena hanya `[CLS]` yang dipakai di akhir (satu layer saja), cukup hitung `Q` baris 0, tetapi `K` dan `V` untuk **semua** baris. Baris 0: head 1 bobot `(0,052; 0,052; 0,883; 0,013)` → `Z = (1,104; 1,843)`; head 2 bobot `(0,402; 0,402; 0,098; 0,098)` → `Z = (0,793; 1,804)`. FFN dan classifier bekerja per baris, jadi baris lain tidak diperlukan. **Cek:** tiap baris bobot berjumlah 1; vektor `[CLS]` akhir `(2,404; 1,894; 1,743; 1,504)` sama dengan contoh `O_CLS` di [[7_Sentence_Comparison]].

### 3.7 Kompleksitas Self-Attention vs RNN

**Rumus:** self-attention `O(n² · d)` per layer; recurrent `O(n · d²)`; operasi sekuensial self-attention `O(1)`, RNN `O(n)`. Self-attention lebih murah saat `n < d`.

**Soal.** `n = 100`, `d = 512`. Mana yang lebih sedikit operasinya per layer?

**Jawaban.** Self-attention `100² × 512 = 5.120.000`; RNN `100 × 512² = 26.214.400`. Self-attention sekitar **5 kali lebih sedikit**. Untuk `n = 1000`: `1000² × 512 = 512.000.000` melawan `1000 × 512² = 262.144.000`, jadi RNN lebih murah.

## 4. BERT

### 4.1 Masking MLM dan Jumlah Epoch

**Rumus:** token yang di-mask = 15% × panjang; token terpakai = step × batch; epoch = token terpakai / jumlah token korpus.

**Soal A.** Sequence 512 token. Berapa yang di-mask?
**Jawaban A.** `0,15 × 512 = 76,8` ≈ **77 token**.

**Soal B.** Batch 131.072 token, 1 juta step, korpus 3,3 miliar kata. Berapa epoch?
**Jawaban B.** `10⁶ × 131.072 = 1,31 × 10¹¹` token; `÷ 3,3 × 10⁹ =` **≈ 39,7 ≈ 40 epoch** (cocok dengan catatan).

### 4.2 Estimasi Parameter BERT-Base (tambahan)

Tiap layer encoder ≈ `12 d²` (attention `4d²` + FFN `8d²` dengan `d_ff = 4d`). BERT-Base: `d = 768`, 12 layer.
`12 × 768² = 7.077.888` per layer; × 12 layer = **84.934.656**. Embedding token (vocab ≈ 30.522, bukan dari slide) `30.522 × 768 = 23.440.896`. Layer + embedding token = `84.934.656 + 23.440.896 = 108.375.552` ≈ **108,4 juta**. Menambah position embedding (`512 × 768 = 393.216`) dan segment embedding (`2 × 768 = 1.536`) menjadi `108.770.304` ≈ 108,8 juta (belum menghitung bias, LayerNorm, dan pooler). Hasilnya mendekati "~110 juta" di slide.

## 5. Decoder, Prompting, dan PEFT

### 5.1 Self-Consistency (voting)

**Soal.** Tiga rantai penalaran menjawab 67, 35, 67. Jawaban akhir?
**Jawaban.** Ambil yang paling sering: **67** (2 dari 3).

### 5.2 LoRA: Jumlah Parameter

**Rumus.** Bobot beku `W₀ ∈ R^{d×k}`. LoRA: `W_down ∈ R^{r×k}`, `W_up ∈ R^{d×r}`. Parameter dilatih `r(d + k)` dibanding penuh `d · k`. Keluaran: `h = W₀x + W_up (W_down x)`.

**Soal.** `d = k = 1024`, `r = 8`. Berapa parameter dilatih dan berapa persen dari penuh? Lalu jika LoRA dipasang di `W^Q` dan `W^V` pada 12 layer dengan `d = k = 768`, `r = 8`?

**Jawaban.** Satu matriks: `8 × (1024 + 1024) = 16.384` vs `1.048.576` → **1,56%**.
Model 12 layer: `12 × 2 × 8 × (768 + 768) = 294.912` vs `12 × 2 × 768² = 14.155.776` → **2,08%**.

**Cek.** Makin kecil `r`, makin hemat. `r ≪ min(d,k)`.

### 5.3 Adapter

**Rumus:** `Adapter(x) = W_up σ(W_down x) + x`; `W_down: m×d`, `W_up: d×m` (`m` = bottleneck).

**Soal.** `d = 768`, `m = 64`. Parameter satu adapter?
**Jawaban.** `768 × 64 + 64 × 768 =` **98.304**; dengan bias `+ 64 + 768 =` **99.136**.

### 5.4 (IA)³ dan Selective PEFT

**(IA)³.** Tiga vektor rescaling `l_k, l_v, l_ff`. Soal: `d_k = d_v = 768`, `d_ff = 3072`, 12 layer. Jawaban: `(768 + 768 + 3072) × 12 =` **55.296** parameter.

**Selective (mask biner).** `θᵢ' = θᵢ − η mᵢ ∂L/∂θᵢ`. Soal: `θ = (0,5; −0,2; 0,8)`, gradient `(0,1; 0,4; −0,3)`, `m = (1,0,1)`, `η = 0,1`. Jawaban: `θ₁' = 0,5 − 0,1×1×0,1 = 0,49`; `θ₂' = −0,2` (mask 0, tidak berubah); `θ₃' = 0,8 − 0,1×1×(−0,3) = 0,83`. Hasil: **(0,49; −0,20; 0,83)**.

## 6. Sentence Comparison

### 6.1 Cosine Leksikal (bag-of-words)

**Soal.** "I love NLP" vs "I love AI". Hitung cosine bag-of-words.
**Jawaban.** Vocabulary (I, love, NLP, AI): `u = (1,1,1,0)`, `v = (1,1,0,1)`. `u·v = 2`; `‖u‖ = ‖v‖ = √3`. `cos = 2/3 =` **0,667**.

> ⚠ **Angka slide yang tidak cocok.** Di [[7_Sentence_Comparison]] dan [[UTS_NLP]] contoh "Institut Teknologi Bandung" vs "Bandung Institute of Technology" ditulis `cos = 1/(2√3) = 0,1667`. Itu tidak konsisten: `1/(2√3) = 0,2887`, bukan 0,1667; dan rumus yang tertulis (`√3 × √3`) akan memberi `1/3 = 0,333`. Jika kedua kalimat dihitung dengan kosakata (Institut, Teknologi, Bandung, Institute, of, Technology), kalimat 1 punya 3 token dan kalimat 2 punya 4 token (1 sama: *Bandung*), jadi `cos = 1/(√3 × 2) = 0,2887`. Cek slide aslinya dan jangan hafal 0,1667.

### 6.2 BGE-M3 Hybrid Retrieval (soal baru)

**Rumus:**
- `s_dense = cos(u_q, v_d)`
- `s_sparse = Σ_{t ∈ Q∩D} w_t^Q · w_t^D` (hanya token yang ada di kedua sisi)
- `s_multi = Σ_{q_i ∈ Q} max_{d_j ∈ D} cos(q_i, d_j)` (maks per baris, lalu jumlahkan)
- `s_rank = w₁ s_dense + w₂ s_sparse + w₃ s_multi`

**Soal.** Query vs D1 dan D2 sudah menghasilkan:

| | dense | sparse | multi-vector |
|---|---|---|---|
| D1 | 0,90 | 0,10 | 2,20 |
| D2 | 0,40 | 0,50 | 2,00 |

Bobot `(w₁, w₂, w₃) = (1; 0,3; 1)`. Hitung `s_rank` dan tentukan peringkat. Lalu cari `w₂` agar skor kedua dokumen sama.

**Jawaban.**
- D1: `1(0,90) + 0,3(0,10) + 1(2,20) = 0,90 + 0,03 + 2,20 =` **3,13**
- D2: `1(0,40) + 0,3(0,50) + 1(2,00) = 0,40 + 0,15 + 2,00 =` **2,55**
- D1 peringkat pertama.
- Titik impas: `0,90 + 2,20 + 0,10 w₂ = 0,40 + 2,00 + 0,50 w₂` → `3,10 − 2,40 = 0,40 w₂` → **`w₂ = 1,75`**. Pada `w₂ = 1,75` skor kedua dokumen seri; jika `w₂ > 1,75`, D2 menang karena sinyal leksikal (sparse) terlalu dominan.

**Multi-vector dari tabel cosine** (cara mengisi `s_multi`): ambil nilai terbesar **per baris** (per token query), jumlahkan. Contoh baris laptop (0,35; 0,93; 0,80; 0,10; 0,20; 0,15) → 0,93.

### 6.3 Loss Kontrastif dan Temperatur τ

**Rumus:** `L = −log [ e^{cos(u,v⁺)/τ} / Σ_i e^{cos(u,v_i)/τ} ]` (penyebut mencakup positif **dan** semua negatif). τ kecil membuat perbedaan skor lebih "tajam".

**Soal.** Anchor `(1,0)`, positif `(0,8; 0,6)`, negatif `(0,1)` dan `(0,6; −0,8)`. Hitung loss dengan `τ = 0,1` dan `τ = 1`.

**Jawaban.** Cosine ke anchor: positif **0,8**, negatif 1 **0,0**, negatif 2 **0,6**.
- `τ = 0,1`: eksponen `(8; 0; 6)` → `e^8 = 2981`, `e^0 = 1`, `e^6 = 403,4`; jumlah 3385,4; `p⁺ = 0,8805`; `L = −ln 0,8805 =` **0,127**.
- `τ = 1`: eksponen `(0,8; 0; 0,6)` → `2,226; 1; 1,822`; jumlah 5,048; `p⁺ = 0,441`; `L =` **0,819**.

**Cek.** τ lebih kecil membuat positif lebih dominan sehingga loss lebih kecil (asalkan positifnya memang paling mirip). Negatif dengan cosine 0,6 (hard negative) menaikkan penyebut.

### 6.4 Fitur `|u − v|`, Biaya Cross- vs Bi-Encoder, dan Zero-shot NLI

**Fitur `|u − v|`.** `u = (0,2; 0,9; 0,4)`, `v = (0,5; 0,1; 0,4)` → `|u−v| = (`**0,3; 0,8; 0**`)`. Masukan classifier berupa `(u, v, |u−v|)` = 3 × 3 = **9 dimensi**.

**Biaya.** Banding 1 kalimat dengan N = 10.000 kalimat: cross-encoder = **10.000** forward pass tiap kali; bi-encoder = embed sekali (bisa disimpan), lalu 10.000 cosine. Clustering 10.000 kalimat berpasangan: cross-encoder `n(n−1)/2 = 49.995.000` pasangan; bi-encoder hanya `10.000` encode.

**Zero-shot NLI.** Kalimat = premise, tiap label = hypothesis "this text is {label}". Misal `P(entailment)` untuk pets 0,94, politics 0,02, sports 0,03 → pilih **pets** (nilai terbesar).

**Threshold.** Aturan `cos > 0,7` dianggap mirip (angka threshold ditentukan soal atau validasi, bukan konstanta).

### 6.5 Soal Penuh: BGE-M3 (dari Exercise Sentence Comparison)

Soal di [[2_Exercise_Sentence_Comparison]] (bagian 1): query "laptop for programming", D1 = "best notebook computer for software developers", D2 = "laptop sleeve and carrying case for programming books". Ringkasan jawaban yang sudah dihitung ulang:

| | dense | sparse | multi-vector | gabungan `(1; 0,3; 1)` |
|---|---|---|---|---|
| D1 | 0,999 | 0,0020 | 2,82 | **3,820** |
| D2 | 0,769 | 0,3375 | 2,70 | 3,570 |

Peringkat 1: **D1**. Sparse sendirian memilih D2 (**salah**, tertipu kecocokan kata); dense dan multi-vector memilih D1. Titik impas `w₂ ≈ 1,04`: skor seri di titik itu, dan untuk `w₂ > 1,04` D2 menang. Paper BGE-M3 memberi bobot sparse kecil di awal (`w₂ = 0,3`) karena matriks bobot leksikalnya masih acak dan hasilnya buruk.

## 7. Rumus Cepat (Satu Halaman)

| Topik | Rumus |
|---|---|
| TF-IDF | `tf × log(N/df)` |
| MI | `log₂ [A·N / ((A+B)(A+C))]` |
| Precision, Recall, F1 | `TP/(TP+FP)`, `TP/(TP+FN)`, `2PR/(P+R)` |
| Cosine | `u·v / (‖u‖‖v‖)` |
| SVD | `σ = √λ(AᵀA)`; `u = Av/σ`; energi `σ₁²/Σσ²` |
| HAL | `w(d) = W − d + 1`; `v(w) = [R ‖ L]`, `L = Rᵀ` |
| LDA | `P(w|d) = Σ θ_dk φ_kw`; Gibbs `(n_dk+α)(n_kw+β)` |
| GloVe | `J = f(X)(w·c + b + bc − ln X)²`; `f = (x/100)^0,75`; `w ← w − η·f·err·c` |
| Positional encoding | `sin(ω t)` (indeks genap), `cos(ω t)` (ganjil); `ω = 1/10000^(2k/d)` |
| Softmax | `e^zᵢ / Σ e^z`; dua kelas `1/(1+e^{−Δ})` |
| Attention | `softmax(QKᵀ/√d_k) V` |
| Dimensi head | `d_k = d_model / h`; parameter attention `4 d_model²` |
| Cross-entropy | `−ln p_benar` |
| LoRA | `r(d + k)` vs `d·k` |
| Adapter | `2 d m` (+ bias `m + d`) |
| BGE-M3 | `w₁ cos + w₂ Σ w^Q w^D + w₃ Σ max cos` |
| Kontrastif | `−log [e^{s⁺/τ} / Σ e^{s_i/τ}]`, `s = cos` |

## 8. Sengaja Tidak Dimasukkan

- Backpropagation dan turunan penuh (tidak diminta di slide, terlalu panjang untuk kertas).
- Eigen-dekomposisi matriks 3×3 atau lebih (tidak praktis tanpa laptop).
- Menjalankan Gibbs sampling berulang sampai konvergen (hanya satu langkah peluang yang dimasukkan).
- Topik BEAM (di luar cakupan [[UTS_NLP]]).
- LayerNorm (latihan Transformer memang menyuruh diabaikan; rumus penuh tidak ada di slide).