tensorflow中的损失函数(带有if-else)
我在尝试张量流中的不同损失函数 我想要的损失函数是一种epsilon不敏感函数(这是组件式的): 我也用过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
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)
该问题的一些解决方案:
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)