10

Pracuję nad replikacją sieci neuronowej. Próbuję zrozumieć, jak działają standardowe typy warstw. W szczególności mam problem ze znalezieniem opisu w dowolnym miejscu, w jaki sposób zachowują się warstwy cross-channel normalizacji na back-pass.Algorytm propagacji wstecznej za pomocą międzykanałowej lokalnej warstwy normalizacyjnej odpowiedzi (LRN)

Ponieważ warstwa normalizacja nie posiada parametrów, mogę odgadnąć dwie możliwe opcje:

  1. gradientów błędu z kolejnym (tj później) warstwy są przekazywane do tyłu, nie robiąc nic do nich.

  2. Gradienty błędów są znormalizowane w ten sam sposób, w jaki aktywacje są znormalizowane dla kanałów w przekazywaniu do przodu.

Nie mogę wymyślić powodu, dla którego zrobiłbyś jeden nad drugim w oparciu o jakąkolwiek intuicję, dlatego chciałbym w tym pomóc.

Edit1:

warstwa jest standardowym warstwa caffe, jak opisano tutaj http://caffe.berkeleyvision.org/tutorial/layers.html (patrz 'Lokalna odpowiedź normalizacji (LRN)').

realizacja warstwy w piłkę z przodu jest opisany w rozdziale 3.3 papieru alexNet: http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

EDIT2:

Wierzę, że do przodu i do tyłu algorytmy karnetów są opisane zarówno w bibliotece Torch tutaj: https://github.com/soumith/cudnn.torch/blob/master/SpatialCrossMapLRN.lua

aw bibliotece Caffe tutaj: https://github.com/BVLC/caffe/blob/master/src/caffe/layers/lrn_layer.cpp

Proszę może ktoś, kto zna albo/oba te przekładają metoda etapu przejścia w tył na zwykły angielski?

+0

Czy można utworzyć łącze do odwołania do "warstw normalizacji międzykanałowej"? Google ujawnia tylko artykuł, który wydaje się również mówić o wielu innych rzeczach. Wygląda na to, że nie jest to standardowy typ warstwy. – IVlad

+0

@IVlad Dodano linki. – user1488804

Odpowiedz

3

Wykorzystuje regułę łańcucha do propagacji gradientu wstecz za pośrednictwem warstwy normalizacji lokalnej odpowiedzi. Jest nieco podobny do warstwy nieliniowości w tym sensie (która również nie ma samodzielnie parametrów, które można pociągnąć, ale wpływa na nachylenie przechodzące w tył).

Z kodu w Caffe że powiązany widzę, że stają się one błąd w każdym neuronu jako parametr, i obliczyć błąd na poprzedniej warstwy, wykonując następujące czynności:

pierwsze, na przejściu do przodu oni buforować tzw skalę, która jest obliczana (w sensie AlexNet papieru można znaleźć formułę z sekcji 3.3) jako:

scale_i = k + alpha/n * sum(a_j^2) 

Tu i poniżej sum jest suma indeksowane przez j i idzie z max(0, i - n/2) do min(N, i + n/2)

(zwróć uwagę, że w dokumencie nie normalizują one przez n, więc zakładam, że jest to coś, co Caffe robi inaczej niż AlexNet). Przekazanie wyprzedzające jest następnie obliczane jako b_i = a_i + scale_i^-beta.

Aby cofnąć propagację błędu, załóżmy, że błąd pochodzący z następnej warstwy to be_i, a błąd, który musimy obliczyć, to ae_i. Następnie ae_i jest obliczana jako:

ae_i = scale_i^-b * be_i - (2 * alpha * beta/n) * a_i * sum(be_j * b_j/scale_j) 

Ponieważ planuje się wdrożyć go ręcznie, będę również udostępnić dwie sztuczki, które Caffe używa w swoim kodzie, który sprawia, że ​​realizacja prostsze:

  1. Kiedy obliczyć dodatki do sumy, przydziel tablicę o rozmiarze N + n - 1 i uzupełnij ją zerami n/2 na każdym końcu. W ten sposób można obliczyć sumę z i - n/2 do i + n/2, nie dbając o zejście poniżej zera i po N.

  2. Nie trzeba ponownie obliczyć sum na każdej iteracji, zamiast obliczania tych składników sumy z góry (a_j^2 przedniego towarzysza, be_j * b_j/scale_j dla wstecznej przebiegu), a następnie obliczyć sum dla i = 0, a następnie dla każdego kolejno i po prostu dodaj addend[i + n/2] i odejmij addend[i - n/2 - 1], otrzymasz wartość sumy dla nowej wartości i w stałym czasie.

+1

nie powinno to być 'b_i = a_i * scale_i^-beta'? –

-1

Z jednej przyczyny można albo wydrukować zmienne, aby obserwować zmiany za ich pomocą, albo użyć modelu debugowania, aby zobaczyć, jak zmieniają się błędy podczas przekazywania sieci.

-1

mam alternatywny preparat do tyłu, a ja nie wiem, czy to jest równoznaczne z caffe to:

So caffe jest:

ae_i = scale_i^-b * be_i - (2 * alpha * beta/n) * a_i * sum(be_j * b_j/scale_j) 

różnicując oryginalny wyraz

b_i = a_i/(scale_i^-b) 

Otrzymuję

ae_i = scale_i^-b * be_i - (2 * alpha * beta/n) * a_i * be_i*sum(ae_j)/scale_i^(-b-1)