我正在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', optimizerGradientDescentOptimizervar_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) 变量消耗更多的内存 .

  • 第二种方式会产生更多更复杂的操作(应用渐变),并且由于噪声类型的数量是一个参数(并且可能相对较大),它可能会消耗更多的内存(还有多少?我应该担心的是什么?关于?)

  • 哪种方式更好(内存,速度)?

  • 有没有更好的方法来实现这个?

提前致谢 .