为什么dropout的seed参数设置了就要始终丢弃相同的输出单元
Created by: yangapku
在模型训练的过程中,经常需要做到训练过程可复现,这时候就需要设置paddle.fluid.layers.dropout
的seed参数,但是这个一设置就会每次执行都丢弃相同的输出单元,这样训练过程就有问题了,那这个参数设置的意义在哪里?实际上,对比tensorflow,人家的dropout op也有seed参数,但是人家就是为了做到结果可复现,每次执行还是丢弃不同的输出单元
import tensorflow as tf
tf.InteractiveSession()
tf.set_random_seed(0)
x = tf.ones([10])
y = tf.nn.dropout(x, keep_prob=0.5, seed=0)
for i in range(5):
print(y.eval())
Output:
[0. 0. 0. 2. 0. 2. 0. 0. 2. 2.]
[2. 0. 2. 0. 2. 2. 2. 2. 0. 2.]
[2. 2. 2. 2. 0. 0. 2. 0. 2. 0.]
[0. 2. 2. 2. 2. 2. 0. 2. 0. 2.]
[0. 2. 0. 2. 0. 2. 0. 2. 2. 0.]
而我们的paddle.fluid.layers.dropout
,就会变成这样
import numpy as np
import paddle.fluid as fluid
a = fluid.layers.data('a', shape=[10, 1], append_batch_size=False, dtype='float32')
out = fluid.layers.dropout(a, 0.2, seed=100, dropout_implementation='downgrade_in_infer')
feed = {'a': np.ones([10, 1], dtype=np.float32)}
fetch = [out.name]
place = fluid.CUDAPlace(0)
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
for _ in range(5):
res = exe.run(fluid.default_main_program(), feed=feed, fetch_list=fetch)
print(res[0].reshape([-1]))
Output:
[0. 1. 0. 0. 1. 1. 1. 1. 1. 1.]
[0. 1. 0. 0. 1. 1. 1. 1. 1. 1.]
[0. 1. 0. 0. 1. 1. 1. 1. 1. 1.]
[0. 1. 0. 0. 1. 1. 1. 1. 1. 1.]
[0. 1. 0. 0. 1. 1. 1. 1. 1. 1.]
我觉得应该借鉴tensorflow的设计,本身这个参数就是为了训练可复现的,结果paddle设置了这个又不能正常训练了,感觉有点无法理解。。 另外,希望paddle在训练可复现性上提升一点,目前并没有一套机制能够让我固定一个种子就使训练结果完全可重复