我正在 Tensorflow 中编写模拟,其中,在优化过程中,我需要在减去渐变时添加噪声。假设我有6种不同类型的噪声,它们都是从具有不同标准偏差的正态分布中提取的。在每次迭代期间,我决定从哪个分布产生噪声,然后将这种类型的噪声应用于所有可训练的变量。
实现这一点的一种方法是创建与可训练变量相同形状的变量,并在训练期间为它们分配不同的噪声值。例如,如果我有一些可训练变量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)
用于计算渐变的操作(假设我有一个字典noises
,其中可训练变量为“键”,噪音变量为“值”,optimizer
为GradientDescentOptimizer
和{ {1}}是张量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] )
个变量消耗更多的内存。提前致谢。