以下型号:
import tensorflow as tf
import numpy as np
BATCH_SIZE = 3
VECTOR_SIZE = 1
LEARNING_RATE = 0.1
x = tf.placeholder(tf.float32, [BATCH_SIZE, VECTOR_SIZE],
name='input_placeholder')
y = tf.placeholder(tf.float32, [BATCH_SIZE, VECTOR_SIZE],
name='labels_placeholder')
W = tf.get_variable('W', [VECTOR_SIZE, BATCH_SIZE])
b = tf.get_variable('b', [VECTOR_SIZE], initializer=tf.constant_initializer(0.0))
y_hat = tf.matmul(W, x) + b
predict = tf.add(tf.matmul(W, x), b, name='predict')
total_loss = tf.reduce_mean(y-y_hat, name='total_loss')
train_step = tf.train.AdagradOptimizer(LEARNING_RATE).minimize(total_loss)
X = np.ones([BATCH_SIZE, VECTOR_SIZE])
Y = np.ones([BATCH_SIZE, VECTOR_SIZE])
all_saver = tf.train.Saver()
具有以下变量列表:
for el in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES):
print(el)
<tf.Variable 'W:0' shape=(1, 3) dtype=float32_ref>
<tf.Variable 'b:0' shape=(1,) dtype=float32_ref>
<tf.Variable 'W/Adagrad:0' shape=(1, 3) dtype=float32_ref>
<tf.Variable 'b/Adagrad:0' shape=(1,) dtype=float32_ref>
张量W:0
和b:0
是显而易见的,但W/Adagrad:0
和b/Adagrad:0
的来源并不完全清楚。我也没有在张量板上看到它们:
答案 0 :(得分:1)
这些变量是在您调用AdagradOptimizer
时定义的。所有优化器都使用一定数量的变量来存储他们完成工作所需的值。
关于Adagrad的问题,让我记住标准梯度下降更新步骤的样子:
theta(t+1) = theta(t) - eta * grad_theta(t)
其中theta
是一般参数(例如W
或b
),eta
是一个不变的学习率,grad_theta
是你的渐变损失函数wrt迭代theta
t
。
通常,人们会使用特定的时间安排来确定学习率eta
,因为他们在学习的初始阶段需要更大的eta
,而在最后阶段需要更小的eta
你非常接近最小值,你想避免它周围的振荡)。 Adagrad尝试使用以下想法自动执行此操作:“我将theta
的渐变的平方根存储到迭代t
,并按比例缩放eta
”。换句话说,给定:
adagrad_theta(t) = sum(grad_theta(tau)) for tau=1,.., t
Adagrad的更新规则如下:
theta(t+1) = theta(t) - eta * grad_theta(t)/(sqrt(adagrad_theta(t)+ eps))
如您所见,学习率将重新调整为w.r.t. adagrad_theta
值。eps
。这里,W/Adagrad:0
是一个小常数(例如1e-12),用于避免被零除。此更新规则的另一个特征是,您将参数更新到某个点的次数越多,您在以下步骤中执行的操作就越少。
b/Adagrad:0
和adagrad_theta
分别只是变量W
和b
的{{1}}。在那里积累了这些变量的梯度之和。
Tensorboard知道它们是特定变量(与模型无关,而与优化策略有关),然后不将它们附加到实际图形中。但是,您仍然可以在屏幕的右上角看到它们。如果您想在当前图表中看到它们,只需点击它们,在右上角,您可以选择将它们附加到图表中。