4  Matris Çarpımı ve Ters Matrisler

Beş bakış, bir sonuç — ve Gauss–Jordan ile A⁻¹

NotBölüm bilgisi

4.1 Bu Derste Ne Var?

Ders 2’de eliminasyon matrislerini sol-çarpan olarak kullandık: \(EA = U\). Strang şimdi geri dönüp diyor ki matris çarpımının beş ayrı yolu var — hepsi aynı sonucu verir, ama her biri farklı bir açı kazandırır.

İki büyük tema:

  1. Matris çarpımının beş yolu — Standart (satır × kolon), kolon yolu, satır yolu, kolon × satır toplamı (rank-1 ayrışımı), blok çarpımı.
  2. Ters matris — Tanımı, var olma koşulu (üç farklı bakış), ve Gauss–Jordan ile hesabı.

İkinci kısım, Ders 2’deki “her eliminasyon adımının bir tersi var” sezgisini formalleştirir.

flowchart TB
    AB["AB çarpımı"] --> Y1["Yol 1: standart<br/>C_ij = satır·kolon"]
    AB --> Y2["Yol 2: kolon yolu<br/>C kolonları = A kolonlarının komb."]
    AB --> Y3["Yol 3: satır yolu<br/>C satırları = B satırlarının komb."]
    AB --> Y4["Yol 4: kolon × satır toplamı<br/>(rank-1 expansion)"]
    AB --> Y5["Yol 5: blok çarpımı"]

    Y4 --> SVD["⭐ SVD'nin habercisi<br/>LoRA, low-rank"]
    Y5 --> FA["⚡ FlashAttention<br/>tensor parallelism"]

    INV["A⁻¹"] --> GJ["Gauss–Jordan<br/>[A|I] → [I|A⁻¹]"]
    GJ --> EA["E·A = I ⇒ E = A⁻¹"]

    style Y4 fill:#fff3e0,stroke:#e67e22,stroke-width:3px
    style SVD fill:#fce4ec,stroke:#c2185b,stroke-width:3px
    style INV fill:#fdf6f7,stroke:#8a1538,stroke-width:2px
flowchart TB
    AB["AB çarpımı"] --> Y1["Yol 1: standart<br/>C_ij = satır·kolon"]
    AB --> Y2["Yol 2: kolon yolu<br/>C kolonları = A kolonlarının komb."]
    AB --> Y3["Yol 3: satır yolu<br/>C satırları = B satırlarının komb."]
    AB --> Y4["Yol 4: kolon × satır toplamı<br/>(rank-1 expansion)"]
    AB --> Y5["Yol 5: blok çarpımı"]

    Y4 --> SVD["⭐ SVD'nin habercisi<br/>LoRA, low-rank"]
    Y5 --> FA["⚡ FlashAttention<br/>tensor parallelism"]

    INV["A⁻¹"] --> GJ["Gauss–Jordan<br/>[A|I] → [I|A⁻¹]"]
    GJ --> EA["E·A = I ⇒ E = A⁻¹"]

    style Y4 fill:#fff3e0,stroke:#e67e22,stroke-width:3px
    style SVD fill:#fce4ec,stroke:#c2185b,stroke-width:3px
    style INV fill:#fdf6f7,stroke:#8a1538,stroke-width:2px
Şekil 4.1: Matris çarpımının beş yolu ve ters matrisin Gauss–Jordan ile inşası.
İpucuBuilder Notu — Modern ML’de Beş Yol Ne İşe Yarar?
  • Yol 4 (kolon × satır = rank-1 toplamı) → SVD’nin sezgisel temeli (Ders 29). \(A = \sum_k \sigma_k \mathbf{u}_k \mathbf{v}_k^T\) — her terim rank-1. LoRA bu temele dayanır: büyük \(\Delta W\) yerine \(A \cdot B^T\) (ince matrisler).
  • Yol 5 (blok çarpımı) → Distributed GPU matmul, FlashAttention chunking, tensor parallelism. Büyük matrisleri belleğe sığdırmanın yolu.
  • Singular vs invertible → ML’de ill-conditioned problem teşhisi; regularization (L2/weight decay) tam olarak “matrisi singular olmaktan uzaklaştırma”.
  • \((AB)^{-1} = B^{-1}A^{-1}\) → Backprop’ta zincirleme türev sırasının matematiksel temeli; normalizing flows / invertible networks.

4.2 Matris Çarpımı — Beş Yol

İki matris: \(C = AB\). Boyutlar: \(A\) (\(m \times n\)), \(B\) (\(n \times p\)), \(C\) (\(m \times p\)). A’nın kolon sayısı = B’nin satır sayısı olmazsa çarpım tanımsız.

“There are many ways you can do it, and they all give the same answer. And they’re all important.” — Strang, 0:24

4.2.1 Yol 1: Standart (satır × kolon)

\[ C_{ij} = \sum_{k=1}^{n} a_{ik} \cdot b_{kj} \]

Klasik okul yöntemi. Hesaplama için pratik; sezgi vermez.

4.2.2 Yol 2: Kolon Yolu

\(C\)’nin her kolonu \(A \cdot (\text{B'nin ilgili kolonu})\):

\[ AB = A \begin{pmatrix} | & | & & | \\ \mathbf{b}_1 & \mathbf{b}_2 & \cdots & \mathbf{b}_p \\ | & | & & | \end{pmatrix} = \begin{pmatrix} | & | & & | \\ A\mathbf{b}_1 & A\mathbf{b}_2 & \cdots & A\mathbf{b}_p \\ | & | & & | \end{pmatrix} \]

\(C\)’nin her kolonu, \(A\)’nın kolonlarının bir lineer kombinasyonudur — katsayılar \(B\)’nin ilgili kolonundan.

4.2.3 Yol 3: Satır Yolu

\(C\)’nin her satırı \((\text{A'nın ilgili satırı}) \cdot B\):

\(C\)’nin her satırı, \(B\)’nin satırlarının bir lineer kombinasyonudur — katsayılar \(A\)’nın ilgili satırından.

Yol 2 + 3 sezgisi: Soldan ne koyarsan \(C\)’nin satırlarını belirler; sağdan ne koyarsan kolonlarını. Ders 2’deki “soldan = satır işlemi” kuralının başka bir yüzü.

4.2.4 Yol 4: Kolon × Satır Toplamı (rank-1 expansion) ⭐

Bir kolon (\(m \times 1\)) ile bir satır (\(1 \times p\)) çarp → \(m \times p\) matris. Örnek:

\[ \begin{pmatrix} 2 \\ 3 \\ 4 \end{pmatrix} \begin{pmatrix} 1 & 6 \end{pmatrix} = \begin{pmatrix} 2 & 12 \\ 3 & 18 \\ 4 & 24 \end{pmatrix} \]

Bu matrisin tüm kolonları \((2, 3, 4)^T\) doğrultusunda, tüm satırları \((1, 6)\) doğrultusunda — bu rank-1 matris demektir.

Çarpımı rank-1 toplamı olarak yaz:

\[ AB = \sum_{k=1}^{n} (\text{A'nın } k\text{. kolonu}) \cdot (\text{B'nin } k\text{. satırı}) \]

import numpy as np
import matplotlib.pyplot as plt

A = np.array([[2, 7], [3, 8], [4, 9]], dtype=float)
B = np.array([[1, 6], [5, 0]], dtype=float)

R1 = A[:, [0]] @ B[[0], :]   # A'nin 1. kolonu  *  B'nin 1. satiri
R2 = A[:, [1]] @ B[[1], :]   # A'nin 2. kolonu  *  B'nin 2. satiri
AB = A @ B

def draw(ax, M, title, cmap='RdBu_r', vmin=-50, vmax=50):
    im = ax.imshow(M, cmap=cmap, vmin=vmin, vmax=vmax)
    for i in range(M.shape[0]):
        for j in range(M.shape[1]):
            ax.text(j, i, f'{M[i,j]:g}', ha='center', va='center',
                    fontsize=14, fontweight='bold')
    ax.set_xticks([]); ax.set_yticks([])
    ax.set_title(title, fontsize=11)
    for s in ax.spines.values(): s.set_visible(False)

fig, axes = plt.subplots(1, 4, figsize=(12, 4))
draw(axes[0], R1, r'rank-1: $A_{:,1} B_{1,:}$')
axes[1].axis('off'); axes[1].text(0.5, 0.5, '+', fontsize=40, ha='center', va='center')
draw(axes[2], R2, r'rank-1: $A_{:,2} B_{2,:}$')
axes[3].axis('off'); axes[3].text(0.5, 0.5, r'$= AB$', fontsize=22, ha='center', va='center')
plt.tight_layout()
plt.show()

print("R1 + R2 =\n", R1 + R2)
print("A @ B    =\n", AB)
assert np.allclose(R1 + R2, AB)
Şekil 4.2

“All those rows lie on the line through (1, 6). All the columns lie on the line through (2, 3, 4). So this is a really minimal matrix.” — Strang, 17:18

4.2.5 Yol 5: Blok Çarpımı

Matrisleri uygun şekilde bloklara böl, blok-blok çarp:

\[ \begin{pmatrix} A_1 & A_2 \\ A_3 & A_4 \end{pmatrix} \begin{pmatrix} B_1 & B_2 \\ B_3 & B_4 \end{pmatrix} = \begin{pmatrix} A_1 B_1 + A_2 B_3 & A_1 B_2 + A_2 B_4 \\ A_3 B_1 + A_4 B_3 & A_3 B_2 + A_4 B_4 \end{pmatrix} \]

Her blok pozisyonunda “satır blokları × kolon blokları” toplamı — büyük çarpımın aynı kuralı, sadece elemanlar yerine alt-matrisler.

İpucuBuilder Notu — Blok Çarpımı = AI Altyapısı
  • GPU memory: Matris GPU’ya sığmıyorsa blok blok çarp.
  • FlashAttention (Dao 2022): \(QK^T\)’yi blok blok hesapla, sadece softmax çıktısını HBM’e yaz. Aynı matematik, \(O(n)\) bellek erişimi.
  • Tensor parallelism: Büyük weight matrisi GPU’lar arasında bloklara dağıtılır; her GPU bir bloğu tutar.
  • Mixed precision: Bazı blokları FP32, bazılarını FP16 hesapla; blok çarpım kuralı birleştirir.

4.3 Ters Matris — Tanım ve Var Olma Koşulu

\(A\) kare (\(n \times n\)). \(A\)’nın tersi \(A^{-1}\), eğer varsa:

\[ A \cdot A^{-1} = I \quad \text{ve} \quad A^{-1} \cdot A = I \]

Square matrisler için bedava bonus: sol ters = sağ ters (rectangular için değil, Ders 33).

İki sınıf:

  • Invertible (non-singular): \(A^{-1}\) var.
  • Singular: \(A^{-1}\) yok.

4.4 Tersi Olmayan Matrisler — Üç Bakış

\[ A = \begin{pmatrix} 1 & 3 \\ 2 & 6 \end{pmatrix} \]

Bakış 1: Determinant. \(\det A = 1 \cdot 6 - 3 \cdot 2 = 0\) → singular.

Bakış 2: Kolon bağımlılığı. \(\mathbf{c}_2 = 3\mathbf{c}_1\). İki kolon aynı doğrultuda — kolon uzayı bir doğru. \(AX\)’in kolonları hep o doğru üzerinde, identity üretilemez.

Bakış 3: \(A\mathbf{x} = \mathbf{0}\) için sıfırdan farklı \(\mathbf{x}\) (en güçlü test):

\[ A \begin{pmatrix} 3 \\ -1 \end{pmatrix} = \begin{pmatrix} 3 - 3 \\ 6 - 6 \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \end{pmatrix} \]

Çelişki: Eğer \(A^{-1}\) olsaydı, her iki yanı soldan \(A^{-1}\) ile çarp: \(X = A^{-1} \cdot \mathbf{0} = \mathbf{0}\). Ama \(X = (3, -1) \neq \mathbf{0}\). Çelişki\(A^{-1}\) yok.

“The matrix can’t have an inverse if some combination of the columns gives nothing.” — Strang, 30:02

ÖnemliSingular Testin Özü

\(A^{-1}\) var \(\iff\) \(A\mathbf{x} = \mathbf{0}\)’ın tek çözümü \(\mathbf{x} = \mathbf{0}\)’dır.

4.5 Gauss–Jordan: \(A^{-1}\)’i Bulma Algoritması

\[ A = \begin{pmatrix} 1 & 3 \\ 2 & 7 \end{pmatrix} \quad (\det = 1, \text{ invertible}) \]

Strateji: \(A^{-1}\)’i bir matris olarak yaz: kolonları \(\mathbf{x}_1, \mathbf{x}_2\). Yol 2’ye göre \(A \cdot A^{-1} = I\) demek:

  • \(A \mathbf{x}_1 = \mathbf{e}_1 = (1, 0)^T\)
  • \(A \mathbf{x}_2 = \mathbf{e}_2 = (0, 1)^T\)

İki sistem, aynı \(A\), farklı sağ taraflar. Jordan’ın fikri: ikisini birlikte çöz — augmented matris \([A \mid I]\).

Augmented:

\[ [A \mid I] = \left[\begin{array}{cc|cc} 1 & 3 & 1 & 0 \\ 2 & 7 & 0 & 1 \end{array}\right] \]

Aşama 1 (ileri eliminasyon): \(2 \cdot r_1 \to r_2\):

\[ \to \left[\begin{array}{cc|cc} 1 & 3 & 1 & 0 \\ 0 & 1 & -2 & 1 \end{array}\right] \]

Aşama 2 (geri eliminasyon): \(3 \cdot r_2 \to r_1\):

\[ \to \left[\begin{array}{cc|cc} 1 & 0 & 7 & -3 \\ 0 & 1 & -2 & 1 \end{array}\right] \]

Sol taraf \(I\) oldu, sağ taraf:

\[ A^{-1} = \begin{pmatrix} 7 & -3 \\ -2 & 1 \end{pmatrix} \]

Doğrula: \(A \cdot A^{-1} = I\) ✓.

import numpy as np

A = np.array([[1, 3], [2, 7]], dtype=float)
A_inv_manuel = np.array([[7, -3], [-2, 1]], dtype=float)
A_inv_numpy  = np.linalg.inv(A)

print("Manuel A^-1:\n", A_inv_manuel)
print("\nnumpy A^-1:\n", A_inv_numpy)
print("\nA @ A^-1 =\n", A @ A_inv_numpy)
assert np.allclose(A_inv_manuel, A_inv_numpy)

4.6 Gauss–Jordan Neden Çalışıyor?

Her eliminasyon adımı = soldan bir \(E\) matrisi ile çarpma. Tüm adımları birleştir: \(E = E_k \cdots E_2 E_1\).

Augmented matris \([A \mid I]\) üzerine etki:

\[ E \cdot [A \mid I] = [EA \mid EI] = [EA \mid E] \]

Algoritma sonunda sol taraf \(I\) oldu, yani \(EA = I\). Demek ki:

\[ E = A^{-1} \]

Ve sağ tarafta kalan da \(E = A^{-1}\). Algoritma “şanstan” çalışmıyor; tüm eliminasyonu yapan kombo matris, tam olarak \(A^{-1}\).

“If E times A is the identity, then E must be the inverse of A. And on the right-hand side, where we just smartly tucked on the identity, it’s turning into A inverse.” — Strang, 45:35

4.7 Bu Dersin Özeti

  1. Matris çarpımının beş yolu — Standart, kolon, satır, rank-1 toplamı, blok.
  2. Ters matris: \(A \cdot A^{-1} = A^{-1} \cdot A = I\) (square için).
  3. Tersi olmayan matrisler üç bakış: determinant 0, kolonlar bağımlı, \(A\mathbf{x} = \mathbf{0}\) için sıfırdan farklı \(\mathbf{x}\).
  4. Gauss–Jordan: \([A \mid I] \to [I \mid A^{-1}]\).
  5. Neden çalışır: Tüm eliminasyon = \(E\) kombo; \(EA = I \Rightarrow E = A^{-1}\).
ÖnemliTek bir cümle

Matris çarpımının beş yolu farklı bakışlar verir; ters matris \([A \mid I] \to [I \mid A^{-1}]\) ile bulunur — çünkü tüm eliminasyonun kombosu \(E\), \(EA = I\) koşulunu sağladığında \(E = A^{-1}\).

4.8 Kontrol Soruları

Yol 1 (standart):

\[ AB = \begin{pmatrix} 1\cdot5+2\cdot7 & 1\cdot6+2\cdot8 \\ 3\cdot5+4\cdot7 & 3\cdot6+4\cdot8 \end{pmatrix} = \begin{pmatrix} 19 & 22 \\ 43 & 50 \end{pmatrix} \]

Yol 2 (kolon):

  • İlk kolon = \(5 \cdot (1,3)^T + 7 \cdot (2,4)^T = (19, 43)^T\)
  • İkinci kolon = \(6 \cdot (1,3)^T + 8 \cdot (2,4)^T = (22, 50)^T\)

Aynı sonuç.

Det: \(4 \cdot 4 - 8 \cdot 2 = 0\) → singular.

Kolon bağımlılığı: \(\mathbf{c}_2 = 2\mathbf{c}_1\). Aynı doğrultu → identity üretilemez.

\(A\mathbf{x} = \mathbf{0}\) testi: \(\mathbf{x} = (2, -1)^T\):

\[ A\mathbf{x} = \begin{pmatrix} 8-8 \\ 4-4 \end{pmatrix} = \mathbf{0} \]

Sıfırdan farklı \(\mathbf{x}\) var → singular.

Augmented:

\[ \left[\begin{array}{cc|cc} 2 & 1 & 1 & 0 \\ 5 & 3 & 0 & 1 \end{array}\right] \]

\(\ell_{21} = 5/2\), \(r_2 \to r_2 - (5/2)r_1\):

\[ \left[\begin{array}{cc|cc} 2 & 1 & 1 & 0 \\ 0 & 1/2 & -5/2 & 1 \end{array}\right] \]

Pivotları normalize (\(r_2 \cdot 2\), sonra \(r_1 \to r_1 - r_2\), sonra \(r_1 / 2\)):

\[ \to \left[\begin{array}{cc|cc} 1 & 0 & 3 & -1 \\ 0 & 1 & -5 & 2 \end{array}\right] \]

\[ A^{-1} = \begin{pmatrix} 3 & -1 \\ -5 & 2 \end{pmatrix} \]

Doğrula: \(A \cdot A^{-1} = I\) ✓.

Niye sıra ters:

\[ (AB)(B^{-1}A^{-1}) = A(BB^{-1})A^{-1} = A \cdot I \cdot A^{-1} = I \checkmark \]

Eğer \(A^{-1}B^{-1}\) deneseydin: \(A(BA^{-1})B^{-1}\) — burada \(BA^{-1}\) sadeleşmez (\(BA \neq AB\) genelde).

Backprop’ta: Forward \(\mathbf{x} \to A\mathbf{x} \to B(A\mathbf{x}) = (BA)\mathbf{x}\). Invertible flow modellerinde “geri yön” \((BA)^{-1} = A^{-1}B^{-1}\).

Zincirleme türevde aynı sıra: \(\frac{\partial L}{\partial \mathbf{x}} = \frac{\partial L}{\partial \mathbf{y}} \cdot \frac{\partial \mathbf{y}}{\partial \mathbf{x}}\) — Jacobian sırası çıktıdan girdiye. Backward pass’in matematiksel iskeleti.

4.9 Egzersizler

Egzersiz 1. \(A = ((1,2),(3,4))\), \(B = ((5,6),(7,8))\) çarpımını Yol 4 (rank-1 toplamı) ile yaz; iki rank-1 matris.

Egzersiz 2. \(A = ((1,2,3),(2,4,6),(3,6,9))\) invertible mi? Soru 2’deki üç bakışla göster. (İpucu: tüm satırlar \((1,2,3)\)’ün katları.)

Egzersiz 3. (Python) np.linalg.inv ile np.linalg.solve performansını karşılaştır.

import numpy as np, time
rng = np.random.default_rng(0)
n = 500
A = rng.standard_normal((n, n))
b = rng.standard_normal(n)

t0 = time.perf_counter()
x_solve = np.linalg.solve(A, b)
t_solve = time.perf_counter() - t0

t0 = time.perf_counter()
x_inv = np.linalg.inv(A) @ b
t_inv = time.perf_counter() - t0

print(f"solve : {t_solve*1000:.2f} ms")
print(f"inv@b : {t_inv*1000:.2f} ms   (~ {t_inv/t_solve:.1f}× yavas)")
print(f"|fark|: {np.linalg.norm(x_solve - x_inv):.2e}")

Egzersiz 4. \(4 \times 4\) bir matrisi \(2 \times 2\) bloklara böl, blok çarpımı ile sonucu bul, standart yöntemle karşılaştır.

Egzersiz 5. \(A = ((1,2),(0,3))\), \(B = ((2,0),(1,1))\). \(A^{-1}, B^{-1}\) Gauss–Jordan ile bul, sonra \((AB)^{-1}\)’i iki yoldan: (a) \(AB\)’nin doğrudan tersi, (b) \(B^{-1}A^{-1}\) çarpımı. Aynı çıkmalı.

4.10 Sonraki Ders İçin Hazırlık

Ders 4: A = LU Faktorizasyonu

  • Her invertible matris için \(A = LU\) ayrışımı.
  • \(L\) (alt üçgensel) = ters eliminasyon adımlarının çarpımı.
  • \(U\) (üst üçgensel) = ileri eliminasyonun sonucu.
  • Sayısal LA’nın en yaygın ayrışımı; scipy.linalg.lu, torch.linalg.lu_factor arka planı.
UyarıDers 4 öncesi yapılacak
  • Egzersizleri çöz, özellikle 3 (solve vs inv) ve 4 (blok çarpımı).
  • Python’da scipy.linalg.lu ile birkaç matris dene.
  • Ana cümleyi tekrar oku.

4.11 Anahtar Kavramlar (Cheat Sheet)

Kavram Tanım Strang’da
Yol 1: Standart \(C_{ij} = \sum_k a_{ik} b_{kj}\) 0:33
Yol 2: Kolon \(C\) kolonları = \(A\) kolonlarının komb. 6:11
Yol 3: Satır \(C\) satırları = \(B\) satırlarının komb. 10:09
Yol 4: rank-1 toplamı \(AB = \sum_k \mathbf{a}_k^{\text{col}} \mathbf{b}_k^{\text{row}}\) 12:06
Yol 5: Blok çarpımı Bloklara böl, blok-blok çarp 18:34
Rank-1 matris Tüm kolonlar/satırlar tek doğrultuda 17:18
Ters matris \(AA^{-1} = A^{-1}A = I\) (square) 21:22
Singular test \(A\mathbf{x}=\mathbf{0}\) için \(\mathbf{x} \neq \mathbf{0}\) varsa singular 28:00
Gauss–Jordan \([A \mid I] \to [I \mid A^{-1}]\) 36:13
\((AB)^{-1}\) \(= B^{-1}A^{-1}\) (sıra ters) 47:00

4.12 ML Bağlantıları Özeti

İpucu6 köprü
  1. Yol 4 (rank-1 toplamı) → SVD/LoRA → Her matris en az \(r\) rank-1 matrisin toplamı; LoRA bu temele dayanır.
  2. Yol 5 (blok çarpımı) → FlashAttention / tensor parallelism → Büyük matrisleri belleğe sığdırmanın matematiksel iskeleti.
  3. \((AB)^{-1} = B^{-1}A^{-1}\) → backprop sırası → Normalizing flows, invertible NNs, zincirleme türev.
  4. np.linalg.inv vs np.linalg.solve → Inverse hesaplamak nadiren gerekli; \(A^{-1}\mathbf{b}\) yerine solve(A, b) (3× hızlı, sağlam).
  5. Singular = ill-conditioned → Gradient descent yakınsamıyorsa condition number yüksek; weight decay = “matrisi singular’dan uzaklaştır”.
  6. Kolon uzayı sezgisi → embedding spaces → Word/sentence embeddings = vektör uzayında “anlam yönleri”; ulaşılabilir vs ulaşılmaz vektör kavramı.
ÖnemliTek bir şey alıp gideceksen

Matris çarpımının beş yolu farklı bakışlardır, aynı sonucu verir. Gauss–Jordan \([A \mid I]\)’dan \([I \mid A^{-1}]\)’a giderek \(A^{-1}\)’i kurar — çünkü eliminasyon kombo matrisi \(E\), \(EA = I\) koşulunda tam olarak \(A^{-1}\)’dir.