3.1 Vektor, norma és skalárszorzat

3.1.1 Cél, előismeret és induló kérdés

Ez az egység a neurális hálózatok mögötti lineáris algebra első, geometriai rétegét építi fel. A cél, hogy a vektor ne csak tömb legyen, hanem koordinátákkal leírható geometriai és adatreprezentációs objektum; a norma, a skalárszorzat, a távolság és az ortogonalitás pedig ellenőrizhető, dimenzióhelyes művelet legyen. Előismeret a 2.1. Python, NumPy és tenzoralak ndarray, shape, axis és broadcasting fogalma, valamint a 2.4. Kis tudományos szoftverprojekt kis projektben megszokott input–output szerződés.

Induló kérdés: a GlyphLab egy 24×24-es szürke képe lapítva egy 576 elemű vektor. Ha két kép két ilyen vektor, mit jelent, hogy „közeliek”, és miért nem elég csak a pontonkénti szorzatösszegüket nézni? Becsülje meg, mekkora lehet egy ilyen képpár euklideszi távolsága, ha minden intenzitás a [0,1][0,1] intervallumban van: 576=24\sqrt{576}=24 a lehető legnagyobb érték, de a tipikus érték az adat tartalmától függ.

3.1.2 Vektor, koordináta és adatreprezentáció

Definíció (valós vektor és koordináta). Legyen d≥1d\ge 1 egész. Az ℝd\mathbb R^d tér egy eleme x=(x1,…,xd)⊤x=(x_1,\dots,x_d)^\top; a könyv absztrakt képleteiben ez oszlopvektor. A standard bázisban az xjx_j valós számok a vektor jj-edik koordinátái, vagyis x=∑j=1dxjejx=\sum_{j=1}^d x_j e_j, ahol eje_j az a vektor, amelynek jj-edik koordinátája 1, a többi 0.

Két vektor, xx és yy, akkor és csak akkor egyenlő, ha minden j∈{1,…,d}j\in\{1,\dots,d\} koordinátára xj=yjx_j=y_j. A koordináták nem abszolút tulajdonságok: más bázisban ugyanahhoz a geometriai vektorhoz más számsor tartozhat. Ebben a fejezetben mindig a standard bázisban dolgozunk; a bázisváltoztatás a későbbi sajátérték-témakörben tér vissza 3.4. Sajátérték, SVD és spektrális határ.

Adatreprezentációs olvasatban egy x∈ℝdx\in\mathbb R^d lehet egy megfigyelés számszerű jellemzősora. A szerződés szerint egy tiszta batch-vektor X∈ℝN×dX\in\mathbb R^{N\times d} soronként egy megfigyelést tárol: x(n)=(Xn1,…,Xnd)⊤x^{(n)}=(X_{n1},\dots,X_{nd})^\top. Egy (1,24,24) NCHW szürke képből az x = image.reshape(-1) kifejezés (576,) alakú vektort állít elő; a pixel intenzitásértékei ekkor a vektor koordinátái, a tengelyek sorrendje pedig a választott lapítási konvenció.

3.1.3 Skalárszorzat

Definíció (skalárszorzat, dot product). Az x,y∈ℝdx,y\in\mathbb R^d vektorok skalárszorzata

⟨x,y⟩=∑j=1dxjyj. \langle x,y\rangle \;=\; \sum_{j=1}^{d} x_j y_j .

A kifejezés másik szokásos jelölése x⊤yx^\top y, ahol a felső ⊤\top a transzponálást jelöli; ennek mátrixos használata a 3.2. Mátrixszorzás és affín réteg egységben pontosítjuk. Az eredmény skalár, tehát nincs tengelye. Ha batchben dolgozunk, az X,Y∈ℝN×dX,Y\in\mathbb R^{N\times d} mátrixok sorainak páronkénti skalárszorzata

sn=∑j=1dXnjYnj,n=1,…,N, s_n = \sum_{j=1}^{d} X_{nj}Y_{nj}, \quad n=1,\dots,N,

ami np.sum(X*Y, axis=1) alakú, (N,) eredménnyel. A szorzás itt elemenkénti, a redukció a jj tengelyen történik.

Az alábbi tulajdonságok közvetlenül a véges összeg definíciójából következnek, ezért külön tétel helyett levezetésként rögzítjük őket. Legyen x,y,z∈ℝdx,y,z\in\mathbb R^d és α,β∈ℝ\alpha,\beta\in\mathbb R.

  1. Szimmetria: ⟨x,y⟩=⟨y,x⟩\langle x,y\rangle=\langle y,x\rangle, mert a szorzás kommutatív.
  2. Linearitás az első változóban: ⟨αx+βz,y⟩=α⟨x,y⟩+β⟨z,y⟩\langle \alpha x+\beta z,y\rangle=\alpha\langle x,y\rangle+\beta\langle z,y\rangle. A szimmetria miatt ugyanez a második változóban is igaz, ezért a művelet bilineáris.
  3. Pozitív definitség: ⟨x,x⟩=∑jxj2≥0\langle x,x\rangle=\sum_j x_j^2\ge 0, és ⟨x,x⟩=0\langle x,x\rangle=0 pontosan akkor, ha minden xj=0x_j=0, azaz x=0x=0.

A pozitív definitség azért döntő, mert ebből lesz a geometriai hossz. A skalárszorzat önmagában nem hasonlósági döntés: az értéke függ a vektorok hosszától is.

3.1.4 Normák és távolság

Definíció (euklideszi norma). Egy x∈ℝdx\in\mathbb R^d vektor euklideszi normája, más néven ℓ2\ell_2-normája:

∥x∥2=⟨x,x⟩=(∑j=1dxj2)1/2. \|x\|_2 = \sqrt{\langle x,x\rangle} = \left(\sum_{j=1}^{d} x_j^2\right)^{1/2}.

A nemnegatív gyök egyértelmű; ∥x∥2≥0\|x\|_2\ge0, és ∥x∥2=0\|x\|_2=0 pontosan akkor, ha x=0x=0. A norma a vektor origótól mért geometriai hossza. Érvényes a homogenitás: ∥αx∥2=|α|∥x∥2\|\alpha x\|_2=|\alpha|\,\|x\|_2, mert a gyök alatti összeg minden tagja α2\alpha^2-nel szorzódik.

Általánosabban, p≥1p\ge1 esetén az ℓp\ell_p-norma

∥x∥p=(∑j=1d|xj|p)1/p, \|x\|_p = \left(\sum_{j=1}^{d}|x_j|^p\right)^{1/p},

és ∥x∥∞=maxj|xj|\|x\|_\infty=\max_j |x_j|. A p=1p=1 eset a Manhattan-norma. A háromszög-egyenlőtlenség általános ℓp\ell_p-normákra a Minkowski-egyenlőtlenség következménye; ezt itt nem bizonyítjuk, csak a főúthoz szükséges p=2p=2 esetet vezetjük le a következő szakaszban.

Definíció (euklideszi távolság). Az x,y∈ℝdx,y\in\mathbb R^d pontok távolsága

d(x,y)=∥x−y∥2. d(x,y) = \|x-y\|_2 .

A definícióból és a norma tulajdonságaiból azonnal adódik, hogy d(x,y)≥0d(x,y)\ge0, d(x,y)=0d(x,y)=0 pontosan akkor, ha x=yx=y, és d(x,y)=d(y,x)d(x,y)=d(y,x). A háromszög-egyenlőtlenséget a következő tétel garantálja.

3.1.5 Ortogonalitás és koszinusz-hasonlóság

Definíció (ortogonalitás). Az x,y∈ℝdx,y\in\mathbb R^d vektorok ortogonálisak, jelölésben x⊥yx\perp y, ha ⟨x,y⟩=0\langle x,y\rangle=0. A nullvektor minden vektorra ortogonális, mert minden szorzatösszeg tagja nulla. Egy u∈ℝdu\in\mathbb R^d vektor egységvektor, ha ∥u∥2=1\|u\|_2=1. Az {u1,…,uk}\{u_1,\dots,u_k\} halmaz ortonormált, ha minden elem egységvektor és páronként ortogonális.

Ha x≠0x\ne0, az x/∥x∥2x/\|x\|_2 vektor egységvektor, az xx irányába mutat. A normalizálás a nullvektorra nem értelmezhető.

Definíció (koszinusz-hasonlóság). Ha x≠0x\ne0 és y≠0y\ne0, akkor

cos(x,y)=⟨x,y⟩∥x∥2∥y∥2. \cos(x,y) = \frac{\langle x,y\rangle}{\|x\|_2\|y\|_2}.

A következő lemma szerint ez mindig a [−1,1][-1,1] intervallumba esik. A név geometriai: ez a két irány közötti szög koszinusza. Az érték 1, ha a vektorok azonos irányú pozitív skalárszorosai, −1-1, ha ellentétes irányúak, és 0, ha ortogonálisak. A koszinusz-hasonlóság nem távolság, mert az azonos irányú, de különböző hosszúságú vektorokra 1, noha a vektorok nem egyenlők.

3.1.6 Cauchy–Schwarz és a háromszög-egyenlőtlenség

Az alábbi lemma a valós skalárszorzatra vonatkozó Cauchy–Schwarz-egyenlőtlenség. A bizonyítás standard másodfokú diszkussziós argumentum; nem használ mértékelméletet és nem támaszkodik külső tételre. A terminológia a [B01] lineáris algebrai keretével konzisztens, de a részletes levezetés itt saját kidolgozás.

1. lemma (Cauchy–Schwarz). Legyen x,y∈ℝdx,y\in\mathbb R^d, és legyen ∥x∥2=⟨x,x⟩\|x\|_2=\sqrt{\langle x,x\rangle}. Ekkor

|⟨x,y⟩|≤∥x∥2∥y∥2. |\langle x,y\rangle| \le \|x\|_2\|y\|_2.

Egyenlőség pontosan akkor áll fenn, ha xx és yy lineárisan összefüggő, vagyis x=0x=0, y=0y=0, vagy valamelyik a másik skalárszorosa.

Bizonyítás. Ha y=0y=0, akkor mindkét oldal nulla, és az állítás igaz. Legyen most y≠0y\ne0. Minden t∈ℝt\in\mathbb R esetén

0≤∥x+ty∥22=⟨x+ty,x+ty⟩=t2∥y∥22+2t⟨x,y⟩+∥x∥22, 0 \le \|x+ty\|_2^2 = \langle x+ty,x+ty\rangle = t^2\|y\|_2^2+2t\langle x,y\rangle+\|x\|_2^2 ,

ahol az átalakítás a bilinearitás és szimmetria definíciójából következik. Ez tt-ben másodfokú kifejezés, amelynek főegyütthatója A=∥y∥22>0A=\|y\|_2^2>0. Mivel a kifejezés soha nem negatív, a másodfokú polinomnak legfeljebb egy valós gyöke lehet, tehát diszkriminánsa nem pozitív:

D=(2⟨x,y⟩)2−4∥y∥22∥x∥22≤0. D = (2\langle x,y\rangle)^2 - 4\|y\|_2^2\|x\|_2^2 \le 0.

Osztva 4-gyel és átrendezve ⟨x,y⟩2≤∥x∥22∥y∥22\langle x,y\rangle^2\le\|x\|_2^2\|y\|_2^2. A nemnegatív oldalakon a gyökvonás monoton, így |⟨x,y⟩|≤∥x∥2∥y∥2|\langle x,y\rangle|\le\|x\|_2\|y\|_2.

Az egyenlőség esete: ha a diszkrimináns nulla, akkor a másodfokú kifejezésnek van t0t_0 valós gyöke, amire ∥x+t0y∥22=0\|x+t_0y\|_2^2=0, tehát a pozitív definitség miatt x=−t0yx=-t_0y, így a két vektor lineárisan összefüggő. Megfordítva, ha y≠0y\ne0 és x=αyx=\alpha y, akkor q(t)q(t) diszkriminánsa nulla, és az egyenlőség kiszámolható. A y=0y=0 esettel együtt ez adja a kimondott feltételt. ▫\square

2. tétel (háromszög-egyenlőtlenség az euklideszi normára). Legyen x,y∈ℝdx,y\in\mathbb R^d, és ∥x∥2=⟨x,x⟩\|x\|_2=\sqrt{\langle x,x\rangle}. Ekkor

∥x+y∥2≤∥x∥2+∥y∥2. \|x+y\|_2 \le \|x\|_2+\|y\|_2.

Egyenlőség pontosan akkor áll fenn, ha y=0y=0, x=0x=0, vagy y=αxy=\alpha x valamely α≥0\alpha\ge0 valós számra.

Bizonyítás. A norma definícióját kétszer alkalmazva:

∥x+y∥22=⟨x+y,x+y⟩=∥x∥22+2⟨x,y⟩+∥y∥22. \|x+y\|_2^2 = \langle x+y,x+y\rangle = \|x\|_2^2+2\langle x,y\rangle+\|y\|_2^2 .

Mivel ⟨x,y⟩≤|⟨x,y⟩|\langle x,y\rangle\le|\langle x,y\rangle|, az 1. lemma szerint

∥x+y∥22≤∥x∥22+2∥x∥2∥y∥2+∥y∥22=(∥x∥2+∥y∥2)2. \|x+y\|_2^2 \le \|x\|_2^2+2\|x\|_2\|y\|_2+\|y\|_2^2 = (\|x\|_2+\|y\|_2)^2 .

Mindkét oldal nemnegatív, ezért a négyzetgyök monotonitása miatt ∥x+y∥2≤∥x∥2+∥y∥2\|x+y\|_2\le\|x\|_2+\|y\|_2.

Az egyenlőséghez a fenti egyenlőtlenségek mindegyikében egyenlőség kell. Az 1. lemma egyenlőségi feltétele a lineáris összefüggőség; a ⟨x,y⟩=|⟨x,y⟩|\langle x,y\rangle=|\langle x,y\rangle| feltétel pedig azt kívánja, hogy a skalárszorzat nemnegatív legyen. Ez pontosan az állításban szereplő azonos irányú eset. ▫\square

A tételből a távolságra is megkapjuk a háromszög-egyenlőtlenséget: tetszőleges x,y,z∈ℝdx,y,z\in\mathbb R^d esetén

d(x,z)=∥(x−y)+(y−z)∥2≤∥x−y∥2+∥y−z∥2=d(x,y)+d(y,z). d(x,z) = \|(x-y)+(y-z)\|_2 \le \|x-y\|_2+\|y-z\|_2 = d(x,y)+d(y,z).

Ezzel az euklideszi távolság a metrikaaxiómákat is teljesíti.

3.1.7 Kézi példa és ellenőrző kód

Legyen x=(3,4)⊤x=(3,4)^\top és y=(−4,3)⊤y=(-4,3)^\top. A skalárszorzat:

⟨x,y⟩=3⋅(−4)+4⋅3=0, \langle x,y\rangle = 3\cdot(-4)+4\cdot 3 = 0,

tehát a két vektor ortogonális. Mindkettő normája 9+16=5\sqrt{9+16}=5, így ortonormált párt alkotnak az ex=(0.6,0.8)⊤e_x=(0.6,0.8)^\top és ey=(−0.8,0.6)⊤e_y=(-0.8,0.6)^\top normalizált vektorok. A távolság

d(x,y)=∥x−y∥2=∥(7,1)⊤∥2=50≈7.071. d(x,y)=\|x-y\|_2=\|(7,1)^\top\|_2=\sqrt{50}\approx7.071.

A Cauchy-egyenlőtlenség itt 0≤250\le25, a háromszög-egyenlőtlenség pedig ∥x+y∥2=50≈7.071≤10\|x+y\|_2=\sqrt{50}\approx7.071\le10. Ortogonális vektoroknál ∥x+y∥2=∥x−y∥2\|x+y\|_2=\|x-y\|_2, mert a kereszttag eltűnik.

A skálázás hatása ugyanezen a páron: az αx\alpha x vektor és yy skalárszorzata α⋅0=0\alpha\cdot0=0 minden α\alpha-ra, tehát az ortogonalitás minden α\alpha esetén megmarad (a zérusvektor is ortogonális minden vektorhoz), de α=0\alpha=0 esetén a koszinusz-hasonlóság nem értelmezhető. A távolság viszont

d(αx,y)=∥(αx)−y∥2=(3α+4)2+(4α−3)2=25α2+25, d(\alpha x,y)=\|(\alpha x)-y\|_2 =\sqrt{(3\alpha+4)^2+(4\alpha-3)^2} =\sqrt{25\alpha^2+25},

ami α=0\alpha=0-nál 5, α=±1\alpha=\pm1-nél 50\sqrt{50}, és nagy |α||\alpha|-ra körülbelül 5|α|5|\alpha|; tehát a távolság általában nem |α|d(x,y)|\alpha|d(x,y).

A munkakönyvtár labs/n009_vector_norm/. Az alábbi munkamenet CPU-n fut, a számítás float64 pontosságú, véletlen számot nem használ. A kimenet kézzel számított ellenőrző érték; futtatás előtt a pontos numerikus megjelenést a használt NumPy-verzió határozza meg.

# labs/n009_vector_norm/vector_lab.py
import numpy as np

def dot(x, y):
    return float(np.dot(x, y))

def norm(x):
    return float(np.sqrt(np.dot(x, x)))

def cosine(x, y):
    # a laborpéldákban egyik vektor sem nullvektor
    return dot(x, y) / (norm(x) * norm(y))

x = np.array([3.0, 4.0], dtype=np.float64)
y = np.array([-4.0, 3.0], dtype=np.float64)

print("dot", dot(x, y))
print("norm_x", norm(x), "norm_y", norm(y))
print("cosine", cosine(x, y))
print("distance", norm(x - y))
print("triangle_lhs", norm(x + y), "triangle_rhs", norm(x) + norm(y))
dot 0.0
norm_x 5.0 norm_y 5.0
cosine 0.0
distance 7.0710678118654755
triangle_lhs 7.0710678118654755 triangle_rhs 10.0

3.1.8 Labor: három vektorpár és a skálázás hatása

Átadandó eredmény. Válassza az alábbi három kétdimenziós vektorpárt:

u1=(2,1)⊤,v1=(−1,2)⊤;u2=(3,0)⊤,v2=(0,4)⊤;u3=(1,1)⊤,v3=(2,2)⊤. u_1=(2,1)^\top,\ v_1=(-1,2)^\top; \quad u_2=(3,0)^\top,\ v_2=(0,4)^\top; \quad u_3=(1,1)^\top,\ v_3=(2,2)^\top.

Kézzel számítsa ki mindhárom párra a skalárszorzatot, a két normát, a koszinusz-hasonlóságot és a távolságot. Az ellenőrző indoklás: u1⊥v1u_1\perp v_1, mert 2⋅(−1)+1⋅2=02\cdot(-1)+1\cdot2=0; u2⊥v2u_2\perp v_2, mert a tengelyvektorokra a szorzat 0; v3=2u3v_3=2u_3, ezért a pár párhuzamos és azonos irányú.

pár skalárszorzat koszinusz euklideszi távolság
(u1,v1)(u_1,v_1) 0 0 10≈3.162\sqrt{10}\approx3.162
(u2,v2)(u_2,v_2) 0 0 55
(u3,v3)(u_3,v_3) 4 1 2≈1.414\sqrt{2}\approx1.414

A kihagyott normák: u1u_1 és v1v_1 normája 5≈2.236\sqrt5\approx2.236; u2u_2 normája 3, v2v_2 normája 4; u3u_3 normája 2\sqrt2, v3v_3 normája 222\sqrt2. A harmadik párra a Cauchy-egyenlőtlenség egyenlőséggel teljesül: 4=2⋅224=\sqrt2\cdot2\sqrt2. A háromszög-egyenlőtlenség is egyenlőséggel teljesül: ∥u3+v3∥2=∥(3,3)⊤∥2=32\|u_3+v_3\|_2=\|(3,3)^\top\|_2=3\sqrt2, míg ∥u3∥2+∥v3∥2=2+22=32\|u_3\|_2+\|v_3\|_2=\sqrt2+2\sqrt2=3\sqrt2.

A labor második része a skálázás. Rögzítse u=u1u=u_1, v=v1v=v_1, és vizsgálja az αu\alpha u vektort. A skalárszorzat ⟨αu,v⟩=α⋅0=0\langle\alpha u,v\rangle=\alpha\cdot0=0 minden α\alpha-ra, tehát az ortogonalitás α≠0\alpha\ne0 esetén megmarad. A koszinusz α>0\alpha>0-ra 0, α<0\alpha<0-ra 0, α=0\alpha=0-ra nem értelmezett. A távolság viszont

d(αu,v)=∥(αu)−v∥2=(2α+1)2+(α−2)2=5α2+5. d(\alpha u,v) = \|(\alpha u)-v\|_2 = \sqrt{(2\alpha+1)^2+(\alpha-2)^2} = \sqrt{5\alpha^2+5}.

A görbe minimuma α=0\alpha=0-nál 5≈2.236\sqrt5\approx2.236; az α=1\alpha=1 érték 10≈3.162\sqrt{10}\approx3.162. Ezért a távolság nem mondható meg pusztán a skálázott vektor hosszából, és a „nagyobb hossz közelebb visz” állítás hamis.

A három vektorpár végpontjai - A vektorok origóból induló szakaszok; a scatter csak a kézzel számított végpontokat mutatja.
A skálázott d(alphau1, v1) távolság - Képletből számolt szemléltetés, nem mért futás. d = sqrt(5alpha^2 + 5).

A vektorok origóból induló ábrázolásához az alábbi, nem futtatott laborvázlat használható; a quiver az origóból a végpontba mutató nyilakat rajzol.

# labs/n009_vector_norm/vector_plot.py
import matplotlib.pyplot as plt
import numpy as np

pairs = [
    (np.array([2.0, 1.0]), np.array([-1.0, 2.0])),
    (np.array([3.0, 0.0]), np.array([0.0, 4.0])),
    (np.array([1.0, 1.0]), np.array([2.0, 2.0])),
]
fig, ax = plt.subplots(figsize=(5, 5))
for u, v in pairs:
    ax.quiver(0, 0, u[0], u[1], angles="xy", scale_units="xy",
              scale=1, color="black")
    ax.quiver(0, 0, v[0], v[1], angles="xy", scale_units="xy",
              scale=1, color="gray")
ax.set_xlim(-2, 4)
ax.set_ylim(-2, 5)
ax.set_aspect("equal")
ax.grid(True)
fig.savefig("vector_pairs.png", dpi=150)

A várt ábrán az első pár két, egymásra merőleges szakasz; a második pár a két tengelyen fekvő szakasz; a harmadik pár két azonos irányú, 1:2 hosszarányú szakasz.

3.1.9 Feladatok

F1 (fogalmi, nehézség 1). Legyen x=(2,0)⊤x=(2,0)^\top, y=(2,ε)⊤y=(2,\varepsilon)^\top és z=(0,10)⊤z=(0,10)^\top. Számítsa ki ⟨x,y⟩\langle x,y\rangle, ⟨x,z⟩\langle x,z\rangle, d(x,y)d(x,y) és d(x,z)d(x,z) értékét ε=0.1\varepsilon=0.1 esetén. Elvárt átadandó eredmény: a négy numerikus érték, valamint egy saját szavas indoklás arról, miért hamis az az állítás, hogy a nagyobb skalárszorzat nagyobb hasonlóságot jelent.

F2 (levezetési/bizonyítási, nehézség 2). Bizonyítsa be a paralelogramma-azonosságot az euklideszi normára: minden x,y∈ℝdx,y\in\mathbb R^d esetén ∥x+y∥22+∥x−y∥22=2∥x∥22+2∥y∥22\|x+y\|_2^2+\|x-y\|_2^2=2\|x\|_2^2+2\|y\|_2^2. Mutassa meg az x=(1,0)⊤x=(1,0)^\top, y=(0,1)⊤y=(0,1)^\top párral, hogy az ℓ1\ell_1-normára ugyanez az azonosság nem teljesül. Elvárt átadandó eredmény: a levezetés minden skalárszorzat-felbontással, és a konkrét ℓ1\ell_1-ellenőrzés számai.

F3 (implementációs, nehézség 1). Írjon két tiszta NumPy-függvényt: batched_norm(X) és batched_cosine(X, Y). Az input X,Y∈ℝN×dX,Y\in\mathbb R^{N\times d}, dtype float64; a kimenet mindkét esetben (N,) alakú, dtype float64. A koszinuszfüggvény nulla normájú sorra nan értéket adjon, és ne adjon ki divisional warningot. Elvárt átadandó eredmény: a függvénykód, egy (3,2) tesztbemenet és annak ellenőrzött kimenete.

F4 (hibakeresési, nehézség 2). Az alábbi függvény koszinusz-hasonlóságot ígér:

def cosine_buggy(a, b):
    return np.dot(a, b) / np.linalg.norm(a * b)

Lokalizálja a hibát, mutassa meg egy konkrét számpárral, hogy a kimenet helytelen, és írja be a javított sort. Elvárt átadandó eredmény: a hibás részkifejezés azonosítása, az a=(1,1)⊤a=(1,1)^\top, b=(2,0)⊤b=(2,0)^\top pár hibás és helyes értéke, valamint a javított kód.

F5 (kísérleti/transzfer, nehézség 2). Tervezzen egy leíró, nem modellválasztó kísérletet a GlyphLab adatán: az azonos scene két view-jának lapított, 576 elemű vektoraira számított euklideszi távolságokat hasonlítsa össze különböző scene-ek vektorpárjaival. Előfeltétel: 1.3. Adatfelosztás és a megfigyelési egység megfigyelési egység, 2.1. Python, NumPy és tenzoralak lapítás. Elvárt átadandó eredmény: mintavételi egység, párosítási protokoll, baseline, legalább két összefoglaló metrika és a következtetési korlát.

3.1.10 Megoldások és indoklás

F1 megoldása. A skalárszorzatok: ⟨x,y⟩=4\langle x,y\rangle=4, ⟨x,z⟩=0\langle x,z\rangle=0. A távolságok: d(x,y)=∥(0,−0.1)⊤∥2=0.1d(x,y)=\|(0,-0.1)^\top\|_2=0.1, d(x,z)=∥(2,−10)⊤∥2=104≈10.198d(x,z)=\|(2,-10)^\top\|_2=\sqrt{104}\approx10.198. A skalárszorzat tehát yy-ra nagyobb, mint zz-re, de az euklideszi távolság szerint yy sokkal közelebb van, mint zz. Az ellentmondás oka, hogy a skalárszorzat a hosszakkal és az iránnyal együtt nő: zz hossza 10, ezért a nulla skalárszorzat ellenére nagy távolságra van.

F2 megoldása. A norma négyzetét a skalárszorzatra visszavezetve:

∥x+y∥22+∥x−y∥22=⟨x+y,x+y⟩+⟨x−y,x−y⟩. \|x+y\|_2^2+\|x-y\|_2^2 = \langle x+y,x+y\rangle+\langle x-y,x-y\rangle .

A bilinearitással felbontva az első tag ∥x∥22+2⟨x,y⟩+∥y∥22\|x\|_2^2+2\langle x,y\rangle+\|y\|_2^2, a második ∥x∥22−2⟨x,y⟩+∥y∥22\|x\|_2^2-2\langle x,y\rangle+\|y\|_2^2. Az összegben a kereszttag kiesik, marad 2∥x∥22+2∥y∥222\|x\|_2^2+2\|y\|_2^2. Ez az azonosság a Cauchy–Schwarz lemmától független, csak a skalárszorzat bilinearitását használja.

Az ℓ1\ell_1-ellenőrzés: x=(1,0)⊤x=(1,0)^\top, y=(0,1)⊤y=(0,1)^\top esetén x+y=(1,1)⊤x+y=(1,1)^\top és x−y=(1,−1)⊤x-y=(1,-1)^\top. A bal oldal 22+22=82^2+2^2=8, a jobb oldal 2⋅12+2⋅12=42\cdot1^2+2\cdot1^2=4. Az ℓ1\ell_1-norma tehát valódi norma, de nem euklideszi indukált norma.

F3 megoldása.

import numpy as np

def batched_norm(X):
    return np.sqrt(np.einsum("ij,ij->i", X, X))

def batched_cosine(X, Y):
    denom = batched_norm(X) * batched_norm(Y)
    num = np.einsum("ij,ij->i", X, Y)
    with np.errstate(divide="ignore", invalid="ignore"):
        return num / denom

X = np.array([[2.0, 1.0],
              [3.0, 0.0],
              [1.0, 1.0]], dtype=np.float64)
Y = np.array([[-1.0, 2.0],
              [0.0, 4.0],
              [2.0, 2.0]], dtype=np.float64)

print("X shape", X.shape, "Y shape", Y.shape)
print("norm", batched_norm(X))
print("cosine", batched_cosine(X, Y))
X shape (3, 2) Y shape (3, 2)
norm [2.23606798 3.         1.41421356]
cosine [0. 0. 1.]

Alakellenőrzés: az einsum a jj tengelyt húzza össze, így (N,) az eredmény. A nulla soros inputra a nevező 0, és a np.errstate alatt a hányados nan lesz.

F4 megoldása. A hiba a nevezőben van: a * b NumPy-ban elemenkénti szorzat, így np.linalg.norm(a * b) az (a1b1,…,adbd)(a_1b_1,\dots,a_db_d) vektor normája, nem pedig ∥a∥2∥b∥2\|a\|_2\|b\|_2. Az a=(1,1)⊤a=(1,1)^\top, b=(2,0)⊤b=(2,0)^\top párra a hibás nevező ∥(2,0)⊤∥2=2\|(2,0)^\top\|_2=2, a számláló 2, tehát a függvény 1-et ad. A helyes érték 2/(2⋅2)=1/2≈0.7072/(\sqrt2\cdot2)=1/\sqrt2\approx0.707. A javítás:

def cosine_fixed(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

F5 megoldásminta. Megfigyelési egység: scene_id, mert egy jelenet két nézete nem független 1.3. Adatfelosztás és a megfigyelési egység. Párosítás: mind a 180 azonos jelenetű nézetpárt használjuk; kontrollként minden jelenet view_0 képét a rákövetkező jelenet view_0 képével párítjuk, ezzel 180 különböző jelenetű párt kapunk. Előfeldolgozás: img.reshape(-1) a (1,24,24) tensorból, float64 számítás, nincs további skálázás. Metrika: a páronkénti d(x,y)=∥x−y∥2d(x,y)=\|x-y\|_2, összefoglalásként a két csoport átlaga és a 95. percentilis. Baseline: az egyszerű azonos–különböző véletlen találati arány önmagában nem tartalmas; ezért a különböző párok távolságeloszlása a kontroll. Ha az azonos jelenetű párok átlagos távolsága kisebb, az arra utal, hogy a jelenetazonosság őriz közös pixelstruktúrát. Korlát: a kísérlet nem választ modellt, csak leíró; az eredmény függ a nyers pixelreprezentációtól és a megvilágítási eltolódástól, ezért nem általános képminőségi állítás.

3.1.11 Tipikus tévedés ellenpéldával

Gyakori hiba: „a skalárszorzat nagyobb, tehát a két vektor hasonlóbb”. Az F1 ellenpélda ezt cáfolja: x=(2,0)⊤x=(2,0)^\top és z=(1000,0)⊤z=(1000,0)^\top skalárszorzata 2000, xx és (0,0.1)⊤(0,0.1)^\top skalárszorzata 0, mégis az utóbbi pár euklideszi távolsága körülbelül 2.0, az előbbié körülbelül 998. A skalárszorzat nyers, hosszfüggő mennyiség. A koszinusz-hasonlóság ezt a hosszhatást kiküszöböli, de a hasonlóság még így sem abszolút: ha u=(1,1)⊤u=(1,1)^\top és v=(2,2)⊤v=(2,2)^\top, a koszinusz 1, noha d(u,v)=2d(u,v)=\sqrt2. A komponensenkénti eltérő skálázás ugyancsak megváltoztatja a geometriát: u=(1,0)⊤u=(1,0)^\top, v=(0,1)⊤v=(0,1)^\top távolsága 2\sqrt2, de ha az első koordinátát 100-zal, a másodikat 1-gyel szorozzuk, u′=(100,0)⊤u'=(100,0)^\top, v′=(0,1)⊤v'=(0,1)^\top távolsága 10001≈100\sqrt{10001}\approx100. A választott reprezentáció és mértékegység tehát része a hasonlósági állításnak; ortonormált bázisváltoztatás nélkül a megőrzés nem automatikus.

3.1.12 Önellenőrzés és visszacsatolás

A 2. tétel bizonyításában a négyzetre emelés megfordítása azért érvényes, mert mindkét oldal nemnegatív. Az 1. lemmában az y=0y=0 esetet külön kezeltük, mert ott a másodfokú diszkusszió nem alkalmazható. A batch-számításnál az axis=1 redukció (N,) eredményt ad; az axis nélküli np.sum(X*Y) skalárrá összegez, ami nem a soronkénti dot. A koszinusz csak nemnulla vektorokra definiált; a nullvektoros normalizálás nan-t vagy hibát ad, és ezt a hívó szerződésben rögzíteni kell. Ez a pont visszahívja a 2.1. Python, NumPy és tenzoralak alak- és broadcasting-ellenőrzését: a redukció tengelye a matematikai indexelésnek felel meg, nem tetszőleges megjelenítési részlet.

3.1.13 Rövid összefoglaló

A dd-dimenziós valós vektor standard bázisbeli koordinátákkal adott; a skalárszorzat koordinátánkénti szorzatösszeg. Az euklideszi norma a skalárszorzatból indukált hossz, a távolság a különbségvektor hossza. A Cauchy–Schwarz-egyenlőtlenségből levezett háromszög-egyenlőtlenség a távolság metrikatulajdonságát adja. Az ortogonalitás nulla skalárszorzat; a koszinusz-hasonlóság a hosszakra normalizált irányhasonlóság. A labor három vektorpárt kézzel és NumPy-ban ellenőrzött, és megmutatta, hogy a távolság egy vektor skálázásakor általában nem lineárisan változik. A hasonlóság és távolság a választott bázistól és skálától függ.

3.1.14 Következő alkalmazás

A 3.2. Mátrixszorzás és affín réteg mátrixszorzás és affin réteg egység a skalárszorzatot a lineáris réteg építőköveként használja: a W∈ℝm×dW\in\mathbb R^{m\times d} súlymátrix minden sora és az xx bemenet egy-egy skalárszorzatot képez, a bias hozzáadása pedig az affin eltolást adja.

3.1.15 Források