Temat: Sieci neuronowe oraz technologia CUDA
Transkrypt
Temat: Sieci neuronowe oraz technologia CUDA
Elbląg, 27.03.2010 Temat: Sieci neuronowe oraz technologia CUDA Przygotował: Mateusz Górny VIII semestr ASiSK Wstęp Sieci neuronowe są to specyficzne struktury danych odzwierciedlające sieć neuronów w mózgu. Oczywiście zwykle jest to uproszczony model, jednak spełnia swoje zadania. Początki sieci neuronowych sięgają końca lat pięćdziesiątych, kiedy to pojawiły się pierwsze modele neuronów i sieci. Był to pierwszy perceptron oraz model Madaline. Pierwsze emocje i zachwyty opadły, gdy kilku naukowców dowiodło ograniczenie zastosowań liniowych sieci neuronowych oraz niemożliwość nauczenia sieci wielowarstwowych. Lata osiemdziesiąte stanowiły renesans sieci. Powstało wiele nowych artchitektur, koncepcji, podsumowań badań oraz, co najważniejsze, algorytm uczenia wielowarstwowych sieci neuronowych: algorytm wstecznej propagacji błędu. Jest on stosunkowo prosty. Najpierw obliczamy, odpowiednim wzorem błąd sieci, pomiędzy wartością oczekiwaną, a wartością jaką otrzymujemy. Następnie rzutujemy ten błąd do warstwy poprzedniej i na jego podstawie poprawiamy warstwę. Więcej o tym w dalszej części. Kolejną przyczyną wzrostu popularności sieci było rosnące zainteresowanie sztuczną inteligencją i zastosowaniem w niej sztucznych neuronów. Obecnie sztuczne sieci neuronowe znajdują zastosowanie w wielu dziedzinach, często zupełnie niespodziewanych. Sztuczny neuron Sieć neuronowa składa się z warstw, które są zbudowane z neuronów. A więc najważniejszą składową jest tutaj neuron. Neuron biologiczny: 1 – synapsy 2 – aksom 3 – ciało komórki 4 – dendryty Model sztucznego neuronu: x1 … xn – wejście neuronu w1 … wn – wagi neuronu s – suma f – funkcja aktywacji neuronu y – wejście Neuron działa w następujący sposób. Sygnały wejściowe są pomnożone przez odpowiadające im wagi. Otrzymany wektor trafia do sumatora. Otrzymany wynik trafia do funkcji aktywacji, gdzie zostaje przetworzony. W ten oto sposób otrzymujemy wyjście. To jest najbardziej ogólny model neuronu. Jednak stosuje się przeróżne jego modyfikacje wynikające ze zmiany funkcji aktywacji. Czym jednak ona jest? Jest to funkcja, która modyfikuje otrzymaną sume w sposób najbardziej odpowiedni dla danego modelu. Np. funkcja aktywacji perceptronu na wyjściu daje 1 lub -1. Dzięki czemu otrzymujemy jednoznaczną odpowiedź. Tak jak true lub false. Funkcja aktywacji modelu Adaline na wyjściu daje 0 lub 1. Założenia są proste, sam schemat również. A więc, gdzie tu jest genialne rozwiązanie pasujące do tak wielu zastosowań? To rozwiązanie to informacja. Informacja przechowywana przez wagi neuronu. Oczywiście istnieje kilka algorytmów zmieniających odpowiednio wagi neuronu. Każdy algorytm jest indywidualnym rozwiązaniem dla danego modelu pasującym do danej funkcji aktywacji. Czym są sieci neuronowe Sieci neuronowe są strukturą składającą się z kilku warstw, które składają się z neuronów. Wyróżniamy trzy rodzaje warstw: –warstwa wejściowa – zwykle służy jedynie do przekazania wejścia do warstw kolejnych; –warstwa ukryta – zwykle jest ich kilka. Znajdują się pomiędzy warstwą wejściową i wyjściową. Wszystkie dane z tych warstw nie powinny być widoczne. Wyjścia każdej z tych warstw (podobnie jak pozostałych) są wejściami warstwy następnej. –Warstwa wyjściowa – jej wejściami są wyjścia warstwy ukrytej. Służy do wyświetlenia wyjścia użytkownikowi. Jest kilka rodzajów sieci: –sieci jednokierunkowe wielowarstwowe; –sieci rekurencyjne; –sieci samoorganizujące z konkurencją; Sieci jednokierunkowe wielowarstwowe są najprostszą strukturą. Przebieg neuronów odbywa się w jednym kierunku. Bardzo łatwo jest przewidzieć zachowanie sygnałów. Podobnie algorytmy nauki są bardzo proste. Sieci rekurencyjne – inaczej zwane sieciami ze sprzężeniem zwrotnym. Jedyna różnica to występowanie tak zwanego sprzężenia zwrotnego. Polega ono na występowaniu dodatkowego wejścia w postaci wyjścia danej warstwy. W związku z tym algorytmy uczące są trochę zmodyfikowane. Jednym z nich jest zmiana wejść dopóki sieć się nie ustabilizuje. Obie powyższe sieci są sieciami z wykorzystaniem algorytmów z nauczycielem. Musimy w nim znać wyjście, by móc nauczyć sieć. W tym momencie należy wspomnieć w jaki sposób można nauczyć sieć. Pomysł jest prosty. Podajemy na wejście sieci tzw. ciąg uczący, a następnie obliczamy wyjście sieci. Jeżeli nie jest bliskie wartościom oczekiwanym obliczamy różnicę pomiędzy faktycznym wyjście, a oczekiwanym. Jeżeli wartości te różnią się o pewną liczbę delta obliczamy błąd warstwy wyjściowej. Przekazujemy następnie ten błąd do warstwy poprzedniej. I kolejnej. Aż dojdziemy do warstwy wejściowej. Ponownie obliczamy wyjście i jeżeli dalej się nie zgadza ponawiamy algorytm. W związku z tym, że błąd jest propagowany do warstw poprzednich został nazwany: algorytm propagacji wstecznej błędów. Sieci samoorganizujące z konkurencją należą do sieci z nauczaniem bez nauczyciela. Służą głównie w zadaniach grupowania danych. Mają nieskomplikowaną budowę, a do ich zrozumienia wymagana jest niewielka znajomość matematyki. Charakteryzującą je rzeczą jest stopień podobieństwa niektórych wag, przez co tworzą swego rodzaju grupy. Po stworzeniu sieci należy dobrać odpowiednio wagi. Zwykle są dobierane losowo często z przedziału (1; 0). Wartości zero i jeden przeważnie nie używa się do doboru wag. Podobnie wartość zero jest unikana w sieci. Jest ona neutralna i często nie bierze udziału w nauce i przechowaniu informacji. Jednak te sprawy są indywidualną sprawą danej sieci oraz projektanta. Dobór początkowych wartości jest bardzo ważny. Optymalny dobór wag powoduje znaczne skrócenie nauki sieci. Czym jest technologia CUDA Od dłuższego czasu widać znaczny wzrost wydajności oraz współbieżności procesorów. Obecnie, w użytku domowym, znajdują się procesory 2 – 4 rdzeniowe, czyli mogące obsłużyć kolejno 2 – 4 wątki. Wydaje się to ogromną wartością, jednak to nic w porównaniu z kartami graficznymi, posiadającymi jednostki mogące obsłużyć 100, 200 a nawet więcej wątków. Do tej pory ta cała moc obliczeniowa była wykorzystywana wyłącznie w programach komputerowych. Kilka lat temu programistom udało się stworzyć proste programy używające części mocy karty jednak programy takie pisane były dosyć żmudnie. Jednak trzy lata temu wszystko to się zmieniło. Nvidia, 15 lutego 2007 roku, wypuściła na rynek CUDA SDK. Dzięki temu programiści uzyskali łatwy dostęp do zasobów karty w języku C. Obecnie technologia CUDA jest wspierana przez karty GeForce z serii 8, 9, 100 i 200 z minimum 256 MB lokalnej pamięci graficznej RAM. Przygotowane przez nvidia sdk pozwala programistom w łatwy sposób przenieść część żmudnych obliczeń na kartę graficzną. Dzięki czemu uzyskujemy spore przyspieszenie. W jaki sposób się to dzieje? W karcie graficznej wbudowane jest kilka jednostek, które mogą wykonywać kilku lub kilkadziesiąt operacji równolegle. Użycie CUDA w sieciach neuronowych. Sieci neuronowe są strukturą idealnie nadającą się do współbieżnego obliczania. Każda taka sieć składa się z co najmniej kilkunastu neuronów, które obliczają wyjście niezależnie od siebie. Poza tym, w każdym neuronie potrzebna jest operacja sumowania oraz obliczenia funkcji aktywacji, a czasami jej pochodnej. Operacje te są żmudne dla procesora jednak nie dla jednostki gpu. Przekazując wektor wejść i wag możemy za pomocą CUDA dostać sumę wszystkich elementów w czasie co najmniej dwukrotnie mniejszym niż poprzez cpu. Podobnie obliczanie sinusów, cosinusów. Możemy również dokonać wszystkich obliczeń neuronu w jednym wątku. Spowoduje to kilkukrotne przyspieszenie.