Wybór z różnych funkcji kosztów i funkcji aktywacji sieci neuronowej

[8]}ostatnio zacząłem bawić się sieciami neuronowymi. Próbowałem zaimplementować AND bramę za pomocą Tensorflow. Mam problemy ze zrozumieniem, kiedy korzystać z różnych funkcji kosztów i aktywacji. Jest to podstawowa sieć neuronowa z tylko warstwami wejściowymi i wyjściowymi, bez ukrytych warstw.

Najpierw starałem się to zaimplementować w ten sposób. Jak widać jest to kiepska realizacja, ale myślę, że wykonuje swoją pracę, przynajmniej w jakiś sposób. Więc próbowałem tylko prawdziwych wyjść, nikt gorące prawdziwe wyjścia. Dla funkcji aktywacji, użyłem funkcji esicy i funkcji kosztów użyłem kwadratowy błąd koszt funkcji (myślę, że jego nazywa, że, popraw mnie, jeśli się mylę).

Próbowałem używać ReLU i Softmax jako funkcji aktywacji (z tą samą funkcją kosztów) i to nie działa. Wiem, dlaczego nie działają. Próbowałem również funkcji sigmoid z funkcją kosztów entropii krzyżowej, to również nie działa.

import tensorflow as tf
import numpy

train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]])
train_Y = numpy.asarray([[0],[0],[0],[1]])

x = tf.placeholder("float",[None, 2])
y = tf.placeholder("float",[None, 1])

W = tf.Variable(tf.zeros([2, 1]))
b = tf.Variable(tf.zeros([1, 1]))

activation = tf.nn.sigmoid(tf.matmul(x, W)+b)
cost = tf.reduce_sum(tf.square(activation - y))/4
optimizer = tf.train.GradientDescentOptimizer(.1).minimize(cost)

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    for i in range(5000):
        train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y})

    result = sess.run(activation, feed_dict={x:train_X})
    print(result)

Po 5000 iteracji:

[[ 0.0031316 ]
[ 0.12012422]
[ 0.12012422]
[ 0.85576665]]

Pytanie 1 - czy jest jakaś inna funkcja aktywacyjna i funkcja kosztowa, która może pracować (uczyć się) dla powyższej sieci, bez zmiany parametrów (czyli bez zmiany W, x, b).

Pytanie 2 - przeczytałem z postu StackOverflow tutaj :

[funkcja aktywacji] wybór zależy od problemu.

Więc nie ma żadnych funkcji kosztów, które mogą być używane wszędzie? Chodzi mi o to, że nie ma standardowej funkcji kosztowej, która może być używana na dowolnym sieć neuronowa. Prawda? Proszę mnie poprawić.


Zaimplementowałem również bramę AND z innym podejściem, z wyjściem jako one-hot true. Jak widać train_Y [1,0] oznacza, że indeks 0 jest równy 1, więc odpowiedź jest równa 0. Mam nadzieję, że to zrozumiesz.

Tutaj użyłem funkcji aktywacji softmax, z entropią krzyżową jako funkcją kosztów. Funkcja Sigmoid jako funkcja aktywacji nie powiodła się.

import tensorflow as tf
import numpy

train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]])
train_Y = numpy.asarray([[1,0],[1,0],[1,0],[0,1]])

x = tf.placeholder("float",[None, 2])
y = tf.placeholder("float",[None, 2])

W = tf.Variable(tf.zeros([2, 2]))
b = tf.Variable(tf.zeros([2]))

activation = tf.nn.softmax(tf.matmul(x, W)+b)

cost = -tf.reduce_sum(y*tf.log(activation))

optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(cost)

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    for i in range(5000):
        train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y})

    result = sess.run(activation, feed_dict={x:train_X})
    print(result)

Po 5000 iteracja

[[  1.00000000e+00   1.41971401e-09]
 [  9.98996437e-01   1.00352429e-03]
 [  9.98996437e-01   1.00352429e-03]
 [  1.40495342e-03   9.98595059e-01]]

Pytanie 3 więc w tym przypadku jakiej funkcji kosztów i funkcji aktywacji mogę użyć? Jak mogę zrozumieć, jakiego rodzaju kosztów i funkcji aktywacji powinienem używać? Czy istnieje standardowy sposób lub reguła, czy tylko doświadczenie? Czy muszę próbować każdej funkcji kosztu i aktywacji w sposób brutalny? Znalazłem odpowiedź tutaj . Ale liczę na bardziej rozbudowane Wyjaśnienie.

Pytanie 4 zauważyłem, że potrzeba wielu iteracje zbiegają się do niemal dokładnego przewidywania. Myślę, że współczynnik zbieżności zależy od szybkości uczenia się (używanie zbyt dużej liczby będzie brakować rozwiązania) i funkcji kosztów (popraw mnie, jeśli się mylę). Czy istnieje optymalny sposób (czyli najszybszy) lub funkcja kosztowa dla osiągnięcia poprawnego rozwiązania?

Author: Community, 2015-12-11

2 answers

Odpowiem na twoje pytania trochę Nie w porządku, zaczynając od bardziej ogólnych odpowiedzi, a kończąc na tych specyficznych dla Twojego konkretnego eksperymentu.

Funkcje aktywacji różne funkcje aktywacji w rzeczywistości mają różne właściwości. Najpierw rozważmy funkcję aktywacji pomiędzy dwiema warstwami sieci neuronowej. Jedynym celem funkcji aktywacyjnej jest jej Nieliniowość. Jeśli nie umieścisz funkcji aktywacji pomiędzy Dwie Warstwy, a następnie dwie warstwy razem będą służyć nie lepiej niż jedna, ponieważ ich efekt nadal będzie tylko liniową transformacją. Przez długi czas ludzie używali funkcji esicy i tanh, wybierając dość arbitralnie, przy czym esica była bardziej popularna, aż do niedawna, kiedy Relu stał się dominującą nieleniarnością. Powodem, dla którego ludzie używają ReLU między warstwami, jest to, że nie nasyca się (a także jest szybsze do obliczenia). Pomyśl o wykresie funkcji esicy. Jeśli absolutna wartość x jest duża, wtedy pochodna funkcji sigmoid jest mała, co oznacza, że gdy propagujemy błąd wstecz, gradient błędu zniknie bardzo szybko, gdy wrócimy przez warstwy. W przypadku ReLU pochodna jest 1 dla wszystkich dodatnich wejść, więc gradient dla tych neuronów, które wystrzeliły, w ogóle nie zostanie zmieniony przez jednostkę aktywacyjną i nie spowolni spadku gradientu.

Dla ostatniej warstwy Sieci Jednostka aktywacyjna również zależy na zadaniu. Do regresji będziesz chciał użyć aktywacji esicy lub tanh, ponieważ chcesz, aby wynik był między 0 a 1. Dla klasyfikacji będziesz chciał, aby tylko jedno z Twoich wyjść było jedno, a wszystkie inne zera, ale nie ma różnicowalnego sposobu, aby dokładnie to osiągnąć, więc będziesz chciał użyć softmax do przybliżenia go.

Twój przykład . Spójrzmy teraz na twój przykład. Pierwszy przykład próbuje obliczyć wynik AND w następujący sposób forma:

sigmoid(W1 * x1 + W2 * x2 + B)

Zauważ, że W1 i W2 zawsze będą zbieżne do tej samej wartości, ponieważ wyjście dla (x1, x2) powinna być równa wyjściu z (x2, x1). Dlatego model, który pasujesz, to:

sigmoid(W * (x1 + x2) + B)

x1 + x2 może przyjmować tylko jedną z trzech wartości (0, 1 lub 2) i chcesz zwrócić 0 Dla Przypadku, Gdy x1 + x2 < 2 i 1 Dla Przypadku, Gdy x1 + x2 = 2. Ponieważ funkcja sigmoid jest raczej gładka, potrzeba bardzo dużych wartości W i B, aby wyjście zbliżone do pożądanego, ale z powodu małej szybkości uczenia się nie mogą szybko dotrzeć do tych dużych wartości. Zwiększenie szybkości uczenia się w pierwszym przykładzie zwiększy szybkość konwergencji.

Twój drugi przykład jest lepszy, ponieważ funkcja softmax jest dobra w tym, że dokładnie jedno wyjście jest równe 1, a wszystkie inne 0. Ponieważ jest to dokładnie Twój przypadek, szybko się zbiega. Zauważ, że sigmoid również ostatecznie zbiegnie się do dobrych wartości, ale będzie weź znacznie więcej iteracji (lub wyższy wskaźnik uczenia się).

Czego używać . Teraz ostatnie pytanie, Jak wybrać, które funkcje aktywacji i kosztów użyć. Porady te będą działać w większości przypadków:

  1. W przypadku klasyfikacji należy użyć softmax dla nieliniowości ostatniej warstwy oraz cross entropy jako funkcji kosztów.

  2. Jeśli wykonujesz regresję, użyj sigmoid lub tanh dla nieliniowości ostatniej warstwy i squared error jako koszt funkcja.

  3. Użyj ReLU jako nieliniowości między warstwami.

  4. Użyj najlepszych SEO (AdamOptimizer, AdagradOptimizer) zamiast GradientDescentOptimizer lub użyj pędu do szybszej konwergencji,

 44
Author: Ishamael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-13 05:28:47

Funkcja kosztów i funkcja aktywacji odgrywają ważną rolę w fazie uczenia się sieci neuronowej.

Funkcja aktywacji, jak wyjaśniono w pierwszej odpowiedzi, daje sieci możliwość uczenia się funkcji nieliniowych, oprócz zapewnienia małej zmiany na wyjściu w odpowiedzi na małą zmianę na wejściu. Funkcja aktywacji sigmoid działa dobrze dla tych założeń. Inne funkcje aktywacji robią to samo, ale mogą być mniej kosztowne obliczeniowo, zobacz funkcje aktywacji dla kompletności. Ale, ogólnie rzecz biorąc, należy unikać funkcji aktywacji Sigmoid, ponieważ znikający problem gradientu .

Funkcja kosztów C odgrywa kluczową rolę w szybkości uczenia się sieci neuronowej. Sieci neuronowe oparte na gradientach uczą się w sposób iteracyjny, minimalizując funkcję kosztów, a więc obliczając gradient funkcji kosztów i zmieniając według niej wagi. Jeśli zastosowana jest kwadratowa funkcja kosztu, oznacza to, że jego gradient względem masy jest proporcjonalny do funkcji aktywacji pierwszej pochodnej. Jeśli używana jest funkcja aktywacji esicy, oznacza to, że gdy wyjście jest bliskie 1, pochodna jest bardzo mała, jak widać na obrazku, a więc neurony uczą się powoli. Funkcja sigmoidalna

funkcja kosztów entropii krzyżowej pozwala uniknąć tego problemu. Nawet jeśli używasz funkcji sigmoidalnej, użycie funkcji entropii Krzyżowej jako funkcji kosztu oznacza, że jej pochodne w odniesieniu do wag nie są bardziej proporcjonalne do pierwszego pochodnego funkcji aktywacji, jak to miało miejsce w przypadku funkcji kwadratowej , ale zamiast tego są proporcjonalne do błędu wyjściowego. Oznacza to, że gdy wyjście przewidywania jest daleko do celu Twoja sieć uczy się szybciej, a viceversa.

Cross-Entropia cost function powinna być używana zawsze zamiast kwadratowej funkcji kosztu, dla problemu klasyfikacji, dla powyższego wyjaśnione.

Zauważ, że w sieciach neuronowych Funkcja cross-entropii nie zawsze ma takie samo znaczenie jak Funkcja cross-entropii, którą spełniasz w prawdopodobieństwie, tam jest używana do porównania dwóch rozkładów prawdopodobieństwa. W sieciach neuronowych może to być prawdą, jeśli masz unikalne wyjście esicy do końcowej warstwy i chcesz myśleć o tym jako o rozkładzie prawdopodobieństwa. Ale ta strata oznacza, jeśli masz multi-esicy neuronów w końcowej warstwie.

 0
Author: Gian Pio Domiziani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-04 10:24:31