{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Uczenie maszynowe i jego wyzwania\n", "\n", "Uwaga: my skupiamy się na uczeniu maszynowym na tekstach (i ostatecznie zmierzamy do ekstrakcji z dokumentów tekstowych).\n", "\n", "## Oznaczenia\n", "\n", "* $x$ — wejście (często interpretowane jako wektor $\\vec{x}$) \n", "* $y$ — oczekiwane wyjście\n", "* $\\hat{y}$ — przewidywane wyjście\n", "* $(X, Y)$, zbiór wejść $X$ traktujemy jako listę $X = (x_1, \\dots, x_N)$ albo jako macierz, a $Y$ jest na ogół ciągiem liczb albo wektorem\n", "* $V$ — słownik (zbiór słów/symboli)\n", " * $V^*$ — zbiór wszystkich tekstów (ciągów na $V$)\n", "* $C = \\{c_1, c_2, \\dots, c_n\\}$ — zbiór klas\n", " * $\\bar{c}$ - dopełnienie klasy $c$\n", "* $L = \\{l_1, l_2, \\dots, l_n\\}$ — zbiór etykiet/tagów (_labels_/_tags_)\n", " * czasami wymiennie używać będziemy terminów klasa oraz etykieta/tag\n", " * $L^*$ — zbiór wszystkich ciągów etykiet\n", "* $q$ — zapytanie\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rekomendacje książkowe\n", "\n", "(Bez aparatu matematycznego! Na przykład do polecenia laikowi.)\n", "\n", "* Stanisław Lem, _Summa technologiae_, Wydawnictwo Literackie, 1964\n", " * może zacząć od spojrzenia, jak kiedyś sobie to wyobrażano?\n", "* Pedro Domingos, _Naczelny Algorytm. Jak jego odkrycie zmieni nasz świat_, Helion, 2016\n", " * książka się trochę zestarzała, czas pokazał, że autor nie do końca trafnie przewidział, jak się dalej potoczą losy uczenia maszynowego (sieci neuronowe zdecydowanie wygrały)\n", " * ... ale bardzo ciekawe spostrzeżenia, dobrze się czyta\n", "* Kai-Fu Lee, _Inteligencja sztuczna, rewolucja prawdziwa_, Media Rodzina, 2019.\n", " * ciekawe w kontekście ekonomicznym, szczególnie Chin\n", " \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Podstawowa idea\n", "\n", "**Uczenie maszynowe to odwrotność programowania** (trochę tak jak $\\sqrt{...}$ jest odwrotnością $^2$)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![Uczenie maszynowe a programowanie](./uczenie-a-programowanie.png)\n", "\n", "(Na razie trochę upraszczamy - odnosimy się tylko do uczenia nienadzorowanego.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5 epok uczenia maszynowego\n", "\n", "### I. Systemy regułowe\n", "\n", "Systemy regułowe, wyrażenia regularne, systemy eksperckie, programowanie logiczne (Prolog)\n", "\n", "Praca człowieka: tworzenie reguł (czasochłonne!)\n", "\n", "### II. Proste algorytmy uczenia maszynowego (lata 90.)\n", "\n", "Naiwny klasyfikator bayesowskie, regresja logistyczna, SVM, XGBoost\n", "\n", "Praca człowieka: inżynieria cech, optymalizacja hiperparametrów, unikanie przeuczenia\n", "\n", "### III. Sieci neuronowe 1 - ucz na _big data_ (2012-2016)\n", "\n", "Sieci feed-forward, splotowe, LSTM; wymagane duże zbiory uczące (w trybie nadzorowanym).\n", "\n", "Praca człowieka: specyficzna architektura, przygotowanie dużego zbioru danych\n", "\n", "### IV. Sieci neuronowe 2 - pretrenuj i dostrajaj (2017-2020)\n", "\n", "Sieci konwolucyjne, LSTM (ELMo), Transformer (BERT). Zbiory uczące do uczenia nadzorowanego nie muszą być obszerne.\n", "\n", "Praca człowieka: dostrajanie modelu.\n", "\n", "### V. Sieci neuronowe 3 - pretrenuj i... po po prostu korzystaj (2019-)\n", "\n", "Duże wielowarstwowe generatywne modele Transformer (GPT-2/3, T5), uczenie few-, one- i zero-shot.\n", "\n", "Praca człowieka: jak sformułować zadanie w języku naturalnym?\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rodzaje uczenia maszynowego\n", "\n", "* uczenie nienadzorowane (_unsupervised learning_)\n", "* uczenie nadzorowane (_supervised learning_)\n", " * predykcja prostej wartości\n", " * klasyfikacja\n", " * klasyfikacja binarna\n", " * klasyfikacja wieloklasowa\n", " * regresja\n", " * ekstrakcja informacji \n", " * zadania _seq2seq_\n", " * etykietowanie sekwencji (_sequence labeling_)\n", " * tłumaczenie maszynowe (szeroko rozumiane)\n", " * automatyczne streszczanie (sumaryzacja) \n", " \n", " \n", " \n", " \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Uczenie maszynowe - widok z góry\n", "\n", "![Uczenie maszynowe - schemat](./uczenie-schemat.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Wyzwania uczenia maszynowego\n", "\n", "Zbiór danych (_data set_) - w uczeniu nadzorowanym po prostu zestaw danych wejściowych i oczekiwanych danych wyjściowych $(X, Y)$.\n", "Wyzwanie uczenia maszynowego (_ML challenge_) - ustandaryzowany zbiór danych, podzielony na zbiór uczący i zbiory testowe, z określoną metryką ewaluacji.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zob. listę na stronie https://gonito.net/list-challenges" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Uczenie nadzorowane\n", "\n", "#### Klasyfikacja binarna\n", "\n", "$$V^* \\mapsto \\{c,\\bar{c}\\}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Przykłady:\n", " \n", "* klasyfikacja spam/nie-spam \n", "* https://gonito.net/challenge/petite-difference-challenge2\n", "* https://gonito.net/challenge/sentiment-by-emoticons\n", "* https://gonito.net/challenge/sane-words" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Na platformie Gonito wyzwania (i zgłoszenia) są dostępne jako repozytoria git." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/home/filipg/ext/amu/aitech-eks/wyk\n", "Klonowanie do „sentiment-by-emoticons”...\n", "remote: Wymienianie obiektów: 29, gotowe.\u001b[K\n", "remote: Zliczanie obiektów: 100% (29/29), gotowe.\u001b[K\n", "remote: Kompresowanie obiektów: 100% (25/25), gotowe.\u001b[K\n", "remote: Razem 29 (delty 5), użyte ponownie 0 (delty 0), paczki użyte ponownie 0\n", "Pobieranie obiektów: 100% (29/29), 155.07 MiB | 2.39 MiB/s, gotowe.\n", "Rozwiązywanie delt: 100% (5/5), gotowe.\n" ] } ], "source": [ "%cd wyk\n", "! git clone --single-branch git://gonito.net/sentiment-by-emoticons" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/home/filipg/ext/amu/aitech-eks/wyk/sentiment-by-emoticons\n", "config.txt dev-0 README.md test-A train\n" ] } ], "source": [ "%cd sentiment-by-emoticons\n", "! ls" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--metric LogLoss --metric Accuracy --precision 5 -%\n" ] } ], "source": [ "# plik konfiguracyjny\n", "! cat config.txt" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "expected.tsv in.tsv.xz meta.tsv.xz\n" ] } ], "source": [ "# zbiór uczący, oczywiście z oczekiwanym wyjściem\n", "! ls train" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "expected.tsv in.tsv meta.tsv\n" ] } ], "source": [ "# zbiór deweloperski też ma\n", "! ls dev-0" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "in.tsv\n" ] } ], "source": [ "# a ostateczny zbiór testowy - nie ma (plik jest dostępny tylko dla ewaluatora)\n", "! ls test-A" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\t1) Amor omnia vincit!!!!- miłość wszystko zwycięży!!!! 2) każdy człowiek jest jak kwiat...Więdnieje bez miłości *) 3) Szukaj mnie cierpliwie dzień po dniu... 4) BĄDű DLA INNYCH SŁONECZNYM ZEGAREM, ODMIERZAJ TYLKO SŁONECZNE GODZINY 5) \\\"... Momenty ze ze snu wyrwana; zas nie wyspana...\\\" 6) ULEWA JEST MA SIOSTRA , STRUMIEN BRATEM 7) KażdaMiłośMusiPrzejścPrzezPróbęWtedyOkażeSięJejPrawdziwaWartość... 8) Zaplątana w pajęczynę snów.. Lepkie nici marzeń.. Utkane przez noc.. 9) Podobno ludzi lubimy za ich zalety, a kochamy za ich wady.... 10) Pozwól mi pozostać... 11) KIEDYŚ-to juz przeszeszłosc...Trzeba przyzwyczajic sie do-DZISIAJ;/ 12) To MoJa JeSt..NiEdOrOsLa MiLoSć..UpArcIe WiEc...BeDe BrOnIć JeJ... 13) Jeszcze jeden krok , a zgine.. 14) *CoRazBl!ŻejŚw!ęTa* NapisałamListDoŚw.Mikołaja ProszącOTwojąMiłość! 15) JeStEm W TeScO Na UrOdZiNaCh <EMOTICON> <EMOTICON> <EMOTICON> 16) Facet jest jak plemnik,tylko jeden na milion staje się człowiekiem! 17) Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to myślę iż wątpię 18) Samotna wśród ludzi którzy myślą...ONA NIGDY NIE JEST SAMA ! 19) PotrzebaCałegoŻycia, AbyZapomniecOKimś, KtoByłDla NasNaprawdeWażny :&# 20) NieŻałujTegoCoZrobiłeś,KaraPrzyjdzieZCzasem;TymczasemUczSięDobroci...\n", "0\t@ Rodzyn \"Ech szkoda, że to wersja komercyjna <EMOTICON>\" A jaki to problem załatać jądro np. za pomocą RTAI lub skorzystać z preempt_RT? Tylko co ci po tym? @ Mily \"Ja chetnie bym przetestowal ten system. Mysle, ze pomimo ze jest on dedykowany do innych zastosowan, bardzo dobrze sprawowal by sie jako system desktopowy. Mam tu na mysli gwarantowane czsy odpowiedzi (muzyka, film, reakcja interface'u graficznego na dzialania uzytkownika).\" To nie działa w ten sposób. Zagadnienia systemów czasu rzeczywistego są o wiele bardziej skomplikowane. Zazwyczaj tylko krytyczne aplikacje działają w czasie rzeczywistym. Gdybyś nadał priorytet czasu rzeczywistego wszystkim aplikacjom \"zwykłego użytkownika\" walczyłyby między sobą o zasoby tak samo jak teraz. O wiele lepiej byłoby gdyby w końcu zaczęto tworzyć aplikacje również z myślą o oszczędności zasobów. @ Macius \"8 rdzeni rowna sie 1system, 2desktop, 3muza,4film, 5net, 6 7 8 inne pierdoly ktore dzialaja w czasie rzeczywistym to jest cos.\" Wybacz, ale uważam to za piekielne marnotrawienie zasobów. Chcesz żeby jeden rdzeń obsługiwał np. tylko muzykę? Przecież to będzie jakieś 5% zasobów współczesnego rdzenia. Wszystko działałoby szybciej gdybyśmy większą uwagę przywiązywali do szybkości działania aplikacji niż jej wizualnych bajerów.\n", "0\tCzy u Was też taka brzydka pogoda, która sprawia, że nic się nie chce?<EMOTICON> ale ja na szczęście jakoś chyba na przekór tej jesieni zaczęłam wyplatać...\n", "0\tPo spektaklu w teatrze,,KOMEDIA''wracałam obok tej pani samochodem i uśmiechałam się ,ale pani jest faktycznie sztuczna i sztywna....zagrała ,wyszła i ma gdzieś sympatię ludzi...ja już jej nie mam dla tej pani<EMOTICON>\n", "1\ta wtedy i ekskomunika niestraszna <EMOTICON>\n", "paste: błąd zapisu: Przerwany potok\n", "paste: błąd zapisu\n" ] } ], "source": [ "# W każdym wierszu jest osobny dokument\n", "! xzcat train/in.tsv.xz | paste train/expected.tsv - | head -n 5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Klasyfikacja wieloklasowa\n", "\n", "$$V^* \\mapsto \\{c_1,\\dots,c_n\\}$$\n", "\n", "#### Regresja\n", "\n", "$$V^* \\mapsto \\mathbb{R}$$\n", "\n", "#### Zadania seq2seq\n", "\n", "$$V^* \\mapsto Y^*$$\n", "\n", "##### Zadania tłumaczenia maszynowego\n", "\n", "$$V^* \\mapsto V^*$$\n", "\n", "##### Zadania sequence labeling\n", "\n", "$$V^* \\mapsto L^*$$\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.2" } }, "nbformat": 4, "nbformat_minor": 4 }