Kursus Matematika untuk AI · Pelajaran 25 dari 180

Penyelesaian Numerik untuk AI: Gunakan solve Tanpa Invers Eksplisit

Selesaikan sistem pemulihan parameter AI dengan NumPy, lalu gunakan residual, bilangan kondisi, dan pemeriksaan singularitas untuk menilai apakah jawabannya dapat dipercaya.

Bagikan artikel ini

Sebuah langkah kalibrasi AI mungkin perlu memulihkan dua parameter yang tidak diketahui dari dua respons terukur. Persamaannya cukup kecil untuk ditulis di papan tulis, tetapi kode produksi tetap harus menentukan cara menyelesaikannya dan cara memeriksa jawabannya. Vektor yang tampak masuk akal bukan bukti bahwa data menentukannya secara andal.

Pelajaran ini mengembangkan keputusan tersebut dengan NumPy. Anda akan menyelesaikan sistem linear persegi, membandingkan numpy.linalg.solve dengan jalur invers eksplisit, menghitung residual, mengukur pengondisian, dan mengenali batas singular ketika estimasi parameter unik tidak ada.

Hasil belajar: Gunakan numpy.linalg.solve dan jelaskan mengapa inversi eksplisit biasanya dihindari.

Pelajaran 22: Transformasi identitas dan invers menunjukkan makna invers secara matematis. Pelajaran 24: Bentuk eselon baris mengungkap struktur menunjukkan bagaimana pivot dan variabel bebas mengungkap apa yang dapat ditentukan oleh sebuah sistem. Di sini, kita menghubungkan aljabar eksak itu dengan komputasi berpresisi hingga. Situs pendamping resmi Mathematics for Machine Learning menempatkan pekerjaan ini di Bagian 2.3 dari PDF buku; skenario kalibrasi, angka, kode, visual, dan asesmen di bawah ini adalah karya orisinal.

Sistem linear adalah kontrak pemulihan parameter

Tuliskan vektor parameter yang tidak diketahui sebagai

x=[x1x2]∈R2.x = \begin{bmatrix}x_1\\x_2\end{bmatrix}\in\mathbb{R}^2.

Vektor ini memiliki dua koordinat, sehingga setiap baris matriks koefisien AA harus memuat dua koefisien. Jika dua pengamatan menghasilkan vektor ruas kanan bb, sistem pemulihan parameter berbentuk

Ax=b,A∈R2×2,b∈R2,x∈R2.A x=b, \qquad A\in\mathbb{R}^{2\times 2}, \quad b\in\mathbb{R}^{2}, \quad x\in\mathbb{R}^{2}.

Untuk kepala kalibrasi kecil, x1x_1 bisa menjadi skala yang diterapkan pada satu sinyal dan x2x_2 menjadi koreksi mirip offset yang diterapkan pada sinyal lain. Secara lebih umum, notasi yang sama menggambarkan lapisan linear kecil, koreksi sensor, atau submasalah pemulihan parameter di dalam pipeline AI yang lebih besar. Baris-baris AA adalah pola koefisien yang diamati; bb berisi respons yang seharusnya dihasilkan oleh pola tersebut.

Jika AA persegi dan invertibel, aljabar dari pelajaran sebelumnya memberi

x=A−1b.x=A^{-1}b.

Identitas itu berguna untuk penalaran. Identitas itu tidak berarti program harus terlebih dahulu membangun A−1A^{-1} setiap kali membutuhkan xx.

Contoh kerja: pulihkan dua parameter kalibrasi

Pertimbangkan sistem yang sengaja dibuat kecil berikut

A=[3112],b=[81].A=\begin{bmatrix}3&1\\1&2\end{bmatrix}, \qquad b=\begin{bmatrix}8\\1\end{bmatrix}.

Kedua persamaannya adalah

3x1+x2=8,x1+2x2=1.3x_1+x_2=8, \qquad x_1+2x_2=1.

Selesaikan dengan substitusi sebelum meminta NumPy melakukan pekerjaan yang sama. Persamaan pertama memberi x2=8−3x1x_2=8-3x_1. Substitusikan ungkapan itu ke persamaan kedua:

x1+2(8−3x1)=1⟹−5x1=−15⟹x1=3.x_1+2(8-3x_1)=1 \Longrightarrow -5x_1=-15 \Longrightarrow x_1=3.

Kemudian x2=8−3(3)=−1x_2=8-3(3)=-1, sehingga

x=[3−1].x=\begin{bmatrix}3\\-1\end{bmatrix}.

Periksa kedua persamaan asli, bukan hanya persamaan yang sudah diubah susunannya:

Ax=[3112][3−1]=[81]=b.A x = \begin{bmatrix}3&1\\1&2\end{bmatrix} \begin{bmatrix}3\\-1\end{bmatrix} = \begin{bmatrix}8\\1\end{bmatrix}=b.

Mengapa solve biasanya merupakan langkah antara yang tepat

Ekspresi matematis langsung A−1bA^{-1}b menyembunyikan dua tugas komputasi yang berbeda:

JalurApa yang dihitungMengapa penting untuk satu ruas kanan
np.linalg.solve(A, b)Memfaktorkan AA dan menerapkan faktor-faktornya pada bbHanya menghitung vektor yang diminta.
np.linalg.inv(A) @ bMembangun setiap kolom A−1A^{-1}, lalu mengalikannya dengan bbMenghitung informasi jauh lebih banyak daripada yang diperlukan satu penyelesaian ini.

Untuk satu ruas kanan, solve menghindari materialisasi seluruh invers. Untuk beberapa ruas kanan yang disimpan sebagai kolom-kolom BB, gunakan np.linalg.solve(A, B) sehingga matriks koefisien yang sama dapat difaktorkan sekali sementara semua solusi yang diminta dihitung. Simpan invers hanya jika aplikasi memang membutuhkan invers itu sendiri; invers bukan pengganti default untuk solve.

Dokumentasi NumPy saat ini untuk solve menyatakan bahwa matriks koefisien harus persegi dan berpangkat penuh, serta mendokumentasikan bahwa rutin tersebut menggunakan implementasi LAPACK _gesv. Dokumentasi inv juga memperingatkan bahwa matriks yang terkondisi buruk dapat menghasilkan keluaran tidak akurat meskipun inversi tidak memunculkan galat. Karena itu, pilihan implementasi dan diagnosis perlu berada dalam model mental yang sama.

Perbedaan runtime bergantung pada perangkat keras dan pustaka, sehingga bukan benchmark yang portabel. Sebagai ilustrasi, pengujian di host penulisan berikut menggunakan matriks acak tetap berukuran 64×6464\times64, lima pengulangan waktu, dan dua puluh pemanggilan per pengulangan:

from timeit import repeat

rng = np.random.default_rng(7)
A_timing = rng.normal(size=(64, 64)) + 64 * np.eye(64)
b_timing = rng.normal(size=64)

solve_time = min(
    repeat(lambda: np.linalg.solve(A_timing, b_timing), repeat=5, number=20)
) / 20
inverse_time = min(
    repeat(lambda: np.linalg.inv(A_timing) @ b_timing, repeat=5, number=20)
) / 20

print(solve_time * 1e6, inverse_time * 1e6, inverse_time / solve_time)

Run yang telah diverifikasi mencetak kira-kira 15.2 µs, 52.2 µs, dan 3.43× untuk waktu solve, waktu jalur invers, dan rasionya. Anggap angka-angka itu sebagai bentuk perbandingan yang dapat direproduksi, bukan janji performa: alasan algoritmis untuk memilih solve adalah karena ia menghindari penghitungan matriks yang tidak digunakan, dan pustaka BLAS atau ukuran matriks yang berbeda dapat mengubah rasio tersebut.

Residual adalah pemeriksaan kecocokan, bukan sertifikat kepercayaan

Untuk contoh kerja, hitung residual dari jalur langsung:

r=b−Ax^=[81]−[81]=[00].r=b-A\hat{x} = \begin{bmatrix}8\\1\end{bmatrix} - \begin{bmatrix}8\\1\end{bmatrix} = \begin{bmatrix}0\\0\end{bmatrix}.

Program floating-point melaporkan norma mendekati 10−1510^{-15}, bukan tepat nol. Itu merupakan bukti kuat bahwa vektor yang dikembalikan cocok dengan bb ini. Namun, bayangkan koefisien atau respons berasal dari pengukuran sensor yang dibulatkan. Solver dapat menemukan vektor yang sangat cocok dengan nilai yang telah dibulatkan itu, tetapi vektor tersebut tetap dapat berubah besar ketika pengukuran diubah dalam batas ketidakpastiannya.

Pengondisian mengukur sensitivitas

Bilangan kondisi membandingkan seberapa besar matriks dapat memperkuat perubahan input relatif. Untuk matriks invertibel dan norma-2,

κ2(A)=∥A∥2,∥A−1∥2=σmax⁡(A)σmin⁡(A),\kappa_2(A)=\lVert A\rVert_2,\lVert A^{-1}\rVert_2 =\frac{\sigma_{\max}(A)}{\sigma_{\min}(A)},

dengan σmax⁡\sigma_{\max} dan σmin⁡\sigma_{\min} adalah nilai singular terbesar dan terkecil. Bilangan kondisi yang mendekati 11 menunjukkan arah yang seimbang. Nilai besar berarti perubahan kecil tertentu pada input dapat menyebabkan perubahan relatif yang jauh lebih besar pada solusi. Jika nilai singular terkecil adalah nol, matriksnya singular dan bilangan kondisinya tak terhingga.

Untuk ruas kanan yang terganggu, batas yang berguna berbentuk

∥δx∥∥x∥≲κ(A)∥δb∥∥b∥,\frac{\lVert\delta x\rVert}{\lVert x\rVert} \lesssim \kappa(A)\frac{\lVert\delta b\rVert}{\lVert b\rVert},

dengan asumsi-asumsi umum untuk sistem nonsingular. Ketaksamaan ini adalah peringatan tentang kemungkinan penguatan, bukan janji bahwa setiap gangguan akan mencapai kasus terburuk.

Sekarang gunakan baris-baris yang hampir bergantung:

B=[1111.0001],xtrue=[2−1],b=Bxtrue=[10.9999].B=\begin{bmatrix}1&1\\1&1.0001\end{bmatrix}, \qquad x_{\text{true}}=\begin{bmatrix}2\\-1\end{bmatrix}, \qquad b=B x_{\text{true}}=\begin{bmatrix}1\\0.9999\end{bmatrix}.

Baris kedua hampir merupakan salinan baris pertama. Dengan bb persis seperti yang ditampilkan, solve memulihkan [2,−1][2,-1]. Ubah hanya respons kedua sebesar 10−610^{-6}, lalu solve lagi. NumPy melaporkan

condition number: 40002.000074915224
original solution: [ 2. -1.]
perturbed solution: [ 1.99 -0.99]
relative input change: 7.071421374297804e-07
relative solution change: 0.006324555320519327
perturbed residual norm: 0.0

Input berubah sekitar 7.1×10−77.1\times10^{-7} secara relatif, sedangkan vektor parameter berubah sekitar 6.3×10−36.3\times10^{-3} secara relatif. Itu kira-kira sensitivitas sebesar bilangan kondisi empat orde magnitudo. Solusi yang terganggu tetap memiliki residual nol untuk data yang terganggu: ia menyelesaikan persamaan baru dengan benar, tetapi data tersebut tidak mengidentifikasi vektor parameter yang stabil.

Peta stabilitas statis

Residual kecil dapat menyembunyikan solusi yang sensitif

Residual memeriksa persamaan yang sudah diselesaikan. Bilangan kondisi memperingatkan seberapa jauh solusi dapat berubah ketika data masukan berubah.

Perbandingan residual dan kondisiTiga kasus membandingkan sistem berkondisi baik, sistem yang hampir bergantung, dan sistem singular. Dua kasus pertama cocok dengan ruas kanan masing-masing, tetapi perubahan masukan kecil menggeser solusi sensitif jauh lebih besar. Kasus singular tidak memiliki solusi unik.A x = bsolvejalur inversresidual kecil‖b − A x̂‖₂Kondisi baikκ₂(A) = 2.62Δb kecil: 1.2 × 10⁻⁷Δx kecil: 2.0 × 10⁻⁷‖r‖₂ ≈ 10⁻¹⁵Kondisi burukκ₂(A) ≈ 4.0 × 10⁴Δb kecil: 7.1 × 10⁻⁷Δx: 6.3 × 10⁻³‖r‖₂ = 0 for perturbed bSingularκ₂(A) = ∞solve: LinAlgErrorjalur invers: LinAlgErrortidak ada x unik
Ketiga kasus dapat menghasilkan residual kecil untuk ruas kanan yang diberikan. Kondisi matriks menentukan apakah kecocokan itu juga merupakan estimasi parameter yang dapat dipercaya.
Kuantitas persis yang diwakili dalam peta stabilitas
KasusBilangan kondisiPerubahan masukan relatif → perubahan solusiResidual dan interpretasi
Kondisi baik2.621.2 × 10⁻⁷ → 2.0 × 10⁻⁷Residual sekitar 10⁻¹⁵; kedua jalur sepakat untuk contoh berkondisi baik ini.
Kondisi buruk4.0002 × 10⁴7.1 × 10⁻⁷ → 6.3 × 10⁻³Residual 0 untuk data yang terganggu, tetapi perubahan masukan 7,1 × 10⁻⁷ menggeser x sebesar 6,3 × 10⁻³.
Singular∞Tidak berlakuκ₂(A) tak terhingga; solve dan inverse menghasilkan galat matriks singular, bukan jawaban unik.

Baca kedua diagnosis bersama-sama: residual bertanya “apakah x ini cocok dengan b?”; kondisi bertanya “seberapa jauh x berubah jika b atau A sedikit berbeda?”

Visual tersebut memisahkan kedua pertanyaan. Residual bertanya apakah kandidat cocok dengan persamaan yang sedang ada di memori. Bilangan kondisi bertanya apakah perubahan kecil pada persamaan dapat menggeser kandidat itu. Sistem kalibrasi AI membutuhkan kedua jawaban.

Kasus batas: singular berarti “tidak ada penyelesaian unik”

Pertimbangkan

C=[1224].C=\begin{bmatrix}1&2\\2&4\end{bmatrix}.

Baris kedua adalah dua kali baris pertama, sehingga rank CC adalah 11, bukan 22. Dengan b=[3,6]Tb=[3,6]^\mathsf{T}, persamaannya konsisten tetapi memiliki tak terhingga banyak solusi: setiap (x1,x2)(x_1,x_2) yang memenuhi x1+2x2=3x_1+2x_2=3 dapat digunakan. Dengan b=[3,7]Tb=[3,7]^\mathsf{T}, persamaannya tidak konsisten karena persamaan kedua meminta ruas kiri dua kali ruas kiri pertama tetapi memberikan ruas kanan yang berbeda.

Tidak satu pun situasi tersebut memiliki vektor unik untuk dikembalikan oleh np.linalg.solve. Pada runtime yang disertakan, np.linalg.solve(C, [3, 6]) dan np.linalg.inv(C) sama-sama memunculkan numpy.linalg.LinAlgError: Singular matrix. Dokumentasi NumPy solve menetapkan syarat rank penuh dan menunjuk ke numpy.linalg.lstsq ketika solusi kuadrat terkecil sesuai untuk masalah non-persegi atau rank-deficient. Itu adalah pertanyaan yang berbeda dari menyelesaikan sistem persegi yang invertibel, jadi jangan diam-diam mengganti satu metode dengan metode lain.

Alur kerja NumPy yang disiplin untuk sistem AI

Untuk submasalah pemulihan parameter kecil, alur kerja yang dapat dipertanggungjawabkan adalah:

  1. Periksa kontraknya. Pastikan dimensi AA, bb, dan vektor parameter yang dimaksud sesuai.
  2. Selesaikan secara langsung. Gunakan np.linalg.solve(A, b) untuk sistem persegi berpangkat penuh; gunakan metode yang dirancang untuk kuadrat terkecil jika masalahnya tidak teridentifikasi dengan baik.
  3. Ukur residual. Hitung np.linalg.norm(A @ x - b) dan bandingkan dengan skala bb, bukan hanya dengan ambang absolut sembarang.
  4. Periksa pengondisian. Hitung np.linalg.cond(A) dan bandingkan sensitivitas yang mungkin terjadi dengan presisi pengukuran serta jumlah digit yang akan digunakan di tahap berikutnya.
  5. Anggap kegagalan sebagai informasi. Galat singular, bilangan kondisi yang sangat besar, atau residual yang besar relatif terhadap bb harus memicu penyelidikan terhadap data, fitur, penskalaan, atau desain model.

Dalam tugas kalibrasi atau pemulihan parameter, alur kerja ini mengubah vektor bobot menjadi hasil yang dapat diaudit. Residual kecil dapat mendukung klaim bahwa implementasi menyelesaikan persamaan yang diberikan. Bilangan kondisi sedang dan pemeriksaan perturbasi memberi bukti bahwa persamaan tersebut cukup kuat mengikat parameter untuk penggunaan yang dimaksud. Tidak satu pun diagnosis membuktikan bahwa sistem AI yang lebih luas akurat; keduanya menjawab pertanyaan implementasi yang lebih sempit dan dapat diuji.

Pelajaran berikutnya meninggalkan algoritme numerik sejenak dan menanyakan operasi aljabar mana yang valid pada sistem bilangan yang digunakan tensor AI umum. Untuk sekarang, ingat aturan praktisnya: selesaikan sistem yang ada, periksa residual yang diperoleh, dan tanyakan melalui pengondisian apakah sistem yang berdekatan akan menceritakan kisah parameter yang berbeda.

Uji pemahaman

Pertanyaan 1

Untuk A di R^(m×n), x di R^n, dan b di R^m, apa yang diminta Ax = b untuk ditemukan oleh program?

Tampilkan solusi langkah demi langkah

Program diminta mencari vektor xx dengan nn koordinat yang, ketika dikalikan dengan matriks AA berukuran m×nm\times n, menghasilkan vektor bb dengan mm koordinat. Pemeriksaan bentuk dilakukan lebih dulu: setiap baris AA harus memiliki nn entri agar hasil dot product dengan xx terdefinisi, dan harus ada satu persamaan hasil untuk setiap entri bb.

Pertanyaan 2

Selesaikan 3x_1 + x_2 = 8 dan x_1 + 2x_2 = 1 dengan tangan.

Tampilkan solusi langkah demi langkah

Dari persamaan pertama, x2=8−3x1x_2=8-3x_1. Substitusikan ke persamaan kedua: x1+2(8−3x1)=1x_1+2(8-3x_1)=1, sehingga −5x1=−15-5x_1=-15 dan x1=3x_1=3. Kemudian x2=8−3(3)=−1x_2=8-3(3)=-1. Solusinya adalah (3,−1)(3,-1), yang dapat diperiksa pada kedua persamaan asli: 3(3)+(−1)=83(3)+(-1)=8 dan 3+2(−1)=13+2(-1)=1.

Pertanyaan 3

Sebuah vektor terhitung memiliki residual r = [0.0001, -0.0002]. Apa yang diberitahukan norma residual kepada Anda, dan apa yang tidak diberitahukannya?

Tampilkan solusi langkah demi langkah

Norma residual adalah

∥r∥2=0.00012+(−0.0002)2≈0.0002236.\lVert r\rVert_2 =\sqrt{0.0001^2+(-0.0002)^2} \approx 0.0002236.

Norma tersebut memberi tahu seberapa dekat kandidat memenuhi persamaan yang diberikan. Norma itu tidak memberi tahu apakah parameter sebenarnya dekat, apakah matriks berkondisi baik, atau apakah pengukurannya akurat. Pertanyaan-pertanyaan itu membutuhkan pemeriksaan pengondisian, skala data, dan pemodelan.

Pertanyaan 4

Mengapa solve(A, b) dan inv(A) @ b dapat sepakat secara matematis sementara solve(A, b) tetap menjadi jalur kode yang lebih disukai?

Tampilkan solusi langkah demi langkah

Jika AA invertibel, identitas x=A−1bx=A^{-1}b membuktikan bahwa kedua jalur menargetkan vektor matematis yang sama. Jalur implementasinya berbeda: solve memfaktorkan AA dan menerapkan faktor-faktor itu pada ruas kanan yang diminta, sedangkan inv terlebih dahulu membangun setiap kolom invers lalu mengalikannya. Karena itu, jalur invers melakukan pekerjaan tambahan dan membuat matriks perantara yang tidak diperlukan oleh satu penyelesaian.

Pertanyaan 5

Sebuah sistem memiliki bilangan kondisi sekitar 40.000. Haruskah residual nol membuat Anda nyaman melaporkan banyak digit x?

Tampilkan solusi langkah demi langkah

Tidak. Residual nol hanya mengatakan bahwa xx yang dilaporkan cocok dengan bb yang diberikan dalam aritmetika saat ini. Bilangan kondisi mendekati 4×1044\times10^4 mengatakan bahwa perubahan relatif kecil pada AA atau bb dapat diperkuat kira-kira sebesar skala tersebut pada arah terburuk. Laporkan presisi yang sesuai dengan ketidakpastian pengukuran, periksa nilai singular atau pengondisian, dan uji perturbasi sebelum menganggap banyak digit bermakna.

Pertanyaan 6

Apa perbedaan antara sistem singular dengan tak terhingga banyak solusi dan sistem singular tanpa solusi?

Tampilkan solusi langkah demi langkah

Keduanya memiliki baris yang bergantung, sehingga matriks koefisien tidak dapat menentukan vektor unik. Jika ruas kanan memiliki ketergantungan yang sama, seperti b=[3,6]Tb=[3,6]^\mathsf{T} untuk C=[[1,2],[2,4]]C=[[1,2],[2,4]], persamaan konsisten dan memiliki tak terhingga banyak solusi. Jika ruas kanan memutus ketergantungan tersebut, seperti b=[3,7]Tb=[3,7]^\mathsf{T}, reduksi baris menghasilkan kontradiksi seperti 0=10=1, sehingga tidak ada solusi. Tidak satu pun kasus merupakan masukan yang valid untuk hasil solve yang unik.

Pertanyaan 7

Dalam kepala kalibrasi AI, bukti apa yang akan Anda catat setelah memanggil np.linalg.solve(A, b)?

Tampilkan solusi langkah demi langkah

Catat bentuk matriks dan vektor, vektor parameter yang dikembalikan, norma residual ∥Ax^−b∥\lVert A\hat{x}-b\rVert, serta diagnosis pengondisian seperti np.linalg.cond(A). Catat juga satuan, penskalaan, atau ketidakpastian pengukuran jika detail itu memengaruhi interpretasi. Residual mendukung klaim tentang pencocokan persamaan yang diberikan; pengondisian dan pemeriksaan perturbasi mendukung klaim terpisah tentang sensitivitas parameter.

Pertanyaan 8

Sebuah tinjauan kode mengusulkan np.linalg.inv(A) @ b untuk setiap permintaan, termasuk matriks yang mungkin rank-deficient. Apa yang harus Anda ubah?

Tampilkan solusi langkah demi langkah

Ganti jalur default dengan np.linalg.solve(A, b) setelah memeriksa bahwa masalahnya memang ditujukan sebagai sistem persegi berpangkat penuh. Tangkap atau tampilkan LinAlgError, jangan menyembunyikannya, dan hitung residual setelah solve. Tambahkan np.linalg.cond(A) atau pemeriksaan pengondisian yang setara ketika sensitivitas input penting. Jika datanya persegi panjang atau rank-deficient, pilih dan dokumentasikan formulasi kuadrat terkecil atau teregularisasi, alih-alih berpura-pura bahwa invers ada.

Sumber

  1. Mathematics for Machine Learning companion website
  2. Mathematics for Machine Learning book PDF
  3. NumPy documentation: numpy.linalg.solve
  4. NumPy documentation: numpy.linalg.inv
  5. NumPy documentation: numpy.linalg.cond
  6. NumPy documentation: numpy.linalg.norm