2016-01-31 15 views
7

テンソルフローでは別の損失関数を試しています。テンソルフローにおける損失関数(if-elseを使用)

私が欲しい損失関数は、(これは要素ごとである)イプシロン小文字を区別しない関数の一種である:

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

私は、このソリューションを試してみました:

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) 

私も

optimizer = tf.train.MomentumOptimizer(0.001,0.9) 
を使用しました

実装でエラーは見つかりませんでした。しかし、損失= tf.square(yData-yModel)は収束し、損失= tf.maximum(tf.square(yData-yModel)-epsilonTensor、tf.zeros_like(yData))も収束する間、収束しない。

私はまた、より単純な損失= tf.abs(yData-yModel)を試みましたが、それも収束しません。私は何か間違いを犯しているのですか、あるいはゼロで何か他の点でABSの差別化できないことに問題がありますか? abs関数で何が起こっていますか?

+1

上記玩具の問題に実装する方法(3)損失がベクトルであるのか? – colinfang

+0

私はそれが(tf.square(yData-yModel)のように)だと思います。しかし、backpropagationアルゴリズムは出力errosの合計を最小化するので、tensorflowはそれに対処しなければなりません! – DanielTheRocketMan

+1

「収束しない」とはどういう意味ですか?損失は​​安定していませんか?それともあなたが手に入れたいモデルを手に入れていないのですか? – lejlot

答えて

12

損失がLoss(x)=abs(x-y)の場合、ソリューションはSGDの不安定な固定小数点です。ソリューションに任意に近いポイントで最小化を開始し、次のステップで損失が増加します。

SGDのような反復手順を収束させるには、安定した固定小数点が必要です。実際には、これはあなたの最適化がローカルの最小値に向かって移動することを意味しますが、十分に近づいた後は、学習率に比例するステップでソリューションを飛び回ります。ここで問題

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

問題のいくつかの解決策を示しているおもちゃのTensorFlowプログラムです:

  1. な近位勾配法として
  2. 使用よりSGDをより堅牢なソルバーを使用しますHuber Lossなどのフレンドリーな損失関数
  3. 徐々に学習率を下げる学習率スケジュールを使用

ここ

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

関連する問題