Kursus Matematika untuk AI · Pelajaran 8 dari 180
Logaritma untuk AI: Menjaga Produk Probabilitas Kecil agar Tidak Hilang
Pelajari logaritma sebagai pangkat invers, turunkan hukum perkalian-menjadi-penjumlahan, dan gunakan skor log NumPy untuk membedakan produk probabilitas yang dibulatkan float64 menjadi nol.
Dalam contoh sederhana penilaian urutan, model bahasa kecil memberikan probabilitas untuk setiap token yang dipilih. Urutan dengan 400 pilihan semacam itu memiliki produk yang secara matematis tidak nol
Tambahkan satu token lagi dengan kemungkinan yang sama, dan produknya menjadi
. Keduanya adalah bilangan positif yang berbeda, tetapi NumPy
menyimpan kedua produk sebagai 0.0 saat menghitungnya dengan bilangan
floating-point 64-bit. Pemeringkatan berdasarkan produk yang tersimpan kehilangan
perbedaan tersebut.
Logaritma mempertahankan representasi yang lebih berguna: kedua produk menjadi jumlah berhingga dan . Setelah pelajaran ini, Anda akan dapat membaca logaritma sebagai pangkat invers, menurunkan hukum yang mengubah produk menjadi jumlah, menghitung skor urutan pendek dengan tangan, dan menerapkan gagasan yang sama tanpa menganggap bahwa ruang log menghapus semua batas numerik.
Pelajaran ini membalik operasi eksponen yang dikembangkan dalam Pelajaran 7: Pangkat untuk AI, yang merupakan halaman lokal terkait dalam Translation Set empat bahasa kursus. Mathematics for Machine Learning companion resmi membagi jalurnya menjadi fondasi matematika dan masalah pembelajaran mesin yang menggunakannya. Bab pengantar-nya mendorong pembangunan fondasi sebelum mengandalkan model probabilistik; matematika logaritma di bawah ini adalah jembatan probabilitas orisinal, bukan definisi yang dikaitkan dengan Bab 1.
Jawaban yang hilang adalah eksponen
Logaritma mengajukan satu pertanyaan tepat: eksponen mana yang menghasilkan bilangan positif ini dari basis yang dipilih?
Contohnya, karena , sedangkan karena . Jawaban negatif itu adalah eksponen, bukan input negatif.
Tiga basis sering muncul dalam komputasi:
| Nama | Notasi di sini | Basis | Satu cara membaca yang berguna |
|---|---|---|---|
| Logaritma umum | Orde besaran desimal | ||
| Logaritma natural | Rumus probabilitas dan optimasi | ||
| Logaritma biner | Penggandaan dan pangkat dua |
Beberapa bidang menulis log tanpa basis, tetapi konvensi itu tidak universal.
Pelajaran ini menulis untuk logaritma natural dan menggunakan subskrip untuk
basis lain. NumPy mengikuti pilihan praktis yang sama:
numpy.log
menghitung logaritma natural elemen demi elemen.
Hubungan invers ini memberikan dua pemeriksaan ketika kedua ekspresi berada dalam domain realnya:
Perkalian meninggalkan jejak penjumlahan
Hukum produk bukan pola yang perlu dihafalkan secara terpisah. Hukum ini langsung diturunkan dari hukum eksponen pada Pelajaran 7.
Ambil bilangan positif dan , serta gunakan basis logaritma yang valid , . Misalkan
Definisi menyatakan dan . Dengan mengalikan dan menerapkan hukum eksponen berbasis sama, kita memperoleh
Jadi, eksponen yang menghasilkan adalah :
Pembagian mengurangkan eksponen di bawah asumsi yang sama:
Menaikkan bilangan positif ke pangkat real mengalikan eksponennya:
Kepositifan berperan nyata dalam ketiga hukum: dan membuat setiap logaritma real terdefinisi, sedangkan juga menjaga penyebut hasil bagi tetap tidak nol.
Penjumlahan tidak mengikuti hukum produk. Sebagai contoh tandingan singkat,
tetapi
Jadi secara umum . Operasi stabil untuk menjumlahkan nilai yang sudah disimpan sebagai logaritma muncul nanti dalam pelajaran ini, dan sengaja berbeda dari konversi produk-menjadi-jumlah.
Empat pilihan token, dikerjakan dalam kedua representasi
Misalkan dua kelanjutan kandidat masing-masing berisi empat pilihan token. Dalam perhitungan kecil ini, anggap setiap yang tercantum sebagai probabilitas kondisional positif model untuk token yang dipilih pada posisi . Mengalikan keempat faktor menghasilkan skor urutan; menjumlahkan logaritma naturalnya menghasilkan log-probabilitas yang sesuai. Untuk urutan teramati yang tetap di bawah model, skor ini juga disebut verosimilitas dan log-verosimilitasnya. Pelajaran-pelajaran selanjutnya akan mengembangkan perangkat probabilitas dan estimasi lengkap; di sini tugasnya hanya menghitung dan membandingkan kedua representasi.
Produk kandidat A dua kali produk kandidat B. Skor log-nya juga lebih besar: . Urutan ini dijamin karena berbasis dan bersifat naik ketat. “Lebih besar” di antara skor log negatif berarti lebih dekat ke nol. Skor tersebut tidak berubah menjadi probabilitas setelah dilogaritmakan; ia menjadi representasi probabilitas yang mudah dibandingkan.
Binary64 mencapai nol sementara skor log terus berubah
Komputer tidak dapat menyimpan setiap bilangan real. Number JavaScript dan
float64 NumPy menggunakan format floating-point binary64. NumPy melaporkan
batas mesinnya melalui
numpy.finfo:
nilai float64 positif normal terkecil sekitar
. Nilai subnormal positif mengisi sebagian
celah antara angka itu dan nol, tetapi dengan presisi yang berkurang; subnormal
positif terkecil sekitar .
numpy.nextafter
memastikan bahwa inilah float terwakili berikutnya setelah nol ke arah positif.
Gerakkan salah satu penggeser dengan penunjuk atau tombol panah. Panel atas mengikuti perkalian binary64 langsung melalui wilayah normal, pita subnormal yang sempit, lalu nol. Panel bawah mengikuti nilai penjumlahan berhingga . Garis penuh dengan lingkaran dan garis putus-putus dengan persegi tetap dapat dibedakan tanpa warna, sementara tabel menampilkan status terpilih dan baris transisi.
Pilih p dari 0.01 hingga 0.50. Tombol panah mengubahnya sebesar 0.01.
Pilih 1 hingga 2.000 faktor berulang. Tombol panah mengubah jumlah satu per satu.
- Produk binary64 langsung
- 0
- Jumlah log kumulatif
- -921,034037
- Status produk langsung
- Nol
- Jumlah faktor subnormal pertama
- 308
- Jumlah faktor nol pertama
- 324
Untuk p = 0,10 yang diulang 400 kali, produk binary64 langsung adalah 0 (Nol); jumlah log kumulatif adalah -921,034037.
Untuk p = 0,10 yang diulang 400 kali, produk binary64 langsung adalah 0 (Nol); jumlah log kumulatif adalah -921,034037.
Produk langsung kecil dibulatkan menjadi empat digit signifikan dalam tampilan ini. Tabel dan label status, bukan angka desimal tambahan, mengidentifikasi transisi keterwakilan.
Tampilkan nilai terpilih dan batas sebagai tabel
| Jumlah faktor n | Produk langsung | Jumlah log kumulatif | Status produk langsung |
|---|---|---|---|
| 1 | 1.000e-1 | -2,302585 | Normal |
| 307 | 1.000e-307 | -706,893624 | Normal |
| 308 | 1.000e-308 | -709,196209 | Subnormal |
| 323 | 9.881e-324 | -743,734985 | Subnormal |
| 324 | 0 | -746,037570 | Nol |
| 400 | 0 | -921,034037 | Nol ← Terpilih |
| 2.000 | 0 | -4.605,170186 | Nol |
Pada keadaan awal yang dirender server, dan . Perkalian langsung sudah menghasilkan nol, tetapi tetap berhingga. Nilai log mempertahankan skor penjumlahan untuk faktor-faktor positif. Memanggil dalam float64 tetap menghasilkan nol, karena perubahan representasi tidak dapat menciptakan nilai float64 positif di bawah jangkauan format tersebut.
Transisi tepatnya bergantung pada tipe data, nilai, dan urutan operasi floating-point. Explorer ini sengaja memodelkan perkalian binary64 berulang; ini bukan batas universal untuk setiap program probabilitas.
NumPy mencerminkan jalur yang aman
Program berikut dijalankan dengan NumPy 2.5.2. Perkalian langsung menggunakan
np.prod, sedangkan akumulasi dalam ruang log menggunakan logaritma natural
per elemen yang didokumentasikan oleh
numpy.log,
kemudian menjumlahkannya.
import numpy as np
for n in (323, 324, 400, 401):
factors = np.full(n, 0.1, dtype=np.float64)
direct = np.prod(factors)
log_score = np.log(factors).sum()
print(f"n={n}: direct={direct:.4e}, log_score={log_score:.6f}")
limits = np.finfo(np.float64)
print(f"smallest normal: {limits.smallest_normal:.4e}")
print(f"smallest subnormal: {limits.smallest_subnormal:.4e}")
print(f"next after zero: {np.nextafter(0.0, 1.0):.4e}")
n=323: direct=9.8813e-324, log_score=-743.734985
n=324: direct=0.0000e+00, log_score=-746.037570
n=400: direct=0.0000e+00, log_score=-921.034037
n=401: direct=0.0000e+00, log_score=-923.336622
smallest normal: 2.2251e-308
smallest subnormal: 4.9407e-324
next after zero: 4.9407e-324
Produk dengan 400 dan 401 faktor bertemu di nol saat disimpan, sedangkan skor log-nya tetap berurutan. Dalam praktik, sistem yang perlu membandingkan produk kandidat dapat menyimpan skor log dan memilih yang lebih besar tanpa mengambil eksponen setiap skor. Inilah manfaat numerik yang spesifik: faktor perkalian positif menjadi skor penjumlahan berhingga. Ini tidak memperbaiki input tidak valid, pembulatan pada operasi lain, atau konversi akhir yang hasilnya terlalu kecil untuk tipe yang dipilih.
Menjumlahkan probabilitas alternatif memerlukan identitas lain. Jika dan , maka
—bukan . NumPy
numpy.logaddexp
menghitung log-dari-jumlah tersebut secara langsung. Untuk dua alternatif yang
sudah dalam bentuk log, dan :
x, y = -1000.0, -1001.0
with np.errstate(divide="ignore"):
naive = np.log(np.exp(x) + np.exp(y))
stable = np.logaddexp(x, y)
print(naive)
print(stable)
print(np.exp(stable))
-inf
-999.6867383124818
0.0
Jalur naif mengambil eksponen terlalu dini sehingga kedua alternatif menjadi nol.
np.logaddexp mempertahankan skor log gabungan yang berhingga. Mengambil
eksponen dari skor itu tetap mengalami underflow, persis seperti yang ditunjukkan
baris terakhir. Gunakan sum(log_factors) untuk produk faktor positif;
gunakan logaddexp ketika menjumlahkan alternatif yang sudah
direpresentasikan sebagai nilai log.
Batas yang perlu dinyatakan secara eksplisit
Domain dan syarat basis logaritma real mencegah beberapa bug umum:
| Input atau klaim | Hasil log real | Alasan |
|---|---|---|
| , , | Valid | Ada eksponen real yang unik |
| Tidak terdefinisi sebagai log real | Tidak ada eksponen berhingga yang membuat basis positif sama dengan nol | |
| Tidak terdefinisi dalam bilangan real | Basis log real yang valid dipangkatkan dengan eksponen real selalu positif | |
| Basis tidak valid | untuk setiap , sehingga tidak ada fungsi invers | |
| Tidak valid untuk definisi log real ini | Pangkat real tidak menghasilkan setiap argumen positif secara konsisten | |
| Secara umum salah | Sisi kanan sama dengan |
Untuk array real, NumPy mengikuti konvensi floating-point di sekitar batas ini:
np.log(0.0) mengembalikan -inf dan memberi sinyal pembagian dengan nol,
sedangkan np.log(-1.0) mengembalikan nan dan memberi sinyal operasi tidak
valid. Ini adalah nilai mesin yang berguna, bukan izin untuk menghapus perbedaan
matematis. Faktor yang benar-benar memiliki probabilitas nol menyumbang
pada skor log; produk positif yang dibulatkan menjadi nol floating-point
seharusnya sudah dilogaritmakan sebelum perkalian. Setelah produk yang
dihitung sudah nol, np.log(product) tidak dapat memulihkan faktor yang hilang.
Mengganti nol secara diam-diam dengan konstanta positif kecil juga mengubah nilai yang dinyatakan model. Jika clipping merupakan keputusan pemodelan yang disengaja, catat aturannya alih-alih menyajikannya sebagai aritmetika eksak.
Terakhir, arah pemeringkatan bergantung pada basis. Untuk setiap basis , termasuk , , dan , logaritma meningkat, sehingga produk positif yang lebih besar memiliki nilai log lebih besar. Basis valid antara nol dan satu menghasilkan logaritma menurun dan membalik urutan tersebut. Implementasi log-probabilitas biasanya menggunakan , sehingga skor log yang lebih tidak negatif mendapat peringkat lebih tinggi.
Skor berhingga dapat menjadi hasil yang berguna
Urutan pembuka tidak perlu mengubah probabilitas mikroskopisnya kembali ke bentuk desimal agar tetap dapat dibedakan. Skor log-nya mempertahankan perbandingan perkalian sebagai penjumlahan biasa, dan hukum produk, hasil bagi, serta pangkat menjelaskan mengapa representasi itu bekerja.
Fondasi ini akan mendukung pelajaran berikutnya tentang probabilitas, estimasi berbasis verosimilitas, entropi, dan perhitungan model yang stabil. Langkah kurikulum berikutnya mengalihkan fokus ke persamaan sebagai kendala dan himpunan nilai yang memenuhinya. Untuk sekarang, titik berhenti praktisnya jelas: simpan faktor positif dalam ruang log saat menggabungkan dan membandingkannya, lalu kembali ke ruang probabilitas hanya ketika hasilnya diperlukan sekaligus dapat direpresentasikan.
Uji pemahaman Anda
Pertanyaan 1
Hitung log₂(32) dan log₁₀(0.001), lalu periksa setiap jawaban dengan pangkat.
Tampilkan solusi langkah demi langkah
Untuk , tanyakan eksponen pada yang menghasilkan :
Untuk , tulis ulang desimal tersebut sebagai pangkat sepuluh:
Kedua argumen positif, dan basis serta positif serta tidak sama dengan , sehingga logaritma real memenuhi asumsi yang diperlukan. Pemeriksaannya adalah pangkat dan .
Pertanyaan 2
Untuk x > 0 dan y > 0, uraikan ln(x³/y²) menjadi logaritma x dan y, serta sebutkan hukum yang digunakan pada tiap langkah.
Tampilkan solusi langkah demi langkah
Mulai dengan hukum hasil bagi karena operasi terluarnya membagi dua kuantitas positif:
Kemudian gunakan hukum pangkat pada setiap suku:
Asumsi dan membuat , , serta hasil baginya positif; asumsi itu juga memastikan . Karena itu, di bawah asumsi yang dinyatakan, ekspresi yang diuraikan memiliki domain real yang sama dengan ekspresi aslinya.
Pertanyaan 3
Seorang rekan menulis ln(4 + 5) = ln(4) + ln(5). Bantah klaim tersebut dan nyatakan identitas produk yang benar.
Tampilkan solusi langkah demi langkah
Periksa apa yang diwakili setiap sisi. Sisi kiri adalah
Jumlah di sisi kanan menggunakan hukum produk:
Karena , logaritma naturalnya tidak sama. Secara numerik, , sedangkan . Identitas yang valid adalah
untuk dan . Identitas ini mengubah perkalian, bukan penjumlahan, menjadi jumlah.
Pertanyaan 4
Kandidat tiga token memiliki faktor positif 0.5, 0.2, dan 0.1. Hitung produk langsung dan skor log naturalnya langkah demi langkah, lalu konversikan skor log itu kembali.
Tampilkan solusi langkah demi langkah
Kalikan dari kiri ke kanan:
Untuk representasi log, hitung dan jumlahkan ketiga suku:
Hukum produk menyatakan bahwa jumlah ini sama dengan . Menerapkan eksponensial invers menghasilkan
Konversi ini sesuai dengan produk langsung; perbedaan kecil yang tersirat oleh desimal yang ditampilkan hanya berasal dari pembulatan suku log hingga enam tempat desimal.
Pertanyaan 5
Dua kandidat memiliki skor log natural −40 dan −42. Produk mana yang lebih besar, dan berapa faktor pengalinya?
Tampilkan solusi langkah demi langkah
Logaritma natural menggunakan basis , sehingga mempertahankan urutan. Karena , kandidat dengan skor log memiliki produk positif yang lebih besar.
Misalkan produknya adalah dan . Rasionya menggunakan hukum hasil bagi untuk eksponen:
Jadi, produk kandidat pertama sekitar kali produk kandidat kedua. Perbedaan dua poin di ruang log merupakan rasio perkalian di ruang asal.
Pertanyaan 6
Pada p = 0.1, explorer menunjukkan produk langsung subnormal pada n = 323 dan nol pada n = 324. Apa yang terjadi pada skor log, dan apa arti hal ini saat skor tersebut dieksponensialkan?
Tampilkan solusi langkah demi langkah
Skor penjumlahan adalah . Dengan :
Keduanya berhingga dan tetap berbeda, meskipun perkalian binary64 langsung mencapai nol pada 324 faktor dalam contoh yang diverifikasi. Akumulasi ruang log karena itu masih dapat membandingkan urutan dengan faktor positif.
Namun, mengeksponensialkan meminta float64 merepresentasikan kira- kira , yang setelah pembulatan berada di bawah jangkauan positifnya, sehingga hasil tersimpan adalah nol. Representasi log mempertahankan skor berhingga; ia tidak memperluas jangkauan keluaran binary64.
Pertanyaan 7
Debug kode untuk menjumlahkan dua alternatif dalam bentuk log ini: np.log(np.exp(-1000) + np.exp(-1001)). Mengapa hasilnya −inf, dan operasi NumPy mana yang mempertahankan skor log gabungan yang berhingga?
Tampilkan solusi langkah demi langkah
Kode tersebut mengambil eksponen terlebih dahulu. Dalam float64, kedua nilai antara terlalu kecil untuk direpresentasikan:
Program kemudian menghitung , yang direpresentasikan NumPy
sebagai -inf sambil memberi sinyal pembagian dengan nol.
Gunakan operasi yang dirancang untuk alternatif yang sudah berada di ruang log:
combined = np.logaddexp(-1000.0, -1001.0)
# -999.6867383124818Operasi ini menghitung tanpa terlebih dahulu
membulatkan kedua eksponen menjadi nol. Ini bukan hukum produk: produk faktor
positif menggunakan np.log(factors).sum(), sedangkan contoh ini menjumlahkan
dua alternatif. Terakhir, np.exp(combined) tetap menghasilkan 0.0; skor
gabungan berhingga dipertahankan, tetapi nilainya pada skala probabilitas tetap
tidak dapat direpresentasikan dalam float64.