我正在Tensorflow中编写一个模拟,在优化过程中,我需要在减去渐变时添加噪声 . 假设我有6种不同类型的噪声,它们都是从具有不同标准偏差的正态分布中提取的 . 在每次迭代期间,我决定需要生成什么样的噪声分布,然后将这种类型的噪声应用于所有可训练的变量 .
One way 实现这一点,就是创建与可训练变量相同形状的变量,并在训练期间为它们分配不同的噪声值 . 例如,如果我有一些可训练的变量 W
,我将创建另一个变量 W_noise
:
W = tf.Variable(tf.truncated_normal((n_inputs, n_neurons), stddev=stddev), name='W')
W_noise = tf.Variable(tf.random_normal(W.shape, stddev=stddev1))
然后我将有一个更新噪声变量的操作,在训练期间,我将选择生成它的标准偏差:
noise_op = tf.assign(W_noise, tf.random_normal(W_noise.shape, stddev=stddev2)
用于计算渐变的op(假设我有一个字典 noises
,可训练变量为'keys',噪声变量为'values', optimizer
是 GradientDescentOptimizer
和 var_list
是张量 loss
的可训练变量列表):
grads_and_vars = optimizer.compute_gradients(loss, var_list)
op = tf.group([ tf.assign(v, v - learning_rate*g + noises[v])
for g, v in grads_and_vars])
我想到的是,创建不同的优化路线并在培训过程中选择优化路线:
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(loss, var_list)
for i, stddev in zip(range(6), stddev_list):
with tf.name_scope('Route_' + str(i)):
train_route[i] = tf.group( [ tf.assign(v, v - learning_rate*g + tf.random_normal(v.shape, stddev=stddev))
for g, v in grads_and_vars] )
在张量板中,它看起来像这样:
在图片中,每条路线添加不同标准偏差的噪声,同时减去梯度,我可以在训练期间选择通过哪条路径进行优化 .
我的想法和 questions 对此:
-
第一种方法在每次迭代期间有更多的ops进行评估(为噪声变量赋值),并且
2 x (# of trainable_variables)
变量消耗更多的内存 . -
第二种方式会产生更多更复杂的操作(应用渐变),并且由于噪声类型的数量是一个参数(并且可能相对较大),它可能会消耗更多的内存(还有多少?我应该担心的是什么?关于?)
-
哪种方式更好(内存,速度)?
-
有没有更好的方法来实现这个?
提前致谢 .