我对最小化函数感到困惑。例如:形状为mini_batch_size的距离变量X,
loss_1 = tf.reduce_mean(X),
loss_2 = X那么最小化(Loss_1)是最小批处理梯度下降,但是最小化(Loss_2)如何?元素级更新?如果是这样的话,它和随机梯度下降完全一样吗?
发布于 2017-08-27 22:52:42
事实上,这是TF中一个非常技术性的东西。loss_2 .等价于loss_1到乘积的常数。它不是其他答案所暗示的"SGD“--这不是TF的工作方式;它也是一个小型批处理更新,与loss_1的唯一区别是它乘以batch_size,仅此而已。
关键元素隐藏在实现tf.gradients的方式中。也就是说,它期望标量函数作为第一个参数传递。但是,如果您传递多个值,它不会抛出一个错误,而是,它只是将它们和为。您可以在tf.gradients官方TF文档中找到这些信息
梯度( ys,xs,grad_ys=None,name='gradients',colocate_gradients_with_ops=False,gate_gradients=False,aggregation_method=None ) ..。 构造了ys的和 w.r.t的符号偏导数。X字。
因此,实际上,您的loss_2相当于:
equivalent_loss_2 = tf.reduce_sum(X)显然,与loss_1的唯一不同之处不在于除以batch_size。没别的了。
x = tf.constant([[1.,2.,3.]]) # [3x1] , [batch_size x 1]
f = 2*x
f1 = tf.reduce_mean(f)
f2 = tf.reduce_sum(f)
g = tf.gradients(f, x)
g1 = tf.gradients(f1, x)
g2 = tf.gradients(f2, x)
with tf.Session() as sess:
print(sess.run(g))
print(sess.run(g1))
print(sess.run(g2))指纹:
[[array([ 2., 2., 2.], dtype=float32)]]
[[array([ 0.66666669, 0.66666669, 0.66666669], dtype=float32)]]
[[array([ 2., 2., 2.], dtype=float32)]]和预期一样,g和g2是相同的,而g1只是g(或g2)除以3 (batch_size)。
https://stackoverflow.com/questions/45901523
复制相似问题