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.

Podobne dokumenty