2016-01-31 5 views
7

Próbuję różnych funkcji strat w tensorflow.Funkcje utraty w tensorflow (z if - else)

Funkcja utrata Chcę to swego rodzaju epsilon niewrażliwego funkcji (jest to componentwise):

if(|yData-yModel|<epsilon): 
    loss=0 
else 
    loss=|yData-yModel|  

próbowałem tego rozwiązania:

yData=tf.placeholder("float",[None,numberOutputs]) 

yModel=model(... 

epsilon=0.2 
epsilonTensor=epsilon*tf.ones_like(yData) 
loss=tf.maximum(tf.abs(yData-yModel)-epsilonTensor,tf.zeros_like(yData)) 
optimizer = tf.train.GradientDescentOptimizer(0.25) 
train = optimizer.minimize(loss) 

użyłem również

optimizer = tf.train.MomentumOptimizer(0.001,0.9) 

Nie znajduję żadnych błędów w implementacji. Jednak nie zbiegają się, a strata = tf.square (yData-yModel) zbiega się i strata = tf.maximum (tf.square (yData-yModel) -epsilonTensor, tf.zeros_like (yData)) również się konwerguje.

Próbowałem więc czegoś prostszego loss = tf.abs (yData-yModel), a także się nie zbiegało. Czy popełniam jakiś błąd, czy mam problemy z nieróżnicowalnością abs na zero lub czymś innym? Co się dzieje z funkcją abs?

+1

jest utrata wektor? – colinfang

+0

Myślę, że jest (jak tf.square (yData-yModel)). Jednak tensorflow musi sobie z tym poradzić, ponieważ algorytm wstecznej propagacji minimalizuje sumę wyjściowych erros !? – DanielTheRocketMan

+1

co masz na myśli, ale "nie zbiegają się"? strata nie stabilizuje się? lub po prostu nie dostaniesz modelu, który chciałbyś dostać? – lejlot

Odpowiedz

12

Kiedy twoja strata jest czymś w rodzaju Loss(x)=abs(x-y), wtedy rozwiązanie jest niestabilnym stałym punktem SGD - zacznij od minimalizacji z punktem arbitralnie bliskim rozwiązania, a następny krok zwiększy stratę.

Posiadanie stabilnego punktu stałego jest warunkiem zbieżności procedury iteracyjnej, takiej jak SGD. W praktyce oznacza to, że twoja optymalizacja przesunie się w kierunku lokalnego minimum, ale po dostatecznym zbliżeniu przeskoczy wokół rozwiązania z krokami proporcjonalnymi do szybkości uczenia się. Oto program zabawka TensorFlow który ilustruje problem

x = tf.Variable(0.) 
loss_op = tf.abs(x-1.05) 
opt = tf.train.GradientDescentOptimizer(0.1) 
train_op = opt.minimize(loss_op) 
sess = tf.InteractiveSession() 
sess.run(tf.initialize_all_variables()) 
xvals = [] 
for i in range(20): 
    unused, loss, xval = sess.run([train_op, loss_op, x]) 
    xvals.append(xval) 
pyplot.plot(xvals) 

Graph of x estimate

Niektóre rozwiązania problemu:

  1. użyć bardziej wytrzymałe solver takie jak metoda Proksymalną Gradient
  2. używać więcej SGD funkcja utraty funkcji, taka jak Huber Loss
  3. Stosuj harmonogram kursów nauki, aby stopniowo zmniejszać wskaźnik uczenia się

Oto sposobem wdrożenia (3) na problemie zabawka powyżej

x = tf.Variable(0.) 
loss_op = tf.abs(x-1.05) 

step = tf.Variable(0) 
learning_rate = tf.train.exponential_decay(
     0.2, # Base learning rate. 
     step, # Current index into the dataset. 
     1,  # Decay step. 
     0.9 # Decay rate 
) 

opt = tf.train.GradientDescentOptimizer(learning_rate) 
train_op = opt.minimize(loss_op, global_step=step) 
sess = tf.InteractiveSession() 
sess.run(tf.initialize_all_variables()) 
xvals = [] 
for i in range(40): 
    unused, loss, xval = sess.run([train_op, loss_op, x]) 
    xvals.append(xval) 
pyplot.plot(xvals) 

enter image description here