tensorflow中的损失函数(带有if-else)

tensorflow中的损失函数(带有if-else),tensorflow,Tensorflow,我在尝试张量流中的不同损失函数 我想要的损失函数是一种epsilon不敏感函数(这是组件式的): 我也用过 optimizer = tf.train.MomentumOptimizer(0.001,0.9) 我在实现中没有发现任何错误。但是,它不收敛,而loss=tf.square(yData yModel)收敛,loss=tf.max(tf.square(yData yModel)-epsilonTensor,tf.zeros_like(yData))也收敛 因此,我还尝试了一些更简单的lo

我在尝试张量流中的不同损失函数

我想要的损失函数是一种epsilon不敏感函数(这是组件式的):

我也用过

optimizer = tf.train.MomentumOptimizer(0.001,0.9)
我在实现中没有发现任何错误。但是,它不收敛,而loss=tf.square(yData yModel)收敛,loss=tf.max(tf.square(yData yModel)-epsilonTensor,tf.zeros_like(yData))也收敛


因此,我还尝试了一些更简单的loss=tf.abs(yData yModel),但它也不收敛。我是否犯了一些错误,或者在abs的不可微性为零或其他方面存在问题?abs函数发生了什么?

当您的损失类似于
损失(x)=abs(x-y)
时,则解决方案是SGD的一个不稳定固定点——从任意接近解决方案的点开始最小化,下一步将增加损失

有一个稳定的不动点是像SGD这样的迭代过程收敛的要求。在实践中,这意味着您的优化将朝着局部最小值移动,但在足够接近后,将以与学习速率成比例的步骤跳过解决方案。下面是一个玩具TensorFlow程序,说明了这个问题

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)

该问题的一些解决方案:

  • 使用更稳健的解算器,如近端梯度法
  • 使用更多SGD友好的损耗功能,如Huber损耗
  • 使用学习率计划逐步降低学习率
  • 这里有一个方法来解决上面的玩具问题

    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)
    

    我想是的(比如tf.square(yData yModel))。然而,tensorflow必须处理这个问题,因为反向传播算法使输出误差之和最小化!?“不收敛”是什么意思?损失不稳定?或者你只是没有得到你想要的模型?当我使用损失作为square()形式时,变量precision=tf.reduce_mean(tf.cast(loss,tf.float32))非常接近于零。当我使用abs()形式时,它只是接近初始值!我认为你的函数是非凸的,因此梯度下降很难优化为绝对凸的。当你在else分支中加入| yData yModel |-epsilon超过epsilon时,如果去掉损失函数中的奇怪步骤,这种情况会消失吗?也许那只是那种奇怪感的产物。
    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)
    
    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)