Site Overlay

Uczenie maszynowe jest zabawą! Część 3: Głębokie uczenie i konwolucyjne sieci neuronowe

Ten rodzaj sieci neuronowej możemy wytrenować w kilka minut na nowoczesnym laptopie. Kiedy to się skończy, będziemy mieli sieć neuronową, która potrafi rozpoznawać obrazki z „8” z całkiem wysoką dokładnością. Witamy w świecie (późnych lat 80-tych) rozpoznawania obrazów!

Tunnel Vision

To naprawdę fajne, że po prostu podawanie pikseli do sieci neuronowej faktycznie zadziałało w celu zbudowania rozpoznawania obrazów! Uczenie maszynowe to magia! …prawda?

Cóż, oczywiście to nie jest takie proste.

Po pierwsze, dobrą wiadomością jest to, że nasz rozpoznawacz „8” naprawdę działa dobrze na prostych obrazach, gdzie litera znajduje się w samym środku obrazu:

Ale teraz naprawdę złe wieści:

Nasz rozpoznawacz „8” zupełnie nie działa, gdy litera nie jest idealnie wyśrodkowana na obrazie. Najmniejsza zmiana pozycji psuje wszystko:

Wynika to z faktu, że nasza sieć nauczyła się tylko wzorca idealnie wyśrodkowanej „8”. Nie ma ona absolutnie żadnego pojęcia czym jest niecentryczna „8”. Zna dokładnie jeden wzór i tylko jeden wzór.

To nie jest bardzo przydatne w prawdziwym świecie. Problemy świata rzeczywistego nigdy nie są tak czyste i proste. Musimy więc wymyślić, jak sprawić, by nasza sieć neuronowa działała w przypadkach, gdy „8” nie jest idealnie wyśrodkowana.

Brute Force Idea #1: Wyszukiwanie za pomocą przesuwanego okna

Zbudowaliśmy już naprawdę dobry program do znajdowania „8” wyśrodkowanej na obrazie. A co jeśli po prostu przeskanujemy cały obraz w poszukiwaniu możliwych „8” w mniejszych sekcjach, jedna sekcja na raz, aż znajdziemy jedną?

To podejście nazywamy przesuwanym oknem. Jest to rozwiązanie typu brute force. Działa dobrze w niektórych ograniczonych przypadkach, ale jest naprawdę nieefektywne. Musisz sprawdzać ten sam obraz w kółko szukając obiektów o różnych rozmiarach. Możemy to zrobić lepiej!

Pomysł Brute Force #2: Więcej danych i głęboka sieć neuronowa

Gdy trenowaliśmy naszą sieć, pokazywaliśmy jej tylko „8”, które były idealnie wyśrodkowane. Co jeśli wytrenujemy ją z większą ilością danych, włączając „8” w różnych pozycjach i rozmiarach na całym obrazie?

Nie musimy nawet zbierać nowych danych treningowych. Możemy po prostu napisać skrypt, który wygeneruje nowe obrazy z „8” w różnych pozycjach na obrazie:

Stworzyliśmy syntetyczne dane treningowe, tworząc różne wersje obrazów treningowych, które już mieliśmy. Jest to bardzo przydatna technika!

Używając tej techniki, możemy łatwo stworzyć nieskończony zapas danych treningowych.

Więcej danych sprawia, że problem jest trudniejszy do rozwiązania dla naszej sieci neuronowej, ale możemy to zrekompensować, czyniąc naszą sieć większą, a tym samym zdolną do uczenia się bardziej skomplikowanych wzorców.

Aby sieć była większa, po prostu układamy warstwa po warstwie węzły:

Nazywamy to „głęboką siecią neuronową”, ponieważ ma ona więcej warstw niż tradycyjna sieć neuronowa.

Pomysł ten istnieje od późnych lat 60. XX wieku. Ale do niedawna, szkolenie tak dużej sieci neuronowej było po prostu zbyt powolne, aby było użyteczne. Ale gdy tylko zorientowaliśmy się, jak używać kart graficznych 3d (które zostały zaprojektowane do naprawdę szybkiego wykonywania mnożenia macierzy) zamiast normalnych procesorów komputerowych, praca z dużymi sieciami neuronowymi nagle stała się praktyczna. W rzeczywistości dokładnie ta sama karta graficzna NVIDIA GeForce GTX 1080, której używasz do gry w Overwatch, może być używana do trenowania sieci neuronowych niewiarygodnie szybko.

Ale nawet jeśli możemy uczynić naszą sieć neuronową naprawdę dużą i trenować ją szybko za pomocą karty graficznej 3d, to nadal nie doprowadzi nas to do rozwiązania. Musimy być mądrzejsi o to, jak przetwarzamy obrazy w naszej sieci neuronowej.

Pomyśl o tym. Nie ma sensu trenować sieci do rozpoznawania „8” na górze obrazu oddzielnie od trenowania jej do rozpoznawania „8” na dole obrazu, tak jakby to były dwa zupełnie różne obiekty.

Powinien istnieć jakiś sposób, aby uczynić sieć neuronową wystarczająco inteligentną, aby wiedziała, że „8” w dowolnym miejscu obrazu to ta sama rzecz bez całego tego dodatkowego treningu. Na szczęście… jest!

Rozwiązanie to konwolucja

Jako człowiek, intuicyjnie wiesz, że obrazy mają hierarchię lub strukturę pojęciową. Rozważmy ten obraz:

Gratuitous picture of my son

Jako człowiek, natychmiast rozpoznajesz hierarchię na tym obrazie:

  • Podłoże jest pokryte trawą i betonem
  • Jest dziecko
  • Dziecko siedzi na dmuchanym koniku
  • Dmuchany konik jest na górze trawy

Co najważniejsze, rozpoznajemy ideę dziecka bez względu na to, na jakiej powierzchni dziecko się znajduje. Nie musimy ponownie uczyć się idei dziecka dla każdej możliwej powierzchni, na której może się ono pojawić.

Ale w tej chwili nasza sieć neuronowa nie potrafi tego zrobić. Myśli ona, że „8” w innej części obrazu to zupełnie inna rzecz. Nie rozumie, że przesuwanie obiektu na obrazie nie czyni go czymś innym. Oznacza to, że musi na nowo nauczyć się identyfikacji każdego obiektu w każdej możliwej pozycji. To jest do bani.

Musimy dać naszej sieci neuronowej zrozumienie niezmienności translacyjnej – „8” jest „8” bez względu na to, w którym miejscu na obrazie się pojawi.

Zrobimy to za pomocą procesu zwanego konwolucją. Idea konwolucji jest zainspirowana częściowo przez informatykę, a częściowo przez biologię (tj. szaleni naukowcy dosłownie szturchali kocie mózgi dziwnymi sondami, aby dowiedzieć się, jak koty przetwarzają obrazy).

Jak działa konwolucja

Zamiast podawać całe obrazy do naszej sieci neuronowej jako jedną siatkę liczb, zrobimy coś o wiele mądrzejszego, co wykorzystuje ideę, że obiekt jest taki sam bez względu na to, gdzie pojawia się na obrazie.

Oto jak to będzie działać, krok po kroku –

Krok 1: Rozbij obraz na nakładające się na siebie kafelki obrazu

Podobnie do naszego wyszukiwania w oknie przesuwnym powyżej, przepuśćmy okno przesuwne nad całym oryginalnym obrazem i zapiszmy każdy wynik jako oddzielny, malutki kafelek obrazu:

Robiąc to, zamieniliśmy nasz oryginalny obraz w 77 równej wielkości malutkich kafelków obrazu.

Krok 2: Podaj każdy kafelek obrazu do małej sieci neuronowej

Wcześniej podaliśmy pojedynczy obraz do sieci neuronowej, aby sprawdzić, czy jest to „8”. Zrobimy dokładnie to samo tutaj, ale zrobimy to dla każdego pojedynczego kafelka obrazu:

Powtórz to 77 razy, raz dla każdego kafelka.

Jest jednak jeden duży zwrot: zachowamy te same wagi sieci neuronowej dla każdego pojedynczego kafelka w tym samym oryginalnym obrazie. Innymi słowy, każdy kafelek obrazu traktujemy jednakowo. Jeśli w danym kafelku pojawi się coś interesującego, oznaczymy ten kafelek jako interesujący.

Krok 3: Zapisz wyniki z każdego kafelka do nowej tablicy

Nie chcemy tracić informacji o układzie oryginalnych kafelków. Zapisujemy więc wynik przetwarzania każdego kafelka do siatki w takim samym układzie jak oryginalny obraz. Wygląda to tak:

Innymi słowy, zaczęliśmy z dużym obrazem, a skończyliśmy z nieco mniejszą tablicą, która zapisuje, które fragmenty naszego oryginalnego obrazu były najbardziej interesujące.

Krok 4: Downsampling

Wynikiem kroku 3 była tablica, która odwzorowuje, które części oryginalnego obrazu są najbardziej interesujące. Ale ta tablica jest nadal dość duża:

Aby zmniejszyć rozmiar tablicy, zmniejszamy jej próbkowanie za pomocą algorytmu zwanego max pooling. Brzmi to wymyślnie, ale wcale takie nie jest!

Po prostu spojrzymy na każdy kwadrat 2×2 tablicy i zachowamy największą liczbę:

Pomysł polega na tym, że jeśli znaleźliśmy coś interesującego w którymkolwiek z czterech kafelków wejściowych, które tworzą każdy kwadrat 2×2 siatki, po prostu zachowamy najbardziej interesujący bit. W ten sposób zmniejszamy rozmiar naszej tablicy, zachowując najważniejsze bity.

Krok końcowy: Make a prediction

Do tej pory zredukowaliśmy gigantyczny obraz do dość małej tablicy.

Guess what? Ta tablica jest po prostu zbiorem liczb, więc możemy użyć tej małej tablicy jako danych wejściowych do kolejnej sieci neuronowej. Ta ostatnia sieć neuronowa zdecyduje, czy obraz jest, czy nie jest dopasowany. Aby odróżnić ją od etapu konwolucji, nazywamy ją siecią „w pełni połączoną”.

Więc od początku do końca, nasz cały pięcioetapowy potok wygląda tak:

Dodając jeszcze więcej kroków

Nasz potok przetwarzania obrazu jest serią kroków: konwolucji, maksymalnego łączenia i w końcu w pełni połączonej sieci.

Podczas rozwiązywania problemów w świecie rzeczywistym, kroki te mogą być łączone i układane w stosy tyle razy, ile tylko chcesz! Możesz mieć dwie, trzy lub nawet dziesięć warstw konwolucji. Możesz rzucić w max pooling gdziekolwiek chcesz zmniejszyć rozmiar swoich danych.

Podstawową ideą jest zacząć od dużego obrazu i stale gotować go w dół, krok po kroku, aż w końcu masz pojedynczy wynik. Im więcej kroków konwolucji masz, tym bardziej skomplikowane cechy Twoja sieć będzie w stanie nauczyć się rozpoznawać.

Na przykład, pierwszy krok konwolucji może nauczyć się rozpoznawać ostre krawędzie, drugi krok konwolucji może rozpoznawać dzioby używając wiedzy o ostrych krawędziach, trzeci krok może rozpoznawać całe ptaki używając wiedzy o dziobach, itd.

Oto, jak wygląda bardziej realistyczna głęboka sieć konwolucyjna (taka, jaką można znaleźć w pracy naukowej):

W tym przypadku rozpoczynają obraz 224 x 224 piksele, stosują konwolucję i max pooling dwa razy, stosują konwolucję 3 razy więcej, stosują max pooling, a następnie mają dwie w pełni połączone warstwy. Efektem końcowym jest zaklasyfikowanie obrazu do jednej z 1000 kategorii!

Konstruowanie właściwej sieci

Więc skąd wiesz, które kroki musisz połączyć, aby Twój klasyfikator obrazu działał?

Szczerze mówiąc, musisz odpowiedzieć na to pytanie, wykonując wiele eksperymentów i testów. Być może będziesz musiał wytrenować 100 sieci, zanim znajdziesz optymalną strukturę i parametry dla problemu, który rozwiązujesz. Uczenie maszynowe wymaga wielu prób i błędów!

Budujemy nasz klasyfikator ptaków

Wreszcie wiemy wystarczająco dużo, aby napisać program, który może zdecydować, czy obrazek jest ptakiem, czy nie.

Jak zawsze, potrzebujemy trochę danych, aby zacząć. Darmowy zbiór danych CIFAR10 zawiera 6 000 zdjęć ptaków i 52 000 zdjęć rzeczy, które nie są ptakami. Ale aby uzyskać jeszcze więcej danych, dodamy również zestaw danych Caltech-UCSD Birds-200-2011, który ma kolejne 12 000 zdjęć ptaków.

Oto kilka ptaków z naszego połączonego zestawu danych:

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.