Rata-rata bermasker
X berisi nilai per token dari n kalimat yang di-pad sampai panjang t. mask[i, j] = 1 berarti token itu asli, 0 berarti padding. Kembalikan rata-rata tiap baris hanya pada token asli. Jika satu baris tidak punya token asli, hasilnya 0.
X = [[1, 2, 3], [4, 5, 6]]
mask = [[1, 1, 0], [1, 1, 1]] → [1.5, 5.0]
Axis
X.sum(axis=1) menjumlahkan sepanjang axis 1, sehingga axis itu hilang: (n, t) → (n,). Pakai keepdims=True kalau hasilnya akan di-broadcast lagi ke (n, t).
Padding dan mask
Satu batch berisi kalimat dengan panjang berbeda, jadi kalimat yang pendek di-pad. Setiap reduksi (rata-rata, softmax, loss) harus mengabaikan padding. Kalau tidak, model ikut belajar dari token palsu. Pola ini muncul lagi di attention: posisi yang dilarang diberi skor -inf sebelum softmax.
Penjelasan
Yang diminta. Rata-rata tiap baris X, tetapi hanya menghitung posisi yang mask-nya 1. Baris tanpa satu pun posisi aktif menghasilkan 0.
Ide kunci. Rata-rata = jumlah ÷ banyaknya. Mask membantu keduanya:
- Jumlah: kalikan
X * mask. Posisi padding menjadi 0 sehingga tidak ikut terjumlah. - Banyaknya:
mask.sum(axis=1)menghitung berapa posisi yang aktif per baris.
Langkah di kode:
total = (X * mask).sum(axis=1)berbentuk(n,).count = mask.sum(axis=1)berbentuk(n,).np.where(count > 0, total / np.maximum(count, 1), 0.0). Pembaginyanp.maximum(count, 1)supaya tidak pernah membagi dengan 0 (yang akan memberinandan peringatan).np.wherelalu memilih 0 untuk baris kosong.
Kenapa bukan X.mean(axis=1)? Karena itu membagi dengan t (panjang yang sudah di-pad), bukan banyaknya token asli. Baris [1, 2, pad] akan dihitung (1+2+0)/3 = 1, padahal jawabannya 1.5.
Yang dikembalikan: array (n,).
Topik
Petunjuk 1
Kalikan X dengan mask supaya posisi yang diabaikan menjadi 0, lalu jumlahkan per baris (axis=1).
Petunjuk 2
Bagi dengan jumlah mask per baris. Baris yang mask-nya semua 0 harus menghasilkan 0, bukan NaN.
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.