Jak zainicjować elementy macierzy filtrów?

24

Próbuję lepiej zrozumieć splotowe sieci neuronowe, pisząc kod Pythona, który nie zależy od bibliotek (takich jak Convnet lub TensorFlow), i utknąłem w literaturze na temat wyboru wartości dla macierzy jądra, kiedy przeprowadzanie splotu obrazu.

Próbuję zrozumieć szczegóły implementacji na etapie między mapami funkcji na poniższym obrazku pokazującym warstwy CNN.

Konwolucyjne warstwy sieci neuronowej

Zgodnie z tym schematem:

Konwertowanie obrazu

Jądro macierzy jądra „przesuwa się” nad obrazem, tworząc mapę cech, w której każdy piksel jest sumą wszystkich produktów pod względem elementu między każdą wagą jądra (lub matrycy filtra) a odpowiednią wartością piksela obrazu wejściowego.

Moje pytanie brzmi: w jaki sposób inicjujemy wagi macierzy jądra (lub filtru)?

W powyższej demonstracji są to po prostu 1 i 0, ale zakładam, że jest to uproszczone ze względu na schemat.

Czy te ciężary są trenowane na jakimś etapie przetwarzania wstępnego? Czy został wybrany przez użytkownika?

Kai Kuspa
źródło

Odpowiedzi:

19

Zwykle inicjuje się sieć z losowej dystrybucji, zwykle oznacza zero i należy zachować ostrożność przy wyborze jej wariancji. Obecnie dzięki postępom w technikach optymalizacji (między innymi SGD + Momentum) i nieliniowości aktywacyjnej (ReLU i aktywacje podobne do ReLU pozwalają na lepszą retragagację sygnałów gradientu, nawet w głębszych sieciach), można rzeczywiście wyszkolić najnowocześniejszy splotowy sieci neuronowe z randomizowanej inicjalizacji.

Kluczowe właściwości są następujące:

  • Dlaczego losowy? Dlaczego nie zainicjować ich wszystkich na 0? Ważną koncepcją jest tutaj łamanie symetrii . Jeśli wszystkie neurony mają takie same ciężary, będą wytwarzać takie same wyniki i nie będziemy uczyć się różnych funkcji. Nie nauczymy się różnych funkcji, ponieważ podczas kroku propagacji wstecznej wszystkie aktualizacje wag będą dokładnie takie same. Zatem rozpoczęcie od losowej dystrybucji pozwala nam zainicjować neurony, aby były różne (z bardzo dużym prawdopodobieństwem) i pozwala nam nauczyć się bogatej i zróżnicowanej hierarchii cech.

  • Dlaczego znaczy zero? Powszechną praktyką w uczeniu maszynowym jest wyśrodkowanie lub normalizacja danych wejściowych, tak że surowe funkcje wejściowe (dla danych obrazu byłyby to piksele) średnio do zera.

    Wyśrodkowiliśmy nasze dane na zero i losowo zainicjalizujemy wagi naszej sieci (macierze, o których mówiłeś). Jaką dystrybucję wybrać? Dystrybucja danych wejściowych do naszej sieci oznacza zero, ponieważ jesteśmy ześrodkowani. Powiedzmy, że inicjalizujemy również nasze warunki uprzedzeń, aby były równe zero. Kiedy rozpoczynamy szkolenie naszej sieci, nie mamy powodu, aby faworyzować jeden neuron nad drugim, ponieważ wszystkie są losowe. Jedną praktyką jest losowe inicjowanie naszych wag w taki sposób, aby wszystkie miały zerową moc wyjściową w oczekiwaniu. W ten sposób żaden neuron nie jest preferowany do „aktywacji” (ma dodatnią wartość wyjściową) niż jakikolwiek inny neuron przy jednoczesnym łamaniu symetrii z powodu losowej inicjalizacji. Cóż, prostym sposobem na osiągnięcie tego jest wybranie średniego rozkładu zerowego.

  • Jak wybieramy wariancje? Nie chcesz wybierać wariancji, która będzie zbyt duża, nawet jeśli jest to średnia zero. Ekstremalne wartości w wagach sieci głębokich mogą spowodować, że wyniki aktywacji będą rosły wykładniczo, a problem ten może się pogłębiać wraz z głębokością sieci. Może to spowodować spustoszenie w szkoleniu naszej sieci. Nie chcesz też, aby był zbyt mały, ponieważ może to spowolnić naukę, ponieważ obliczamy bardzo małe wartości gradientu. Tutaj jest równowaga, szczególnie jeśli chodzi o głębsze sieci, ponieważ nie chcemy, aby nasze propagacje do przodu lub do tyłu gwałtownie zwiększały lub zmniejszały głębokość.

    Istnieją dwa bardzo popularne schematy inicjowania ciężaru: Glorot Uniform ( Zrozumienie trudności w trenowaniu głębokich sieci neuronowych ) i He Normalizator ( Zagłębiając się w prostowniki: przewyższające wydajność na poziomie ludzkim w klasyfikacji ImageNet ).

    Oba są skonstruowane z myślą o szkoleniu głębokich sieci z uwzględnieniem następującej podstawowej zasady (cytat z artykułu Delving Deeper into Rectifiers):

    „Właściwa metoda inicjalizacji powinna unikać wykładniczego zmniejszania lub powiększania wielkości sygnałów wejściowych.”

    Z grubsza mówiąc, te dwa schematy inicjalizacji inicjują wariancję każdej warstwy, tak że rozkład wyjściowy każdego neuronu jest taki sam. Sekcja 2.2 „Zagłębianie się w prostowniki” zawiera dogłębną analizę.

Ostatnia uwaga: czasami zobaczysz, że ludzie używają Gaussa ze standardowym odchyleniem równym .005 lub .01 lub jakimś innym „małym” odchyleniem standardowym na wszystkich warstwach. Innym razem zobaczysz, jak ludzie majstrują przy rozbieżnościach ręcznie, w zasadzie przeprowadzając weryfikację krzyżową, aby znaleźć konfigurację o najlepszej wydajności.

Indie AI
źródło
1
Ale co z kształtem „X” (utworzonym przez 1) żółtego filtra w powyższym GIF-ie? Rozumiem, że tego chciałbym użyć do wykrycia kształtów „X” w dowolnym miejscu na zdjęciu, ale skąd mam wiedzieć, że „X” jest kształtem, którego chcę? Mam wrażenie, że kształt filtra jest uczony automatycznie, ale nie wiem jak. Może to też pytanie OP?
Felipe Almeida,
2

Nie mogę komentować z powodu niskiej reputacji, dlatego piszę to w odpowiedzi na pytanie Felipe Almeidy. Po doskonałej odpowiedzi Indie AI nie ma już nic do dodania. Jeśli chcesz wykryć określone kształty (np. X), możesz wstępnie zdefiniować określony filtr, jak ma to miejsce w przypadku wykrywania krawędzi. Ale to jest piękno głębokiego uczenia się, jest tak wiele warstw, tyle filtrów i tyle iteracji, że filtry uczą się prawie każdego kształtu obiektu, który jest potrzebny. Teoretycznie, jeśli wykryty zostanie X, jeden z filtrów nauczy się wykrywać X (jako żółty filtr)

deadcode
źródło