چیت‌شیت

جبر خطی برای یادگیری ماشین

Linear Algebra for ML

بردارها، تبدیل‌ها، مقادیر ویژه، SVD و حل‌کننده‌های Ax = b. پایتون از صفر و NumPy برگرفته از درس‌ها.

  • ۱۲ بخش
  • ۵ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. ‏SVD: دوران، مقیاس، دوران
  2. حذف گاوسی با محورگیری جزئی
  3. وظایف در NumPy
  4. مقطوع‌سازی، فشرده‌سازی و وارون‌سازی با SVD
  5. حل Ax = b از صفر
  6. ماتریس‌های تبدیل
  7. فرمول‌های کلیدی
  8. انتخاب حل‌کننده
  9. اعداد و مقادیر پیش‌فرض
  10. عیب‌یابی
  11. پرسش‌ها
  12. نکات

‏SVD: دوران، مقیاس، دوران

معماری
VUفضای ورودی‏n-بعدیV^TدورانSigmaتغییر مقیاس با sigma_iUدورانA^T Aبردارهای ویژه همان V هستندA A^Tبردارهای ویژه همان U هستندفضای خروجی‏m-بعدی

حذف گاوسی با محورگیری جزئی

گام‌به‌گام
  1. محور (Pivot)در ستون k، بزرگ‌ترین درایه را در سطر k یا زیر آن پیدا کنید.
  2. جابجاییآن سطر را با سطر k جابجا کنید. محور کوچک خطاهای گردکردن را تشدید می‌کند.
  3. بررسیمحور کمتر از 1e-12 خطای ValueError صادر می‌کند.
  4. حذفبرای هر سطر i زیر k، مقدار m = A[i][k] / A[k][k] را محاسبه کنید. سپس m برابر سطر k را کم کنید.
  5. جانشینی پس‌روابتدا آخرین معادله را حل کنید، سپس به سمت بالا بروید.
  6. استفاده مجددماتریس L ضرایب را ذخیره می‌کند. U ماتریس حاصل از حذف است. PA = LU.

وظایف در NumPy

کار و کد
وظیفهکد
ضرب داخلی و طول`np.dot(a, b)`, `np.linalg.norm(a)`
ضرب ماتریسیA @ B
ضرب نظیر‌به‌نظیرA * B
رتبهnp.linalg.matrix_rank(A)
مقادیر ویژه و بردارهای ویژهnp.linalg.eig(A)
‏Thin SVDnp.linalg.svd(A, full_matrices=False)
کمترین مربعاتnp.linalg.lstsq(A, b, rcond=None)[0]
‏QR، بررسی Qnp.allclose(Q @ Q.T, np.eye(3))

مقطوع‌سازی، فشرده‌سازی و وارون‌سازی با SVD

کد
python
U, S, Vt = np.linalg.svd(A, full_matrices=False)  # ‏S مرتب‌شده به صورت نزولی
A_k = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]       # بهترین تقریب با رتبه k
compressed_size = k * (rows + cols + 1)           # حافظه لازم برای رتبه k
A_pinv = Vt.T @ np.diag(1.0 / S) @ U.T            # شبه‌وارون، فقط برای S غیرصفر
x_svd = A_pinv @ b                                # پاسخ کمترین مربعات
x_pinv = np.linalg.pinv(A) @ b                    # همان نتیجه از NumPy
U, S, V = svd_from_scratch(A)                     # تکرار توانی و کاهش رتبه (deflation)
A_pinv = pseudoinverse_via_svd(A, tol=1e-10)      # ‏1/s تنها برای s بالاتر از tol

حل Ax = b از صفر

کد
python
x = gaussian_elimination(A, b)             # محورگیری جزئی، O(n^3)
P, L, U = lu_decompose(A)                  # ‏PA = LU، فقط یک‌بار پرداخت هزینه O(n^3)
x = lu_solve(P, L, U, b)                   # ‏O(n^2) برای هر b جدید
L = cholesky(A)                            # ‏A = L L^T، فقط برای متقارن معین مثبت
x = cholesky_solve(L, b)                   # جانشینی پیش‌رو، سپس جانشینی پس‌رو
w_ols = least_squares_normal(X, y)         # معادله A^T A x = A^T b را حل می‌کند
w_ridge = ridge_regression(X, y, lam=1.0)  # اضافه کردن lam * np.eye(n)
x, iters = conjugate_gradient(A, b)        # ‏SPD، حداکثر n تکرار
kappa = condition_number(A)                # ‏S[0] / S[-1]، بی‌نهایت اگر منفرد باشد

ماتریس‌های تبدیل

دستورها
دستورعملکرد
rotation_2d(theta)‏[[c, -s], [s, c]]. فواصل را حفظ می‌کند. دترمینان 1
scaling_2d(sx, sy)‏[[sx, 0], [0, sy]]. دترمینان sx * sy است
shearing_2d(kx, ky)‏[[1, kx], [ky, 1]]. مستطیل‌ها به متوازی‌الاضلاع تبدیل می‌شوند
reflection_y()‏[[-1, 0], [0, 1]]. جهت‌گیری را وارونه می‌کند. دترمینان -1
reflection_x()‏[[1, 0], [0, -1]]. دترمینان -1
mat_mul(S, R)ابتدا دوران، سپس تغییر مقیاس. ترتیب مهم است
eigenvalues_2x2(matrix)ریشه‌های معادله‌ی مشخصه. اگر مبین < 0 باشد مختلط است
eigenvector_2x2(matrix, eigenvalue)بردار ویژه یکه برای یک مقدار ویژه

فرمول‌های کلیدی

مفهوم‌ها
ابعاد
(m x n) @ (n x p) = (m x p). ابعاد درونی باید مطابقت داشته باشند.
کسینوس
$\cos\theta = \frac{a \cdot b}{\lvert a\rvert \lvert b\rvert}$. مقدار 1 هم‌جهت و 0 متعامد است.
تصویر
$\text{proj}_b a = \frac{a \cdot b}{b \cdot b} b$. باقیمانده بر $b$ عمود است.
ویژه
$Av = \lambda v$. مقادیر ویژه ریشه‌های $\det(A - \lambda I) = 0$ هستند.
مقادیر ویژه ماتریس 2x2
$\lambda^2 - (a+d)\lambda + (ad - bc) = 0$.
تجزیه مقادیر منفرد (SVD)
$A = U \Sigma V^T$ و $A v_i = \sigma_i u_i$. رتبه تعداد $\sigma_i$ غیرصفر است.
معادلات نرمال
$A^T A x = A^T b$. رگرسیون ریج $\lambda I$ را به $A^T A$ اضافه می‌کند.
عدد حالت
$\kappa = \sigma_{\max} / \sigma_{\min}$.

انتخاب حل‌کننده

دستورها
دستورعملکرد
Gaussian elimination‏ماتریس A مربعی و نامنفرد. O(n^3). یک‌بار حل
LU decompositionچندین حل با همان ماتریس A. برای هر حل O(n^2)
QR decompositionکمترین مربعات با m >= n. از نظر عددی پایدار
Choleskyماتریس A متقارن معین مثبت. دو برابر سریع‌تر از LU
Normal equationsفرامعین، n کوچک. رگرسیون خطی
SVD / pseudoinverseماتریس A با رتبه ناقص. پاسخ با کمترین نرم
Conjugate gradientماتریس A بزرگ، خلوت و SPD. روش تکراری

اعداد و مقادیر پیش‌فرض

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
Zero test in `rank()`1e-10درایه‌های کوچک‌تر صفر به شمار می‌روند
Pivot test in elimination1e-12محور کوچک‌تر خطا صادر می‌کند: ValueError
`power_iteration` `num_iters`200توقف زودهنگام در tol=1e-10
`conjugate_gradient` `tol`1e-10مقدار پیش‌فرض max_iter برابر n است
Safe condition number< 100پاسخ دقیق است
Meaningless for float6410^{16}ماتریس عملاً منفرد است
Image at rank k=5014.6%از بین مقادیر 800 x 600
LoRA rank16131K پارامتر، نه 16M

عیب‌یابی

عیب‌یابی
  • خطای عدم تطابق ابعاد

    علت
    ابعاد درونی با هم تفاوت دارند
    راه‌حل
    قبل از ضرب کردن، ابعاد هر کدام را بنویسید
  • تابع inverse_2x2 خطای ValueError می‌دهد

    علت
    دترمینان 0 است
    راه‌حل
    از شبه‌وارون استفاده کنید
  • "Matrix is not positive definite"

    علت
    ماتریس A از نوع SPD نیست
    راه‌حل
    مقدار lambda I را اضافه کنید، یا از LU استفاده کنید
  • نوسان شدید وزن‌ها با تغییرات کوچک ورودی

    علت
    ویژگی‌های هم‌خط، رتبه ناقص
    راه‌حل
    حذف ویژگی‌ها یا افزودن منظم‌سازی
  • پاسخ ارقام بااهمیت خود را از دست می‌دهد

    علت
    ‏kappa نزدیک به 10^k باعث از دست رفتن k رقم می‌شود
    راه‌حل
    منظم‌سازی کنید، یا از QR یا SVD استفاده نمایید
  • دستور np.linalg.eig(A.T @ A) نادقیق است

    علت
    عدد حالت را به توان دو می‌رساند
    راه‌حل
    از np.linalg.svd(A) استفاده کنید
  • ترکیب توابع به نقطه اشتباهی ختم می‌شود

    علت
    عملگر B @ A ابتدا A را اعمال می‌کند
    راه‌حل
    به ترتیب معکوس اعمال، ضرب کنید
  • ضرب‌های داخلی Gram-Schmidt دقیقاً 0 نیستند

    علت
    محاسبات ممیز شناور
    راه‌حل
    با یک آستانه تحمل مانند 1e-9 مقایسه کنید

پرسش‌ها

پرسش و پاسخ
چرا فاکتورگیری با LU؟
هزینه O(n^3) فقط یک بار پرداخت می‌شود. هر b جدید هزینه‌ای برابر O(n^2) دارد.
چه زمانی روش Cholesky پاسخ می‌دهد؟
ماتریس A متقارن معین مثبت باشد. ماتریس $X^T X + \lambda I$ برای $\lambda > 0$ از نوع SPD است.
دترمینان چه چیزی را نشان می‌دهد؟
ضریب مقیاس مساحت را. مقدار 0 یک بعد را فشرده و محو می‌کند. -1 جهت‌گیری را وارونه می‌سازد.
چرا تجزیه مقادیر منفرد مقطوع بهترین رتبه k است؟
قضیه Eckart-Young. خطای طیفی برابر است با $\sigma_{k+1}$.
مقادیر ویژه چه چیزی درباره پایداری می‌گویند؟
اندازه بزرگ‌تر از 1 منفجر می‌شود. اندازه زیر 1 ناپدید (صفر) می‌شود.

نکات

نکته‌ها
  • تحلیل مؤلفه‌های اصلی (PCA) همان SVD روی داده‌های میانگین‌صفر است. مؤلفه‌ها همان بردارهای منفرد راست V هستند.
  • واریانس تبیین‌شده برای هر مؤلفه برابر sigma_i^2 / (n-1) است.
  • به دنبال یک شکاف واضح در مقادیر منفرد باشید. مقادیر بالاتر از آن را برای نویززدایی نگه دارید.
  • ریج، عدد حالت را به $(\sigma_{\max} + \lambda) / (\sigma_{\min} + \lambda)$ بهبود می‌بخشد.
  • در حالتی که چندین پاسخ وجود دارد، شبه‌وارون پاسخی با کوچک‌ترین نرم را به دست می‌دهد.
  • مقداردهی اولیه متعامد از QR برای ساختن ستون‌های وزنی راست‌هنجار استفاده می‌کند.