Umelá inteligencia - nám predpovie budúcnosť
V predchádzajúcich dieloch ste videli:
Umelá inteligencia sa učí počítať
Umelá inteligencia - prvý praktický príklad v rozpoznávaní obrazu
Data augmentation
Vytvorenie datasetu
Prvé kroky k programovaniu
Umelá inteligencia v rozpoznávaní obrazu
Umelá inteligencia nás všetkých zabije
Úvod
Dnes sa definitívne presvedčíme či je tento svet dopredu daný, alebo máme nejakú možnosť ovplyvniť to čo sa okolo nás deje.Bohužiaľ aj v prvolíniovej fyzike máme veci ako mainstream a veľa vedcov sa bojí z neho vybočiť aby sa nejak nezosmiešnili.
Keď Georges Lemaître prišiel za Albertom Einsteinom tak ten ho vlastne poslal do zádele a povedal mu, že hoci sú jeho výpočty správne, tak jeho fyzika je ohavná.
Bolo to v dobe keď sa "vedelo", že vesmír je statický a večný.
Sám veľký Einstein sa musel časom Lemaîtremu ospravedlniť a zrušil aj vesmírnu konštantu.
Takže dnes "vieme", že vesmír nie je statický a rozpína sa stále rýchlejšie. Podľa týchto pozorovaní, sa vieme pohybovať v čase dozadu a vypočítať čas vzniku vesmíru, čiže Veľkého tresku.
Samozrejme sa vieme teoreticky "pohybovať" v čase aj dopredu a vieme vypočítať čo bude ďalej. Hustota hmoty v celom priestore vesmíru sa bude postupne zmenšovať až sa začnú rozpadávať galaxie, planéty, atómy a nakoniec aj častice hmoty.
Ak by to niekoho zaujímalo, tak ďalej v tejto práci pokračoval George Gamow. Hlavne je okolo toho už slušná matematika, kde je viac menej všetko objasnené.
Takže už dnes vieme budúcnosť všetkého.
Ideme na to
Stiahnem si nejaké hotové dáta z netu. A kde sa taká náhoda odohráva dva krát do týždňa? Áno trafili ste, ideme predpovedať čísla na Loto.Trošku teórie o našich dátach. Vieme čo bude z celým vesmírom za sto miliárd rokov, ale nikto netuší čo bude za hodinu.
Naše vedomosti by sa dali zobraziť takto:
Keď ideme v grafe zľava, tak vieme predpovedať celý vesmír, ale nevieme aké čísla sa zajtra vylosujú v Lote. Ja som tam označil ~1% miesto kde budeme približne predpovedať vylosované čísla, čiže výsledok bude 1 ku 99. Možno ste sklamaný, ale je to stále lepšie ako 1 ku 15 000 000. Ako som trafil pomer 1 ku 99? Tak trochu zo skúseností koľko dát potrebujeme aby sme sa dopátrali k očakávaným výsledkom.
Zaujímavosti
Aby som nahradil dostatok dát, tak som sa pokúsil na čísla použiť rovnakú techniku ako sa používa na obraz, čiže z nich vytiahneme vlastnosti. Docielime toho vektorizáciou čísiel, alebo sa tomu hovorieva aj "one hot vektor".Najlepšie to uvidíte na príklade. Pre jednoduchosť si to ukážeme na číslach od 0 do 5.
Nula = 100000 Jednotka = 010000 Dvojka = 001000 trojka = 000100 Štvorka = 000010 Päťka = 000001Takže teraz už vidíte, že sa tabuľka čísiel zobrazí rovnako ako dáta v obraze. Keď som riešil problém ako z tak malého počtu výsledkov cca dvetisíc, dostať nejaký výsledok, tak ma samozrejme napadlo LSTM, LSTM + RepeatVector + TimeDistributed, ale moc sa mi výsledky nepozdávali. Ono to je vidieť počas procesu učenia, keď sa sieť na tie dáta zle učí.
Tak ma napadlo, že s tých čísiel nebudem ťahať náväznosť (LSTM) , ale pokúsim o vytiahnutie vlastnosti. Proste či ten vesmír má, alebo nemá nejaké dopredu dané veci, takže som použil konvolučné vrstvy.
Model siete vyzerá takto:
def model_cnn_3 (max_len, max_value, activation): model = Sequential () model.add (Conv2D (32, kernel_size = (3, 3), padding = "valid", strides = (1, 1), activation = activation, input_shape = (max_len, max_value + 1, 1))) model.add (Conv2D (64, kernel_size = (3, 3), padding = "valid", strides = (1, 1), activation = activation)) model.add (Conv2D (128, kernel_size = (3, 3), padding = "valid", strides = (1, 1), activation = activation)) model.add (Flatten ()) model.add (Dense (1000, activation = activation)) model.add (Dense (max_len, activation = activation)) model.compile (optimizer = Adam (), loss = 'mse', metrics = ['accuracy']) return modelVizualizácia modelu:
Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_1 (Conv2D) (None, 5, 48, 32) 320 _________________________________________________________________ conv2d_2 (Conv2D) (None, 3, 46, 64) 18496 _________________________________________________________________ conv2d_3 (Conv2D) (None, 1, 44, 128) 73856 _________________________________________________________________ flatten_1 (Flatten) (None, 5632) 0 _________________________________________________________________ dense_1 (Dense) (None, 1000) 5633000 _________________________________________________________________ dense_2 (Dense) (None, 7) 7007 ================================================================= Total params: 5,732,679 Trainable params: 5,732,679 Non-trainable params: 0 _________________________________________________________________Hotový kód nájdete tu.
Nenájdete tu nič nové, okrem toho, že som modely sieti umiestnil do modulu.
from supermario.model import model_cnn_3
Predpoveď
Takže zo siete vyliezli tieto čísla. Ak som použil len čísla z prvého ťahu:34 20 27 31 27 13 26Vidíme tam chybu, že číslo 27 je tam dva krát
a keď som pridal aj druhý ťah, tak predpovedané čísla sú:
19 21 26 34 37 45 9
Záver
Už som vás pár krát prosil údaje z reálneho života. Napríklad u strájárov o dáta z meraní, kde sa CNCéčka pokúšajú dostať na nulovú chybu, alebo hocičoho iného kde sa snažíme prekonováť chyby vesmíru. Uvítál by som, keby sa niekto oprel do dát z Cernu ako ich jednoducho ťahať. Nie žeby som si to nenašiel sám, ale bol by som rád, keby sa niekto na to odhodlal. Mne tiež vedomosti nepadajú z neba a musím pre to niečo spraviť.Prílohy
- 92.mkv (660.1 kB)
Pre pridávanie komentárov sa musíte prihlásiť.
Data z Cern v plnej krase http://opendata.cern.ch/search?page=1&size=20&type=Dataset
Čo si tam vyčítal?
Ako hladat Higgsov bozon.
https://nbviewer.jupyter.org/github/atlas-outreach-data-tools/notebooks-collection-opendata/blob/master/13-TeV-examples/cpp/ATLAS_OpenData_13-TeV__analysis_example-cpp_Hyy_channel.ipynb
Tiež ma fascinuje, že niektoré javy sú predpovedateľné a niektoré nie sú (alebo nie je známe, že sú predpovedateľné). Keď to zoberiem prakticky, niečo v živote ovplyvniť viem a niečo (možno zdanlivo) absolútne nie a môžem sa aj rozkrájať. Priložil som výstup z TRNG vlastnej výroby. Výstup nie je bielený okrem použitia Von Neumannovho algoritmu. Som naozaj zvedavý, čo v tom nájde umelá inteligencia :)
Dalo by sa to použiť, keby si tam žiadny filter nepridával.
Žiaľ bez filtru (Von Neumann extractor) tie dáta už nemám - musel by som ďalšie vyrobiť. A zo skúsenosti tento algoritmus nestačí, ak nie je dosť dobrý generátor. Aj keby som Ti dal dáta zo záznamu teploty v neustále klimatizovanej miestnosti bez okien, zrejme by umelá inteligencia niečo našla v záznamoch, kde sa nevyskytuje poruchová veličina. Napr. vstupujúci človek do miestnosti, odchádzajúci človek z miestnosti, pridané predmety neznámej tepelnej kapacity a pod. Tým chcem povedať, že sledovať len predchádzajúci stav výstupnej veličiny v drvivej väčšine prípadov nebude postačovať na predikciu budúcnosti. Na výsledný stav vplýva väčšinou viac faktorov. Napr. pri dátach z CNC strojov (nemám k takým prístup) zrejme by si prišiel na to, že tepelné ustálenie stroja má vplyv na výsledok. Medzitým sa opotrebováva nástroj, ktorého korekcie zadáva väčšinou obsluha (možno pri výmene, možno raz za zmenu). Korekcie sa merajú napr. na meracích mikroskopoch alebo profil-projektoroch. Okrem iného ani to isté zloženie obrábaného materiálu nezabezpečí tie isté mechanické vlastnosti pri opracovaní napr. obrábaním, ohýbaním ...
Pointa je mať tých dát masaker. Vtedy sa zotrú rôzne vplivy ktoré tam človek, alebo niečo iné nejak zanese.
Tie dáta z Cernu sú dobrá cesta, sú ich tam milióny a povedzme od 100k hore sa dá z tých dát niečo odvodiť.
Tak keby sa v nich chcelo niekomu prehrabať a popísať ako sa v nich vyznať, to by sme to Loto nabudúce už určite rozbili :-)
Prečo sú v kóde použité dva datasety loto1.csv a loto2.csv, ktoré sú po načítaní spojené do spoločného poľa data a potom rozdelené na X a Y? Loto1 je trénovacia a loto2 testovacia množina? Alebo je možné priložiť ku kódu pár riadkov ako príklad týchto datasetov?
Prihodil som tam download.py, ten ti tie CSVéčka stiahne.
Super, diky.
Tipované čisla:
34 20 27 31 27 13 26
19 21 26 34 37 45 9
Vyžrebované čísla:
11 43 2 1 6 45 49
34 17 30 35 28 4 27
Ako som písal 1 ku 99 :-D