Deep Learning – nauczmy się razem! #1

Jak pewnie zauważyłeś, nie ma na tym blogu żadnego artykułu poświęconego deep learning. Znajdziesz tutaj artykuły dotyczące analizy danych ogólnie, jak i konkretne artykuły dedykowane „tradycyjnemu” uczeniu maszynowemu. Przyczyna tego stanu jest prosta – nie znam się na deep learning, czyli na głębokich sieciach neuronowych. Ale z racji tego, że jest to bardzo obiecująca dziedzina uczenia maszynowego, warto się z nią zapoznać bliżej. Miałem już kilka podejść do tego tematu, ale jakoś zawsze było coś innego do zrobienia lub zrozumienia. Teraz udało mi się jednak wygospodarować odpowiednią ilość czasu, argumentów i motywacji, żeby do tematu powrócić, tym razem na dobre. Może nauczymy się razem?

Kursy deep learning

Gdy wcześniej zabierałem się za deep learning, korzystałem jednocześnie z dwóch źródeł: kursów deep learning w serwisie Coursera i nagrań kursu na stronie fast.ai. Obydwa kursy powstały chyba w podobnym czasie i docelowo uczą tych samych umiejętności, ale uczą ich zupełnie inaczej. Pierwszy kurs robiony przez Andrew Ng zaczyna od algebry i operacji macierzowych. Później zostajemy wprowadzeni w gradient descent i … dalej nie dotarłem ;-). Pierwsza wersja tego kursu była realizowana z wykorzystaniem program GNU Octave, który jest otwartą i darmową alternatywą dla programu MATLAB. Teraz z tego, co kojarzę, to bazuje ona na Pythonie. Andrew Ng to człowiek, którego zaliczam do kategorii „megamózg”. Metody nauczania ma jednak bardzo mocno zakorzenione w środowisku naukowym – co akurat w tym przypadku nie za bardzo mi przypadło do gustu.

Albo, pewnie bym się dostosował, gdybym nie natrafił na kurs fast.ai. Kurs ten prowadzi Jeremy Howard i jest on dostępny w formie nagrań z wykładów, które prowadził na University of San Francisco. Jeremy (kolejny megamózg) i jego zespół wybrali zupełnie odwrotne podejście. Chcą pokazać, że deep learning może być uczony szybko i efektywnie przez programowanie i eksperymentowanie. A „teorię” pokazują w momencie, gdy już się przekonamy jak dany fragment technologi działa. Pierwsza edycja tego kursu była realizowana z wykorzystaniem Pythonowego moduł Keras, najnowsza edycja wykorzystuje ich autorski moduł fastai, który działa na silniku PyTorch. No i faktycznie, od samego początku robimy deep learning, niekoniecznie wiedząc, o co chodzi, ale patrząc na efekty wcześniejszych edycji tego kursu, ma to sens. Jako że jest to mój preferowany styl nauki, wybrałem ten kurs.

Deep learning – nauczmy się razem!

Kurs fast.ai jest zbudowany wokół wspomnianych nagrań z uniwersytetu. Ale jest to coś więcej niż suche nagranie i slajdy bez kontekstu. Jest to cała społeczność, która wspólnie „pracuje” nad kursem. Mamy tam moduł Pythonowy fastai, mamy transkrypcje wykładów i katalog linków do dodatkowych materiałów. Mamy wiki gdzie studenci dokumentują wiedzę, ale i problemy techniczne. Ostatnie, ale być może najważniejsze jest forum, gdzie studenci miedzy sobą rozbudowują swoją wiedzę. W praktyce przypomina więc to bardziej projekt open source niż liniowy kurs akademicki. I to jest świetne!

Żeby przejść przez niego porządnie i tym razem faktycznie nauczyć się deep learning postanowiłem wykorzystać swojego bloga w charakterze trzymacza notatek, na temat tego, czego się nauczyłem. Ten i przyszłe wpisy z tej serii będą więc może nieco bardziej chaotyczne i „przemyśleniowe”. Ale dzięki temu, może przekonasz się, że nie tylko Ty niekoniecznie wszystko rozumiesz od początku i poprawnie. Sądzę bowiem, że te wpisy mogą mieć potencjalnie trochę błędów i nieścisłości. Będzie to natomiast uzasadnione, bo tak jak wspomniałem powyżej, będę się dzielił przebiegiem procesu uczenia się czegoś nowego.

Jeśli masz ochotę przejść przez ten proces ze mną, to śmiało. Zacznij od obejrzenia poszczególnych lekcji. Później możesz wpaść tutaj – planuję dedykować każdej lekcji jeden wpis. A na końcu możesz nawiązać ze mną dyskusję w komentarzach do poszczególnych wpisów. Teraz nie masz już w zasadzie wymówki, dlaczego by się tym nie zająć.

Środowisko

Gdy we wcześniejszym wpisie omawiałem środowisko Google Colab, użyłem kursu fast.ai jako przykładu na to, co można tam ciekawego zrobić. Colab wydaje się wystarczająco dobrą platformą do przejścia przez poszczególne lekcje tego kursu. GPU, które tam mamy jest wystarczająco pojemne, żeby nie mieć problemów z trenowaniem modeli. Trzeba się trochę nagimnastykować z dokładaniem swoich danych, ale z drugiej strony nie jest to nic nadzwyczajnego w uczeniu maszynowym, można wiec to potraktować jako kolejne ćwiczenie.

Lekcja 1

Pierwsza lekcja z tego kursu znajduje się tutaj.  Wideo trwa godzinę i czterdzieści minut więc trzeba sobie zarezerwować trochę czasu. Albo rozbić to na kawałki.

Jeden z najciekawszych elementów wstępu to slajd, na którym Jeremy rozwiewa mity i wątpliwości odnośnie do deep learning:

  • black box – Zdaje się, że modele deep learning można już interpretować i wizualizować. Ja takiego czegoś jeszcze nie widziałem. Jeśli to prawda to jest to całkiem przydatna cecha.
  • needs too much data – Faktycznie tak kilka lat temu się mówiło w tym kontekście. Jeśli nie masz dziesiątek tysięcy obserwacji, to nie warto się zabierać. Teraz, jeśli korzysta się z transfer learning i wytrenowanych wcześniej sieci wystarczy dotrenować model na nawet kilkudziesięciu nowych przykładach.
  • needs ml PhD – Jak się okazuje, żeby używać głębokich sieci neuronowych nie trzeba mieć doktoratu z uczenia maszynowego. Wystarczy umieć programować i przyswoić sobie kilka kluczowych koncepcji.
  • only for vision – Faktem jest, że deep learning wszedł z buta na piedestał kilka lat temu w problemach związanych z klasyfikacją obrazów. Ale teraz już da się go używać chyba do wszystkich typów problemów.
  • needs lots of GPUs – Niby więcej GPU przyspiesza cały proces, ale okazuje się, że jak się rozsądnie do niego podejdzie, to wystarczą pojedyncze karty graficzne.
  • not really AI – No tak, deep learning to nie jest kompletny system sztucznej inteligencji. Jest to w zasadzie bardzo potężna maszyna, która niejako rozwiązuje jeden konkretny problem uczenia maszynowego na zasadzie brute force. Mielimy tutaj przykłady aż model (siec neuronowa), nauczy się je dobrze ogarniać. Natomiast wiele takich systemów pewnie będzie składowymi przyszłych sztucznych inteligencji.

Zbiór danych

We wcześniejszych wersjach kursu pierwsza lekcja polegała na stworzeniu klasyfikatora, który rozróżnia psy od kotów na zdjęciach. Jako że wszystko poszło do przodu, teraz zadaniem jest rozróżnianie ich ras – 25 ras psów i 12 kotów. Zbiór danych to The Oxford-IIIT Pet Dataset. Brzmi ciekawie nie? W notebooku z lekcją mamy już kod, który pobierze i rozpakuje odpowiednie dane. Dane nie mają pliku z opisem, trzeba więc parsować nazwy plików w celu wydobycia ras.

Wszystkie obrazki będą przeskalowane do rozmiaru kwadratu o boku 224 pikseli.

Model

Na potrzeby tej lekcji użyliśmy wspomnianego transfer learning. Skorzystaliśmy z modelu o nazwie resnet34, który został wytrenowany na zbiorze danych ImageNet. Model ten składa się 34 warstw konwolucyjnych, które wyłapują różne kształty. Pierwsze warstwy wyłapują proste kształty a dalsze coraz bardziej złożone.

Możemy ponownie wytrenować tylko końcówkę sieci, która jest odpowiedzialna za dokonanie klasyfikacji. Ale okazuje się, że możemy też przebudować warstwy konwolucyjne (te od kształtów) i w ten sposób możemy uzyskać nieco bardziej dopasowaną sieć.

Z tego, co zrozumiałem, to sieć ta została zaprojektowana dla kwadratowych obrazków o boku 224 pikseli. Stąd też wcześniej wspomniałem o przeskalowywaniu obrazków do tego formatu.

W notebooku możemy też podmienić łatwo tę sieć na resnet50 która koncepcyjnie jest taka sama, zawiera jednak więcej warstw konwolucyjnych. Z tego powodu trenuje się wolniej i może spowodować, że zabraknie nam pamięci RAM w GPU.

Na stronie DAWNBench możemy sobie porównać osiągi tego i konkurencyjnych modeli. Bardzo ciekawa sprawa. W przyszłości możemy chcieć porównywać swoje wynalazki z tego typu rozwiązaniami. Dzięki temu od razu widzimy, czy to, co stworzyliśmy, ma sens, czy może lepiej faktycznie zainwestować np. w resnet50.

Warto sprawdzać (a pewnie nawet trzeba) learning rate. Jeśli będzie za mały, to sieć będzie mieć duży błąd. Jeżeli używamy biblioteki fastai, możemy nawet skorzystać z zakresu (np. 1e-6, 1e-4) – wtedy początek sieci „zmienia” się miej, a dalsze warstwy „zmieniają się” bardziej. I w sumie w naszym przypadku ma to sens, bo to te dalsze warstwy będą wyłapywać kształty charakterystyczne dla poszczególnych ras.

Ciekawym pomysłem jest to, że jeśli da się problem przedstawić za pomocą grafiki (np. diagram ruchów myszką na ekranie), to można z powodzeniem zastosować takie same sieci neuronowe do klasyfikacji.

Uwagi

Aktualnie okazuje się, że funkcja doc (na przykład: doc(interp.plot_top_losses)) nie działa w środowisku Colab. Jest to funkcja wyświetlająca dokumentację, więc do przejścia przez całą lekcję nie jest nam potrzebna. Ja darowałem sobie debugowanie i po prostu ją usunąłem z kodu.

Zadanie domowe

Zadaniem domowym z tej lekcji jest przygotowanie sobie samodzielnie zbioru danych z obrazkami i dotrenowanie klasyfikatora, który zajmie się ich identyfikacją. Mam już pewien pomysł na to zadanie, ale o tym w innym artykule ;-).

Jeśli interesuje Cię jakiś temat – nie musi być związany z tym artykułem – to zostaw mi sygnał tutaj. Dzięki!

Jedna myśl na temat “Deep Learning – nauczmy się razem! #1

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *