同一参数具有不同精度(由于不确定性行为)时的超参数整定方法

2024-04-20 00:55:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用tf.truncated\u normal\u初始值设定项要初始化权重和偏差:

with tf.variable_scope('params'):
    weights = tf.get_variable(name="weights1",shape = [2*rnn_size, n_classes],initializer = tf.truncated_normal_initializer(seed=seed))
    biases = tf.get_variable(name="biases1",shape = [n_classes],initializer = tf.truncated_normal_initializer(seed=seed))   

为了使它们在不同的运行中保持相同的重复性,我将种子设置为op级别。另外,我在同一个图形中使用

tf.reset_default_graph()

后来:

tf.set_random_seed(seed)

除此之外,我还将numpy和random seed设置为与上述seed相同的值(tfseed的值与seed相同)。你知道吗

np.random.seed(tfseed)
random.seed(tfseed)

训练和打印第1次、第2次和第3次在epoch 0的值并比较它们时,我注意到重量有轻微的变化。你知道吗

Epoch 0 weights run 0 vs 1

Epoch 0 run 1 vs 2

到了94世纪,变化变得更加明显:

Epoch 94 run 0 vs 1

Epoch 94 run 1 vs 2

在更高的纪元1000+时,权重可能会变得更加不同,从而导致不同的精度。我试图有再现性,以尝试不同的超参数。你知道吗

尽管种子是相同的,但不同跑步的重量/偏差的微小差异背后的原因是什么?我们如何避免这种差异?你知道吗

有没有一种方法可以避免在不同的时间段使用不同的重量,从而在非常高的时间段内实现完全的再现性?你知道吗

更新编辑- 在epoch 0打印的权重是在epoch 0之后打印的,我误解了这些权重是初始权重。在我注意到这一点并在历元计算前打印重量之后。我可以看到初始重量是一样的。所以种子是按计划工作的。你知道吗

Before Epoch 0 - Run 0 weights vs Run 1 weights

Before Epoch 0 - Run 1 weights vs Run 2 weights

从注释和其他参考资料来看,tensorflow在GPU/CPU(https://github.com/tensorflow/tensorflow/issues/3103)上的工作方式,tf.u平均值以及减少总和是不确定的,这可能解释了为什么重量在不同的时间不同的运行不断变化,导致不同的精度在高历元(4至7%的差异,在1000历元为10运行我的训练LSTM)。你知道吗

当使用相同的参数(由于不确定性行为)时,精度有变化时,通常如何进行超参数调整?如何确定精度的提高实际上是由于超参数的变化?你知道吗


Tags: run参数tf精度randomseed权重vs