Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00065 004871 19012468 na godz. na dobę w sumie
Deep Learning. Praca z językiem R i biblioteką Keras - książka
Deep Learning. Praca z językiem R i biblioteką Keras - książka
Autor: , Liczba stron: 376
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-4780-9 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> inne - programowanie
Porównaj ceny (książka, ebook (-35%), audiobook).

W ostatnich latach byliśmy świadkami ogromnego postępu technik sztucznej inteligencji, uczenia maszynowego oraz uczenia głębokiego. Konsekwencje tego błyskawicznego rozwoju są odczuwalne w niemal każdej dziedzinie. Wydaje się, że to jedna z tych technologii, które powinny być dostępne dla jak najszerszej grupy ludzi. Dopiero wtedy uczenie głębokie wykorzysta w pełni swój potencjał i stanie się prawdziwym impulsem rozwoju naszej cywilizacji. Co prawda na pierwszy rzut oka ta niesamowita technologia może wydawać się wyjątkowo skomplikowana i trudna do zrozumienia, warto jednak wykorzystać dostępne narzędzia, takie jak biblioteka Keras i język R, aby implementować mechanizmy uczenia głębokiego wszędzie tam, gdzie okażą się przydatne.

Ta książka jest znakomitym przewodnikiem po technikach uczenia głębokiego. Poza wyczerpująco przedstawionymi podstawami znajdziesz tu zasady implementacji tych technik z wykorzystaniem języka R i biblioteki Keras. Dzięki przystępnym wyjaśnieniom i praktycznym przykładom szybko zrozumiesz nawet bardziej skomplikowane zagadnienia uczenia głębokiego. Poznasz koncepcje i dobre praktyki związane z tworzeniem mechanizmów analizy obrazu, przetwarzania języka naturalnego i modeli generatywnych. Przeanalizujesz ponad 30 przykładów kodu uzupełnionego dokładnymi komentarzami. W efekcie szybko przygotujesz się do korzystania z uczenia głębokiego w rozwiązywaniu konkretnych problemów.

W tej książce między innymi:

Uczenie głębokie: zafascynuj się i zaimplementuj!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Deep Learning with R Tłumaczenie: Konrad Matuk Projekt okładki: Studio Gravite / Olsztyn Obarek, Pokoński, Pazdrijowski, Zaprucki Materiały graficzne na okładce zostały wykorzystane za zgodą Shutterstock Images LLC. ISBN: 978-83-283-4780-9 Original edition copyright © 2018 by Manning Publications Co. All rights reserved. Polish edition copyright © 2019 by HELION SA. All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Helion SA ul. Kościuszki 1c, 44-100 Gliwice tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/delerk.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/delerk Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Przedmowa Podziękowania O książce O autorach Spis treści 9 11 13 17 1.1. Sztuczna inteligencja, uczenie maszynowe i uczenie głębokie 1.1.1. 1.1.2. 1.1.3. 1.1.4. 1.1.5. 1.1.6. 1.1.7. 1.1.8. 1.2. Zanim pojawiło się uczenie głębokie: krótka historia uczenia maszynowego 1.2.1. Modelowanie probabilistyczne 1.2.2. Wczesne sieci neuronowe 1.2.3. Metody jądrowe 1.2.4. 1.2.5. 1.2.6. 1.2.7. Współczesne uczenie maszynowe Sztuczna inteligencja Uczenie maszynowe Formy danych umożliwiające uczenie „Głębia” uczenia głębokiego Działanie uczenia głębokiego przedstawione na trzech rysunkach Co dotychczas osiągnięto za pomocą uczenia głębokiego? Nie wierz w tymczasową popularność Nadzieje na powstanie sztucznej inteligencji CZĘŚĆ I. PODSTAWY UCZENIA GŁĘBOKIEGO ............................................. 19 Rozdział 1. Czym jest uczenie głębokie? 21 22 22 22 24 26 27 29 30 31 32 32 33 33 35 35 36 37 38 38 39 40 40 41 41 43 44 47 48 48 48 49 2.1. Pierwszy przykład sieci neuronowej 2.2. Reprezentacja danych sieci neuronowych Skalary (tensory zerowymiarowe) 2.2.1. 2.2.2. Wektory (tensory jednowymiarowe) 2.2.3. Macierze (tensory dwuwymiarowe) 2.2.4. Drzewa decyzyjne, lasy losowe i gradientowe wzmacnianie maszyn Powrót do sieci neuronowych Co wyróżnia uczenie głębokie? 1.3. Dlaczego uczenie głębokie? Dlaczego teraz? 1.3.1. 1.3.2. 1.3.3. 1.3.4. 1.3.5. 1.3.6. Sprzęt Dane Algorytmy Nowa fala inwestycji Demokratyzacja uczenia głębokiego Co dalej? Rozdział 2. Matematyczne podstawy sieci neuronowych Trójwymiarowe tensory i tensory o większej liczbie wymiarów Poleć książkęKup książkę 4 Spis treści Główne atrybuty Obsługa tensorów R 2.2.5. 2.2.6. 2.2.7. Wsad danych 2.2.8. 2.2.9. 2.2.10. Dane szeregu czasowego i dane sekwencyjne 2.2.11. Dane w postaci obrazów 2.2.12. Materiały wideo Prawdziwe przykłady tensorów danych Dane wektorowe 2.3. Koła zębate sieci neuronowych: operacje na tensorach 2.3.1. 2.3.2. 2.3.3. 2.3.4. 2.3.5. 2.3.6. Operacje wykonywane element po elemencie Operacje na tensorach o różnych wymiarach Iloczyn tensorowy Zmiana kształtu tensora Geometryczna interpretacja operacji tensorowych Interpretacja geometryczna uczenia głębokiego 2.4. Silnik sieci neuronowych: optymalizacja gradientowa 2.4.1. 2.4.2. 2.4.3. 2.4.4. Czym jest pochodna? Pochodna operacji tensorowej: gradient Stochastyczny spadek wzdłuż gradientu Łączenie pochodnych: algorytm propagacji wstecznej 2.5. Ponowna analiza pierwszego przykładu 2.6. Podsumowanie rozdziału Rozdział 3. Rozpoczynamy korzystanie z sieci neuronowych 3.1. Anatomia sieci neuronowej 3.1.1. Warstwy: podstawowe bloki konstrukcyjne uczenia głębokiego 3.1.2. Modele: sieci warstw 3.1.3. Funkcja straty i optymalizatory: najważniejsze elementy konfiguracji procesu uczenia 3.2. Wprowadzenie do pakietu Keras 3.2.1. 3.2.2. 3.2.3. Keras, TensorFlow, Theano i CNTK Instalowanie pakietu Keras Praca z pakietem Keras: krótkie wprowadzenie 3.3. Przygotowanie stacji roboczej do uczenia głębokiego Dwie opcje uruchamiania pakietu Keras 3.3.1. 3.3.2. Wady i zalety uruchamiania uczenia głębokiego w chmurze 3.3.3. Jaki procesor graficzny najlepiej nadaje się do uczenia głębokiego? 3.4. Przykład klasyfikacji binarnej: klasyfikacja recenzji filmów Zbiór danych IMDB Przygotowywanie danych Budowa sieci neuronowej 3.4.1. 3.4.2. 3.4.3. 3.4.4. Walidacja modelu 3.4.5. Używanie wytrenowanej sieci do generowania przewidywań dotyczących nowych danych Dalsze eksperymenty 3.4.6. 3.4.7. Wnioski 3.5. Przykład klasyfikacji wieloklasowej: klasyfikacja krótkich artykułów prasowych 3.5.1. 3.5.2. Zbiór danych Agencji Reutera Przygotowywanie danych 49 50 50 51 51 52 52 53 53 54 55 55 57 58 59 60 61 62 63 66 67 68 71 72 72 73 74 75 76 77 77 79 79 80 80 81 81 82 83 87 90 90 91 91 91 93 Poleć książkęKup książkę Spis treści 5 Budowanie sieci 3.5.3. 3.5.4. Walidacja modelu 3.5.5. 3.5.6. 3.5.7. 3.5.8. 3.5.9. Wnioski Generowanie przewidywań dotyczących nowych danych Inne sposoby obsługi etykiet i funkcji straty Dlaczego warto tworzyć odpowiednio duże warstwy pośrednie? Dalsze eksperymenty 3.6. Przykład regresji: przewidywanie cen mieszkań 3.6.1. 3.6.2. 3.6.3. 3.6.4. 3.6.5. Wnioski Zbiór cen mieszkań w Bostonie Przygotowywanie danych Budowanie sieci K-składowa walidacja krzyżowa 3.7. Podsumowanie rozdziału Rozdział 4. Podstawy uczenia maszynowego 4.1. Cztery rodzaje uczenia maszynowego 4.1.1. 4.1.2. 4.1.3. 4.1.4. Uczenie nadzorowane Uczenie nienadzorowane Uczenie częściowo nadzorowane Uczenie przez wzmacnianie 4.2. Ocena modeli uczenia maszynowego 4.2.1. 4.2.2. Zbiory treningowe, walidacyjne i testowe Rzeczy, o których warto pamiętać 4.3. Wstępna obróbka danych, przetwarzanie cech i uczenie cech 4.3.1. 4.3.2. Przygotowywanie danych do przetwarzania przez sieci neuronowe Przetwarzanie cech 4.4. Nadmierne dopasowanie i zbyt słabe dopasowanie 4.4.1. 4.4.2. 4.4.3. Redukcja rozmiaru sieci Dodawanie regularyzacji wag Porzucanie — technika dropout 4.5. Uniwersalny przepływ roboczy uczenia maszynowego Definiowanie problemu i przygotowywanie zbioru danych 4.5.1. 4.5.2. Wybór miary sukcesu 4.5.3. 4.5.4. 4.5.5. 4.5.6. Określanie techniki oceny wydajności modelu Przygotowywanie danych Tworzenie modeli lepszych od linii bazowej Skalowanie w górę: tworzenie modelu, który ulega nadmiernemu dopasowaniu Regularyzacja modelu i dostrajanie jego hiperparametrów 4.5.7. 4.6. Podsumowanie rozdziału 93 94 96 97 97 98 98 99 99 100 100 101 105 105 107 108 108 108 109 109 109 111 114 114 115 116 118 119 121 123 125 125 126 127 127 128 129 129 130 CZĘŚĆ II. UCZENIE GŁĘBOKIE W PRAKTYCE ........................................... 131 133 Rozdział 5. Uczenie głębokie i przetwarzanie obrazu 134 136 141 5.1. Wprowadzenie do konwolucyjnych sieci neuronowych Działanie sieci konwolucyjnej Operacja max-pooling 5.1.1. 5.1.2. Poleć książkęKup książkę 6 Spis treści 5.2. Trenowanie konwolucyjnej sieci neuronowej na małym zbiorze danych Stosowanie uczenia głębokiego w problemach małych zbiorów danych 5.2.1. Pobieranie danych 5.2.2. 5.2.3. Budowa sieci neuronowej 5.2.4. Wstępna obróbka danych 5.2.5. Stosowanie techniki augmentacji danych 5.3. Korzystanie z wcześniej wytrenowanej konwolucyjnej sieci neuronowej 5.3.1. 5.3.2. 5.3.3. Wnioski Ekstrakcja cech Dostrajanie 5.4. Wizualizacja efektów uczenia konwolucyjnych sieci neuronowych 5.4.1. Wizualizacja pośrednich aktywacji 5.4.2. Wizualizacja filtrów konwolucyjnych sieci neuronowych 5.4.3. Wizualizacja map ciepła aktywacji klas 5.5. Podsumowanie rozdziału Rozdział 6. Uczenie głębokie w przetwarzaniu tekstu i sekwencji 6.1. Praca z danymi tekstowymi 6.1.1. 6.1.2. 6.1.3. 6.1.4. Wnioski Kodowanie słów i znaków metodą gorącej jedynki Osadzanie słów Łączenie wszystkich technik: od surowego tekstu do osadzenia słów 6.2. Rekurencyjne sieci neuronowe 6.2.1. Warstwa rekurencyjna w pakiecie Keras 6.2.2. Warstwy LSTM i GRU 6.2.3. 6.2.4. Wnioski Przykład warstwy LSTM zaimplementowanej w pakiecie Keras 6.3. Zaawansowane zastosowania rekurencyjnych sieci neuronowych 6.3.1. 6.3.2. 6.3.3. 6.3.4. 6.3.5. 6.3.6. Problem prognozowania temperatury Przygotowywanie danych Punkt odniesienia w postaci zdrowego rozsądku Podstawowe rozwiązanie problemu przy użyciu techniki uczenia maszynowego Punkt odniesienia w postaci pierwszego modelu rekurencyjnego Stosowanie rekurencyjnego porzucania w celu zmniejszenia nadmiernego dopasowania Tworzenie stosów warstw rekurencyjnych Korzystanie z dwukierunkowych rekurencyjnych sieci neuronowych Kolejne rozwiązania 6.3.7. 6.3.8. 6.3.9. 6.3.10. Wnioski 6.4. Konwolucyjne sieci neuronowe i przetwarzanie sekwencji 6.4.1. 6.4.2. 6.4.3. 6.4.4. Przetwarzanie sekwencji za pomocą jednowymiarowej sieci konwolucyjnej Jednowymiarowe łączenie danych sekwencyjnych Implementacja jednowymiarowej sieci konwolucyjnej Łączenie sieci konwolucyjnych i rekurencyjnych w celu przetworzenia długich sekwencji 6.4.5. Wnioski 6.5. Podsumowanie rozdziału 143 144 144 147 148 151 155 155 163 167 168 169 175 181 185 187 188 189 192 197 203 203 206 209 212 213 214 214 217 220 221 223 225 226 228 232 233 234 234 235 235 237 241 242 Poleć książkęKup książkę Spis treści 7 Rozdział 7. Najlepsze zaawansowane praktyki uczenia głębokiego 7.1. Funkcjonalny interfejs programistyczny pakietu Keras: wykraczanie poza model sekwencyjny 7.1.1. Wprowadzenie do funkcjonalnego interfejsu API 7.1.2. Modele z wieloma wejściami 7.1.3. Modele z wieloma wyjściami 7.1.4. 7.1.5. 7.1.6. Modele pełniące funkcję warstw 7.1.7. Wnioski Skierowane acykliczne grafy warstw Udostępnianie wag warstwy 7.2. Monitorowanie modeli uczenia głębokiego przy użyciu wywołań zwrotnych pakietu Keras i narzędzia TensorBoard 7.2.1. Używanie wywołań zwrotnych w celu sterowania procesem trenowania modelu 7.2.2. Wprowadzenie do TensorBoard — platformy wizualizacji danych pakietu TensorFlow 7.2.3. Wnioski 7.3. Korzystanie z pełni możliwości modeli 7.3.1. 7.3.2. 7.3.3. 7.3.4. Wnioski Konstrukcja zaawansowanych architektur Optymalizacja hiperparametru Składanie modeli 7.4. Podsumowanie rozdziału Rozdział 8. Stosowanie uczenia głębokiego w celu generowania danych 8.1. Generowanie tekstu za pomocą sieci LSTM Krótka historia generatywnych sieci rekurencyjnych 8.1.1. 8.1.2. Generowanie danych sekwencyjnych 8.1.3. Dlaczego strategia próbkowania jest ważna? 8.1.4. 8.1.5. Wnioski Implementacja algorytmu LSTM generującego tekst na poziomie liter 8.2. DeepDream 8.2.1. 8.2.2. Wnioski Implementacja algorytmu DeepDream w pakiecie Keras 8.3. Neuronowy transfer stylu 8.3.1. 8.3.2. 8.3.3. 8.3.4. Wnioski Strata treści Strata stylu Implementacja neuronowego transferu stylu przy użyciu pakietu Keras 8.4. Generowanie obrazów przy użyciu wariacyjnych autoenkoderów Próbkowanie z niejawnej przestrzeni obrazów 8.4.1. 8.4.2. Wektory koncepcyjne używane podczas edycji obrazu 8.4.3. Wariacyjne autoenkodery 8.4.4. Wnioski 8.5. Wprowadzenie do generatywnych sieci z przeciwnikiem 8.5.1. 8.5.2. 8.5.3. Generator Schematyczna implementacja sieci GAN Zbiór przydatnych rozwiązań 245 246 247 249 251 254 258 259 260 260 260 264 268 268 269 272 274 276 276 279 281 281 282 282 285 289 290 291 296 297 298 298 299 304 306 306 307 308 314 315 316 317 318 Poleć książkęKup książkę 8 Spis treści 8.5.4. Dyskryminator 8.5.5. 8.5.6. 8.5.7. Wnioski Sieć z przeciwnikiem Trenowanie sieci DCGAN 8.6. Podsumowanie rozdziału Rozdział 9. Wnioski 9.1. Przypomnienie najważniejszych koncepcji 9.1.1. 9.1.2. 9.1.3. 9.1.4. 9.1.5. 9.1.6. 9.1.7. Sztuczna inteligencja Co sprawia, że uczenie głębokie to wyjątkowa dziedzina uczenia maszynowego? Jak należy traktować uczenie głębokie? Najważniejsze technologie Uniwersalny przepływ roboczy uczenia maszynowego Najważniejsze architektury sieci Przestrzeń możliwości 9.2. Ograniczenia uczenia głębokiego 9.2.1. 9.2.2. 9.2.3. Wnioski Ryzyko antropomorfizacji modeli uczenia maszynowego Lokalne uogólnianie a ekstremalne uogólnianie 9.3. Przyszłość uczenia głębokiego 9.3.1. Modele jako programy 9.3.2. Wykraczanie poza algorytm propagacji wstecznej i warstwy 9.3.3. 9.3.4. 9.3.5. różniczkowalne Zautomatyzowane uczenie maszynowe Nieustanne uczenie się i wielokrotne używanie modułowych procedur składowych Przewidywania dotyczące dalekiej przyszłości 9.4. Bycie na bieżąco z nowościami związanymi z szybko rozwijającą się dziedziną 9.4.1. 9.4.2. 9.4.3. Zdobywaj wiedzę praktyczną, pracując z prawdziwymi problemami przedstawianymi w serwisie Kaggle Czytaj o nowych rozwiązaniach w serwisie arXiv Eksploruj ekosystem związany z pakietem Keras 9.5. Ostatnie słowa 319 320 320 322 323 325 326 326 326 327 328 329 330 334 336 337 339 340 341 342 343 344 345 346 348 348 348 349 349 353 DODATKI ....................................................................................................351 Dodatek A. Instalowanie pakietu Keras i innych bibliotek niezbędnych do jego działania w systemie Ubuntu Dodatek B.Uruchamianie kodu w środowisku RStudio Server przy użyciu zdalnej instancji procesora graficznego EC2 Skorowidz 359 365 Poleć książkęKup książkę Stosowanie uczenia głębokiego w celu generowania danych W tym rozdziale opisałem:  Generowanie tekstu za pomocą sieci LSTM.  Implementację narzędzia DeepDream.  Wykonywanie transferu neuronowego.  Wariacyjne autoenkodery.  Generatywne sieci z przeciwnikiem. Potencjał udawania przez sztuczną inteligencję ludzkiego procesu myślowego wykracza poza pasywne zadania, takie jak rozpoznawanie obiektów, i zadania reakcyjne, takie jak prowadzenie samochodu. Sięga on również do zadań kreatywnych. Kilka lat temu nie wierzono mi, że w niedalekiej przyszłości większość naszej kultury będzie tworzona ze znaczną pomocą sztucznej inteligencji. Nie wierzyły mi nawet osoby od dłuższego czasu zajmujące się uczeniem maszynowym. Prognozę tę sformułowałem w 2014 r. Trzy lata później liczba niedowiarków zaczęła coraz szybciej maleć. Latem 2015 r. zobaczyli- śmy efekty pracy algorytmu DeepDream opracowanego przez firmę Google, który bawił nas psychodelicznym obrazem psich oczu i paranoidalnych artefaktów. W 2016 r. poja- wiła się aplikacja Prisma zamieniająca zdjęcia w obrazy o różnych stylach. Latem 2016 r. powstał eksperymentalny film krótkometrażowy Sunspring, stworzony na podstawie Poleć książkęKup książkę 280 ROZDZIAŁ 8. Stosowanie uczenia głębokiego w celu generowania danych scenariusza napisanego w pełni (łącznie z dialogami) przez algorytm LSTM. Coraz czę- ściej sieci neuronowe stosuje się do komponowania muzyki. Oczywiście dzieła tworzone obecnie przez sztuczną inteligencję nie są najwyższych lotów. Sztuczna inteligencja nie potrafi jeszcze zbliżyć się do poziomu ludzi pracujących jako scenarzyści, malarze i kompozytorzy. Zastępowanie ludzi nigdy nie było celem sztucznej inteligencji — nie chcemy zastąpić własnej inteligencji czymś innym, chcemy wnieść do naszego życia i naszej pracy więcej inteligentnych rozwiązań. W wielu zada- niach, a szczególnie w zadaniach kreatywnych, sztuczna inteligencja będzie używana w charakterze narzędzia wspierającego — będzie raczej nas wspierać, niż zastępować. Tworzenie dzieła przez artystę w dużej mierze sprowadza się do prostego rozpo- znawania wzorców i umiejętności technicznych. Te części procesu twórczego wiele osób uważa za mniej atrakcyjne. Tu właśnie wkracza sztuczna inteligencja. Nasz język i nasza sztuka charakteryzują się statystyczną strukturą. Algorytmy uczenia głębokiego mogą uczyć się takich właśnie struktur. Modele uczenia maszynowego mogę uczyć się ukrytej przestrzeni obrazów, muzyki i opowiadań. Następnie mogą generować próbki z tych przestrzeni w celu stworzenia nowego dzieła sztuki o charakterze podobnym do tego, co model rozpoznał w treningowym zbiorze danych. Oczywiście takie próbkowanie samo w sobie nie jest niczym kreatywnym. To tylko operacja matematyczna: algorytm nie ma pojęcia o ludzkim życiu, ludzkich emocjach i naszym doświadczaniu świata. Algorytm uczy się z doświadczeń, które bardzo różnią się od naszych. Znaczenie temu, co zostanie wygenerowane przez model, może nadać tylko interpretacja przez czło- wieka. Dane wygenerowane przez algorytm w rękach uzdolnionego artysty mogą zostać odpowiednio zmodyfikowane i nabrać piękna. Próbkowanie przestrzeni może stać się pędzlem wspomagającym artystę, modyfikować naszą kreatywność i poszerzać wyobraź- nię. Algorytmy mogą sprawić, że tworzeniem sztuki zacznie zajmować się szersza grupa osób, ponieważ sztuczna inteligencja eliminuje potrzebę posiadania doświadczenia i umiejętności technicznych — oddziela ekspresję artystyczną od warsztatu. Iannis Xenakis — wizjoner i pionier muzyki elektronicznej i algorytmicznej, wyraził tę samą myśl w latach 60. w kontekście stosowania automatycznych technologii w kom- ponowaniu muzyki1. Kompozytor zwolniony z obowiązku wykonywania skrupulatnych obliczeń może poświęcić się pracy nad ogólnymi problemami nowej formy muzycznej i przyglądać się uważnie wszelkim szczegółom tej formy, modyfikując wartości danych wejściowych. Może np. sprawdzić wszystkie kombinacje instrumentalne: od solistów, przez małe orkiestry, do dużych orkiestr. Dzięki pomocy komputerów kompozytor zaczyna działać jak pilot: naciska przyciski, wprowadza współrzędne i nadzoruje trajektorię lotu kosmicznej kapsuły dźwięku przez muzyczne konstelacje i galaktyki, które do niedawna mógł sobie tylko wyobrazić. W tym rozdziale opiszę różne potencjalne zastosowania uczenia głębokiego w celach twórczych. Przedstawię zagadnienia związane z sekwencyjnym generowaniem danych (techniki przydatne podczas tworzenia tekstu lub muzyki), algorytmem DeepDream, tworzeniem obrazów przy użyciu wariacyjnych autoenkoderów i generatywnych sieci 1 Iannis Xenakis, Musiques formelles: nouveaux principes formels de composition musicale, specjalne wydanie „La Revue musicale”, numery 253 – 254, 1963. Poleć książkęKup książkę 8.1. Generowanie tekstu za pomocą sieci LSTM 281 z przeciwnikiem. Podczas lektury tego rozdziału dowiesz się, jak sprawić, aby Twój komputer wygenerował nowe treści, i zaczniesz dostrzegać fantastyczne możliwości wynikające z łączenia techniki ze sztuką. 8.1. Generowanie tekstu za pomocą sieci LSTM W tym podrozdziale opiszę stosowanie rekurencyjnych sieci neuronowych do genero- wania danych sekwencyjnych. Zrobię to na przykładzie generowania tekstu, ale to samo rozwiązanie może zostać użyte w celu utworzenia dowolnych danych o charakterze sek- wencyjnym, takich jak sekwencje dźwięków tworzących muzykę i ruchy pędzlem two- rzące obraz (dane tego typu można uzyskać, nagrywając tabletem ruchy dłoni artysty). Możliwości generowania danych sekwencyjnych nie ograniczają się do tworzenia sztuki. Techniki tego typu stosuje się w syntezowaniu mowy i generowaniu wypowiedzi czatbotów. Udostępniona w 2016 r. przez firmę Google funkcja inteligentnej odpowiedzi, która może automatycznie wygenerować listę szybkich odpowiedzi na e-maile lub wia- domości tekstowe, jest oparta na podobnej technice. 8.1.1. Krótka historia generatywnych sieci rekurencyjnych Pod koniec 2014 r. mało kto miał do czynienia z sieciami LSTM. Dotyczyło to nawet osób zajmujących się zawodowo uczeniem maszynowym. Skuteczne generowanie danych sekwencyjnych przy użyciu rekurencyjnych sieci neuronowych zaczęło być popularne dopiero w 2016 r. Pomimo tego techniki te mają dość długą historię — za jej począ- tek można uznać opracowanie algorytmu LSTM w 1997 r.2. Początkowo algorytm ten stosowano do generowania tekstu znak po znaku. W 2002 r. Douglas Eck, pracując wówczas w szwajcarskim laboratorium Schmid- hubera, zastosował po raz pierwszy algorytm LSTM w celu wygenerowania muzyki. Udało mu się uzyskać obiecujące rezultaty. Eck jest obecnie badaczem w Google Brain, gdzie w 2016 r. założył zespół badawczy Magenta zajmujący się stosowaniem nowo- czesnych technik uczenia głębokiego w celu tworzenia chwytliwej muzyki. Jak widać, wdrożenie pomysłu może czasami trwać nawet 15 lat. Pod koniec lat dwutysięcznych i na początku drugiej dekady XXI w. Alex Graves stał się pionierem stosowania rekurencyjnych sieci neuronowych w celu generowania sekwencyjnych danych. Za punkt zwrotny rozwoju tej techniki uważa się napisanie przez niego pracy na temat stosowania różnych gęstych rekurencyjnych sieci w celu wygenerowania pisma odręcznego przy użyciu danych szeregu czasowego określają- cych położenie długopisu3. Właśnie to zastosowanie sieci neuronowych było dla mnie urzeczywistnieniem idei śniącej maszyny i stanowiło duże źródło inspiracji, gdy rozpo- czynałem pracę nad pakietem Keras. Graves miał podobne spostrzeżenia na ten temat. Świadczy o tym treść komentarza ukrytego w pliku LaTeX, załadowanego na serwer 2 Sepp Hochreiter i Jürgen Schmidhuber, Long Short-Term Memory, „Neural Computation” 9, nr 8, 1997. 3 Alex Graves, Generating Sequences With Recurrent Neural Networks, arXiv, 2013, https://arxiv. org/abs/1308.0850. Poleć książkęKup książkę 282 ROZDZIAŁ 8. Stosowanie uczenia głębokiego w celu generowania danych arXiv jako wstępna wersja artykułu: „Generowanie danych sekwencyjnych jest czymś, co maksymalnie zbliża komputery do śnienia”. Po upływie kilku lat niektóre z wówczas nowatorskich rozwiązań traktujemy jako coś zwykłego, ale w tamtych czasach trudno było przyglądać się temu, co pokazywał Graves, i nie być oszołomionym ilością nowych możliwości. Od tego czasu rekurencyjne sieci neuronowe zaczęły być skutecznie stosowane w celu generowania muzyki, obrazów, treści dialogów, syntezy mowy i projektowania mole- kuł. Użyto ich nawet do wygenerowania scenariusza filmu, który został zrealizowany z udziałem prawdziwej obsady. 8.1.2. Generowanie danych sekwencyjnych Uniwersalnym sposobem generowania danych sekwencyjnych przy użyciu uczenia głębokiego jest trenowanie sieci (zwykle sieci rekurencyjnej lub konwolucyjnej) w celu przewidywania kolejnego znaku lub kilku kolejnych znaków wchodzących w skład sekwencji na podstawie wcześniejszych znaków pełniących funkcję danych wejściowych. Przykładowo, fraza wejściowa „kot leży na maci” sprawi, że wytrenowana do przewi- dywania sieć wygeneruje literę „e” jako kolejną literę tej frazy. Pracując z danymi tekstowymi, możemy operować na tokenach mających formę słów lub znaków. Sieć mogącą modelować prawdopodobieństwo kolejnego tokena na podstawie poprzednich tokenów określamy mianem modelu języka. Model języka rozpoznaje ukrytą przestrzeń języka — jego strukturę statystyczną. Po wytrenowaniu modelu języka możemy go używać w celu tworzenia próbek (generowania nowych sekwencji): do modelu kierowany jest początkowy łańcuch znaków (nazywa się go danymi warunkującymi), a model ma wygenerować kolejną literę lub kolejne słowo (możliwe jest nawet jednoczesne generowanie kilku tokenów). Wyge- nerowane dane wyjściowe są dodawane do danych wejściowych, a cały proces jest powtarzany wielokrotnie (patrz rysunek 8.1). Pętla ta pozwala na generowanie sekwencji o dowolnej długości. Charakter tych sekwencji odzwierciedla strukturę danych, na któ- rych model został wytrenowany — sekwencje wyglądają prawie tak, jakby zostały napi- sane przez człowieka. W tej sekcji zaprezentuję przykład, w którym warstwa LSTM na podstawie łańcuchów N znaków wyciągniętych z korpusu tekstu ma przewidywać znak N + 1. Na wyjściu modelu będzie znajdować się warstwa softmax określająca prawdopodobieństwa wszystkich liter na umieszczenie w charakterze kolejnego znaku. Warstwa LSTM, z której będę korzystać, określana jest mianem modelu języka na poziomie liter. 8.1.3. Dlaczego strategia próbkowania jest ważna? Podczas generowania tekstu bardzo ważny jest sposób wyboru kolejnego znaku. Naiwną techniką wyboru kolejnego znaku jest tzw. chciwe próbkowanie (ang. greedy sam- pling) — zawsze wybierany jest znak o najwyższym prawdopodobieństwie. W praktyce zastosowanie tej techniki prowadzi do uzyskania powtarzalnych, przewidywalnych łań- cuchów, które nie wyglądają naturalnie. Lepszym rozwiązaniem, dokonującym mniej oczywistych wyborów, jest proces próbkowania korzystający z mechanizmu losowania Poleć książkęKup książkę 8.1. Generowanie tekstu za pomocą sieci LSTM 283 Rysunek 8.1. Proces generowania tekstu znak po znaku przy użyciu modelu języka wybierającego kolejne znaki na podstawie rozkładu prawdopodobieństwa. Określamy je mianem próbkowania stochastycznego (przymiotnik stochastyczny w tym kontek- ście oznacza to samo co przymiotnik losowy). Po zastosowaniu tej techniki, jeżeli litera „e” charakteryzowała się prawdopodobieństwem wybrania jako kolejny znak na poziomie równym 0,3, litera ta będzie wybierana w 30 sytuacji. Zwróć uwagę na to, że prób- kowanie chciwe może być również rzutowane na rozkład prawdopodobieństwa. Wów- czas jeden znak będzie charakteryzował się prawdopodobieństwem równym 1, a pozo- stałe znaki będą miały zerowe wartości prawdopodobieństwa. Probabilistyczne próbkowanie wyjściowe z warstwy softmax modelu jest dobrym rozwiązaniem, ponieważ pozwala na pojawienie się czasem nawet mniej prawdopo- dobnych znaków, co umożliwia uzyskanie bardziej interesujących zdań i wykazanie pewnej kreatywności poprzez tworzenie nowych realistycznie brzmiących słów, które nie wystąpiły w treningowym zbiorze danych. Strategia ta ma jedną wadę: nie oferuje żadnego sposobu kontrolowania tego, jak bardzo losowy jest proces próbkowania. Dlaczego mielibyśmy chcieć zwiększać lub zmniejszać losowość? Przyjrzyjmy się ekstremalnemu przykładowi próbkowania o charakterze czysto losowym (kolejny znak jest wybierany z jednolitego rozkładu prawdopodobieństw — każda litera charakteryzuje się taką samą wartością prawdopodobieństwa). To najbardziej losowy scenariusz — rozkład prawdopodobieństwa charakteryzuje się maksymalną entropią. Oczywiście nie doprowadzi on do uzyskania niczego ciekawego. Z drugiej strony inny ekstremalny przy- padek — próbkowanie chciwe — również nie przyczynia się do wygenerowania niczego ciekawego (nie ma tutaj żadnej losowości, a rozkład prawdopodobieństwa charaktery- zuje się minimalną entropią). Próbkowanie z „realnego” rozkładu prawdopodobieństwa (rozkład generowany na wyjściu modelu przez funkcję softmax) stanowi rozwiązanie pośrednie, leży dokładnie na środku między dwoma zaprezentowanymi ekstremami. Oczywiście istnieje wiele innych punktów pośrednich (o wyższej lub niższej entropii), którym warto się przyjrzeć. Zmniejszenie entropii sprawi, że wygenerowane struktury będą charakteryzowały się bardziej przewidywalną strukturą, a więc potencjalnie mogą wyglądać bardziej realistycznie. Zmniejszanie entropii sprawi, że uzyskamy bardziej zaskakujące i kreatywne sekwencje. Gdy wykonuje się operację próbkowania z gene- ratywnych modeli, zawsze warto sprawdzić wpływ różnej ilości czynnika losowego na proces generowania. Ostatecznie to my (ludzie) oceniamy to, jak bardzo interesujące są wygenerowane dane, a więc jest to bardzo subiektywne i nie można z góry ocenić optymalnego poziomu entropii. Poleć książkęKup książkę 284 ROZDZIAŁ 8. Stosowanie uczenia głębokiego w celu generowania danych W celu kontrolowania tego, jak bardzo losowy jest charakter procesu losowania, wprowadzimy parametr określany mianem temperatury softmax. Parametr ten charakte- ryzuje entropię rozkładu prawdopodobieństwa używanego podczas próbkowania — określa to, jak bardzo zaskakujące lub przewidywalne będą wybory kolejnych liter. Na podstawie wartości temperatury (temperature) poprzez zmiany wag obliczany jest nowy rozkład prawdopodobieństwa (przetwarzamy rozkład poprzedni wygenerowany przez warstwę wyjściową softmax modelu). Proces ten przebiega w następujący sposób: Listing 8.1. Zmiany wag rozkładu prawdopodobieństwa w celu uzyskania innej temperatury softmax Rozkład original_distribution jest jednowymiarowym wektorem zawierającym wartości prawdopodobieństwa, których suma jest równa 1. Współczynnik temperature określa entropię rozkładu wyjściowego. reweight_distribution - function(original_distribution, temperature = 0.5) { distribution - log(original_distribution) / temperature distribution - exp(distribution) distribution / sum(distribution) ) Zwracana jest zmodyfikowana wersja rozkładu. Suma wartości poszczególnych prawdopodobieństw nie musi być równa 1, a więc w celu uzyskania prawidłowych wartości należy przeprowadzić operację dzielenia wartości przez ich sumę. Większe wartości parametru temperature prowadzą do uzyskania rozkładu próbkowania o wyższej entropii, a więc generowane będą bardziej zaskakujące dane. Mniejsze warto- ści tego parametru zmniejszają losowość i pozwalają na uzyskanie bardziej przewidy- walnych danych (patrz rysunek 8.2). Rysunek 8.2. Ten sam rozkład prawdopodobieństwa z różnymi wagami; zmniejszenie parametru temperature powoduje większą przewidywalność; zwiększenie parametru temperature zwiększa losowość Poleć książkęKup książkę 8.1. Generowanie tekstu za pomocą sieci LSTM 285 8.1.4. Implementacja algorytmu LSTM generującego tekst na poziomie liter Czas skorzystać z pakietu Keras i zastosować teorię w praktyce. Na początek będziemy potrzebować dużo danych tekstowych do trenowania modelu języka. Możemy skorzystać z dowolnego wystarczająco rozbudowanego zestawu plików tekstowych — Wikipedii, Władcy pierścieni itd. W zaprezentowanym przykładzie posłużymy się wybranymi dzie- łami Friedricha Nietzschego — niemieckiego filozofa żyjącego w XIX w. — przetłu- maczonymi na język angielski. W związku z tym wytrenujemy model odwzorowujący spe- cyficzny styl pisania Nietzschego. Ponadto model ten będzie generował teksty tylko na wybrane tematy — nie będzie to ogólny model języka angielskiego. PRZYGOTOWANIE DANYCH Zacznijmy od pobrania korpusu i zapisania go przy użyciu tylko małych liter. Listing 8.2. Pobieranie i parsowanie pliku tekstowego library(keras) library(stringr) path - get_file( nietzsche.txt , origin = https://s3.amazonaws.com/text-datasets/nietzsche.txt ) text - tolower(readChar(path, file.info(path)$size)) cat( Długość korpusu: , nchar(text), \n ) Teraz dokonamy wyodrębnienia częściowo zachodzących na siebie sekwencji o długości maxlen, zakodujemy je techniką kodowania z gorącą jedynką, a następnie umieścimy je w trójwymiarowej tablicy o kształcie x (sequences, maxlen, unique_characters). Jedno- cześnie przygotujemy tablicę y zawierającą „wartości docelowe”, które w tym przy- padku są po prostu literami umieszczanymi po każdej z wyodrębnionych sekwencji. Wartości te zostaną zapisane przy użyciu techniki kodowania z gorącą jedynką. Listing 8.3. Zapis sekwencji liter za pomocą wektorów maxlen - 60 step - 3 Wyodrębniamy sekwencje składające się z 60 znaków. Nowa sekwencja jest próbkowana co 3 znaki. Zmienna, w której zapisywane będą wyodrębnione sekwencje. text_indexes - seq(1, nchar(text) - maxlen, by = step) sentences - str_sub(text, text_indexes, text_indexes + maxlen - 1) next_chars - str_sub(text, text_indexes + maxlen, text_indexes + maxlen) Zmienna, w której zapisywane będą kolejne znaki (cele). cat( Liczba sekwencji: , length(sentences), \n ) chars - unique(sort(strsplit(text, )[[1]])) cat( Liczba unikatowych znaków: , length(chars), \n ) char_indices - 1:length(chars) names(char_indices) - chars Lista unikatowych znaków wchodzących w skład korpusu. Słownik przypisujący unikatowe znaki do ich indeksów. Poleć książkęKup książkę 286 ROZDZIAŁ 8. Stosowanie uczenia głębokiego w celu generowania danych cat( Tworzenie wektorów...\n ) x - array(0L, dim = c(length(sentences), maxlen, length(chars))) y - array(0L, dim = c(length(sentences), length(chars))) for (i in 1:length(sentences)) { sentence - strsplit(sentences[[i]], )[[1]] for (t in 1:length(sentence)) { char - sentence[[t]] x[i, t, char_indices[[char]]] - 1 } next_char - next_chars[[i]] y[i, char_indices[[next_char]]] - 1 } Znaki są zapisywane w formie tablic binarnych przy użyciu kodowania z gorącą jedynką. BUDOWANIE SIECI Sieć składa się z pojedynczej warstwy layer_lstm i klasyfikatora dense z funkcją aktywacji softmax. Pamiętajmy o tym, że generowanie danych sekwencyjnych nie musi być prze- prowadzane przy użyciu rekurencyjnych sieci neuronowych. Ostatnio coraz częściej stosuje się w tym celu jednowymiarowe sieci konwolucyjne. Listing 8.4. Model jednowarstwowej sieci LSTM przewidujący kolejny znak model - keras_model_sequential() layer_lstm(units = 128, input_shape = c(maxlen, length(chars))) layer_dense(units = length(chars), activation = softmax ) Wartości docelowe (znaki) są zakodowane przy użyciu techniki gorącej jedynki, a więc funkcją straty trenowanego modelu będzie categorical_crossentropy. Listing 8.5. Konfiguracja kompilacji modelu optimizer - optimizer_rmsprop(lr = 0.01) model compile( loss = categorical_crossentropy , optimizer = optimizer ) TRENOWANIE MODELU JĘZYKA I PRÓBKOWANIE Z NIEGO Dysponując wytrenowanym modelem i kawałkiem początkowego tekstu, możemy wyge- nerować nowy tekst. W tym celu należy powtarzać następujące operacje: 1. Użyj modelu w celu wygenerowania rozkładu prawdopodobieństwa następnego znaku kontynuującego obecny tekst. 2. Zmodyfikuj rozkład, korzystając z określonej wartości parametru temperature. 3. Przeprowadź operację losowego próbkowania następnego znaku na podstawie zmodyfikowanego rozkładu. 4. Dodaj nowy znak na końcu obecnego tekstu. Oto kod używany do zmiany wag rozkładu prawdopodobieństwa wygenerowanego przez model. Kod ten tworzy funkcję próbkującą, która również określa indeks znaku. Poleć książkęKup książkę 8.1. Generowanie tekstu za pomocą sieci LSTM 287 Listing 8.6. Funkcja próbkująca kolejny znak na podstawie przewidywań modelu sample_next_char - function(preds, temperature = 1.0) { preds - as.numeric(preds) preds - log(preds) / temperature exp_preds - exp(preds) preds - exp_preds / sum(exp_preds) which.max(t(rmultinom(1, 1, preds))) } Na koniec poniższa pętla wykonuje operację trenowania modelu i generowania tek- stu. Wygenerujemy teksty przy różnych wartościach parametru temperature (warto- ści te będą zmieniane przy rozpoczęciu kolejnych epok procesu trenowania). Pozwoli to nam zobaczyć, jak zmienia się tekst wraz z udoskonalaniem modelu, a także to, jak parametr temperature wpływa na strategię próbkowania. Listing 8.7. Pętla generująca tekst for (epoch in 1:60) { Model będzie trenowany przez 60 epok. cat( epoch , epoch, \n ) model fit(x, y, batch_size = 128, epochs = 1) Dopasowywanie modelu. start_index - sample(1:(nchar(text) - maxlen - 1), 1) seed_text - str_sub(text, start_index, start_index + maxlen - 1) Losowanie tekstu początkowego. cat( --- Generowanie przy użyciu tekstu początkowego: , seed_text, \n\n ) for (temperature in c(0.2, 0.5, 1.0, 1.2)) { Sprawdzanie różnych parametrów temperature procesu próbkowania. cat( ------ Wartość parametru temperature: , temperature, \n ) cat(seed_text, \n ) generated_text - seed_text for (i in 1:400) { Generowanie 400 znaków (proces rozpoczyna się od wylosowanego tekstu początkowego). sampled - array(0, dim = c(1, maxlen, length(chars))) generated_chars - strsplit(generated_text, )[[1]] for (t in 1:length(generated_chars)) { char - generated_chars[[t]] sampled[1, t, char_indices[[char]]] - 1 } preds - model predict(sampled, verbose = 0) next_index - sample_next_char(preds[1,], temperature) next_char - chars[[next_index]] generated_text - paste0(generated_text, next_char) generated_text - substring(generated_text, 2) Jedna iteracja trenowania modelu na dostępnych danych treningowych. Próbkowanie kolejnego znaku. cat(next_char) } cat( \n\n ) } } Poleć książkęKup książkę 288 ROZDZIAŁ 8. Stosowanie uczenia głębokiego w celu generowania danych Oto tekst wygenerowany przy użyciu wylosowanej frazy new faculty, and the jubilation reached its climax when kant. Został on uzyskany po 20 epokach trenowania algorytmu — na długo przed osiągnięciem końca procesu trenowania — przy parametrze temperature przyjmującym wartość równą 0,2: new faculty, and the jubilation reached its climax when kant and such a man in the same time the spirit of the surely and the such the such as a man is the sunligh and subject the present to the superiority of the special pain the most man and strange the subjection of the special conscience the special and nature and such men the subjection of the special men, the most surely the subjection of the special intellect of the subjection of the same things and Oto wynik przy parametrze temperature przyjmującym wartość równą 0,5: new faculty, and the jubilation reached its climax when kant in the eterned and such man as it s also become himself the condition of the experience of off the basis the superiory and the special morty of the strength, in the langus, as which the same time life and even who discless the mankind, with a subject and fact all you have to be the stand and lave no comes a troveration of the man and surely the conscience the superiority, and when one must be w A to wynik przy parametrze temperature przyjmującym wartość 1,0: new faculty, and the jubilation reached its climax when kant, as a periliting of manner to all definites and transpects it it so hicable and ont him artiar resull too such as if ever the proping to makes as cnecience. to been juden, all every could coldiciousnike hother aw passife, the plies like which might thiod was account, indifferent germin, that everythery certain destrution, intellect into the deteriorablen origin of moralian, and a lessority o Po 60 epokach proces trenowania można uznać za praktycznie zakończony — tekst generowany przez model zaczyna wyglądać na coraz bardziej składny. Oto tekst wygene- rowany przy parametrze temperature przyjmującym wartość 0,2: cheerfulness, friendliness and kindness of a heart are the sense of the spirit is a man with the sense of the sense of the world of the self-end and self-concerning the subjection of the strengthorixes--the subjection of the subjection of the subjection of the self-concerning the feelings in the superiority in the subjection of the subjection of the spirit isn t to be a man of the sense of the subjection and said to the strength of the sense of the A to tekst wygenerowany przy parametrze temperature przyjmującym wartość 0,5: cheerfulness, friendliness and kindness of a heart are the part of the soul who have been the art of the philosophers, and which the one won t say, which is it the higher the and with religion of the frences. the life of the spirit among the most continuess of the strengther of the sense the conscience of men of precisely before enough presumption, and can mankind, and something the conceptions, the subjection of the sense and suffering and the Poleć książkęKup książkę 8.1. Generowanie tekstu za pomocą sieci LSTM 289 Przy parametrze temperature przyjmującym wartość 1,0 wygenerowany został nastę- pujący tekst: cheerfulness, friendliness and kindness of a heart are spiritual by the ciuture for the entalled is, he astraged, or errors to our you idstood--and it needs, to think by spars to whole the amvives of the newoatly, prefectly raals! it was name, for example but voludd atu-especity --or rank onee, or even all solett increessic of the world and implussional tragedy experience, transf, or insiderar,--must hast if desires of the strubction is be stronges Jak widać, niska wartość parametru temperature prowadzi do uzyskania tekstu, który charakteryzuje się dużą przewidywalnością i powtarzalnością, ale jego lokalna struk- tura jest bardzo realistyczna — wszystkie wygenerowane słowa (słowo jest lokalnym wzorcem składającym się ze znaków) występują w języku angielskim. Przy wyższych wartościach parametru temperature wygenerowany tekst staje się bardziej interesujący, zaskakujący, a nawet kreatywny — algorytm czasami wymyśla nawet nowe słowa, które brzmią tak, jakby były naprawdę istniejącymi słowami (są to np. eterned i troveration), ale lokalna struktura tekstu zaczyna się załamywać i większość słów wygląda tak, jakby była prawie losowym zbiorem znaków. Bez wątpienia najciekawsze efekty w przypadku tego generowania tekstu uzyskuje się przy parametrze temperature równym 0,5. Zawsze warto eksperymentować z różnymi strategiami próbkowania! Dobra równowaga między wytrenowaną strukturą a losowością sprawi, że wygenerowany tekst będzie interesujący. Trenując model dłużej, tworząc większy model i stosując większy zbiór danych, można generować próbki, które wyglądają o wiele składniej i bardziej realistycznie. Oczywiście nie należy oczekiwać od modelu wygenerowania tekstu, który będzie miał jakiś większy sens — mechanizm generujący tekst tylko próbkuje litery z modelu staty- stycznego określającego ich kolejność. Język jest kanałem komunikacji, a rozmowy doty- czące różnych tematów charakteryzują się inną strukturą statystyczną. Tezę tę można udowodnić, odpowiadając sobie na pytanie: co, jeżeli język ludzki zostałby skompreso- wany tak, jak kompresowana jest większość cyfrowej komunikacji między kompute- rami? Wówczas język przenosiłby tyle samo informacji, ale nie charakteryzowałby się żadną ukrytą strukturą statystyczną, co uniemożliwiłoby wytrenowanie modelu języka w sposób, w jaki zrobiliśmy to przed chwilą. 8.1.5. Wnioski  Dyskretna sekwencja danych może zostać wygenerowana poprzez trenowanie modelu pod kątem przewidywania kolejnych elementów tekstu na podstawie wcześniejszego ciągu znaków.  Model trenowany na zbiorze danych tekstowych określany jest mianem modelu języka. Może on być oparty na słowach lub literach.  Próbkowanie zbioru elementów tekstu wymaga kompromisu między bezkrytycz- nym przyjmowaniem przewidywań modelu a losowością. Poleć książkęKup książkę 290 ROZDZIAŁ 8. Stosowanie uczenia głębokiego w celu generowania danych  Można to zrobić przy użyciu parametru temperature funkcji softmax. Wybór właściwej wartości tego parametru powinien zostać dokonany na drodze ekspe- rymentów. 8.2. DeepDream DeepDream to technika artystycznego modyfikowania obrazów, która korzysta z repre- zentacji wyuczonych przez konwolucyjne sieci neuronowe. Została ona upubliczniona przez firmę Google w 2015 r. w postaci implementacji napisanej z wykorzystaniem biblioteki uczenia głębokiego o nazwie Caffe (miało to miejsce kilka miesięcy przed opublikowaniem pierwszej wersji pakietu TensorFlow)4. Rozwiązanie to bardzo szybko wywołało sensację z powodu generowania obrazów przypominających narkotyczne wizje (patrz przykład przedstawiony na rysunku 8.3) — grafiki te były pełne różnych arte- faktów, psich oczu, piór ptaków itd., co wynikało z tego, że sieć konwolucyjna Deep- Dream była trenowana na zbiorze ImageNet, w którym zdjęć psów i ptaków jest wię- cej od zdjęć innych zwierząt i przedmiotów. Rysunek 8.3. Przykładowy obraz wygenerowany przez algorytm DeepDream Algorytm DeepDream jest bardzo podobny do techniki filtrowania wizualizacji przy użyciu konwolucyjnej sieci neuronowej przedstawionej w rozdziale 5. Rozwiązanie to składało się z sieci konwolucyjnej działającej odwrotnie — dane wejściowe były prze- 4 Alexander Mordvintsev, Christopher Olah i Mike Tyka, DeepDream: A Code Example for Visualizing Neural Networks, Google Research Blog, 1 lipca 2015 r., http://mng.bz/xXlM. Poleć książkęKup książkę 8.2. DeepDream 291 twarzane przez algorytm wzrostu gradientowego w celu maksymalizacji aktywacji wybra- nego filtra górnej warstwy konwolucyjnej sieci neuronowej. Twórcy algorytmu Deep- Dream skorzystali z tego samego rozwiązania, ale opracowany przez nich algorytm charakteryzuje się pewnymi różnicami:  W algorytmie DeepDream próbuje się maksymalizować aktywację całej warstwy, a nie wybranego filtra, co powoduje jednoczesne mieszanie się wizualizacji wielu cech.  Generowanie obrazu nie rozpoczyna się od pustego, nieco zaszumianego obrazu wejściowego — na wejściu przetwarzany jest gotowy obraz, co powoduje nano- szenie efektów na utworzony wcześniej obraz — elementy tego obrazu są znie- kształcane w sposób artystyczny.  Obrazy wejściowe są przetwarzane przy różnych skalach określanych mianem oktaw, co ma na celu poprawienie jakości wizualizacji. Spróbujmy samodzielnie wygenerować jakieś ciekawe obrazy. 8.2.1. Implementacja algorytmu DeepDream w pakiecie Keras Zaczniemy od konwolucyjnej sieci neuronowej wytrenowanej na zbiorze obrazów Image- Net. Pakiet Keras zawiera wiele takich sieci. Są to między innymi: VGG16, VGG19, Xception i ResNet50. Algorytm DeepDream może zostać zaimplementowany przy użyciu każdej z tych sieci, ale wybór sieci będzie miał oczywiście wpływ na genero- wane wizualizacje. Wynika to z tego, że różne architektury sieci konwolucyjnych uczą się różnych cech. W oryginalnym algorytmie DeepDream zastosowano model Inception. Wykorzystanie tego modelu pozwala na wygenerowanie ładnie wyglądających grafik, a więc skorzystamy z modelu Inception V3 dołączonego do pakietu Keras. Listing 8.8. Ładowanie wytrenowanego modelu Inception V3 library(keras) K.set_learning_phase(0) model - application_inception_v3( weights = imagenet , include_top = FALSE, ) Nie będziemy trenować modelu. Polecenie to wyłącza wszystkie operacje używane tylko podczas trenowania. Sieć Inception V3 jest budowana bez swojej konwolucyjnej bazy. Model zostanie załadowany z wagami wytrenowanymi na zbiorze ImageNet. Następnie musimy zająć się obliczaniem straty — wartości, którą będziemy starali się maksymalizować w procesie wzrostu gradientu. W rozdziale 5. podczas filtrowania wizualizacji staraliśmy się maksymalizować wartość określonego filtra wybranej war- stwy sieci. Tym razem będziemy jednocześnie maksymalizować aktywacje wszystkich filtrów wielu warstw, a konkretnie rzecz biorąc, będziemy maksymalizować sumę normy L2 aktywacji zbioru warstw wysokiego poziomu. Wybór warstw (a także dokłada- nie się poszczególnych warstw do finalnej wartości straty) ma największy wpływ na generowane wizualizacje. W związku z tym chcemy, aby parametry te można było z łatwością modyfikować. Niższe warstwy odpowiadają za wzorce geometryczne, Poleć książkęKup książkę 292 ROZDZIAŁ 8. Stosowanie uczenia głębokiego w celu generowania danych a wyższe warstwy odpowiadają za elementy obrazu pozwalające na rozpoznawanie klas zbioru ImageNet (np. ptaków lub psów). Zaczniemy od niezbyt optymalnej konfigu- racji czterech warstw, ale z pewnością warto wypróbować później działanie wielu innych konfiguracji. Listing 8.9. Konfiguracja algorytmu DeepDream layer_contributions - list( mixed2 = 0.2, mixed3 = 3, mixed4 = 2, mixed5 = 1.5 ) Lista z nazwami przypisująca nazwy warstw do współczynników wpływu aktywacji warstw na wartość straty, którą chcemy maksymalizować. Zauważ, że nazwy warstw są wprowadzone na stałe w wbudowanej aplikacji Inception V3. Listę nazw wszystkich warstw modelu można wyświetlić za pomocą polecenia summary(model). Teraz czas zdefiniować tensor zawierający wartość straty: ważoną sumę normy L2 akty- wacji warstw z listingu 8.9. Listing 8.10. Definiowanie mechanizmu maksymalizującego wartość straty layer_dict - model$layers names(layer_dict) - lapply(layer_dict, function(layer) layer$name) Tworzy listę przypisującą nazwy warstw do instancji warstw. Strata będzie definiowana przez dodanie wartości charakteryzujących wpływ poszczególnych warstw na stratę. loss - k_variable(0) for (layer_name in names(layer_contributions)) { coeff - layer_contributions[[layer_name]] activation - layer_dict[[layer_name]]$output scaling - k_prod(k_cast(k_shape(activation), float32 )) loss - loss + (coeff * k_sum(k_square(activation)) / scaling) } Przechwytuje wyjście warstwy. Dodaje normę L2 cech warstwy do straty. Teraz możemy uruchomić proces wzrostu gradientu. Listing 8.11. Proces wzrostu gradientu dream - model$input W tym tensorze znajduje się wygenerowany obraz (wizja). grads - k_gradients(loss, dream)[[1]] Oblicza gradienty wizji na podstawie wartości straty. grads - grads / k_maximum(k_mean(k_abs(grads)), 1e-7) outputs - list(loss, grads) fetch_loss_and_grads - k_function(list(dream), outputs) eval_loss_and_grads - function(x) { outs - fetch_loss_and_grads(list(x)) loss_value - outs[[1]] grad_values - outs[[2]] list(loss_value, grad_values) } gradient_ascent - function(x, iterations, step, max_loss = NULL) { for (i in 1:iterations) { c(loss_value, grad_values) - eval_loss_and_grads(x) if (!is.null(max_loss) loss_value max_loss) Normalizuje gradienty (to ważny zabieg). Konfiguruje funkcję Keras służącą do uzyskiwania wartości straty i gradientów na podstawie obrazu wejściowego. Funkcja wykonująca iteracje procesu wzrostu gradientu. Poleć książkęKup książkę 8.2. DeepDream 293 break cat( ...Wartość straty , i, : , loss_value, \n ) x - x + (step * grad_values) } x } Funkcja wykonująca iteracje procesu wzrostu gradientu. Na koniec możemy zająć się właściwym algorytmem DeepDream. Na początku definio- wana jest lista skal (nazywanych również oktawami), które są używane podczas przetwa- rzania obrazów. Każda kolejna skala jest większa od poprzedniej o współczynnik równy 1,4 (jest o 40 większa) — zaczynamy od przetwarzania małego obrazu, a następnie zwiększamy jego skalę (patrz rysunek 8.4). Rysunek 8.4. Działanie algorytmu DeepDream: następujące po sobie operacje skalowania przestrzennego (oktawy) i dodawania szczegółów Po każdej kolejnej operacji skalowania (od najmniejszej do największej) uruchamiany jest algorytm wzrostu gradientu w celu maksymalizacji zdefiniowanej wcześniej straty przy danej skali. Po każdym zakończeniu pracy tego algorytmu skala obrazu jest zwiększa- na o 40 . W celu uniknięcia utraty dużej ilości szczegółów obrazu po każdej operacji skalo- wania (w wyniku tych operacji otrzymywany jest coraz bardziej rozmyty i rozpikselowany obraz) możemy wykonać prosty zabieg polegający na ponownym dodaniu utraconych szczegółów do obrazu. Jest to możliwe do wykonania, ponieważ wiemy, jak powinien wyglądać oryginalny obraz w większej rozdzielczości. Dysponując obrazem S o małym rozmiarze i obrazem L o większym rozmiarze, możemy przekształcić obraz L do roz- miaru obrazu S i określić różnice między tymi obrazami — różnica ta będzie wskazy- wać utracone szczegóły. Listing 8.12. Określanie wzrostu gradientu przy kolejnych operacjach skalowania obrazu step - 0.01 num_octave - 3 Rozmiar kroku algorytmu wzrostu gradientu. Liczba operacji skalowania, przy których należy uruchomić algorytm wzrostu gradientu. Modyfikacja tych parametrów pozwala na uzyskanie innych efektów wizualnych. Poleć książkęKup książkę 294 ROZDZIAŁ 8. Stosowanie uczenia głębokiego w celu generowania danych octave_scale - 1.4 iterations - 20 max_loss - 10. Różnica między rozmiarami kolejnych wersji obrazu. Liczba kroków wzrostu wykonywanych przy każdej operacji skalowania. Modyfikacja tych parametrów pozwala na uzyskanie innych efektów wizualnych. Jeżeli strata przekroczy wartość równą 10, to proces wzrostu gradientu zostanie przerwany w celu zapobiegnięcia powstawania brzydkich artefaktów. base_image_path - … Tu należy umieścić ścieżkę obrazu, który chcemy przetwarzać. img - preprocess_image(base_image_path) Ładowanie obrazu do tablicy (funkcję tę zdefiniowano w listingu 8.13). original_shape - dim(img)[-1] successive_shapes - list(original_shape) for (i in 1:num_octave) { shape - as.integer(original_shape / (octave_scale ^ i)) successive_shapes[[length(successive_shapes) + 1]] - shape } Przygotowywanie listy kształtów definiujących skalowania, przy których uruchomiony zostanie algorytm wzrostu gradientu. successive_shapes - rev(successive_shapes) Odwracanie listy kształtów tak, aby znalazły się w kolejności rosnącej. original_img - img shrunk_original_img - resize_img(img, successive_shapes[[1]]) Zmiana rozmiaru tablicy obrazu w celu zmniejszenia jego skali. for (shape in successive_shapes) { cat( Zmiana kształtu obrazu , shape, \n ) img - resize_img(img, shape) img - gradient_ascent(img, iterations = iterations, step = step, max_loss = max_loss) Zwiększanie skali generowanego obrazu. Po wygenerowaniu obrazu uruchamiany jest algorytm wzrostu gradientu. Przeskalowywanie mniejszej wersji oryginalnego obrazu (obraz ten będzie rozpikselowany). upscaled_shrunk_original_img - resize_img(shrunk_original_img, shape) same_size_original - resize_img(original_img, shape) lost_detail - same_size_original - upscaled_shrunk_original_img img - img + lost_detail shrunk_original_img - resize_img(original_img, shape) save_img(img, fname = sprintf( dream/at_scale_ s.png , paste(shape, collapse = x ))) } Przywracanie szczegółów. Różnica między tymi obrazami określa szczegóły utracone podczas zwiększania skali obrazu. Tworzenie wersji oryginalnego obrazu o tym rozmiarze, mającej wysoką jakość. W kodzie algorytmu zwiększania gradientu zastosowano poniższe funkcje pomocnicze. Listing 8.13. Funkcje pomocnicze resize_img - function(img, size) { image_array_resize(img, size[[1]], size[[2]]) } save_img - function(img, fname) { img - deprocess_image(img) image_array_save(img, fname) Poleć książkęKup książkę 8.2. DeepDream 295 preprocess_image - function(image_path) { image_load(image_path) image_to_array() array_reshape(dim = c(1, dim(.))) inception_v3_preprocess_input() } Funkcja narzędziowa używana podczas otwierania obrazu, zmiany jego rozdzielczości i zapisywania go w formie tensora, który może zostać przetworzony przez sieć Inception V3. deprocess_image - function(img) { img - array_reshape(img, dim = c(dim(img)[[2]], dim(img)[[3]], 3)) img - img / 2 img - img + 0.5 img - img * 255 Cofa obróbkę wstępną dokonaną przez funkcję imagenet_preprocess_input. Funkcja narzędziowa konwertująca tensor do postaci właściwego obrazu. dims - dim(img) img - pmax(0, pmin(img, 255)) dim(img) - dims img } UWAGA Oryginalna wersja sieci Inception V3 była trenowana pod kątem rozpoznawania elementów obrazów o rozdzielczości 299299, a w naszym procesie zmniejszamy rozdziel- czość obrazu o określony współczynnik, tak więc zaprezentowana implementacja algorytmu DeepDream daje najlepsze efekty podczas pracy z obrazami o rozdzielczości znajdującej się w zakresie od 300300 do 400400. Pomimo tego możesz spróbować użyć tego kodu do przetworzenia obrazu o dowolnej rozdzielczości i dowolnych proporcjach. Na rysunku 8.5 pokazano efekt przetwarzania zdjęcia wykonanego na wzgórzach pomię- dzy zatoką San Francisco a kampusem firmy Google. Rysunek 8.5. Przetwarzanie przykładowego obrazu za pomocą algorytmu DeepDream Polecam samodzielną zabawę tym algorytmem poprzez zmianę warstw, które są uży- wane podczas obliczania straty. Niższe warstwy sieci zawierają bardziej lokalne, mniej abstrakcyjne reprezentacje danych i prowadzą do generowania wzorów, które bardziej przypominają kształty geometryczne. Wyższe warstwy sieci natomiast prowadzą do Poleć książkęKup książkę 296 ROZDZIAŁ 8. Stosowanie uczenia głębokiego w celu generowania danych generowania bardziej rozpoznawalnych wzorców wizualnych przypominających naj- popularniejsze obiekty zbioru ImageNet, takie jak oczy psa czy ptasie pióra. W celu szybkiego sprawdzenia efektów różnych kombinacji warstw możesz skorzystać z mecha- nizmu losowego generowania parametrów słownika layer_contributions. Na rysunku 8.6 przedstawiono efekty przetwarzania obrazu domowych wypieków uzyskane z wykorzy- staniem różnych konfiguracji warstw sieci neuronowej. Rysunek 8.6. Przetwarzanie przykładowego obrazu przez różne konfiguracje algorytmu DeepDream 8.2.2. Wnioski  Algorytm DeepDream składa się z sieci konwolucyjnej działającej na odwrót. Sieć ta generuje obrazy wejściowe na podstawie wyuczonych przez nią reprezen- tacji danych.  Uzyskane obrazy są ciekawe i przypominają wizje generowane przez ośrodek wzroku człowieka, który zażył środki psychodeliczne.  Możliwości tego procesu nie ograniczają się do przetwarzania grafiki i korzystania z sieci konwolucyjnych. Można go użyć także w celu zniekształcania np. mowy lub muzyki. Poleć książkęKup książkę 8.3. Neuronowy transfer stylu 297 8.3. Neuronowy transfer stylu Kolejnym ważnym rozwiązaniem modyfikującym obrazy, opartym na technologii ucze- nia głębokiego, jest neuronowy transfer stylu opracowany latem 2015 r. przez zespół kierowany przez Leona Gatysego5. Algorytm neuronowego transferu stylu od tego czasu był wielokrotnie usprawniany i modyfikowany. Zastosowano go w wielu aplikacjach pozwalających na edycję zdjęć przy użyciu smartfona. Dla uproszczenia skupimy się na oryginalnej wersji tego algorytmu. Neuronowy transfer stylu polega na zastosowaniu stylu obrazu referencyjnego w celu przetworzenia innego obrazu z zachowaniem jego zawartości. Przykład tego procesu pokazano na rysunku 8.7. Rysunek 8.7. Przykład transferu stylu Pojęcie stylu odnosi się do tekstur, kolorów i sposobu przedstawiania rzeczy widocz- nych na obrazie. Treścią określamy wysokopoziomową makrostrukturę obrazu. Niebie- skie i żółte linie narysowane pędzlem widoczne na rysunku 8.7 (obraz Gwiaździsta noc, namalowany przez Vincenta van Gogha) charakteryzują styl, a budynki widoczne na zdjęciu Tübingen są treścią. Idea transferu stylu powiązana z generowaniem tekstur była znana w środowisku osób zajmujących się przetwarzaniem obrazu na długo przed pojawieniem się w 2015 r. neuronowego transferu stylu, ale transfer stylu oparty na technikach uczenia głębo- kiego okazał się dawać o wiele lepsze rezultaty od tych, które uzyskiwano z zastoso- waniem klasycznych technik przetwarzania obrazu. Ta nowatorska technika zyskała wiele kreatywnych zastosowań. Implementacja transferu stylu jest oparta na tych samych rozwiązaniach, co wszystkie algorytmy uczenia głębokiego — definiujemy w niej funkcję straty i staramy się ją zminimalizować. Celem algorytmu jest zachowanie treści oryginalnego obrazu przy jednoczesnym przyjęciu stylu obrazu referencyjnego. Gdybyśmy mogli matematycz- nie zdefiniować treść (content) i styl (style), to wówczas funkcja straty (loss) miałaby następującą postać: loss - distance(style(reference_image) - style(generated_image)) + distance(content(original_image) - content(generated_image)) Distance (odległość) jest funkcją normy takiej jak norma L2, content jest funkcją przyj- mującą obraz i generującą reprezentację jego treści, a style — funkcją przyjmującą obraz i obliczającą reprezentację jego stylu. Minimalizacja straty sprawia, że wartość zwracana przez funkcję style(generated_image) zbliża się do wartości zwracanej przez 5 Leon A. Gatys, Alexander S. Ecker i Matthias Bethge, A Neural Algorithm of Artistic Style, arXiv, 2015, https://arxiv.org/abs/1508.06576. Poleć książkęKup książkę 298 ROZDZIAŁ 8. Stosowanie uczenia głębokiego w celu generowania danych style(reference_image), a content(generated_image) zbliża się do content(original_image), co prowadzi do zdefiniowanego wcześniej transferu stylu. Głównym spostrzeżeniem Gatysa i jego zespołu było to, że głębokie konwolucyjne sieci neuronowe umożliwiają matematyczne zdefiniowanie funkcji style i content. Sprawdźmy, jak do tego dochodzi. 8.3.1. Strata treści Przypominam, że aktywacje wcześniejszych warstw sieci zawierają lokalne informacje o obrazie, a aktywacje wyższych warstw zawierają coraz bardziej globalne i abstrak- cyjne informacje. W związku z tym można przyjąć, że aktywacje różnych warstw kon- wolucyjnej sieci zawierają rozkład treści obrazu przeprowadzony według różnych prze- strzennych skal, a więc treść obrazu, która jest bardziej globalna i abstrakcyjna, powinna być opisywana przez reprezentacje górnych warstw sieci konwolucyjnej. Dobrym kandydatem na funkcję straty treści jest norma L2 pomiędzy aktywacjami górnej warstwy uprzednio wytrenowanej sieci neuronowej, obliczona przy użyciu przetwarzanego obrazu i aktywacji tej samej warstwy określonych z zastosowaniem wygenerowanego obrazu. Rozwiązanie takie gwarantuje to, że z punktu widzenia górnej warstwy wygenerowany obraz będzie wyglądał podobnie do oryginalnego obrazu, oczy- wiście przy założeniu, że górne warstwy konwolucyjnej sieci neuronowej naprawdę „widzą” treść obrazów wejściowych. Wówczas rozwiązanie takie pozwoli na zacho- wanie treści obrazu. 8.3.2. Strata stylu Mechanizm obliczający stratę treści korzysta tylko z jednej górnej warstwy, a mecha- nizm obliczający stratę stylu według Gatysa korzysta z wielu warstw sieci konwolu- cyjnej — próbujemy wziąć pod uwagę styl referencyjnego obrazu, który jest rozsiany po wszystkich przestrzennych skalach sieci konwolucyjnej. Gates, określając stratę stylu, korzysta z macierzy Grama składającej się z aktywacji warstw — iloczynu skalarnego map cech danej warstwy. Iloczyn skalarny może być rozumiany jako reprezentacja mapy korelacji między cechami warstwy. Korelacje cech określają parametry statystyczne wzorców poszczególnych skal przestrzennych, co empirycznie odpowiada wyglądowi tekstur skal. Mechanizm obliczający stratę stylu próbuje zachować podobne do siebie wewnętrzne korelacje wewnątrz aktywacji różnych warstw między stylem obrazu referencyjnego a stylem obrazu wygenerowanego. Rozwiązanie to sprawia, że tekstury znalezione w różnych przestrzennych skalach obrazu referencyjnego mają podobny styl do tych, które występują w wygenerowanym obrazie. Og
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Deep Learning. Praca z językiem R i biblioteką Keras
Autor:
,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: