2.3 Tiesinė algebra
Dabar jau galime įkelti duomenų rinkinius į tenzorius ir apdoroti šiuos tenzorius pagrindinėmis matematinėmis operacijomis. Norint pradėti kurti sudėtingus modelius, mums prireiks ir keleto tiesinės algebros įrankių. Šiame skyrelyje švelniai supažindiname su svarbiausiomis sąvokomis, pradedant skaliarine aritmetika ir pereinant prie matricų daugybos.
from mxnet import np, npx
npx.set_np()
import torch
import tensorflow as tf
from jax import numpy as jnp
2.3.1 Skaliarai
Dauguma kasdienės matematikos susideda iš skaičių apdorojimo po vieną. Formaliai šias reikšmes vadiname skaliarais. Pavyzdžiui, temperatūra Palo Alto yra malonūs Farenheito laipsniai. Jei norėtumėte konvertuoti temperatūrą į Celsijaus laipsnius, įvertintumėte išraišką , kai lygus . Šioje lygtyje reikšmės , ir yra pastovūs skaliarai. Kintamieji ir paprastai žymi nežinomus skaliarus.
Skaliarus žymime paprastomis mažosiomis raidėmis (pvz., , ir ), o visų (tolydžiųjų) realiąsias reikšmes įgyjančių skaliarų erdvę – . Patogumo dėlei praleisime griežtas erdvių apibrėžtis: tiesiog prisiminkite, kad išraiška yra formalus būdas pasakyti, kad yra realiąją reikšmę įgyjantis skaliaras. Simbolis (tariamas „priklauso") žymi priklausymą aibei. Pavyzdžiui, rodo, kad ir yra kintamieji, galintys įgyti tik reikšmes arba .
(Skaliarai įgyvendinami kaip tenzoriai, turintys tik vieną elementą.) Toliau priskiriame du skaliarus ir atliekame gerai žinomas sudėties, daugybos, dalybos ir kėlimo laipsniu operacijas.
x = np.array(3.0)
y = np.array(2.0)
x + y, x * y, x / y, x ** y
x = torch.tensor(3.0)
y = torch.tensor(2.0)
x + y, x * y, x / y, x**y
x = tf.constant(3.0)
y = tf.constant(2.0)
x + y, x * y, x / y, x**y
x = jnp.array(3.0)
y = jnp.array(2.0)
x + y, x * y, x / y, x**y
2.3.2 Vektoriai
Šiuo metu vektorių galite įsivaizduoti kaip fiksuoto ilgio skaliarų masyvą. Kaip ir jų atitikmenis kode, šiuos skaliarus vadiname vektoriaus elementais (sinonimai: įrašai ir komponentės). Kai vektoriai vaizduoja realių duomenų rinkinių pavyzdžius, jų reikšmės turi tam tikrą realią reikšmę. Pavyzdžiui, jei apmokytume modelį prognozuoti paskolos neišmokėjimo riziką, galėtume kiekvieną pareiškėją susieti su vektoriumi, kurio komponentės atitinka dydžius, tokius kaip jų pajamos, darbo stažas ar ankstesnių neįvykdymų skaičius. Jei tirtume infarkto riziką, kiekvienas vektorius galėtų vaizduoti pacientą, o jo komponentės galėtų atitikti naujausius gyvybinius požymius, cholesterolio lygį, kasdienio fizinio krūvio minutes ir kt. Vektorius žymime pastorintomis mažosiomis raidėmis (pvz., , ir ).
Vektoriai įgyvendinami kaip -osios eilės tenzoriai. Paprastai tokie tenzoriai gali būti savavališko ilgio, priklausomai nuo atminties apribojimų. Dėmesio: Python, kaip ir daugumoje programavimo kalbų, vektorių indeksai prasideda nuo (angl. zero-based indexing, indeksavimas nuo nulio), o tiesinėje algebroje apatiniai indeksai prasideda nuo (indeksavimas nuo vieneto).
x = np.arange(3)
x
x = torch.arange(3)
x
x = tf.range(3)
x
x = jnp.arange(3)
x
Vektoriaus elementą galime nurodyti naudodami apatinį indeksą. Pavyzdžiui, žymi antrąjį elementą. Kadangi yra skaliaras, jo nepastoriname. Pagal numatytuosius nustatymus vektorius vizualizuojame sudėdami jo elementus vertikaliai:
Čia yra vektoriaus elementai. Vėliau atskirsime tokius stulpelio vektorius ir eilutės vektorius, kurių elementai sudėti horizontaliai. Prisiminkite, kad tenzoriaus elementus pasiekiame indeksavimu.
x[2]
Norėdami nurodyti, kad vektorių sudaro elementų,
rašome .
Formaliai vadiname vektoriaus dimensija.
Kode tai atitinka tenzoriaus ilgį,
pasiekiamą Python integruota funkcija len.
len(x)
Ilgį taip pat galime pasiekti per atributą shape.
Forma yra kortežas, nurodantis tenzoriaus ilgį kiekviena ašimi.
(Tenzorių, turinčių tik vieną ašį, formos turi tik vieną elementą.)
x.shape
Dažnai žodis „dimensija" vartojamas dviprasmiškai: tiek ašių skaičiui, tiek ilgiui tam tikra ašimi žymėti. Kad išvengtume šios painiavos, ašių skaičiui žymėti vartojame terminą eilė, o dimensija – tik komponenčių skaičiui žymėti.
2.3.3 Matricos
Kaip skaliarai yra -osios eilės tenzoriai, o vektoriai – -osios eilės tenzoriai, taip matricos yra -osios eilės tenzoriai. Matricas žymime pastorintomis didžiosiomis raidėmis (pvz., , ir ) ir kode vaizduojame tenzoriais su dviem ašimis. Išraiška rodo, kad matricą sudaro realiąsias reikšmes įgyjančių skaliarų, išdėstytų eilučių ir stulpelių. Kai , sakome, kad matrica yra kvadratinė. Vizualiai bet kurią matricą galime pavaizduoti kaip lentelę. Kad nurodytume atskirą elementą, pridedame apatinius eilutės ir stulpelio indeksus, pvz., yra reikšmė, priklausanti -ajai eilutei ir -ajam stulpeliui:
Kode matricą
vaizduojame -osios eilės tenzoriumi, kurio forma (, ).
Bet kurį tinkamo dydžio tenzorių galime paversti
matrica,
nurodę norimą formą funkcijai reshape:
A = np.arange(6).reshape(3, 2)
A
A = torch.arange(6).reshape(3, 2)
A
A = tf.reshape(tf.range(6), (3, 2))
A
A = jnp.arange(6).reshape(3, 2)
A
Kartais norime apversti ašis. Kai sukeičiame matricos eilutes ir stulpelius, rezultatas vadinamas jos transponuota matrica. Formaliai matricos transponuotą matricą žymime , ir jei , tai visiems ir . Taigi matricos transponuota matrica yra matrica:
Kode bet kurios (matricos transponuotą matricą) galime gauti taip:
A.T
tf.transpose(A)
Simetrinės matricos yra kvadratinių matricų poaibis, lygių savo pačių transponuotoms matricoms: . Ši matrica yra simetrinė:
A = np.array([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
A == A.T
A = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
A == A.T
A = tf.constant([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
A == tf.transpose(A)
A = jnp.array([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
A == A.T
Matricos naudingos duomenų rinkiniams vaizduoti. Paprastai eilutės atitinka atskirus įrašus, o stulpeliai – skirtingus atributus.
2.3.4 Tenzoriai
Nors su vien skaliarais, vektoriais ir matricomis galite nueiti toli savo mašininio mokymosi kelyje, galiausiai gali prireikti dirbti su aukštesnės eilės tenzoriais. Tenzoriai (suteikia mums bendrą būdą aprašyti -osios eilės masyvų plėtinius.) Programinius tenzoriaus klasės objektus vadiname „tenzoriais" būtent todėl, kad jie taip pat gali turėti savavališką ašių skaičių. Nors gali būti painu vartoti žodį tenzorius ir matematiniam objektui, ir jo įgyvendinimui kode, mūsų reikšmė paprastai turėtų būti aiški iš konteksto. Bendruosius tenzorius žymime didžiosiomis raidėmis specialiu šriftu (pvz., , ir ), o jų indeksavimo mechanizmas (pvz., ir ) natūraliai išplaukia iš matricų indeksavimo.
Tenzoriai taps svarbesni, kai pradėsime dirbti su vaizdais. Kiekvienas vaizdas pateikiamas kaip -iosios eilės tenzorius, kurio ašys atitinka aukštį, plotį ir kanalą. Kiekvienoje erdvinėje vietoje kiekvienos spalvos (raudonos, žalios ir mėlynos) intensyvumai sudedami kanalo ašimi. Be to, vaizdų rinkinys kode vaizduojamas -osios eilės tenzoriumi, kurio skirtingi vaizdai indeksuojami pirmąja ašimi. Aukštesnės eilės tenzoriai konstruojami, kaip ir vektoriai bei matricos, didinant formos komponenčių skaičių.
np.arange(24).reshape(2, 3, 4)
torch.arange(24).reshape(2, 3, 4)
tf.reshape(tf.range(24), (2, 3, 4))
jnp.arange(24).reshape(2, 3, 4)
2.3.5 Pagrindinės tenzorių aritmetikos savybės
Skaliarai, vektoriai, matricos ir aukštesnės eilės tenzoriai turi keletą patogių savybių. Pavyzdžiui, poelementės operacijos sukuria išvestis, kurių forma tokia pati kaip operandų.
A = np.arange(6).reshape(2, 3)
B = A.copy() # Assign a copy of A to B by allocating new memory
A, A + B
A = torch.arange(6, dtype=torch.float32).reshape(2, 3)
B = A.clone() # Assign a copy of A to B by allocating new memory
A, A + B
A = tf.reshape(tf.range(6, dtype=tf.float32), (2, 3))
B = A # No cloning of A to B by allocating new memory
A, A + B
A = jnp.arange(6, dtype=jnp.float32).reshape(2, 3)
B = A
A, A + B
Dviejų matricų poelementė sandauga vadinama jų Adamaro sandauga (žymima ). Dviejų matricų Adamaro sandaugos įrašus galime išrašyti:
A * B
Pridėjus skaliarą prie tenzoriaus arba padauginus skaliarą ir tenzorių, gaunamas rezultatas, kurio forma tokia pati kaip pradinio tenzoriaus. Čia prie kiekvieno tenzoriaus elemento pridedamas skaliaras (arba jis dauginamas iš skaliaro).
a = 2
X = np.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape
a = 2
X = torch.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape
a = 2
X = tf.reshape(tf.range(24), (2, 3, 4))
a + X, (a * X).shape
a = 2
X = jnp.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape
2.3.6 Redukavimas
Dažnai norime apskaičiuoti tenzoriaus elementų sumą. Vektoriaus , kurio ilgis , elementų sumai išreikšti rašome . Tam yra paprasta funkcija:
x = np.arange(3)
x, x.sum()
x = torch.arange(3, dtype=torch.float32)
x, x.sum()
x = tf.range(3, dtype=tf.float32)
x, tf.reduce_sum(x)
x = jnp.arange(3, dtype=jnp.float32)
x, x.sum()
Kad išreikštume savavališkos formos tenzorių elementų sumas, tiesiog sumuojame pagal visas jo ašis. Pavyzdžiui, matricos elementų suma galėtų būti užrašyta .
A.shape, A.sum()
A.shape, tf.reduce_sum(A)
Pagal numatytuosius nustatymus iškvietus sumos funkciją
tenzorius redukuojamas visomis ašimis,
galiausiai gaunamas skaliaras.
Mūsų bibliotekos taip pat leidžia nurodyti ašis,
kuriomis tenzorius turi būti redukuojamas.
Norėdami susumuoti visus elementus eilutėmis (0 ašis),
funkcijoje sum nurodome axis=0.
Kadangi įvesties matrica redukuojama 0 ašimi,
kad gautume išvesties vektorių,
šios ašies išvesties formoje nėra.
A.shape, A.sum(axis=0).shape
A.shape, tf.reduce_sum(A, axis=0).shape
Nurodžius axis=1, bus redukuojamas stulpelių matmuo (1 ašis), susumuojant visų stulpelių elementus.
A.shape, A.sum(axis=1).shape
A.shape, tf.reduce_sum(A, axis=1).shape
Matricos redukavimas sumuojant ir eilutėmis, ir stulpeliais yra ekvivalentus visų matricos elementų susumavimui.
A.sum(axis=[0, 1]) == A.sum() # Same as A.sum()
tf.reduce_sum(A, axis=[0, 1]), tf.reduce_sum(A) # Same as tf.reduce_sum(A)
Susijęs dydis yra vidurkis, dar vadinamas aritmetiniu vidurkiu.
Vidurkį skaičiuojame dalydami sumą
iš bendro elementų skaičiaus.
Kadangi vidurkio skaičiavimas toks dažnas,
jam skirta atskira bibliotekos funkcija,
veikianti analogiškai kaip sum.
A.mean(), A.sum() / A.size
A.mean(), A.sum() / A.numel()
tf.reduce_mean(A), tf.reduce_sum(A) / tf.size(A).numpy()
Panašiai vidurkio skaičiavimo funkcija taip pat gali redukuoti tenzorių konkrečiomis ašimis.
A.mean(axis=0), A.sum(axis=0) / A.shape[0]
tf.reduce_mean(A, axis=0), tf.reduce_sum(A, axis=0) / A.shape[0]
2.3.7 Suma be redukavimo
Kartais gali būti naudinga išlaikyti nepakeistą ašių skaičių, kviečiant sumos ar vidurkio skaičiavimo funkciją. Tai svarbu, kai norime naudoti transliavimo mechanizmą.
sum_A = A.sum(axis=1, keepdims=True)
sum_A, sum_A.shape
sum_A = tf.reduce_sum(A, axis=1, keepdims=True)
sum_A, sum_A.shape
Pavyzdžiui, kadangi sum_A po kiekvienos eilutės susumavimo išlaiko abi ašis,
galime (padalyti A iš sum_A naudodami transliavimą),
kad sukurtume matricą, kurios kiekvienos eilutės suma lygi .
A / sum_A
Jei norime apskaičiuoti A elementų kaupiamąją sumą tam tikra ašimi,
tarkime, axis=0 (eilutė po eilutės), galime iškviesti funkciją cumsum.
Pagal paskirtį ši funkcija neredukuoja įvesties tenzoriaus jokia ašimi.
A.cumsum(axis=0)
tf.cumsum(A, axis=0)
2.3.8 Skaliarinės sandaugos
Iki šiol atlikome tik poelementes operacijas, sumas ir vidurkius. Ir jei tai būtų viskas, ką galime daryti, tiesinė algebra nenusipelnytų atskiro skyrelio. Laimei, čia viskas tampa įdomiau. Viena pagrindinių operacijų yra skaliarinė sandauga. Kai duoti du vektoriai , jų skaliarinė sandauga (dar žinoma kaip vidinė sandauga, ) yra tos pačios padėties elementų sandaugų suma: .
Dviejų vektorių skaliarinė sandauga yra tos pačios padėties elementų sandaugų suma
y = np.ones(3)
x, y, np.dot(x, y)
y = torch.ones(3, dtype = torch.float32)
x, y, torch.dot(x, y)
y = tf.ones(3, dtype=tf.float32)
x, y, tf.tensordot(x, y, axes=1)
y = jnp.ones(3, dtype = jnp.float32)
x, y, jnp.dot(x, y)
Ekvivalenčiai, (dviejų vektorių skaliarinę sandaugą galime apskaičiuoti atlikdami poelementę daugybą, o po jos – sumavimą:)
np.sum(x * y)
torch.sum(x * y)
tf.reduce_sum(x * y)
jnp.sum(x * y)
Skaliarinės sandaugos naudingos įvairiuose kontekstuose. Pavyzdžiui, kai duotas reikšmių rinkinys, žymimas vektoriumi , ir svorių (angl. weights) rinkinys, žymimas , reikšmių svertinė suma pagal svorius gali būti išreikšta skaliarine sandauga . Kai svoriai neneigiami ir sudaro sumą , t. y. , skaliarinė sandauga išreiškia svertinį vidurkį. Normalizavus du vektorius iki vienetinio ilgio, skaliarinės sandaugos išreiškia kampo tarp jų kosinusą. Vėliau šiame skyrelyje formaliai pristatysime šią ilgio sąvoką.
2.3.9 Matricos ir vektoriaus sandaugos
Dabar, kai žinome, kaip skaičiuoti skaliarines sandaugas, galime pradėti suprasti sandaugą tarp matricos ir -mačio vektoriaus . Pradžioje savo matricą pavaizduojame jos eilučių vektoriais
kur kiekvienas yra eilutės vektorius, vaizduojantis matricos -ąją eilutę.
Matricos ir vektoriaus sandauga yra tiesiog ilgio stulpelio vektorius, kurio -asis elementas yra skaliarinė sandauga :
Daugybą iš matricos galime laikyti transformacija, projektuojančia vektorius iš į . Šios transformacijos nepaprastai naudingos. Pavyzdžiui, posūkius galime pavaizduoti kaip daugybą iš tam tikrų kvadratinių matricų. Matricos ir vektoriaus sandaugos taip pat aprašo pagrindinį skaičiavimą, naudojamą apskaičiuojant kiekvieno neuroninio tinklo sluoksnio išvestis, kai duotos ankstesnio sluoksnio išvestys.
Matricos ir vektoriaus sandaugai kode išreikšti
naudojame tą pačią funkciją dot.
Operacija nustatoma
pagal argumentų tipą.
Atkreipkite dėmesį, kad A stulpelių dimensija
(jos ilgis 1 ašimi)
turi sutapti su x dimensija (jo ilgiu).
Matricos ir vektoriaus sandaugai kode išreikšti
naudojame funkciją mv.
Atkreipkite dėmesį, kad A stulpelių dimensija
(jos ilgis 1 ašimi)
turi sutapti su x dimensija (jo ilgiu).
Python turi patogų operatorių @,
galintį vykdyti ir matricos–vektoriaus,
ir matricos–matricos sandaugas
(priklausomai nuo argumentų).
Taigi galime rašyti A@x.
Matricos ir vektoriaus sandaugai kode išreikšti
naudojame funkciją matvec.
Atkreipkite dėmesį, kad A stulpelių dimensija
(jos ilgis 1 ašimi)
turi sutapti su x dimensija (jo ilgiu).
A.shape, x.shape, np.dot(A, x)
A.shape, x.shape, torch.mv(A, x), A@x
A.shape, x.shape, tf.linalg.matvec(A, x)
A.shape, x.shape, jnp.matmul(A, x)
2.3.10 Matricų daugyba
Kai perprasite skaliarines sandaugas ir matricos ir vektoriaus sandaugas, matricų daugyba turėtų būti paprasta.
Tarkime, turime dvi matricas ir :
Tegul žymi eilutės vektorių, vaizduojantį matricos -ąją eilutę, o – stulpelio vektorių iš matricos -ojo stulpelio:
Kad sudarytume matricų sandaugą , tiesiog apskaičiuojame kiekvieną elementą kaip skaliarinę sandaugą tarp -osios eilutės ir -ojo stulpelio, t. y. :
Matricų daugybą galime laikyti
matricos ir vektoriaus sandaugų
arba skaliarinių sandaugų atlikimu
ir rezultatų sujungimu į
matricą.
Šiame fragmente
atliekame matricų A ir B daugybą.
Čia A yra matrica su dviem eilutėmis ir trimis stulpeliais,
o B – matrica su trimis eilutėmis ir keturiais stulpeliais.
Po daugybos gauname matricą su dviem eilutėmis ir keturiais stulpeliais.
B = np.ones(shape=(3, 4))
np.dot(A, B)
B = torch.ones(3, 4)
torch.mm(A, B), A@B
B = tf.ones((3, 4), tf.float32)
tf.matmul(A, B)
B = jnp.ones((3, 4))
jnp.matmul(A, B)
Terminas matricų daugyba (angl. matrix–matrix multiplication) dažnai supaprastinamas iki matricų daugybos ir neturėtų būti painiojamas su Adamaro sandauga.
2.3.11 Normos
Vieni naudingiausių tiesinės algebros operatorių yra normos. Neformaliai vektoriaus norma parodo, kiek jis yra didelis. Pavyzdžiui, norma matuoja vektoriaus (Euklido) ilgį. Čia vartojame dydžio sąvoką, susijusią su vektoriaus komponenčių didumu (o ne jo dimensija).
Norma yra funkcija , kuri atvaizduoja vektorių į skaliarą ir tenkina šias tris savybes:
- Kai duotas bet kuris vektorius , jei vektorių (visus jo elementus) padauginame iš skaliaro , jo norma atitinkamai keičiasi:
- Bet kuriems vektoriams ir normos tenkina trikampio nelygybę:
- Vektoriaus norma yra neneigiama ir lygi nuliui tik tada, kai vektorius nulinis:
Daug funkcijų yra tinkamos normos, ir skirtingos normos koduoja skirtingas dydžio sąvokas. Euklido norma, kurią visi išmokome pradinės mokyklos geometrijoje skaičiuodami statiojo trikampio įžambinę, yra vektoriaus elementų kvadratų sumos kvadratinė šaknis. Formaliai tai vadinama norma ir išreiškiama
(**
**)
Metodas norm apskaičiuoja normą.
u = np.array([3, -4])
np.linalg.norm(u)
u = torch.tensor([3.0, -4.0])
torch.norm(u)
u = tf.constant([3.0, -4.0])
tf.norm(u)
u = jnp.array([3.0, -4.0])
jnp.linalg.norm(u)
norma taip pat dažna, o susijęs matas vadinamas Manheteno atstumu. Pagal apibrėžtį norma susumuoja vektoriaus elementų absoliutines reikšmes:
(**
**)
Palyginti su norma, ji mažiau jautri išskirtims. Kad apskaičiuotume normą, absoliutinės reikšmės operaciją sukomponuojame su sumavimo operacija.
np.abs(u).sum()
torch.abs(u).sum()
tf.reduce_sum(tf.abs(u))
jnp.linalg.norm(u, ord=1) # same as jnp.abs(u).sum()
Ir , ir normos yra bendresnių normų atskiri atvejai:
Matricų atveju reikalai sudėtingesni. Juk matricas galima vertinti ir kaip atskirų įrašų rinkinius, ir kaip objektus, veikiančius vektorius ir paverčiančius juos kitais vektoriais. Pavyzdžiui, galime klausti, kiek ilgesnė gali būti matricos ir vektoriaus sandauga palyginti su . Ši mąstymo linija veda prie vadinamosios spektrinės normos. Kol kas pristatome kur kas lengviau apskaičiuojamą Frobenijaus normą, apibrėžiamą kaip matricos elementų kvadratų sumos kvadratinė šaknis:
**
**
Frobenijaus norma elgiasi taip, tarsi būtų matricos formos vektoriaus norma. Iškvietus šią funkciją, bus apskaičiuota matricos Frobenijaus norma.
np.linalg.norm(np.ones((4, 9)))
torch.norm(torch.ones((4, 9)))
tf.norm(tf.ones((4, 9)))
jnp.linalg.norm(jnp.ones((4, 9)))
Nors nenorime per daug skubėti, jau galime sudaryti intuiciją, kodėl šios sąvokos naudingos. Giliajame mokyme dažnai bandome spręsti optimizavimo uždavinius: maksimizuoti stebimiems duomenims priskirtą tikimybę; maksimizuoti su rekomendacijų modeliu susijusias pajamas; minimizuoti atstumą tarp prognozių ir etaloninių stebėjimų; minimizuoti atstumą tarp to paties asmens nuotraukų reprezentacijų, kartu maksimizuojant atstumą tarp skirtingų asmenų nuotraukų reprezentacijų. Šie atstumai, sudarantys giliojo mokymosi algoritmų tikslus, dažnai išreiškiami normomis.
2.3.12 Diskusija
Šiame skyrelyje apžvelgėme visą tiesinę algebrą, kurios jums prireiks, kad suprastumėte didelę šiuolaikinio giliojo mokymosi dalį. Tiesinė algebra turi daug daugiau, ir didelė jos dalis naudinga mašininiam mokymuisi. Pavyzdžiui, matricas galima skaidyti į daugiklius, o šie skaidiniai gali atskleisti žemos dimensijos struktūrą realiuose duomenų rinkiniuose. Yra ištisų mašininio mokymosi porūšių, kurie sutelkia dėmesį į matricų skaidinių ir jų apibendrinimų aukštesnės eilės tenzoriams naudojimą, kad atskleistų duomenų rinkinių struktūrą ir spręstų prognozavimo uždavinius. Tačiau ši knyga sutelkia dėmesį į gilųjį mokymąsi. Ir manome, kad jums labiau norėsis išmokti daugiau matematikos, kai praktiškai išbandysite mašininį mokymąsi su realiais duomenų rinkiniais. Taigi, nors pasiliekame teisę vėliau pristatyti daugiau matematikos, čia šį skyrelį baigiame.
Jei norite sužinoti daugiau tiesinės algebros, yra daug puikių knygų ir šaltinių internete. Pažangesniam greitajam kursui apsvarstykite (Strang, 1993), (Kolter, 2008) ir (Petersen ir Pedersen, 2008).
Apibendrinant:
- Skaliarai, vektoriai, matricos ir tenzoriai yra pagrindiniai matematiniai objektai, naudojami tiesinėje algebroje, ir turi atitinkamai nulį, vieną, dvi ir savavališką skaičių ašių.
- Tenzorius galima atpjauti arba redukuoti nurodytomis ašimis
atitinkamai indeksavimu arba operacijomis, tokiomis kaip
sumirmean. - Poelementės sandaugos vadinamos Adamaro sandaugomis. Priešingai, skaliarinės sandaugos, matricos ir vektoriaus sandaugos bei matricų sandaugos nėra poelementės operacijos ir paprastai grąžina objektus, kurių formos skiriasi nuo operandų.
- Palyginti su Adamaro sandaugomis, matricų sandaugos skaičiuojamos gerokai ilgiau (kubiniu, o ne kvadratiniu laiku).
- Normos atspindi įvairias vektoriaus (ar matricos) didumo sąvokas ir dažnai taikomos dviejų vektorių skirtumui, kad būtų išmatuotas jų atstumas.
- Įprastos vektorių normos yra ir normos, o įprastos matricų normos – spektrinė ir Frobenijaus normos.
2.3.13 Pratimai
- Įrodykite, kad matricos transponuotos matricos transponuota matrica yra pati matrica: .
- Kai duotos dvi matricos ir , parodykite, kad sudėtis ir transponavimas komutuoja: .
- Ar bet kurios kvadratinės matricos atveju visada yra simetrinė? Ar galite įrodyti rezultatą naudodami tik ankstesnių dviejų pratimų rezultatus?
- Šiame skyrelyje apibrėžėme tenzorių
X, kurio forma (2, 3, 4). Kokia yralen(X)išvestis? Parašykite savo atsakymą nerašydami jokio kodo, tada patikrinkite atsakymą kodu. - Ar savavališkos formos tenzoriui
Xlen(X)visada atitinka tam tikrosXašies ilgį? Kokia tai ašis? - Paleiskite
A / A.sum(axis=1)ir pažiūrėkite, kas nutinka. Ar galite išanalizuoti rezultatus? - Keliaujant tarp dviejų taškų Manheteno centre, kokį atstumą reikia įveikti koordinačių požiūriu, t. y. prospektais ir gatvėmis? Ar galima keliauti įstrižai?
- Panagrinėkite tenzorių, kurio forma (2, 3, 4). Kokios yra sumavimo išvesčių formos 0, 1 ir 2 ašimis?
- Pateikite tenzorių su trimis ar daugiau ašių funkcijai
linalg.normir stebėkite jos išvestį. Ką ši funkcija apskaičiuoja savavališkos formos tenzoriams? - Panagrinėkite tris dideles matricas, tarkime, , ir , inicializuotas Gauso atsitiktiniais dydžiais. Norite apskaičiuoti sandaugą . Ar yra skirtumas atminties pėdsake ir greityje, priklausomai nuo to, ar skaičiuojate , ar ? Kodėl?
- Panagrinėkite tris dideles matricas, tarkime, , ir . Ar yra skirtumas greityje, priklausomai nuo to, ar skaičiuojate , ar ? Kodėl? Kas pasikeičia, jei inicializuojate nekopijuodami atminties? Kodėl?
- Panagrinėkite tris matricas, tarkime, . Sukonstruokite tenzorių su trimis ašimis, sudėję . Kokia yra dimensija? Atpjaukite antrąją trečiosios ašies koordinatę, kad atkurtumėte . Patikrinkite, ar jūsų atsakymas teisingas.
