Phase 01: Math Foundations

Tensör İşlemleri

Tensorlar veriler ve derin öğrenme arasındaki ortak dil. Her görüntü, her cümle, her gradient onların içinden akıyor.

Type: Build

Language:Python

Prerequisites: Phase 1, Lessons 01 (Linear Algebra Intuition), 02 (Vectors, Matrices & Operations)

Time: ~90 minutes

Öğrenme Hedefleri

  • Şekil, adım, yeniden şekil, transpose ve element-hikmetli işlemlerle sıfırdan bir tensor sınıfı uygulayın
  • Veri kopyasını yapmadan farklı şekillerdeki tenzorlarda çalışmak için yayın kurallarını uygula
  • Düğüm ürünleri, matris çarpmaları, dış ürünler ve seri işlemler için birim ifadeleri yazın
  • Çok başlı dikkatin her adımı boyunca tam tenzor şekilleri izleyin

Sorun

Bir transformatör inşa edersin, ön geçit temiz görünüyor, çalıştırırsın ve elde edersin:RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x768 and 512x768)Şekillerine bakıp transpose deneyin.Expected 4D input (got 3D input)Bir sıçrama eklersen başka bir şey kırılır.

Şekil hataları derin öğrenme kodunda en yaygın hatalardır. Konseptik olarak zor değiller - her işlemin bir şekil kontratı vardır - ama hızlı bir şekilde çoğalabilirler. Bir transformatörün düzinelerce şekil değiştirmesi, transposasyonu ve yayınları bir arada zincirlenmesi vardır. Bir yanlış eksik ve hata kaskasları. Daha da kötüsü, bazı şekil hataları hatalar atmaz. Onlar sessizce çöp üretirler yanlış boyutta yayınlarken veya yanlış ekseni toplayarak.

Matrisler iki şey kümesi arasındaki çiftlik ilişkileri ele alıyor. Gerçek veriler iki boyutta uyum sağlamaz. 32 RGB görüntülerinin bir parti 224x224'te 4D tenzorudur:(32, 3, 224, 224)12 başlı kendine dikkat 4 boyutlu bir şey .(batch, heads, seq_len, head_dim)Bu yapı, tensördür. İşlemlerini yönetmek ve şekil hataları önemsiz bir şekilde hata çözülebilir hale gelir.

Anlaşım

Tensör nedir?

Tensör, bir eşit veri tipi olan çok boyutlu bir sayı dizisidir.rank(veya order) Her boyut bir axis- Ne ?shapeher eksesi boyunca boyutları listeden bir tuple.

graph LR
    S["Scalar<br/>rank 0<br/>shape: ()"] --> V["Vector<br/>rank 1<br/>shape: (3,)"]
    V --> M["Matrix<br/>rank 2<br/>shape: (2,3)"]
    M --> T3["3D Tensor<br/>rank 3<br/>shape: (2,2,2)"]
    T3 --> T4["4D Tensor<br/>rank 4<br/>shape: (B,C,H,W)"]

Toplam elementler = tüm boyutların ürünü.(2, 3, 4)Tutulur .2 3 4 = 24unsurlar.

Derin öğrenme için tensor şekilleri

Farklı veri türleri, konvansiyonla belirli tenzor şekillerine haritası yapmaktadır.

graph TD
    subgraph Vision
        V1["(B, C, H, W)<br/>32, 3, 224, 224"]
    end
    subgraph NLP
        N1["(B, T, D)<br/>16, 128, 768"]
    end
    subgraph Attention
        A1["(B, H, T, D)<br/>16, 12, 128, 64"]
    end
    subgraph Weights
        W1["Linear: (out, in)<br/>Conv2D: (out_c, in_c, kH, kW)<br/>Embedding: (vocab, dim)"]
    end

PyTorch, NCHW (kanallar ilk) kullanır. TensorFlow, NHWC (kanallar son) için varsayılan özelliklere sahiptir.

Hatırlama düzenlemesi nasıl çalışır

Hatıradaki 2 boyutlu bir dizil, 1 boyutlu bir bayt dizisidir. StridesHer eksesi boyunca bir adım atmak için kaç element atlamayı söyleyebilirim.

graph LR
    subgraph "Row-major (C order)"
        R["a b c d e f<br/>strides: (3, 1)"]
    end
    subgraph "Column-major (F order)"
        C["a d b e c f<br/>strides: (1, 2)"]
    end

Transpose verileri hareket ettirmez.non-contiguous-- bir satırdaki elementler artık hafızada bitişik değil.

Yayınlama kuralları

Yayınlama, verileri kopyalamadan farklı şekillerdeki tensörleri çalıştırmanıza olanak tanır. Sağdan şekillerin uyumlu olması. İki boyut eşit olduğunda veya bir tane 1.

Tensor A:     (8, 1, 6, 1)
Tensor B:        (7, 1, 5)
Padded B:     (1, 7, 1, 5)
Result:       (8, 7, 6, 5)

Einsum: evrensel tenzor işlevi

Einstein toplamı her ekseni bir harf ile etiketler. Girişdeki ekseler toplamlanır ama çıkış değil. Her iki eksede de saklanır.

graph LR
    subgraph "matmul: ik,kj -> ij"
        A["A(I,K)"] --> |"sum over k"| C["C(I,J)"]
        B["B(K,J)"] --> |"sum over k"| C
    end

Anahtar örnekler: i,i->(dot ürün), i,j->ij(dış ürün), ii->(izleri), ij->ji(Transpose), bij,bjk->bik(batch matmul), bhtd,bhsd->bhts(Dikkat puanları).

Yapın

Kod içinde yaşıyor .code/tensors.pyHer adım, orada uygulanmaya işaret eder.

Adım 1: Tensiyon depolama ve adımlar

Bir tensör, sayıların düz listesini ve şekil metadatalarını saklar.

pythonclass Tensor:
    def __init__(self, data, shape=None):
        if isinstance(data, (list, tuple)):
            self._data, self._shape = self._flatten_nested(data)
        elif isinstance(data, np.ndarray):
            self._data = data.flatten().tolist()
            self._shape = tuple(data.shape)
        else:
            self._data = [data]
            self._shape = ()

        if shape is not None:
            total = reduce(lambda a, b: a * b, shape, 1)
            if total != len(self._data):
                raise ValueError(
                    f"Cannot reshape {len(self._data)} elements into shape {shape}"
                )
            self._shape = tuple(shape)

        self._strides = self._compute_strides(self._shape)

    @staticmethod
    def _compute_strides(shape):
        if len(shape) == 0:
            return ()
        strides = [1] * len(shape)
        for i in range(len(shape) - 2, -1, -1):
            strides[i] = strides[i + 1] * shape[i + 1]
        return tuple(strides)

Şekil için(3, 4), adımlar (4, 1)-- bir satır ileriye 4 element atlamak, bir sütun ileriye 1 element atlamak.

Adım 2: Yeniden şekillendirin, sıkın, sıkın

Modelleştirme, element sırasını değiştirmeden şeklini değiştirir.-1Bir boyut için boyutunu çıkarmak için.

pythont = Tensor(list(range(12)), shape=(2, 6))
r = t.reshape((3, 4))
r = t.reshape((-1, 3))

Squeeze, 1. boyuttaki ekseni çıkarır. Uncpress bir ekler.(D,)bir partiye eklenir (B, T, D)Çekilmemesi gerek .(1, 1, D)- Evet .

pythont = Tensor(list(range(6)), shape=(1, 3, 1, 2))
s = t.squeeze()
v = Tensor([1, 2, 3])
u = v.unsqueeze(0)

Adım 3: Transpose ve permute

Transpose iki ekseni değiştirir, Permute tüm ekseni yeniden düzenler.

pythonmat = Tensor(list(range(6)), shape=(2, 3))
tr = mat.transpose(0, 1)

t4d = Tensor(list(range(24)), shape=(1, 2, 3, 4))
perm = t4d.permute((0, 2, 3, 1))

Transpose veya permute sonrasında, tenzor hafızada birbiriyle uzlaşmaz.viewDüzsel olmayan tenzorlarda başarısız olur -- kullan reshapeYa da aramak ..contiguous()Önce.

Adım 4: Elementler açısından işlemler ve azaltmalar

Element-wise ops (ekle, çarp, çıkar) her öğeye bağımsız olarak uygulanır ve şeklini korur.

pythona = Tensor([[1, 2], [3, 4]])
b = Tensor([[10, 20], [30, 40]])
c = a + b
d = a * 2
s = a.sum(axis=0)

CNN'de küresel ortalama birleştirme: (B, C, H, W).mean(axis=[2, 3])üretir (B, C). NLP'de sırayla birleştirme ortalaması: (B, T, D).mean(axis=1)üretir (B, D)- Evet .

Adım 5: NumPy ile yayınlama

  • Evet .demo_broadcasting_numpy()tensors.py- Temel modellerini gösteriyor.
pythonactivations = np.random.randn(4, 3)
bias = np.array([0.1, 0.2, 0.3])
result = activations + bias

images = np.random.randn(2, 3, 4, 4)
scale = np.array([0.5, 1.0, 1.5]).reshape(1, 3, 1, 1)
result = images * scale

a = np.array([1, 2, 3]).reshape(-1, 1)
b = np.array([10, 20, 30, 40]).reshape(1, -1)
outer = a * b

Yayınlama yoluyla çiftlik mesafe: yeniden şekillendirmek (M, 2)- ...(M, 1, 2)ve (N, 2)- ...(1, N, 2), çıkar, kare, son eksesi boyunca toplam, kare kökü alın. Sonuç: (M, N)- Evet .

Adım 6: Einsum operasyonları

  • Evet .demo_einsum()ve demo_einsum_gallery()fonksiyonlar her ortak örneği geçer.
pythona = np.array([1.0, 2.0, 3.0])
b = np.array([4.0, 5.0, 6.0])
dot = np.einsum("i,i->", a, b)

A = np.array([[1, 2], [3, 4], [5, 6]], dtype=float)
B = np.array([[7, 8, 9], [10, 11, 12]], dtype=float)
matmul = np.einsum("ik,kj->ij", A, B)

batch_A = np.random.randn(4, 3, 5)
batch_B = np.random.randn(4, 5, 2)
batch_mm = np.einsum("bij,bjk->bik", batch_A, batch_B)

Bir kısıtlamanın hesaplama maliyeti tüm indeks boyutlarının (daha fazla ve toplam) ürünüdür.bij,bjk->bikB=32, I=128, J=64, K=128:32 128 64 * 128 = 33,554,432kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat kat

Adım 7: Eynüm yoluyla dikkat mekanizması

  • Evet .demo_attention_einsum()Bu işlevi, bir çok başlı dikkat uygulaması ile başlıyor.
pythonB, H, T, D = 2, 4, 8, 16
E = H * D

X = np.random.randn(B, T, E)
W_q = np.random.randn(E, E) * 0.02

Q = np.einsum("bte,ek->btk", X, W_q)
Q = Q.reshape(B, T, H, D).transpose(0, 2, 1, 3)

scores = np.einsum("bhtd,bhsd->bhts", Q, K) / np.sqrt(D)
weights = softmax(scores, axis=-1)
attn_output = np.einsum("bhts,bhsd->bhtd", weights, V)

concat = attn_output.transpose(0, 2, 1, 3).reshape(B, T, E)
output = np.einsum("bte,ek->btk", concat, W_o)

Her adım bir tensor işlemidir: projeksiyon (matmul via einsum), baş bölünmesi (reform + transpose), dikkat puanları (batch matmul via einsum), ağırlıklı toplam (batch matmul via einsum), baş birleşimi (transpose + reshape), çıkış projeksiyonu (matmul via einsum).

Kullan

Çizik vs NumPy

OperationScratch (Tensor class)NumPy
CreateTensor([[1,2],[3,4]])np.array([[1,2],[3,4]])
Reshapet.reshape((3,4))a.reshape(3,4)
Transposet.transpose(0,1)a.T or a.transpose(0,1)
Squeezet.squeeze(0)np.squeeze(a, 0)
Sumt.sum(axis=0)a.sum(axis=0)
EinsumN/Anp.einsum("ij,jk->ik", a, b)

Çizik vs PyTorch

pythonimport torch

t = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32)
t.shape
t.stride()
t.is_contiguous()

t.reshape(3, 2)
t.unsqueeze(0)
t.transpose(0, 1)
t.transpose(0, 1).contiguous()

torch.einsum("ik,kj->ij", A, B)

PyTorch, otograd, GPU desteği ve optimize edilmiş BLAS çekirdeklerini ekler. Şekil semantikleri aynıdır.

Her sinir ağ katmanı bir tensor işlevi olarak

OperationTensor FormEinsum
Linear layerY = X @ W.T + b"bd,od->bo" + bias
Attention QKVQ = X @ W_q"btd,dh->bth"
Attention scoresQ @ K.T / sqrt(d)"bhtd,bhsd->bhts"
Attention outputsoftmax(scores) @ V"bhts,bhsd->bhtd"
Batch norm(X - mu) / sigma * gammaelement-wise + broadcast
Softmaxexp(x) / sum(exp(x))element-wise + reduction

Gönder

Bu ders iki tekrar kullanılabilir ipucu verir:

  1. outputs/prompt-tensor-shapes.md-- Tenzor şekli eşleşmezliklerini düzeltmek için sistematik bir istek. Her ortak işlem için karar tabloları (matmul, yayın, kedi, doğrusal, Conv2d, BatchNorm, softmax) ve bir düzeltme arama tablo içerir.
  1. outputs/prompt-tensor-debugger.md-- Bir adım adım defoglama uyarısı şekil hatası sizi engellediğinde herhangi bir AI asistanına yapıştırır.

Egzersizler

  1. Easy -- Reshape round-trip.Şekil tensörü alın .(2, 3, 4)- Onu yeniden şekillendir .(6, 4)Sonra da (24,), sonra geri dön .(2, 3, 4). Verify elementleri sırası, her adımda düz verileri basarak korunur.
  1. Medium -- Implement broadcasting.Tensorsınıfıbroadcast_to(shape)Bu yöntem, hedef şekline uygun olarak 1 boyut boyutlarını genişletir._elementwise_opİşlemden önce otomatik olarak yayınlanmak için.(3, 1)ve (1, 4)üretimi(3, 4)- Evet .
  1. Hard -- Build einsum from scratch.Temel bir uygulama yapın einsum(subscripts, *tensors)En az: nokta ürünü (i,i->), matris çarpımı (ij,jk->ik), dış ürün (i,j->ij(), ve transpose (ij->ji) Alt yazılı dizileri analiz edin, sözleşmiş indeksleri belirleyin ve tüm indeks kombinasyonlarını inceleyin.np.einsum- Evet .
  1. Hard -- Attention shape tracker.Alıcı bir fonksiyon yaz batch_size- Evet .seq_len- Evet .embed_dimvenum_headsGiriş, Q/K/V projesi, baş bölümü, dikkat puanları, softmax ağırlıkları, ağırlıklı toplam, baş birleşimi, çıkış projesi.demo_attention_einsum()çıkış.

Anahtar Terimler

TermWhat people sayWhat it actually means
Tensor"A matrix but more dimensions"A multi-dimensional array with uniform type and defined shape, strides, and operations
Rank"The number of dimensions"The number of axes. A matrix has rank 2, not rank equal to its matrix rank
Shape"The size of the tensor"A tuple listing the size along each axis. (2, 3) means 2 rows, 3 columns
Stride"How memory is laid out"The number of elements to skip to advance one position along each axis
Broadcasting"It just works when shapes differ"A strict set of rules: align from right, dimensions must be equal or one must be 1
Contiguous"The tensor is normal"Elements stored sequentially in memory with no gaps or reordering from the logical layout
Einsum"A fancy way to write matmul"A general notation that expresses any tensor contraction, outer product, trace, or transpose in one line
View"Same as reshape"A tensor sharing the same memory buffer but with different shape/stride metadata. Fails on non-contiguous data
Contraction"Summing over an index"The general operation where a shared index between tensors is multiplied and summed, producing a lower-rank result
NCHW / NHWC"PyTorch vs TensorFlow format"Memory layout conventions for image tensors. NCHW puts channels before spatial dims, NHWC puts them after

Daha Fazla Okumak

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.