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.

Bagikan artikel ini

Dalam contoh sederhana penilaian urutan, model bahasa kecil memberikan probabilitas 0.10.1 untuk setiap token yang dipilih. Urutan dengan 400 pilihan semacam itu memiliki produk yang secara matematis tidak nol

0.1×0.1××0.1400 factors=(0.1)400=10400.\underbrace{0.1\times0.1\times\cdots\times0.1}_{400\text{ factors}} =(0.1)^{400}=10^{-400}.

Tambahkan satu token lagi dengan kemungkinan yang sama, dan produknya menjadi 1040110^{-401}. 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 400ln(0.1)921.034037400\ln(0.1)\approx-921.034037 dan 401ln(0.1)923.336622401\ln(0.1)\approx-923.336622. 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, log2(8)=3\log_2(8)=3 karena 23=82^3=8, sedangkan log10(0.01)=2\log_{10}(0.01)=-2 karena 102=0.0110^{-2}=0.01. Jawaban negatif itu adalah eksponen, bukan input negatif.

Tiga basis sering muncul dalam komputasi:

NamaNotasi di siniBasisSatu cara membaca yang berguna
Logaritma umumlog10(x)\log_{10}(x)1010Orde besaran desimal
Logaritma naturalln(x)=loge(x)\ln(x)=\log_e(x)e2.71828e\approx2.71828Rumus probabilitas dan optimasi
Logaritma binerlog2(x)\log_2(x)22Penggandaan dan pangkat dua

Beberapa bidang menulis log tanpa basis, tetapi konvensi itu tidak universal. Pelajaran ini menulis ln\ln 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:

logb(by)=yandblogb(x)=x.\log_b(b^y)=y \qquad\text{and}\qquad b^{\log_b(x)}=x.

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 aa dan cc, serta gunakan basis logaritma yang valid b>0b>0, b1b\ne1. Misalkan

u=logb(a)andv=logb(c).u=\log_b(a)\quad\text{and}\quad v=\log_b(c).

Definisi menyatakan a=bua=b^u dan c=bvc=b^v. Dengan mengalikan dan menerapkan hukum eksponen berbasis sama, kita memperoleh

ac=bubv=bu+v.ac=b^u b^v=b^{u+v}.

Jadi, eksponen yang menghasilkan acac adalah u+vu+v:

logb(ac)=logb(a)+logb(c).\boxed{\log_b(ac)=\log_b(a)+\log_b(c)}.

Pembagian mengurangkan eksponen di bawah asumsi yang sama:

ac=bubv=buvlogb ⁣(ac)=logb(a)logb(c).\frac{a}{c}=\frac{b^u}{b^v}=b^{u-v} \quad\Longrightarrow\quad \boxed{\log_b\!\left(\frac{a}{c}\right)=\log_b(a)-\log_b(c)}.

Menaikkan bilangan positif ke pangkat real rr mengalikan eksponennya:

ar=(bu)r=brulogb(ar)=rlogb(a).a^r=(b^u)^r=b^{ru} \quad\Longrightarrow\quad \boxed{\log_b(a^r)=r\log_b(a)}.

Kepositifan berperan nyata dalam ketiga hukum: a>0a>0 dan c>0c>0 membuat setiap logaritma real terdefinisi, sedangkan c>0c>0 juga menjaga penyebut hasil bagi tetap tidak nol.

Penjumlahan tidak mengikuti hukum produk. Sebagai contoh tandingan singkat,

ln(2+3)=ln(5)1.609438,\ln(2+3)=\ln(5)\approx1.609438,

tetapi

ln(2)+ln(3)=ln(6)1.791759.\ln(2)+\ln(3)=\ln(6)\approx1.791759.

Jadi secara umum log(a+c)log(a)+log(c)\log(a+c)\ne\log(a)+\log(c). 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 pip_i yang tercantum sebagai probabilitas kondisional positif model untuk token yang dipilih pada posisi ii. 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: 7.824046>8.517193-7.824046>-8.517193. Urutan ini dijamin karena ln\ln berbasis e>1e>1 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 2.2250738585072014×103082.2250738585072014\times10^{-308}. Nilai subnormal positif mengisi sebagian celah antara angka itu dan nol, tetapi dengan presisi yang berkurang; subnormal positif terkecil sekitar 4.9406564584124654×103244.9406564584124654\times10^{-324}. 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 nln(p)n\ln(p). Garis penuh dengan lingkaran dan garis putus-putus dengan persegi tetap dapat dibedakan tanpa warna, sementara tabel menampilkan status terpilih dan baris transisi.

Ulangi satu probabilitas positif p hingga 2.000 faktor. Produk binary64 langsung dapat berpindah dari normal ke subnormal lalu nol, sementara jumlah log natural kumulatif tetap berhingga. Pembacaan menggunakan empat digit signifikan untuk produk kecil agar tidak menyiratkan presisi yang tidak tersedia.

Pilih p dari 0.01 hingga 0.50. Tombol panah mengubahnya sebesar 0.01.

0,10

Pilih 1 hingga 2.000 faktor berulang. Tombol panah mengubah jumlah satu per satu.

400
Produk langsung: garis penuh dan lingkaranJumlah log: garis putus-putus dan persegiJumlah terpilih: panduan bertitik
Produk probabilitas langsung dan jumlah log kumulatifDua plot bertumpuk vertikal berbagi jumlah faktor pada sumbu horizontal. Garis penuh atas dengan lingkaran turun melalui wilayah binary64 normal dan subnormal sebelum berlanjut sebagai garis nol bertitik. Garis putus-putus bawah dengan persegi tetap menjadi jumlah log natural kumulatif yang lurus dan berhingga. Panduan vertikal bertitik menandai jumlah terpilih.Produk binary64 langsung dan keterwakilan0-100-200-300Nilai normalSubnormal: pita sempit di atas batas bawahNol: batas bawah bertitikmagnitudo log₁₀ dari pⁿJumlah log natural kumulatif-0-1.151-2.303-3.454-4.60505001.0001.5002.000n ln(p)Jumlah faktor n
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
Produk binary64 langsung dan jumlah log natural kumulatif pada nilai terpilih serta tonggak keterwakilan
Jumlah faktor nProduk langsungJumlah log kumulatifStatus produk langsung
11.000e-1-2,302585Normal
3071.000e-307-706,893624Normal
3081.000e-308-709,196209Subnormal
3239.881e-324-743,734985Subnormal
3240-746,037570Nol
4000-921,034037Nol ← Terpilih
2.0000-4.605,170186Nol

Pada keadaan awal yang dirender server, p=0.10p=0.10 dan n=400n=400. Perkalian langsung sudah menghasilkan nol, tetapi 400ln(0.10)=921.034037400\ln(0.10)=-921.034037\ldots tetap berhingga. Nilai log mempertahankan skor penjumlahan untuk faktor-faktor positif. Memanggil exp(921.034037)\exp(-921.034037\ldots) 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 x=ln(a)x=\ln(a) dan y=ln(c)y=\ln(c), maka

ln(a+c)=ln(ex+ey),\ln(a+c)=\ln(e^x+e^y),

—bukan x+yx+y. NumPy numpy.logaddexp menghitung log-dari-jumlah tersebut secara langsung. Untuk dua alternatif yang sudah dalam bentuk log, x=1000x=-1000 dan y=1001y=-1001:

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 klaimHasil log realAlasan
x>0x>0, b>0b>0, b1b\ne1ValidAda eksponen real yang unik
x=0x=0Tidak terdefinisi sebagai log realTidak ada eksponen berhingga yang membuat basis positif sama dengan nol
x<0x<0Tidak terdefinisi dalam bilangan realBasis log real yang valid dipangkatkan dengan eksponen real selalu positif
b=1b=1Basis tidak valid1y=11^y=1 untuk setiap yy, sehingga tidak ada fungsi invers
b0b\le0Tidak valid untuk definisi log real iniPangkat real tidak menghasilkan setiap argumen positif secara konsisten
logb(a+c)=logb(a)+logb(c)\log_b(a+c)=\log_b(a)+\log_b(c)Secara umum salahSisi kanan sama dengan logb(ac)\log_b(ac)

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 -\infty 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 b>1b>1, termasuk ee, 22, dan 1010, 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 e>1e>1, 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 log2(32)\log_2(32), tanyakan eksponen pada 22 yang menghasilkan 3232:

25=32log2(32)=5.2^5=32 \quad\Longrightarrow\quad \log_2(32)=5.

Untuk log10(0.001)\log_{10}(0.001), tulis ulang desimal tersebut sebagai pangkat sepuluh:

0.001=11000=103log10(0.001)=3.0.001=\frac{1}{1000}=10^{-3} \quad\Longrightarrow\quad \log_{10}(0.001)=-3.

Kedua argumen positif, dan basis 22 serta 1010 positif serta tidak sama dengan 11, sehingga logaritma real memenuhi asumsi yang diperlukan. Pemeriksaannya adalah pangkat 25=322^5=32 dan 103=0.00110^{-3}=0.001.

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:

ln ⁣(x3y2)=ln(x3)ln(y2).\ln\!\left(\frac{x^3}{y^2}\right) =\ln(x^3)-\ln(y^2).

Kemudian gunakan hukum pangkat pada setiap suku:

ln(x3)ln(y2)=3ln(x)2ln(y).\ln(x^3)-\ln(y^2) =3\ln(x)-2\ln(y).

Asumsi x>0x>0 dan y>0y>0 membuat x3x^3, y2y^2, serta hasil baginya positif; asumsi itu juga memastikan y20y^2\ne0. 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

ln(4+5)=ln(9).\ln(4+5)=\ln(9).

Jumlah di sisi kanan menggunakan hukum produk:

ln(4)+ln(5)=ln(4×5)=ln(20).\ln(4)+\ln(5)=\ln(4\times5)=\ln(20).

Karena 9209\ne20, logaritma naturalnya tidak sama. Secara numerik, ln(9)2.197225\ln(9)\approx2.197225, sedangkan ln(20)2.995732\ln(20)\approx2.995732. Identitas yang valid adalah

ln(ac)=ln(a)+ln(c)\ln(ac)=\ln(a)+\ln(c)

untuk a>0a>0 dan c>0c>0. 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:

0.5×0.2=0.1,0.1×0.1=0.01.0.5\times0.2=0.1, \qquad 0.1\times0.1=0.01.

Untuk representasi log, hitung dan jumlahkan ketiga suku:

ln(0.5)0.693147,\ln(0.5)\approx-0.693147,ln(0.2)1.609438,ln(0.1)2.302585,\ln(0.2)\approx-1.609438, \qquad \ln(0.1)\approx-2.302585,0.6931471.6094382.302585=4.605170.-0.693147-1.609438-2.302585=-4.605170.

Hukum produk menyatakan bahwa jumlah ini sama dengan ln(0.01)\ln(0.01). Menerapkan eksponensial invers menghasilkan

e4.6051700.01.e^{-4.605170}\approx0.01.

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 e>1e>1, sehingga mempertahankan urutan. Karena 40>42-40>-42, kandidat dengan skor log 40-40 memiliki produk positif yang lebih besar.

Misalkan produknya adalah A=e40A=e^{-40} dan B=e42B=e^{-42}. Rasionya menggunakan hukum hasil bagi untuk eksponen:

AB=e40e42=e40(42)=e27.389.\frac{A}{B}=\frac{e^{-40}}{e^{-42}}=e^{-40-(-42)}=e^2\approx7.389.

Jadi, produk kandidat pertama sekitar 7.3897.389 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 nln(p)n\ln(p). Dengan ln(0.1)2.302585093\ln(0.1)\approx-2.302585093:

323ln(0.1)743.734985,323\ln(0.1)\approx-743.734985,324ln(0.1)746.037570.324\ln(0.1)\approx-746.037570.

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 746.037570-746.037570 meminta float64 merepresentasikan kira- kira 1032410^{-324}, 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:

float64(e1000)=0,float64(e1001)=0.\operatorname{float64}(e^{-1000})=0, \qquad \operatorname{float64}(e^{-1001})=0.

Program kemudian menghitung ln(0+0)=ln(0)\ln(0+0)=\ln(0), 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.6867383124818

Operasi ini menghitung ln(e1000+e1001)\ln(e^{-1000}+e^{-1001}) 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.

Sumber

  1. Mathematics for Machine Learning companion website
  2. Mathematics for Machine Learning book PDF
  3. NumPy documentation: numpy.log
  4. NumPy documentation: numpy.logaddexp
  5. NumPy documentation: numpy.finfo
  6. NumPy documentation: numpy.nextafter