Dlaczego TensorFlow nie może pasować do prostego modelu liniowego, skoro minimalizuję średni błąd bezwzględny zamiast błędu średniego kwadratu?

10

We wstępie właśnie się zmieniłem

loss = tf.reduce_mean(tf.square(y - y_data))

do

loss = tf.reduce_mean(tf.abs(y - y_data)) 

i model nie jest w stanie dowiedzieć się, że strata z czasem stała się większa. Dlaczego?

Brans Ds
źródło

Odpowiedzi:

17

Próbowałem tego i uzyskałem ten sam wynik.

Wynika to z faktu, że gradient .absjest trudniejszy dla prostego optymalizatora do podążenia do minimów, w przeciwieństwie do kwadratowej różnicy, w której gradient zbliża się do zera powoli, gradient różnicy absolutnej ma stałą wielkość, która gwałtownie się odwraca, co powoduje, że optymalizator oscyluje wokół minimalny punkt Podstawowy spadek gradientu jest bardzo wrażliwy na wielkość gradientu i na szybkość uczenia się, która jest w zasadzie tylko mnożnikiem gradientu dla wielkości kroku.

Najprostszym rozwiązaniem jest zmniejszenie tempa uczenia się, np. Zmiana linii

optimizer = tf.train.GradientDescentOptimizer(0.5)

do

optimizer = tf.train.GradientDescentOptimizer(0.05)

Zagraj też z różnymi optymalizatorami. Niektórzy będą w stanie .abslepiej poradzić sobie ze stratami na bazie.

Neil Slater
źródło