Sztuczna inteligencja i uczenie maszynowe: jak się ich nauczyć wizualnie

Ten samouczek stworzyłem jako podstawowy artykuł na temat sztucznej inteligencji.

Każdy nowy przedmiot musi być przedstawiony w języku odpowiadającym poziomowi umiejętności ucznia w tym czasie. Więc nie oczekuj jeszcze szalonych formuł matematycznych.

W szczególności przyjrzymy się uczeniu maszynowemu, czyli Deep Learning.

Głębokość sieci neuronowej zależy od liczby warstw wejściowych.

Algorytmy uczenia maszynowego porównują prawdopodobieństwo określonego zestawu danych z określonym wzorcem.

Myślenie w zakresach

Neurony w twoim mózgu zdecydowanie nie są cyfrowe, ale przypominają logikę binarną jako stan włączenia lub wyłączenia. Ale w oprogramowaniu używamy zamiast tego zakresu wartości.

Wynikiem cyklu obliczeniowego w operacji AI jest dokładna ocena w zakresie od 0,0 do 1,0. Ostatecznie - wartość wyjściowa jest tworzona na podstawie tego, jak dobrze dane wejściowe pasują do określonego wzorca, przy czym 1,0 oznacza 100% dopasowania (rzadko osiągasz to, ale 0,95 - 0,97 jest dobre).

Ten wzór jest zwykle trenowany, zanim można uzyskać znaczące wyniki. Więcej na ten temat nieco później w tym samouczku. Ale po pierwsze, tutaj jest ML w najbardziej podstawowym.

Wszystko zaczyna się od sieci neuronowych - oprogramowania imitującego fizyczną strukturę neuronów w mózgu.

Prosta struktura sieci neuronowej

Uczenie maszynowe w swojej najbardziej podstawowej formie - bardzo prostej sieci neuronowej.

W tym minimalistycznym przykładzie pokazano 1 warstwę wejściową składającą się z 3 węzłów wejściowych.

Zwykle zapewnia się wiele zestawów danych wejściowych na warstwę. Każde wejście jest gromadzone z pewnego rodzaju źródła. Podobnie jak tablica pikseli obrazu wykorzystywanego do rozpoznawania twarzy, na przykład / lub innych danych. To zależy od celu, który próbujesz osiągnąć za pomocą algorytmu AI.

Zarówno wartości wejściowe, jak i wyjściowe są zmiennoprzecinkowe pt. liczby od 0,0 do 1,0.

Logistycznie, podczas działania sieci dane są podawane od lewej do prawej. Jednak… propagacja wsteczna jest czasem wykorzystywana do optymalizacji sieci neuronowej. Wtedy podróżujemy po sieci w odwrotnej kolejności. Ale na razie nie musimy się tym przejmować.

Suma

Suma kilku węzłów wejściowych jest taka, jak się wydaje. Jest to całkowita suma wag z każdego węzła z poprzedniej warstwy wejściowej. Po obliczeniu sumy jest ona następnie przekazywana do funkcji aktywacji w celu przetworzenia.

Funkcja aktywacji

Funkcja aktywacji przekształca sumę wartości wejściowych w wartość wyjściową.

Ale jak to dokładnie działa?

Musimy spojrzeć na inny aspekt uczenia maszynowego.

Pamiętasz te równania matematyczne z liceum? Parabolas - ktoś?

Źródło obrazu: https://pl.wikipedia.org/wiki/Plik:Catenary-pm.svg

Funkcja aktywacji jest dosłownie równaniem matematycznym. Więc dla tych, którzy mają doświadczenie matematyczne, może to być nieco łatwiejsze do zrozumienia. Jeśli nie - czytaj dalej diagramy wizualne i resztę tego samouczka, aby zaczął się zapadać!

Powód, dla którego nie możemy używać prostych równań liniowych, wynika z ich ograniczeń.

Nie są wystarczające do stworzenia użytecznych sieci neuronowych.

Sieci neuronowe są zaprojektowane wokół bardziej złożonych równań. Na przykład funkcja Sigmoid (znana również jako Logistic) jest dość powszechna. (Przyjrzymy się kilku różnym w poniższej sekcji).

Wszystkie przyjmują postać f (x) =…, a następnie łamią wartość x w sposób unikalny dla tej funkcji. Dlaczego to ma znaczenie i dlaczego mamy różne funkcje AF, staną się bardziej widoczne później.

Co się stanie, gdy otrzymamy nasz wynik?

AF przekazuje obliczoną wartość do następnego węzła i zasadniczo jako częściowy sygnał wejściowy do jednej z funkcji aktywacyjnych w węźle w następnym zestawie wejściowym.

Możesz myśleć o tym jako o zestawie wielu danych wejściowych. I przekazanie obliczonej wartości do następnego węzła. Jest bramą wartości między zestawami danych wejściowych.

Różne typy funkcji aktywacyjnych

Podobnie jak istnieją różne typy równań matematycznych… istnieją różne typy funkcji aktywacyjnych.

Dokładnie sposób, w jaki dzielą liczby na ostateczną wartość wyjściową, jest ściśle związany ze szkoleniem najpierw istniejącej sieci. Dlatego nie możemy jeszcze zagłębić się w ten temat, ponieważ ogólnie rzecz biorąc, system nie opiera się na czymś tak prostym, jak obliczenie i zwrócenie wyniku liczbowego.

Ale tym, co możemy zrobić - jak dotąd pogłębić nasze zrozumienie - jest spojrzenie na wizualne przedstawienie każdego równania matematycznego kryjącego się za różnymi funkcjami aktywacyjnymi!

To jest samouczek wizualny. Aby dać ci podstawowe wyobrażenie o tym, z czym będziesz się tutaj zmagać, znajdziesz tabelę klasycznego zestawu równań matematycznych, na których może opierać się wiele klasycznych Funkcji Aktywacji.

Najbardziej podstawowy AF jest reprezentowany przez f (x) = x lub funkcję tożsamości.

Kilka podstawowych dobrze znanych wzorów matematycznych.

Istnieje kilka innych. Ale są nieco bardziej złożone.

Zasadniczo te funkcje są używane do określania wynikowej wartości węzła.

Jak dokładnie funkcja aktywacji określa jej wartość?

To właśnie jest AF. Pobiera dane wejściowe w postaci liczby i zwraca wartość między 0,0–1,0 (czasami zakres wynosi +/- nieskończoność). Rzeczywiste formuły opisano powyżej. Możesz ponownie zapisać te równania jako funkcje w języku Python, JavaScript lub innym języku programowania.

Jeśli jesteś matematyką i masz dużo czasu, pokochasz pisanie tych funkcji w kodzie! Ale często nie musisz. A to dlatego, że już istnieje A.I. biblioteki zajmują się tym za Ciebie. W ten sposób możesz skupić się na budowaniu sieci neuronowej i szkoleniu jej do określonego celu.

Każdy węzeł ma obliczoną wagę

Zatem te funkcje aktywacji generują wartość.

Najważniejszą rzeczą do zauważenia w tym momencie - każdy punkt jest ciężarem.

Ta waga mierzy prawdopodobieństwo dopasowania określonego wzoru.

Ale możliwe jest wiele warstw zestawów wejściowych, jak pokazano w następnym przykładzie.

Węzły w nieco bardziej zaawansowanej sieci neuronowej połączone ze sobą.

Każdy pojedynczy węzeł komunikuje się z każdym węzłem w następnej warstwie wejściowej, która tworzy tę skrzyżowaną drogę komunikacyjną.

Liczba elementów na każdej warstwie jest dowolna. Nie musi to być ta sama liczba, jak pokazano na powyższym schemacie. W zależności od problemu, który próbujesz rozwiązać.

Potrzeba trochę intuicji i kreatywności, aby określić liczbę węzłów wejściowych, których chcesz użyć w każdej warstwie. Ale nawet rozwiązanie tego samego problemu może być osiągnięte przez różne struktury sieci neuronowej.

Ze względu na nieliniowy charakter obliczeń proces ten jest niejednoznaczny.

Ukryte warstwy

Właśnie omówiliśmy, w jaki sposób sieć neuronowa może mieć wiele warstw wejściowych. Można je traktować jako pionowe rzędy węzłów.

Wszystkie wewnętrzne warstwy między pierwszym rzędem wejściowym a węzłem wyjściowym są często nazywane warstwami ukrytymi. Ma to sens, ponieważ w tym miejscu wykonywana jest większość trudnych zadań związanych z przetwarzaniem AI. Zasadniczo jest to tajemnicze pudełko AI.

Różne typy wzorców sieci neuronowej

Czasami ML może wydawać się podobnym do tworzenia wzorca sieci w celu dopasowania wzorców.

Sieci neuronowe mają różne kształty i formy.

Różne typy struktur sieci neuronowych są bardziej odpowiednie do rozwiązywania określonych rodzajów problemów związanych z ich strukturą.

OK - ale jak napisać kod?

To było dużo teorii.

Ale jak faktycznie implementujemy to w kodzie?

Aby rozpocząć, możesz użyć biblioteki takiej jak Tensorflow.js.

Ale to nic nie da, bo wciąż jest tyle do ukrycia.

OK - ale w jaki sposób przynosi to znaczące wyniki?

Do tej pory omawialiśmy strukturę sieci neuronowej.

Rozmawialiśmy o funkcjach aktywacji, danych wejściowych i ukrytych warstwach.

Rozmawialiśmy również o ciężarach przekazywanych do i z symulowanych połączeń.

Aby nieliniowy algorytm uczenia maszynowego przyniósł jakikolwiek sensowny wynik, należy go najpierw wyszkolić na zestawie wcześniej istniejących danych.

Zawsze zaczynasz od wybrania danych do wyszkolenia algorytmu AI.

To zależy od tego, jaki problem próbujesz rozwiązać.

Jeśli chcesz rozpoznać liczby na obrazie, zacznij od obrazów cyfr.

Rozpoznawanie liczb z zrzutu ekranu

Klasycznym przykładem sztucznej inteligencji jest nauczenie sieci neuronowej rozpoznawania liczb od 0 do 9. W ten sam sposób, w jaki można wytrenować algorytm maszynowy do rozpoznawania liter A-Z lub nawet części ludzkiej twarzy - oka lub ust na fotografia przedstawia również określony typ kształtu lub wzoru, który jest wspólny dla wszystkich ludzi, ale może wyglądać nieco inaczej.

Pamiętaj, że mamy tu do czynienia tylko ze wzorami.

Gdy algorytm rozpozna wzór, nigdy nie jest on w 100% zgodny. Ale im bardziej zbliżamy się do 1.0 (100%), tym bardziej prawdopodobne jest, że szukany kształt reprezentuje to, co został przeszkolony do rozpoznawania.

Gdybyśmy użyli standardowej czcionki, nie musielibyśmy nawet wykonywać żadnej sztucznej inteligencji. Możemy po prostu zeskanować każdą cyfrę w celu znalezienia dokładnego wzoru pikseli. Ale kluczowym punktem sztucznej inteligencji jest rozpoznanie wzoru w niejasności.

Po pierwsze, musimy mieć jakiś rodzaj nośnika, który będzie wykorzystywany jako element danych treningowych. Każda cyfra może być reprezentowana przez obraz:

Te same cyfry zapisane wiele razy dają nieco inny wzór. Zdjęcie pochodzi z demonstracji JavaScript AI pod adresem http://myselph.de/neuralNet.html

Możesz łatwo rozpoznać każdą cyfrę na podstawie wzroku. Ale algorytm sztucznej inteligencji musi być przeszkolony w rozpoznawaniu podobnych wzorców, ponieważ chociaż są one podobne, wciąż nie są w 100% identyczne.

Aby to osiągnąć, możemy rozbić pierwotny wzór na mniejsze bloki i zaimplementować coś, co nazywa się ekstrakcją cech.

Ekstrakcja funkcji

Aby zidentyfikować cyfrę, algorytm implementuje system ekstrakcji cech, który rozkłada wspólne wzorce na odpowiedniki istotne przy konstruowaniu pełnej cyfry / symbolu / litery / itp.

Istota wzoru pozostaje taka sama. Na przykład 0 jest głównie kołem - możesz rozbić je na mniejsze wzory z łukiem po obu stronach:

Jeśli tylko możemy wyćwiczyć nasz algorytm w zakresie rozpoznawania tych 4 unikalnych wzorców i sprawdzania ich obecności w zlokalizowanym obszarze obrazu, możemy obliczyć stopień pewności, z jaką można powiedzieć, że może to być zero.

To samo dotyczy innych cyfr. Cyfra 1 to na przykład pojedynczy pionowy pasek. A może z mniejszą linią pod niewielkim kątem u góry.

Liczba 2 to półkole na górze, linia ukośna i linia pozioma.

Numer 3 można podzielić na dwa półskalowe wzory.

Numer 4 można traktować jako 3 linie: pionową, poziomą i ukośną.

…i tak dalej.

Co jeśli jest to ręcznie napisana cyfra? Nadal ma te same właściwości tej cyfry: te same krawędzie, te same pętle.

Co się stanie, jeśli cyfra pojawi się na ograniczeniu prędkości, wyloguj się na ulicy z pośredniego kąta na zdjęciu? Podobnie jak nasza własna wizja sztuczna inteligencja powinna być w stanie uwzględnić pewien rodzaj błędu.

Czy to pięć, trzy czy osiem?

Wypróbuj wersję demonstracyjną AI JavaScript, która pozwala narysować coś na ekranie, a wstępnie wyszkolony algorytm powie ci, co właśnie narysowałeś.

Algorytm będzie próbował zapewnić najlepsze dopasowanie, nawet jeśli to, co narysujesz, nie jest liczbą. Nadal widać sztuczny intelekt w pracy, który stara się uzyskać możliwie najbliższe przybliżenie.

Jak wygląda wyszkolony zestaw?

Oto fragment danych treningowych z algorytmu. To tylko lista wag zapisanych w bardzo długiej tablicy (tysiące wartości):

// wagi sieci neuronowej (wagi jednostek i odchylenia jednostek) // szkolenie zostało przeprowadzone w Matlabie przy użyciu zestawu danych MNIST.
// dane dotyczą jednostki 784-200-10, z nieliniowością logistyczną
// w ukrytym i softmax w warstwie wyjściowej. Dane wejściowe to
// [-1; 1] obraz poziomu szarości, tło == 1, 28 x 28 pikseli zlinearyzowany
// w kolejności kolumn (tj. kolumna 1 (:); kolumna 2 (:); ...) i-ty wynik
// bycie maksimum oznacza, że ​​sieć myśli, że kodowanie wejściowe
// (i-1) poniższe wagi wykazały poziom błędu 1,92% w teście
// zestaw danych (poprawnie rozpoznano 9808/10000 cyfr).
niech w12 = [[-0,00718674, 0,00941102, -0,0310175, -0,00121102, -0,00978546, -4,65943e-05, 0,0150367, 0,0101846, 0,0482145, 0,00291535, -0,00172736, 0,0234746, 0,0416268, 0,0258520, 0,042560, 0,025 , 0,00692898, 0,0215552, 0,0540464, 0,0393167, 0,0668207, 0,0232665, 0,031598, 0,0143047, 0,0156885, -0,0269579, -0,00777022, 0,0397823, -0,00825727, 0,0212889, -0,00755215, 0,035643, 0,0358 ...
/ * ... Tysiące ciężarów więcej śledzi ... * /

Pełny kod źródłowy nie pasuje do tego artykułu. Ale zestawy są zwykle dość długie, nawet jak na trywialne testy.

Malowanie obrazu w sieci neuronowej

Ten fragment kodu pochodzi z funkcji rozpoznawania () napisanej w JavaScript.

Został zaczerpnięty z wersji demo na http://myselph.de

Możesz sprawdzić cały kod źródłowy tutaj.

// do wizualizacji / debugowania: zamaluj dane wejściowe do sieci neuronowej. if (document.getElementById („przetwarzanie wstępne”). zaznaczone == prawda)
{
    ctx.clearRect (0, 0, canvas.width, canvas.height);
    ctx.drawImage (copyCtx.canvas, 0, 0);
    dla (var y = 0; y <28; y ++) {
        dla (var x = 0; x <28; x ++) {
           var block = ctx.getImageData (x * 10, y * 10, 10, 10);
           var newVal = 255 * (0,5 - nnInput [x * 28 + y] / 2);
           dla (var i = 0; i <4 * 10 * 10; i + = 4) {
               block.data [i] = newVal;
               block.data [i + 1] = newVal;
               block.data [i + 2] = newVal;
               block.data [i + 3] = 255;
           }
       ctx.putImageData (blok, x * 10, y * 10);
       }
   }
}

Ten częściowy fragment kodu „wkleja” wejście obrazu (rysunek odręczny), który został wcześniej podzielony na 10 x 10 bloków przechowujących średnie wartości skali szarości dla tego obszaru obrazu.

Następnie sprawdzi to względem wyszkolonego zestawu, a po rozbiciu sum / i średnich porównań zwróci prawdopodobieństwo wyniku pod względem tego, jak blisko rysunek na płótnie HTML pasuje do konkretnej cyfry.

Ostatnie słowa

Sztuczna inteligencja to rozległy temat. Każdego dnia pojawiają się różne rodzaje wzorców uczenia maszynowego i samouczki. Ten poradnik powinien służyć jedynie jako wstęp dla kogoś, kto dopiero zaczyna!

Śledź mnie na Twitterze, aby otrzymać bezpłatne książki

Chwyć swoją kopię Visual Dictionary CSS włącznie. diagramy wszystkich właściwości CSS.

Na Twitterze Tidal Wave to konto, które rozdaje moje książki za darmo.

Śledź mnie na @ js_tut, gdzie zamieszczam tutoriale JavaScript freemium.