use*_*352 6 gradient python-3.x deep-learning tensorflow
mean_sqr = tf.reduce_mean(tf.pow(y_ - y, 2))
optimizer = tf.train.AdamOptimizer(LEARNING_RATE)
gradients, variables = zip(*optimizer.compute_gradients(mean_sqr))
opt = optimizer.apply_gradients(list(zip(gradients, variables)))
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for j in range(TRAINING_EPOCHS):
sess.run(opt, feed_dict={x: batch_xs, y_: batch_xs})
Run Code Online (Sandbox Code Playgroud)
我不太清楚compute_gradients会返回什么?它是否为batch_xs分配的给定x值返回sum(dy / dx),并更新apply_gradients函数中的梯度,例如:
theta < -theta -LEARNING_RATE * 1 / m * gradients?
还是已经返回给定批次中每个x值求和的梯度平均值,例如sum(dy / dx)* 1 / m,m定义为batch_size?
compute_gradients(a,b) 返回 d[ sum a ]/db。因此,在您的情况下,这将返回 d mean_sq / d theta,其中 theta 由所有变量组成。这个方程中没有“dx”,你不是在计算梯度。输入。那么批量维度会发生什么?你自己在 mean_sq 的定义中删除它:
mean_sqr = tf.reduce_mean(tf.pow(y_ - y, 2))
Run Code Online (Sandbox Code Playgroud)
因此(为简单起见,我假设 y 是一维的)
d[ mean_sqr ] / d theta = d[ 1/M SUM_i=1^M (pred(x_i), y_i)^2 ] / d theta
= 1/M SUM_i=1^M d[ (pred(x_i), y_i)^2 ] / d theta
Run Code Online (Sandbox Code Playgroud)
所以你可以控制它是对批次求和,取平均值还是做一些不同的事情,如果你定义mean_sqr来使用reduce_sum而不是reduce_mean,梯度将是批次的总和等等。
另一方面,apply_gradients 只是“应用梯度”,应用的确切规则取决于优化器,对于 GradientDescentOptimizer,它将是
theta <- theta - learning_rate * gradients(theta)
Run Code Online (Sandbox Code Playgroud)
对于亚当来说,你使用的方程当然更复杂。
但是请注意,在数学意义上,tf.gradients 更像是“反向传播”而不是真正的梯度——这意味着它取决于图依赖关系,并且不识别“相反”方向的依赖关系。
归档时间: |
|
查看次数: |
3399 次 |
最近记录: |